Flutter GUI and a pure-Dart AI coding-agent daemon. The daemon owns workspace, agent, timeline, and approval state; desktop and mobile applications connect to the same versioned WebSocket protocol.
dart pub get --enforce-lockfile
dart run melos verify
dart run melos verify:debugSee docs/testing.md for the individual TDD, contract,
widget, golden, coverage, architecture, and Debug E2E commands.
Run the standalone daemon. The seeded OpenAI provider reads
OPENAI_API_KEY; additional providers can use an environment variable or a
locally stored credential configured from the Settings screen:
dart run melos run run:daemonThe default endpoint is ws://127.0.0.1:7337/ws. Override the state/config
directory and listener with TINYRACK_CODER_HOME and
TINYRACK_CODER_LISTEN. Without an override, Linux uses the XDG config/state
directories, macOS uses Application Support, and Windows uses AppData.
The app shell does not require a daemon connection. Desktop enables its
app-owned embedded daemon by default, while mobile remains remote-only. Global
Settings can disable the embedded daemon and save any number of independent
ws:// or wss:// remote daemon profiles. Desktop Settings also controls
whether the embedded daemon listens only on 127.0.0.1 or on every IPv4
interface (0.0.0.0); changing it restarts only that app-owned daemon. Offline
profiles and the last selected host remain navigable.
Provider and Markdown Agent setup belongs to a connected daemon. Every client
uses one bearer token, which grants the complete daemon API for both local and
remote connections. coder-cli both hosts a daemon and drives the same
setup from a terminal against an already running one, discovering its token
from the same configuration directory:
brew install tinyrack-net/tap/coder-cli # or winget install tinyrack.coder-cli
coder-cli daemon start
coder-cli provider list
coder-cli agent apply reviewer --file reviewer.mdRun coder-cli completion bash (or zsh, fish, powershell) to install
shell completion.
From a checkout, dart run melos run:cli -- provider list runs the same
commands without installing anything.
Desktop, mobile, and web use separate targets so that only the desktop
bootstrap can start a daemon. Run these commands from apps/coder_app:
flutter run -d linux -t lib/main_desktop.dart
flutter run -t lib/main_mobile.dart
flutter run -d chrome -t lib/main_web.dartThe web build is a client only, hosted at https://coder.tinyrack.net. It
connects to a daemon you run yourself, which has to allow the page's origin
first. A daemon on your own machine also works, after granting the browser's
Local Network Access permission once. See
docs/remote-daemon.md.
Release builds, packaging, and the winget and Homebrew channels are described
in docs/releasing.md.
The daemon intentionally does not implement TLS or certificate bypasses. Keep
it bound to loopback when terminating TLS in a local reverse proxy. Binding to
all interfaces exposes the plain daemon port, which must be isolated by the
operator's firewall when TLS is mandatory. See
docs/remote-daemon.md for Caddy/Nginx WebSocket,
authentication-header, and development-data reset examples.
See docs/mcp.md for configuring external MCP servers, the
secret reference syntax, and the trust implications of a repository-declared
.mcp.json.