Fa mobile app
The full iOS / Android / desktop sandbox, from source.
git clone https://github.com/IstiN/flutter_agent_harness cd flutter_agent_harness/flutter_app flutter run
fa1.dev · Dart & Flutter
Fa is a coding agent with a real tool loop — a sandboxed shell, git, interpreters, and a file browser — built on a pure-Dart core that runs on iOS, Android, web, desktop, in your terminal, in Chrome, and in Outlook. Same harness, same tools, everywhere. This page is the proof: the app below runs entirely in your browser.
Live demo
The full agent app as static files — no server, no account. Pick a
provider, paste your own key, and put the agent to work. Its sandbox
shell (curl, jq, rg,
git, python3, sqlite3) runs in an
in-memory filesystem on your machine.
Bring your own key: it is held in memory only — never persisted, gone on reload. OpenRouter works from browsers; some providers block cross-origin calls (see BYOK).
Install
Fa runs in your terminal on macOS, Windows, and Linux. The installer is non-interactive: it detects your OS and architecture, downloads a prebuilt binary from the latest GitHub Release, puts it on your PATH, and exits. On macOS it also strips Gatekeeper quarantine and re-signs the binary ad-hoc so it runs without a manual security override. Run the separate setup wizard afterward to configure your provider, model, and API key.
curl -fsSL "https://fa1.dev/install.sh" | sh
The full iOS / Android / desktop sandbox, from source.
git clone https://github.com/IstiN/flutter_agent_harness cd flutter_agent_harness/flutter_app flutter run
No install at all — the full agent runs in your browser with your own key. Try it above ↑ or open it full screen ↗.
Fa lives in your browser: it reads the page, drives tabs, takes
screenshots and answers with the full tool loop.
Download the zip,
unzip it, then open chrome://extensions, enable
Developer mode, Load unpacked → pick the unzipped
folder and pin Fa from the puzzle-piece menu.
Fa lives in your mailbox: a taskpane chat that reads the open email, reads its attachments, and writes draft bodies — every mail tool approval-gated. Sideload it once: download manifest.xml, open aka.ms/olksideload (My add-ins), then Custom add-ins → “+ Add a custom add-in” → Add from file. Microsoft removed the manual “Add from a URL” entry — download-then-file is the only self-service path. Full guide: Outlook install guide.
Capabilities
curl · wget · jq ·
yq · rg · sed ·
awk · find · xargs ·
diff · patch · tar ·
zip, plus nslookup/dig/whois.
On web it is a pure-Dart memory shell; on mobile the same commands run
as WASM (uutils coreutils + ripgrep).
Pure-Dart git: smart-HTTP clone and push, SSH remotes, commits and diffs. No native binary — it works the same in a browser tab as on a phone.
Interpreters stream in from a CDN on demand: Python 3 (with
pip installs into the sandbox), QuickJS, and SQLite via
sql.js. The agent picks the right tool for the job.
Secret values never reach the model, the transcript, or session
files. The agent references them as $NAME in shell
commands; redaction hooks scrub tool output on the way back.
A live view of the exact filesystem the agent works in — browse, preview, and watch files appear as the agent writes them. No hidden state.
Append-only JSONL session trees you can resume and fork, with automatic LLM-powered compaction when the context window fills up.
Every platform ships the same core tools: read ·
write · edit · ls ·
bash · web_search ·
web_fetch · task subagents ·
lsp · memory_search ·
checkpoint/rewind · ask ·
request_secret — plus the mcp__ servers
you configure. Hosts add their own: 34 browser tools in the Chrome
extension, three mail tools in Outlook. Full list in
llms.txt.
Runs everywhere
The harness is pure Dart — no dart:io in the core — so the
same agent loop, tools, and session format run behind any
ExecutionEnv: browser memory FS, phone sandbox, or your
host shell.
| Capability | Browser | macOS | iOS | Android | Windows |
|---|---|---|---|---|---|
| Agent loop, tools, sessions, compaction | ✓ | ✓ | ✓ | ✓ | ✓ |
| Chat UI + file browser | ✓ | ✓ | ✓ | ✓ | ✓⁴ |
| Shell: curl, jq, rg, sed, awk, tar, zip, diff, patch… | pure-Dart builtins | host shell | WASI binaries | WASI binaries | host shell |
| python3 + pip (pure-python wheels) | pyodide CDN¹ | host | CPython 3.14 WASI | CPython 3.14 WASI | host |
| sqlite3 | sql.js CDN¹ | host | WASI | WASI | host |
| JavaScript (qjs) / lua | qjs CDN¹ · lua — | host | qjs + lua WASI | qjs + lua WASI | host |
| git — local ops | ✓ dart_git | ✓ | ✓ | ✓ | ✓ |
| git — clone / push (remote) | — CORS² | ✓ | ✓ HTTP+SSH | ✓ HTTP+SSH | ✓ |
| ssh / scp / sftp · dig / whois | ~ DoH+RDAP³ | ✓ host | ✓ builtins | ✓ builtins | ~ ssh⁵ |
| File upload + persistence | IndexedDB (upload UI) | host FS | app sandbox | app sandbox | host FS |
| Secrets — env injection + redaction | ✓ in-memory | ✓ .env | ✓ | ✓ | ✓ .env |
✓ full support · ~ partial /
host-dependent · — not possible on the platform.
¹ Web interpreters (pyodide, quickjs-emscripten, sql.js) lazy-load from jsDelivr on first use.
² Browsers can't reach remote git (CORS) — local repos work fully.
³ No raw TCP in browsers: DNS-over-HTTPS and RDAP whois work; ssh/scp/sftp report unavailable.
⁴ Windows and Linux share the tested desktop code path; manual testing happens on macOS + iOS simulator.
⁵ Windows has no stock dig/whois; ssh/scp/sftp work via the built-in dartssh2 client on platforms with the Dart builtins, or the host OpenSSH client on desktop.
Add-ons
Two hosts ship straight off this site, built from the same pure-Dart core. Both are static artifacts — no server, no account.
The side panel hosts the full Fa app; the agent runs in the
service worker and gains 34 browser tools — tabs_*,
windows_*, bookmarks_*,
downloads_*, cookies_*,
history_search, inject_js,
cdp_eval, page_screenshot, and more.
Reach it from the side panel, the omnibox
(fa <query>), the Ctrl+Shift+1 hotkey, or the
context menu on any selection. Every page-derived byte is
quarantined as untrusted data; code injection prompts on every
call by default — only an explicit yolo session drops that
guard.
Download fa-extension.zip — install steps in Install ↑.
The same agent as an Office taskpane (Mailbox 1.8+). Three mail
tools: outlook.read_current_item (metadata + body of
the open email), outlook.read_attachment, and
outlook.insert_draft_body — the latter two always
prompt. Email bodies enter the context only inside a quarantine
fence marked untrusted, so instructions in a message can never
drive the agent. Ask about the open email, get attachments
summarized, or dictate a reply straight into the compose pane.
Sideload: download manifest.xml, open aka.ms/olksideload → My add-ins → Custom add-ins → “+ Add a custom add-in” → Add from file (Microsoft removed the manual “Add from a URL” entry). In new Outlook (Windows) and OWA the «fa» button lives in a message's Apps flyout; classic Outlook shows it on the Home ribbon. Full guide: install + troubleshooting.
BYOK
API calls go directly from your machine to the provider. This page is static files — there is no server, no proxy, and nothing in the middle to log your key.
The key lives in page memory: never persisted, never written to localStorage, cookies, or disk — and gone on reload. The app's web secrets store is in-memory by design.
The provider must allow cross-origin browser requests. OpenRouter
does. api.anthropic.com and Ollama Cloud do not — reach
those models through OpenRouter instead. Self-hosted endpoints need
CORS headers.
FAQ
Fa (Flutter Agent Harness) is an open-source coding agent for Dart and Flutter. It pairs a pure-Dart agent core (provider adapters, tool loop, session tree, compaction) with a real sandboxed workbench: shell commands, git, python3 and sqlite3 — running identically on iOS, Android, web, desktop, and as a CLI.
Yes. The key is held in page memory only — never written to localStorage, cookies, or disk, and gone on reload. API calls go directly from your browser to the LLM provider: this page is static files, so there is no server or proxy in between that could log it.
OpenAI-compatible endpoints (OpenRouter, Ollama Cloud, self-hosted llama.cpp / LM Studio / vLLM), Anthropic, and Google. Custom OpenAI-compatible providers can be added with a base URL — the model list, context window, and output limits are detected from the endpoint automatically.
iOS, Android, web (as static files, no server), macOS, Windows, Linux, and a terminal CLI — plus a Chrome MV3 extension that hosts the full agent in your browser and an Outlook add-in that runs it inside your mailbox. The core library is pure Dart with no dart:io, so the same agent loop and tools run everywhere behind a small environment abstraction.
Run shell commands (curl, jq, rg, sed, awk, tar, zip, diff, patch), clone and push git repositories over HTTP/SSH, run python3 with pip, query sqlite3, execute QuickJS, edit files, browse the web, spawn task subagents, use LSP and MCP servers, keep persistent memory, and — through the Chrome extension — drive tabs, history, bookmarks, downloads, cookies, and screenshots with approval-gated injection. Inside Outlook it reads the open email and its attachments and writes draft bodies.
Fa itself is free and open source (MIT license). You bring your own provider key and pay your LLM provider only for the tokens you use — there is no markup, subscription, or account.
One line: curl -fsSL "https://fa1.dev/install.sh" | sh
(macOS / Linux / WSL) or the PowerShell equivalent on Windows. The
installer downloads a prebuilt binary from GitHub Releases and, on
macOS, removes Gatekeeper quarantine and re-signs it ad-hoc. Then run
the setup wizard to pick a provider and key. You can also install via
dart pub global activate flutter_agent_harness from
pub.dev if you already have the Dart SDK.
Download fa-extension.zip,
unzip it, open chrome://extensions, enable
Developer mode, Load unpacked → pick the unzipped
folder, and pin Fa from the puzzle-piece menu. The side panel hosts
the full Fa app; the agent gains 34 browser tools — tabs, windows,
history, bookmarks, downloads, cookies, screenshots, and
approval-gated code injection.
Yes — as an Office Add-in. Download fa1.dev/outlook/manifest.xml, open aka.ms/olksideload (My add-ins), then Custom add-ins → “+ Add a custom add-in” → Add from file → manifest.xml → Install — Microsoft removed the manual “Add from a URL” entry, so download-then-file is the only self-service path. Works in Outlook on the web, new Outlook for Windows, and classic Outlook. The taskpane runs the full agent with three approval-gated mail tools: read the open email, read attachments, and insert draft bodies. Full guide: Outlook install guide.