VT Code and OpenCode are both free terminal coding agents that charge nothing for the client and both accept your own OpenAI-compatible endpoint, so this is not a price comparison. The real differences are where each one lets you declare that endpoint, which way the permission defaults point, and whether you want a $10 per month subscription in the same box. VT Code is a single Rust binary from an independent project led by one maintainer. OpenCode is a TypeScript agent from the company Anomaly, with a desktop app, editor extensions and two first-party wallets of its own.
Two name traps have to be cleared first, because getting either wrong invalidates everything after it. "VT Code" is not Visual Studio Code, and VT Code confusingly ships its own VS Code companion extension on a separate version series. And three different things are called OpenCode — only one of them is in this comparison.
What you are actually comparing
| Project | What it is today | Language and license | Version on September 21, 2026 |
|---|---|---|---|
| vinhnx/VTCode | Active. A Rust terminal coding agent led by one maintainer, with outside contributors credited in the README. Written "VT Code" in prose, vtcode as the binary and crate | Rust. "MIT OR Apache-2.0" per the README; GitHub detects Apache-2.0 | CLI 0.165.0, published that day; crates.io matches |
| anomalyco/opencode | Active. The OpenCode published at opencode.ai. github.com/sst/opencode now returns a 301 here and the site footer reads "© 2026 Anomaly" | TypeScript. MIT | Two lines at once: release v1.18.31 (September 14) and npm @opencode/cli 2.0.12 |
| opencode-ai/opencode | Archived. The Go CLI that continued as Charm's Crush. Not the OpenCode on this page — do not take config or prices from it | Go. MIT | Last push September 18, 2025 |
Repository metadata, releases and dist-tags read from the GitHub API, npm and crates.io on September 21, 2026. A fourth collision: "OpenCode Go" is also the name of Anomaly's $10 per month subscription plan, which has nothing to do with the Go language or the archived Go CLI — and VT Code makes that worse by naming one of its built-in provider keys opencode-go. Note too how fast VT Code's version moves: 0.164.0, 0.164.2 and 0.165.0 all shipped inside about 27 hours across September 20–21, so read the tag rather than trusting a version printed on any page, this one included.
Who should pick which
| If this describes you | Pick | Why, specifically |
|---|---|---|
| You want the gateway pinned in the repo so every clone and every CI job uses it | OpenCode | A committed opencode.json at the project root is ordinary project data and registers the provider. VT Code refuses the same move |
| You want the opposite: a repository you clone must never be able to redirect your model traffic | VT Code | A non-empty [[custom_providers]] arriving from a workspace or project layer is rejected before provider registration — a named layer in its own security model |
| You want the agent to stop and ask before it touches anything, out of the box | VT Code | Documented defaults: tools.default_policy "prompt", security.human_in_the_loop true, sandbox.default_policy "read_only", automation.full_auto.enabled false |
| You would rather it move and be narrowed afterwards with per-tool patterns | OpenCode | Most permissions default to "allow", with doom_loop and external_directory set to "ask"; rules are glob patterns per tool, last match wins |
| You need more than a terminal — a desktop app, editor extensions, GitHub or GitLab | OpenCode | Ships a desktop app via brew install --cask opencode-desktop, plus an extension for VS Code and the forks Cursor, Windsurf and VSCodium that installs itself when you run opencode in the integrated terminal |
| You want to drive the agent from your own service over HTTP | OpenCode | opencode serve exposes an OpenAPI 3.1 spec on 127.0.0.1:4096 and the SDK is generated from it; the TUI is just one client |
| You want one static binary with a hard command allowlist rather than a Node toolchain | VT Code | One Rust binary. Layer 1 of its security model allows nine commands — ls, cat, cp, head, printenv, pwd, rg, sed, which — and blocks everything else by default |
| You want a flat $10 per month over a curated roster instead of metered tokens | OpenCode | OpenCode Go is that product, with per-model caps and one subscriber per workspace. VT Code ships the provider key but is on neither of Go's client lists |
| You want one prepaid balance across frontier Claude, GPT and Gemini families | Either | Both accept a third-party OpenAI-compatible endpoint with no plan gate. Neither paywalls custom providers |
On migration cost. The cheap half is AGENTS.md: both tools read it from the project root, so the file describing your conventions survives a move in either direction untouched. The expensive half is everything else. The two config formats are disjoint — TOML with array-of-tables against JSON naming an npm package per provider — and there is no converter, so a project-local setup gets rewritten by hand. Whether MCP definitions, skills, plugins, custom agents or session history carry across is something this page did not establish, so it makes no estimate of migration time beyond that rewrite.
The one asymmetry worth the decision: where the endpoint may live
This is the difference nobody's generic template mentions, and it flips the usual monorepo instinct. OpenCode treats a custom provider as ordinary project data: a committed opencode.json works, which is how a team standardises everyone onto one gateway in a single reviewed file. VT Code deliberately refuses that.
VT Code's configuration field reference states it on the field itself: "Non-empty values from repository-controlled workspace/project layers are rejected; define provider endpoints in trusted system/user or explicitly selected config." The same rejection is repeated on custom_providers[].base_url, on custom_providers[].auth.command, and on provider_overrides.*.base_url and .api_key_env. Its security model names the reasoning as a layer of its own — the loader records the winning origin of each merged field, treats workspace-root files, workspace .vtcode/ files and project profiles as repository-controlled, and fails closed before provider validation, which it says prevents a repository from introducing a custom provider's executable auth.command or redirecting requests through an overridden base URL.
So the practical consequence: with OpenCode, one merged pull request points the whole team at a gateway. With VT Code, the same change is a per-machine install into the user or system config, or a --config path passed at launch. That is a genuine trade — one is deployment convenience, the other is a supply-chain control — and whichever you prefer is a stronger reason to pick a client here than any feature list. Both facts read from main on September 21, 2026.
Permissions, autonomy and the surfaces each one ships
| Behaviour | VT Code | OpenCode |
|---|---|---|
| Default tool posture | Ask first: tools.default_policy is "prompt" and security.human_in_the_loop is true | Mostly allow; read is allow but .env files are denied by default |
| Autonomous mode | Off by default, and gated: require_profile_ack true, max_turns 100, and an explicit allowed-tools list | --auto approves anything not explicitly denied; explicit denies are still enforced |
| Sandbox | Documented as an optional layer with filesystem isolation and a network allowlist | None documented — /docs/sandbox/ returns 404, and the sandbox that does surface is a third-party Daytona plugin in the plugin ecosystem list. Absence of a doc is not proof the runtime lacks isolation |
| Provider governance | providers_whitelist restricts which providers may be reached at all, which the guide frames as a control for corporate-gateway or air-gapped setups | whitelist and blacklist operate on models within a provider, hiding them from the /models picker |
| Editor reach | ACP via vtcode acp, an in-repo Zed extension, and a VS Code companion on its own version series | ACP via opencode acp, a desktop app, and extensions that install themselves from the integrated terminal |
| Unattended surface | Subcommands on one binary — vtcode exec with JSON events, review, eval, schedule — plus an Anthropic-Messages compatibility server | A client/server split: opencode serve with an OpenAPI 3.1 spec, and an SDK generated from it |
Sources: VT Code's config field reference, security model and provider guide; OpenCode's permissions, providers, server and ACP documentation. All read September 21, 2026, and all of it describes defaults — either client can be reconfigured in the other direction. Both speak ACP and both support MCP, so editor reach is close to parity rather than a differentiator.
The wallet, not the client, is where the money goes
OpenCode sells two things of its own. VT Code sells nothing, which is itself a decision input: every token it sends is billed by whoever you configured, and there is no first-party plan to fall back on.
| Wallet | Published price | What to watch |
|---|---|---|
| VT Code | None. No accounts, no tiers, no hosted service | Funding is voluntary sponsorship. Your whole bill is the endpoint you point it at |
| OpenCode Go | "a low cost $10/month subscription" over a published roster of open coding models, which the same page says "may change as we test and add new ones" | Not unlimited. Each model carries a monthly cap denominated in dollars of usage, published from $15 to $60, with the 5-hour cap at 20% of it and the weekly cap at 50%. One member per workspace may subscribe |
| OpenCode Zen | Pay-as-you-go prepaid credit, per million tokens | Auto-reloads $20 when the balance drops below $5 unless you change or disable it; card fees passed through at 4.4% plus $0.30 per transaction. Its docs also note cheap models appearing in your usage history because Zen uses them to generate session titles |
| Any third-party endpoint | That provider's rates | Supported by both clients with no plan gate. Zen and Go are described in OpenCode's own docs as completely optional |
Prices and quotas read from OpenCode's own documentation on September 21, 2026. Two things worth knowing before you compare against them. Go publishes per-model data terms that are not uniform — most rows say model training not used and zero-day retention, while a few name a 30-day retention and two contributor models are marked as used for training and not zero-retention — so check the row for the model you intend to live on. And Zen publishes dated deprecations, so a comparison anchored to one model id can go stale faster than the page it sits on. OpenCode Enterprise is a contact form with no published price, and this page quotes none.
What a session costs on your own endpoint
The figures below are illustrative token arithmetic, not measured task costs and not a bill ceiling. Assume one agent session that sends 200,000 uncached input tokens and receives 15,000 output tokens — an assumption for comparison, not a measurement of your repository. Rates are live Kunavo catalog prices per million tokens; the last column simply divides, so it inherits every assumption above it.
| Model | Input / output per 1M | Estimate for one session | Sessions per $10 of credit |
|---|---|---|---|
| GPT-5.6 Luna | $0.07 / $0.42 | $0.020 | 492 |
| Claude Haiku 4.5 | $0.40 / $2.00 | $0.110 | 90 |
| Gemini 3.8 Flash | $0.525 / $2.625 | $0.144 | 69 |
| GPT-5.6 Terra | $0.70 / $4.20 | $0.203 | 49 |
| Claude Sonnet 4.6 | $1.20 / $6.00 | $0.330 | 30 |
| Claude Sonnet 5 | $2.00 / $10.00 | $0.550 | 18 |
Set that last column against OpenCode Go's $10 per month, and then resist the urge to call it a verdict. The two are not the same unit: Go's caps are denominated in dollars of usage on its roster, not dollars you spend, and the two shelves only partly overlap — GPT 5.6 Luna is on Go's published list, while the Claude and Gemini rows in the table above are not. A subscription also buys predictability rather than a rate. What the table does settle is the shape of the question — if your work is a handful of long sessions a week on a cheap model, metered tokens get there first; if it is all-day heavy use on models Go actually carries, a flat plan stops being obviously worse. Measure your own sessions before choosing, because a model that needs a second attempt erases a rate advantage immediately.
Kunavo's catalog amount is a billing floor rather than a cap: when the upstream reports its charge, the bill is the greater of catalog cost and upstream cost times the applicable markup. Cache charges and external tools sit outside this example. The minimum top-up is $10 in prepaid credit — a funding minimum, not a task fee or a subscription. See billing details.
Pointing either one at your own endpoint
VT Code's side is a [[custom_providers]] block, and the placement rule from the section above is the part people get wrong:
# This block is rejected if it arrives from a repository-controlled
# layer. Put it in your user config, in the Unix system layer
# (/etc/vtcode/vtcode.toml), or pass it with --config / VTCODE_CONFIG_PATH.
[[custom_providers]]
name = "kunavo"
display_name = "Kunavo"
base_url = "https://api.kunavo.com/v1"
api_key_env = "KUNAVO_API_KEY"
api_format = "openai-chat"
model = "claude-sonnet-5"
models = ["claude-sonnet-5", "claude-haiku-4-5"]
context_window = 1000000 # omit this and VT Code assumes 128000Four notes on that block, all from the provider guide and field reference. The key is read from the environment variable named in api_key_env, and the config documentation carries an explicit caution never to put API keys in vtcode.toml. api_format accepts auto, openai-chat, openai-responses or anthropic-messages — an explicit value is honoured rather than silently falling back — and the Anthropic route is worth a separate look because the two base-URL conventions differ, which the base URL reference covers. Setting context_window matters: omit it and the provider is assumed to be 128,000 tokens, which quietly caps compaction and preflight checks on a much larger context. And VT Code applies name-based OpenAI sampling gates to custom endpoints too — a model id matching gpt-6-astra, for instance, never receives temperature or top_p — with the guide's own advice being to "prefer neutral model IDs on gateways if you need pinned values on such names."
OpenCode's equivalent is a data file, and the npm field is what picks the wire format — @ai-sdk/openai-compatible for an endpoint serving /v1/chat/completions, @ai-sdk/openai for /v1/responses:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"kunavo": {
"npm": "@ai-sdk/openai-compatible",
"name": "Kunavo",
"options": {
"baseURL": "https://api.kunavo.com/v1",
"apiKey": "{env:KUNAVO_API_KEY}"
},
"models": {
"claude-sonnet-5": {
"name": "Claude Sonnet 5",
"limit": { "context": 1000000, "output": 128000 }
}
}
}
}
}OpenCode can also override the baseURL of a built-in provider rather than declaring a custom one, its docs describe model metadata for known providers coming from Models.dev — so a hand-declared provider has to supply its own limit — and keys added through the /connect command land in ~/.local/share/opencode/auth.json. Kunavo publishes a setup page for this client: the OpenCode integration guide. There is no VT Code integration page here, and the TOML block above is a configuration reference assembled from VT Code's documented field definitions — neither client has been runtime-tested against Kunavo, and no compatibility is claimed for either. Keep a working route available, run one bounded task, and read the charge your account recorded before you switch a daily driver. Create a Kunavo account when you are ready to fund a key.
One installation warning that costs real time. The public npm package named vtcode is not the current VT Code: its dist-tag latest was 0.52.8, published December 24, 2025, while crates.io was on 0.165.0 on September 21, 2026. VT Code's installation documentation names a different npm path — npm install -g @vinhnx/vtcode --registry=https://npm.pkg.github.com — alongside cargo install vtcode and a Homebrew tap that needs brew trust vinhnx/tap before brew install vinhnx/tap/vtcode. The same doc warns that Windows artefacts are best-effort and may not appear in every release, while OpenCode's own install page recommends WSL on Windows — so neither is a first-class Windows tool on the strength of its own documentation.
Comparing further afield? Crush vs OpenCode takes the same OpenCode against Charm's agent, OpenCode pricing goes deeper on Zen and Go, and the OpenAI-compatible API reference covers the endpoint convention both clients rely on.
FAQ
Is VT Code the same thing as VS Code?
No, and the search results mix them constantly. VT Code is a terminal coding agent written in Rust, distributed as the vtcode binary from github.com/vinhnx/VTCode and the vtcode crate on crates.io. Visual Studio Code is Microsoft's editor. The confusion is made worse by the fact that VT Code publishes its own VS Code companion extension, whose display name in the extension manifest is literally "VT Code" — and that extension runs on its own version series, 0.50.14 in the repository on September 21, 2026, while the CLI was on 0.165.0 the same day. So "VT Code 0.50" means the editor extension, never the agent. Check which artefact a version number belongs to before you pin it.
Which OpenCode am I installing, v1 or v2?
It depends entirely on which page you followed, and on September 21, 2026 both were current. The repo README and the docs introduction still deliver the v1 line: curl -fsSL https://opencode.ai/install | bash, or npm install -g opencode-ai, whose dist-tag latest was 1.18.31 published September 14, 2026 — the newest entry in GitHub Releases. The marketing homepage and opencode.ai/download promote only v2: curl -fsSL https://opencode.ai/v2/install | bash, npm install -g @opencode/cli, or brew install anomalyco/tap/opencode-v2. The npm package @opencode/cli had dist-tag latest 2.0.12, matching repo tag v2.0.12, and no v2 tag has a GitHub Release entry. Neither line is a beta in the ordinary sense, and no dated official announcement declaring v2 generally available was found, so check the package name you are actually installing rather than trusting a version number quoted anywhere.
Which is cheaper, VT Code or OpenCode?
Neither client charges anything, so the client price is a tie at zero. OpenCode is MIT-licensed. VT Code's README states first-party code is MIT OR Apache-2.0 while GitHub's license detection reports Apache-2.0, and its only money surface is voluntary sponsorship. What you pay in both cases is model tokens at whatever endpoint you configure. The cost difference is created downstream: OpenCode ships two first-party wallets of its own — pay-as-you-go OpenCode Zen credits and a $10 per month OpenCode Go subscription with published per-model usage caps — while VT Code has no accounts, no tiers and no hosted service at all, so every token it sends is billed by someone else. Note also that the cheapest listed rate and the lowest cost to finish a task are different questions: a model that needs three attempts can cost more than a pricier one that lands first time.
Can I point VT Code at a custom OpenAI-compatible gateway?
Yes, through a [[custom_providers]] entry in vtcode.toml, and there is one rule that surprises people. VT Code's configuration field reference states that non-empty custom_providers values from repository-controlled workspace or project layers are rejected, and that provider endpoints must be defined in trusted system or user configuration or an explicitly selected config file. So a vtcode.toml committed at your repository root will not register a gateway. Use the platform user config, the Unix system layer at /etc/vtcode/vtcode.toml, or pass --config. The entry needs a name, a display_name and a base_url; the key is read from the environment variable you name in api_key_env; and api_format accepts auto, openai-chat, openai-responses or anthropic-messages, with the documentation stating an explicit value is honoured and does not silently fall back. Set context_window too, because an omitted value defaults to 128000 tokens and that figure drives the context display, automatic compaction and preflight checks.
Can I use an OpenCode Go subscription from inside VT Code?
VT Code ships the wiring; OpenCode has not validated VT Code as a client, and those are two different statements. VT Code's provider guide documents opencode-go as a built-in provider key with OPENCODE_GO_API_KEY and base URL https://opencode.ai/zen/go/v1, alongside opencode-zen. On the other side, OpenCode's Go documentation says traffic is monitored for abuse, asks clients to identify themselves with their own user agent and to send a stable session ID in an x-opencode-session header, and publishes a Validated Clients table listing Hermes, Claude Code, Codex, ZCode, Pi, jcode and Kilo Code CLI, plus a Known Problematic Clients table listing DeepSeek Harness, GitHub Copilot Chat, Kimi Code and MiMo Code. VT Code appears on neither table, and OpenCode's own caveat is that it does not guarantee listed clients will continue to work. Absence from a list is not evidence of breakage, and this page has no evidence either way. Also budget for the seat rule: only one member per workspace can subscribe to OpenCode Go.
How hard is it to migrate between VT Code and OpenCode?
The project instructions are the cheap half and the configuration is the expensive half. Both tools read an AGENTS.md at the project root — VT Code loads it into every turn and scaffolds one with vtcode init, and OpenCode generates one with /init and tells you to commit it — so the file describing your conventions moves across untouched. Nothing else does. VT Code reads TOML with array-of-tables provider blocks and merges nine configuration layers, from built-in defaults up through system, user, project profile, workspace and an explicit --config path, deep-merging tables while scalars and arrays are replaced by the higher layer. OpenCode reads an opencode.json data file whose provider entries name an npm AI SDK package per wire format. There is no converter, so a project-local setup is rewritten by hand. What this page could not establish is whether MCP server definitions, skills, plugins, custom agent definitions or session history carry across in any form, so it makes no claim about how long a migration takes beyond the config rewrite.
Is VT Code stable enough to standardise a team on?
Read the project's own status note first: the README says active development, with some automation flows experimental and subject to change between releases. The cadence backs that up rather than contradicting it — on September 20 and 21, 2026 the project published 0.164.0, 0.164.2 and 0.165.0, three releases inside about 27 hours, and the crates.io record moved with them. The README says it is built and maintained in spare time, with GitHub Sponsors and Buy Me a Coffee as the only funding surface — though the same README thanks a list of outside contributors, one of them credited with 52 commits, so it is one maintainer's project rather than one person's code. Scale is the other asymmetry: 852 stars against OpenCode's 209,102 on the same day. Stars measure attention, not quality, but a spare-time project led by one maintainer and a company-maintained one carry different bus-factor risk, and that is a procurement question rather than a technical one. Both repositories were active that day.
Checked September 21, 2026: the GitHub API for all three repositories plus VT Code's release list; npm dist-tags for opencode-ai, @opencode/cli and vtcode; the crates.io record for vtcode; VT Code's README, security model, provider guide, configuration field reference, installation doc and VS Code extension manifest on main; and OpenCode's permissions, providers, server, Zen, Go and download pages. Kunavo token rates come from the live catalog. Neither client was installed, run, or pointed at a Kunavo endpoint for this page, no benchmark or performance comparison was made, and none is claimed; every dollar figure here is illustrative token arithmetic rather than a measured task cost.