Vercel fx review: we measured the 10µs agent
TL;DR: fx is a 6 MB coding agent from Vercel Labs that starts in 2.7 ms and sends about 25 KB (roughly 6,400 to 7,300 tokens, our estimate) before it reads your prompt. Both numbers are real and both are better than Claude Code’s, which we measured at 112 ms and 29,061 tokens. Neither is why you’d switch. Where fx is interesting is as an embeddable harness: fx ask --json, an ACP server, a Wasm build. Where it isn’t ready: it’s a v0.0.x tied to Vercel’s AI Gateway by default, the docs’ tool list doesn’t match what the binary sends, and it quietly reads every skill in ~/.claude/skills.
What is fx?
fx is Vercel Labs’ coding agent CLI, written in Zig and Apache-2.0 licensed. Its first public release, v0.0.1, was tagged on August 17, 2026. It was an internal tool first; Vercel Labs’ announcement pitched it as “a harness and CLI written in Zig, optimized for research and embedding in larger systems,” and tagged v0.0.1 the same day. The README says the rest plainly: “Status: Experimental. Use at your own risk.”
The form factor is the thing to understand first. fx doesn’t try to be a terminal IDE. It prints like a Unix tool, keeps your scroll history, and exposes the same agent four ways: an interactive shell (fx), a one-shot command (fx ask "..."), an ACP server for editors (fx acp), and a WebAssembly build you can run in a browser at fx.sh/try. That last pair is the actual product. The CLI is the demo.
We installed v0.0.7 (tagged the day before) on August 30 and spent the day measuring it rather than vibing with it. Seven releases in thirteen days tells you how fast this is moving. The claims worth checking were the two headline numbers (10µs, 6 MB), the promise of a small system prompt, and the privacy story.
Is the 10 microsecond cold start real?
The 10µs figure measures the time before fx accepts input, not the time before anything useful happens. The repo’s own engineering budget is more honest: AGENTS.md sets a 2 ms startup limit for every command on the Linux CI runner and says local macOS numbers vary too much to enforce.
Here’s what we got on an M-series Mac, 20 runs each, medians:
| Command | Median | What it exercises |
|---|---|---|
fx —help | 2.7 ms | Process start, argument parsing, print |
fx status | 65 ms | Reads config, resolves model, checks auth |
fx ask → first model request | 31 ms | Launch to the chat POST leaving the machine |
claude —help | 112 ms | Same test, Claude Code v2.1.251 |
fx v0.0.7 and Claude Code v2.1.251, macOS arm64, August 30, 2026. Timed from Python with perf_counter around a subprocess call, so each figure includes process spawn. The “first model request” row was measured by pointing fx at a local mock gateway and timestamping when the POST arrived.
So: 2.7 ms to a help screen, 31 ms to a network request. That’s genuinely quick, and about 40x faster than Claude Code’s help screen. It’s also nowhere near 10 microseconds: the 2.7 ms help screen is 270x that figure and the 31 ms round trip to a request is 3,100x it. The 10µs claim is technically defensible and practically meaningless, because the next thing that happens after 31 ms is a multi-second round trip to a model. Where startup time does matter is the use case Vercel actually names: benchmarks and sandboxes that spawn the agent thousands of times. For a human typing fx once, 31 ms and 112 ms are the same number.
The binary we downloaded is 6,486,176 bytes on disk, or 6.19 MiB. The README says 7.8 MiB and has said so since the v0.0.1 tag, and AGENTS.md names 7.800 MiB as the production ceiling — enforced by the macOS arm64 release qualification, not by the per-PR size check, which the same file calls informational. So the published number is a budget, and the actual arm64 build sits well under it. Claude Code, for comparison, ships as a 197 MB native Mach-O executable on this machine, so the “no runtime to install” argument fx made at launch is weaker than it looks: Anthropic dropped the Node requirement too. The size difference is still 30x.
fx vs Claude Code: what actually differs
Four measurements, one table. Everything here we ran ourselves on the same machine on August 30, 2026, with fx v0.0.7 and Claude Code v2.1.251.
| fx v0.0.7 | Claude Code v2.1.251 | |
|---|---|---|
| Help screen | 2.7 ms | 112 ms |
| Binary on disk | 6.19 MiB | 197 MB |
| Sent before your prompt | 25,479 bytes (~6,400–7,300 tokens, estimated) | 29,061 tokens (counted) |
| Who bills you by default | Vercel AI Gateway | Anthropic |
The token row isn’t apples to apples and we won’t pretend it is: ours is a byte estimate, Anthropic’s API gave us a real count for Claude Code. The gap is wide enough (roughly 4x) that the conclusion survives the imprecision.
How many tokens does fx send before your prompt?
About 25 KB in a clean install, which we estimate at 6,400 to 7,300 tokens. That’s a quarter of Claude Code’s overhead and it’s the most useful number in this review, so here’s exactly how we got it.
fx honors two undocumented environment variables, FX_GATEWAY_BASE_URL and FX_GATEWAY_CHAT_URL (we found them with strings on the binary). We pointed both at a Python HTTP server on localhost that logs every request body, set a dummy AI_GATEWAY_API_KEY, and ran fx ask --no-save "Say hi" from an empty git repo with HOME set to an empty directory. The request that arrived:
| Part of the request | Bytes | Share |
|---|---|---|
| 17 tool definitions | 17,376 | 68.2% |
| Base system prompt | 5,531 | 21.7% |
| Runtime context: five more system messages (cwd, OS, git branch, permission mode, empty MCP list, one tool blurb) | 2,456 | 9.6% |
| Your prompt (“Say hi”) | 59 | 0.2% |
| toolChoice and JSON envelope | 57 | 0.2% |
| Total JSON body | 25,479 |
fx v0.0.7, fx ask --no-save, default model moonshotai/kimi-k3, empty HOME and workspace, no MCP servers, August 30, 2026. Bytes are the UTF-8 JSON the gateway receives, counted as serialized (so each row includes its own keys and quoting, and the five rows add up to the total). We could not get a tokenizer count because we have no Gateway key and Kimi’s tokenizer isn’t public; at 3.5 to 4 bytes per token, that’s 6,400 to 7,300 tokens.
Two things stand out. First, the system prompt really is small: 5,448 bytes, about 800 words, organized under six headings (identity and context, workspace behavior, source routing, interaction, safety, tools and verification). It reads like a style guide, not a manual. Our Claude Code measurement put the harness floor at 29,061 tokens; fx’s whole request would fit inside Claude Code’s system prompt several times over.
Second, the tools are the cost, not the prompt. Seventeen definitions, 17,376 bytes, and the biggest three (grep_files at 2.2 KB, terminal at 1.9 KB, mcp_features at 1.8 KB) are long because their descriptions explain “when to use” and “when not to use” in prose. That’s the same pattern Anthropic uses, and it’s a deliberate trade: spend tokens on tool discipline so the model wastes fewer calls.
There’s a nice mechanism hiding in that list, too. MCP tools aren’t inlined. fx sends a capability_search tool and an mcp_select_tool tool, and the model has to search for an MCP tool by use case, then select it by exact name before its schema gets advertised on the next turn. That’s the same lazy-loading idea Claude Code’s tool search uses, and it’s why our MCP servers wouldn’t have blown up this number. The context limits page caps each MCP tool description at 1 KiB and each server’s instructions at 2 KiB, so the ceiling is explicit.
Does fx read your Claude Code skills?
fx v0.0.7 reads other agents’ skill directories, and it costs you tokens on every request. Run the same command from a normal home directory and the payload goes from 25,479 to 42,727 bytes. Of those 17,248 extra bytes, 16,247 are one system message holding a catalog of skills. Not fx skills. Our Claude Code skills.
fx scans twelve directories for SKILL.md files by default, and the user-level list includes ~/.claude/skills, ~/.codex/skills, ~/.config/opencode/skills, ~/.agents/skills, and ~/.claw/skills. It found candidates across our ~/.claude/skills, rejected 21 for malformed frontmatter (fx is stricter about YAML than Claude Code), truncated each description to a 1 KiB limit, and shipped 23 of them to the model as an <available_skills> block of name, description, and absolute path. Every request, every turn.
There is a ceiling, and a switch. The combined catalog is capped at 16 KiB by skill_catalog_bytes; ours came in at 16,247 bytes, which is under the 16,384-byte cap but close enough that a couple more skills would have started getting cut. Set it to off and the block disappears: fx --context-limit skill_catalog_bytes=off, or a context_limits entry in ~/.fx/settings.json.
One distinction worth making, because the docs look like they contradict this. fx’s skills page says “Discovering a skill does not add its instructions to every prompt. Instructions enter context only when the skill is invoked.” That’s true and it’s not what we measured. The instructions stay out; the catalog of descriptions goes in, every turn, so the model knows what it could load.
This is the convention taking hold across agents (Codex and OpenCode do versions of it) and it’s convenient. It’s also a surprise if you didn’t expect a tool you installed an hour ago to read a directory another vendor’s tool populated, and a 68% jump in per-request overhead you didn’t opt into. The privacy page is careful to say “context can include conversation history, applicable AGENTS.md and skill instructions,” which covers it. We’d have preferred that sentence in the README next to the binary size.
Two smaller surprises in the same area. Running from a directory that isn’t under $HOME (our scratch directory under /tmp), fx skipped project instructions entirely and said so in the payload: <project-rules-omitted reason="workspace is not below home" />. And inside a normal home-directory repo, we put a marker string in a CLAUDE.md and it never reached the model; adding an AGENTS.md with its own marker put that one in the very next request. So fx borrows another vendor’s skills but not its instructions file — a repo documented for Claude Code gets nothing until you add AGENTS.md.
What does fx actually ship as tools?
Seventeen, in the request v0.0.7 actually sends. The tools docs list around twenty-six, including list_files, semantic_search, delete_file, rename_file, copy_file, create_folder, file_info, open_file, web_search, and subagent. None of those names appear in the v0.0.7 payload we captured. Two of them look like renames rather than absences — mcp_search_tools is plausibly today’s capability_search, and web_search is shipping as perplexity_search — but the rest are simply not there. What’s there instead: read_file, glob_files, grep_files, edit_file, write_file, terminal, capability_search, skill, install_skill, mcp_select_tool, mcp_features, memory, ask_user_question, web_fetch, perplexity_search, read_tool_result, and vision.
Some of that gap is probably gating (subagents and web search may load on demand or depend on the provider). Some of it looks like docs written for a build that isn’t the one on the release channel. Either way, when a project is at v0.0.7 and the CONTRIBUTING.md says “expect frequent changes,” take the docs as intent and the payload as fact. If you’re building on the JSON output, capture your own.
The perplexity_search entry is worth a note on its own: web search in fx is a Gateway-side provider tool (the binary also references a parallel_search backend), so your search queries go through Vercel’s infrastructure even when the model doesn’t.
What model does it use, and who bills you?
By default, moonshotai/kimi-k3 through Vercel AI Gateway. That’s the compiled default per the models docs, and fx status confirmed it before we’d signed in to anything — an interesting pick, given what Kimi K3 costs and how it codes. The catalog we listed had 233 models, including every current Claude and GPT-5.x variant, so switching is one /model away and the choice persists per provider in ~/.fx/settings.json. A repo’s .fx.json can’t override your model, which is a small, good decision.
Billing is the part the launch tweet doesn’t dwell on. The usage docs are direct: “Every model request from fx goes through AI Gateway, whether you sign in with Vercel or use an AI Gateway API key.” There are two exits. fx login codex uses a ChatGPT Plus, Pro, Business, Enterprise, or Edu subscription and talks to OpenAI directly, the same credential Codex CLI uses; fx login grok does the same with SuperGrok or X Premium. Those bypass Vercel. Anthropic keys don’t get an equivalent; if you want Claude in fx, you pay Gateway rates for it.
Local models are the open question. The privacy page says fx “can use compatible loopback endpoints for model discovery and generation,” and the announcement promised local inference. We couldn’t find a documented flag for it, and the base-URL variables we used for the mock are undocumented and shaped for the Gateway’s own API, not OpenAI’s. Treat “works with Ollama” as a roadmap item until a docs page says otherwise.
How does fx’s auto permission mode work?
fx starts in auto permission mode. Saved rules apply first; anything unresolved and sensitive (every write, terminal, install_skill, paths outside the workspace) goes to what the runtime context calls “a narrow safety reviewer.” On the Gateway provider that reviewer is moonshotai/kimi-k3; on Codex it’s gpt-5.4-mini. A “clear” result authorizes that exact action once. The other modes are ask (prompt every time) and yolo (no checks), set with /permissions, FX_PERMISSION_MODE, or permission_mode in settings.
If that sounds like the classifier we tested in Claude Code’s auto mode, it is the same shape, and the same caveat applies: the reviewer is a model, and a model with a smaller context than the one doing the work. We didn’t get to probe what Kimi lets through, because every request needs Gateway credit. We’ll follow up once we’ve put money on the meter.
Credit where due on the privacy side. We ran fx repeatedly and the only files it created were ~/.fx/logs/trace.log (because we set FX_TRACE=1) and nothing else until a session was saved. No telemetry endpoint appears in the binary’s strings; the update check is a static-metadata read every 30 minutes with no machine ID, and FX_AUTO_UPGRADE=0 turns it off. The privacy page is the most precise document in the project.
Is fx production ready?
No, and Vercel doesn’t claim otherwise. fx v0.0.7 is for teams building agent infrastructure and for people who want to watch a small harness work, not for daily-driver users.
The case for it: a 6 MB static binary you can drop into a CI image, a JSON mode that gives you structured output without scraping a TUI, an ACP server so an editor can host the agent without owning the loop, and a system prompt short enough to read in two minutes. If you’re spinning up an agent per task in a sandbox, the 31 ms and the ~7K-token floor compound into real money and real minutes.
If you want the mature end of this trade instead, our Claude Code review and the rest of our tool reviews cover it. The case against fx, today: it’s v0.0.7 with docs that describe a different tool list; the default path bills through a Vercel account; local inference is a sentence, not a feature; and it reads skill directories you set up for other tools without saying so at install. None of those are hard to fix and most will be fixed before this article is a month old. That’s the trade with anything Vercel Labs ships: you get to be early, and early is the price.
We’ll re-measure at v0.1.
How to reproduce our numbers
Both measurements take ten minutes. For timing:
curl -fsSL https://fx.sh/setup.sh | bash
python3 -c "
import subprocess, time, statistics
ts = []
for _ in range(20):
t = time.perf_counter(); subprocess.run(['fx', '--help'], capture_output=True)
ts.append((time.perf_counter() - t) * 1000)
print(round(statistics.median(ts), 1), 'ms')"
For the payload, run a request logger on localhost (any HTTP server that saves POST bodies and returns a 500), then:
AI_GATEWAY_API_KEY=test \
FX_GATEWAY_BASE_URL=http://127.0.0.1:8787 \
FX_GATEWAY_CHAT_URL=http://127.0.0.1:8787/chat \
HOME=$(mktemp -d) \
fx ask --no-save "Say hi"
The logger will first get a GET /coding-agent/v1/models (return a JSON list containing moonshotai/kimi-k3 or fx refuses to continue), then the chat POST with prompt, tools, and toolChoice keys. Count the bytes. Then run it again with your real HOME and see what else you’re paying for.
Frequently asked questions
What is Vercel fx?
fx is an experimental, open-source coding agent CLI from Vercel Labs, written in Zig and shipped as a single native binary (6.19 MiB on disk for v0.0.7 on macOS arm64). It runs interactively, as a one-shot fx ask command, as an ACP server for editors, and as a WebAssembly build. It's Apache-2.0 and labeled experimental by Vercel.
Does fx really start in 10 microseconds?
Not in any sense you'd feel. Vercel's 10µs figure is the time before fx accepts input, and the project's own CI budget is 2 ms per command on Linux. We measured 2.7 ms for fx --help on an M-series Mac and 31 ms from launching fx ask to the first model request leaving the machine. That's fast, and roughly 40x quicker than Claude Code's --help, but the microsecond number is a marketing framing of an engineering budget.
How many tokens does fx send before your prompt?
In a clean environment (empty HOME, empty git repo, no MCP servers), fx v0.0.7 sent a 25,479-byte request for a two-word prompt: a 5,448-byte system prompt, 17 tool definitions totalling 17,376 bytes, and about 2.5 KB of runtime context. We couldn't get an exact token count without a Gateway key, but at the usual 3.5 to 4 bytes per token that's roughly 6,400 to 7,300 tokens, against the 29,061 we measured for Claude Code.
Does fx need a Vercel account?
For the default provider, yes. Every Gateway request goes through Vercel AI Gateway, whether you sign in with fx login or paste an AI Gateway API key with fx setup. The two ways around it are a ChatGPT subscription (fx login codex) or a SuperGrok / X Premium subscription (fx login grok), which talk to those providers directly. There's no documented way to point it at Ollama today, even though the privacy page mentions loopback endpoints.