Vtx is a coding agent harness. Give it a goal and a working folder, and it reads files, runs commands, edits code, and works through multi-step tasks without stopping to confirm each one. The same core runs three ways: a keyboard-driven TUI, a headless CLI for scripts and CI, and a Python SDK for embedding.
It ships 11 packages under the single vtx-coding-agent distribution, with 62 providers,
14 tools, and an agent runtime whose every subsystem is replaceable without editing the
harness.
Quick start
uv tool install vtx-coding-agent
vtx # terminal UI
vtx -p "add tests for vtx.git" # headless, one task, then exit
Python 3.12 or newer. The console script is vtx.
Connect a model with --provider and --model, or export a key and start:
export ANTHROPIC_API_KEY=sk-ant-...
vtx --provider anthropic --model claude-sonnet-4-5
Resume a session with vtx -c, or a specific one with vtx -r <id>.
What makes it different
Everything is a row. vtx boots a plugin composition: a profile's ordered bundles,
then its own patch layer, then --patch overlays, last write per row id. The tool
registry, the provider seam, the session log, the permission gate, and the agent loop are
all rows, so each is replaceable from configuration rather than by forking the harness.
vtx --dump-config # the composed row list
vtx plugin --profile default disable tool-grep
vtx --profile minimal # a four-row composition, for embedding
A plugin declares what it needs with inject and registers through a context that records
teardown, so unmounting a row unwinds exactly what it registered.
It extends itself. Vtx ships a skill that teaches the model which surface to reach for when it lacks a capability - a directory of instructions, a plugin row that registers a real tool, or an extension file - and mounts it in place. It will not upgrade the Vtx package itself; that stays a user action.
The sandbox is honest about what it is. A codemode script runs in a separate worker
process as you, with the full standard library, the filesystem, subprocesses, and the
network. There is no interpreter-level confinement and none is attempted. What a script
cannot reach is the host's own state, because that lives in another process - so a
deadline is a kill, not a cooperative request.
62 providers, 16 API families. The catalog ships 62 providers across 16 API families;
--provider takes a family name, and dropping a YAML file into ~/.vtx/providers/ adds
your own.
Sessions are durable and branchable. Resume the last one, fork a new one mid-task to explore a different approach, and revert a turn with snapshots.
Documentation
Full reference, generated from the source:
| Quickstart | Install, connect a model, finish a first task |
| How Vtx works | The composition, the agent loop, how a tool reaches the model |
| Tools | Every tool, its exact parameter schema, and worked examples |
| CLI | Every flag, subcommand, and exit code |
| Configuration | The config file and every field |
| Providers | The catalog, auth modes, OAuth, local and custom models |
Using it
| Slash commands | Keybindings |
| Sessions | Goals |
| Agents & sub-agents | Headless / CI |
Extending it
| Skills | A directory of instructions the model loads on demand |
| Plugins | A row that can register a tool, command, hook, or replace a core service |
| Extensions | The ExtensionAPI surface, for providers and renderers |
| Codemode | The sandbox and its tool-exposure model |
Building on it
| SDK | Run Vtx inside your own application |
| Development | Repo layout, the lint and test commands, how to add a tool or a row |
| Storage layout | Every path Vtx writes to on disk |
Packages
| Package | Description |
|---|---|
| @vtx.plugins | The plugin kernel: Context, EventHub, plugin rows, patch layers, profiles, boot composition |
| @vtx.protocol | Leaf. Message, stream, and tool-contract types. Imports nothing from vtx |
| @vtx.telemetry | Leaf. Spans, processors, console and JSONL exporters |
| @vtx.git | Git and GitHub integration: gh CLI wrapper, GitHub App auth |
| @vtx.core | Agent events, permission gate, compaction, config schema and paths, theme registry |
| @vtx.ai | The LLM layer: provider catalog, OAuth, SDK adapters, model catalog, tool parsing |
| @vtx.codemode | The script sandbox and its tool-discovery layer |
| @vtx.mcp | MCP client: server config, transports, tool exposure, trust prompt |
| @vtx.tui | Base terminal-UI toolkit: editing, fuzzy matching, overlays, block renderers |
| @vtx.agent | Product-neutral harness: loop, turn engine, sessions, tool registry, prompts, hooks, goals, SDK |
| @vtx.coding_agent | Product layer: CLI entry point, headless runner, filesystem tools, the TUI app |
Dependencies flow protocol and telemetry into core, git, and ai; those into
agent; agent into coding_agent, with mcp, tui, and plugins above. Each package
carries its own README with the public surface and internal notes.
Twelve tools are on by default - read, edit, write, bash, find, skill,
web, ask_user, tool_search, codemode, goal, delegate_subagent - resolved by the
composition, not by a constant. grep and web_search are registered but off. The
sub-agent tool is defined internally as task and exposed as delegate_subagent. Agent
profiles load only from .vtx/agent/<name>.py; none ship built in. Configuration lives in
~/.vtx/config.yml.
Contributing
AGENTS.md holds the project rules for humans and agents alike. In short:
uv run ruff format .
uv run ruff check .
uvx ty check .
uv run python -m pytest path/to/test_file.py # one file, not the full suite
Run a single file's tests rather than the full suite; it is slow and resource intensive. See docs/development.md.
License
Metadata
Release files for vtx-coding-agent 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vtx_coding_agent-1.3.0.tar.gz | 4.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vtx_coding_agent-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 5.4 MB
Release files / vtx_coding_agent-1.3.0.tar.gz
| Download URL | vtx_coding_agent-1.3.0.tar.gz |
|---|---|
| Size | 4.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4610af09f494d74a23362089d0484f4ad180dd7f45a1b53482ccdbe8e04722f
|
|
BLAKE2b-256 checksum How to use checksums |
3ee00728e97b917defd18961330097f16f2cc21e4d78c7bdf44865b8a77729b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Zorin OS","version":"18","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / vtx_coding_agent-1.3.0-py3-none-any.whl
| Download URL | vtx_coding_agent-1.3.0-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eef019ae10ce2181becd45d52be561edf907ec5e19d5472368de3ab17abf27f0
|
|
BLAKE2b-256 checksum How to use checksums |
2ab93d1e2c08264f5c4e560bc213555bef0d1f4784decbdfcc1714c30342b339
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Zorin OS","version":"18","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|