The agent harness
for your terminal.

A plugin-based coding agent with durable sessions, 11 built-in providers, and no login. Connecting a model takes one API key.

Get started GitHub
$npm install -g @amvelt/tvashta
Windows, macOS, and Linux. The package ships its full dependency closure, so nothing else is fetched at install time.
$pnpm add -g @amvelt/tvashta
The same package, installed through the pnpm global store.
$bun install -g @amvelt/tvashta
The same package. Bun places the binary shim on your PATH.
$yarn global add @amvelt/tvashta
The same package, through the Yarn global prefix.
$npm install -g ./amvelt-tvashta-0.1.1.tgz
Offline or air-gapped installs. Download the tarball from GitHub Releases and install it from disk.
Requires Node.js 22.19 or newer, with 24 or newer recommended. Verify with tvashta --version.
Native packages for winget, Homebrew, and the AUR are in progress and will be listed here once they are published.
tvashta
$ tvashta providers anthropic Anthropic ANTHROPIC_API_KEY not connected openai OpenAI OPENAI_API_KEY not connected google Google Gemini GEMINI_API_KEY not connected zai Z.AI ZAI_API_KEY not connected nvidia NVIDIA NVIDIA_API_KEY not connected openrouter OpenRouter OPENROUTER_API_KEY not connected opencode OpenCode Zen OPENCODE_API_KEY not connected deepseek DeepSeek DEEPSEEK_API_KEY not connected groq Groq GROQ_API_KEY not connected mistral Mistral MISTRAL_API_KEY not connected xai xAI XAI_API_KEY not connected Connect one: tvashta connect <provider> [--key <key>] Settings document: ~/.dsh/settings.yaml $ tvashta connect openai Connected openai. Key stored in ~/.dsh/settings.yaml (0600).
Why Tvashta

Everything a terminal agent needs. Nothing it does not.

Every capability is a plugin on a vendored Cordis core. The CLI boots ordered patch layers, runs entirely on your machine, and never asks you to create an account.

Keyless connect

Run tvashta connect openai, pick from the catalog, and paste a key. It is stored in settings.yaml with 0600 permissions and picked up on the next request.

Durable sessions

Every turn persists to a session log. A failed request keeps the session open, so you can retry, rephrase, or step away and resume without losing context.

Everything is a plugin

Shell stacks, filesystem tools, subagents, hooks, MCP clients, and workflows are composed by profile patches, and extended without forking the harness.

One command feel

A single tvashta command on Windows, Linux, and macOS. It installs from one line and runs like a native tool.

Local-first secrets

Keys live in your home settings document and travel only to the provider you chose. Project .env layers work too.

Fails loud

An unknown provider, a missing key, or a bad profile errors at the earliest resolvable point, with the valid options listed.

11
providers
0
accounts required
3
platforms
1
command
Providers

Eleven connectors. One API key each.

Predefined base URLs and default models ship built in. An unknown id fails loud with the valid list.

Anthropicanthropic
OpenAIopenai
Google Geminigoogle
Z.AIzai
NVIDIAnvidia
OpenRouteropenrouter
OpenCode Zenopencode
DeepSeekdeepseek
Groqgroq
Mistralmistral
xAIxai
Usage

One command does the work

CommandWhat it does
tvashtaOpen an interactive session in the default profile. Type a message, read the answer, repeat. /exit quits.
tvashta "<task>"Answer one task in a fresh durable session, print the result, then exit.
tvashta providersList the predefined providers and whether each one is connected.
tvashta connect <provider>Store a provider API key in the settings document. Add --key to pass it inline.
tvashta --profile <name>Boot a named profile. Everything after your flags belongs to the booted app.
tvashta --dump-configPrint the composed profile tree and exit without booting.
tvashta plugin add <pkg>Install a plugin into the profile. Forwards to pnpm.
tvashta --versionPrint the installed version.
Guide

How it fits together

Profiles

Ordered stacks of plugin-bundle patch layers under $DSH_HOME/profiles/<name>, plus your own cordis.patch.yml. The default headless profile auto-initializes on first use. Inspect any composition with tvashta --dump-config.

Sessions

Runs persist a session log per home directory, not per terminal. Interactive sessions keep history across turns. One-shot runs exit nonzero unless the turn completed.

Keys and settings

$DSH_HOME/settings.yaml holds provider keys, and connect writes it with 0600 permissions. $DSH_HOME/.env and the project .env layer environment variables beneath it. Settings win over env.

Plugins

Bundles mount capabilities: bash and pwsh stacks, filesystem tools, code runtime, subagents, LSP, and MCP. Install one into a profile with tvashta plugin add, then compose it in your patch layer.

Docs

Go deeper