Rusta
Rusta v1.0.1

The Coding Agent Built
for Kimi, GLM & DeepSeek

A lean, native Rust coding agent for the terminal, built for Kimi (Moonshot AI), GLM (Z.AI) and DeepSeek models — with first-class Devscriptor code intelligence over MCP. Not another OpenAI-compatible shim: each request carries exactly the fields its endpoint documents.

Native Rust · one binaryPreserved ThinkingLive model cataloguesDevscriptor’s 75 MCP toolsOpen source · GPL-3.0-only
terminal
# Pick a provider, plan and key — verified, then saved
$ rusta init
# One headless prompt
$ rusta -p "Explain this repository"
# Or the interactive REPL
$ rusta
Rationale

Frontier models, lowest-common-denominator plumbing

Kimi, GLM and DeepSeek are among the strongest coding models available — and most agents reach them through a generic OpenAI-compatible interface that quietly discards what each one was built around. Rusta speaks each vendor’s own contract.

Reasoning is thrown away every turn

Generic client

A generic client drops the reasoning a model streamed once the turn is over, so the model re-derives what it already worked out.

Rusta

Preserved Thinking replays each stored reasoning block unchanged — what Kimi and GLM ask for, and what DeepSeek requires: a DeepSeek request that carries tools and drops the earlier reasoning fails with HTTP 400.

Reasoning effort goes where it is ignored — or refused

Generic client

A generic client sends one top-level reasoning_effort to every model. Kimi Code reads the level inside the thinking object and answers an unknown one with HTTP 400; GLM-5.3 runs at max, its costliest level, when the field is missing; each vendor has a ladder of its own.

Rusta

Rusta sends effort where each model reads it — thinking.effort on Kimi Code, a top-level reasoning_effort on Kimi’s platform K3 series, GLM-5.2 and newer, and DeepSeek — folded onto the levels the model lists, and never a value the endpoint would refuse.

Sampling is sent where it is fixed

Generic client

A generic client sends a temperature and a top-p. Every model Kimi serves fixes both and answers any other value with HTTP 400; DeepSeek ignores the temperature while it thinks.

Rusta

Rusta never sends sampling to Kimi — a configured value is dropped, with a warning — clamps GLM’s to the ranges Z.AI documents, and adds no temperature for DeepSeek.

The output budget is left to the endpoint

Generic client

A generic client sends no max_tokens. DeepSeek’s default is then 8K without thinking and 64K with it, which cuts a long reasoning reply short.

Rusta

Rusta always sends DeepSeek an explicit cap — the room the window has left, up to 256K — and compacts a DeepSeek conversation before it eats into that room.

Providers

Four providers, one binary

Each provider has its own wire handling in lm-bridge. Out of the box you get each vendor’s current coding model; --model and --base-url override it, whatever the billing implies, and any other --provider is rejected at startup.

--provider--billingDefault modelBase URL
kimisubscriptiondefaultkimi-for-codinghttps://api.kimi.com/coding/v1
kimiapikimi-k3.1-prohttps://api.moonshot.ai/v1
glm (zai)subscriptiondefaultglm-5.3https://api.z.ai/api/coding/paas/v4
glm (zai)apiglm-5.3https://api.z.ai/api/paas/v4
deepseek—deepseek-flashhttps://api.deepseek.com
openai—gpt-4o-minihttps://api.openai.com/v1

Two keys that look identical

Kimi and Z.AI sell the same models twice — a Coding Plan subscription and pay-per-token credits — so --billing picks the endpoint that takes your key. Kimi refuses the other plan’s key with an invalid_authentication_error that reads like a typo; Z.AI takes either and bills it by its type. --region china selects the mainland deployments. DeepSeek has one door.

Any OpenAI-compatible endpoint

--provider openai speaks any /chat/completions endpoint — OpenAI itself, a gateway, or a server of your own with --base-url. It reads the reasoning dialect each endpoint uses (reasoning_content, reasoning as GPT-OSS and vLLM send it, or reasoning_details) and echoes thinking back under the same key.

model, base_url and api_key belong to the provider they were configured for: switching provider derives them again, rather than sending a Kimi key to Z.AI.

Under the hood

What “provider-native” means, vendor by vendor

The endpoints, models, effort ladders, caching and services of each vendor, and how Rusta handles each of them. Pick a vendor.

Kimi (Moonshot AI)

--provider kimi, the default. Kimi sells its models twice — a Coding Plan subscription and pay-per-token credits — at separate doors, and names them differently at each: the billing picks the door, and with it the model.

API key
KIMI_API_KEY
Model override
--model · KIMI_MODEL_NAME
Keys from
kimi.com/code/console (Coding Plan) · platform.kimi.ai/console/api-keys (pay-per-token)

Endpoints

--billingDefault modelBase URL
subscription (default)kimi-for-codinghttps://api.kimi.com/coding/v1, or https://api.kimi.ai/coding/v1 for kimi.ai accounts
apikimi-k3.1-prohttps://api.moonshot.ai/v1, or https://api.moonshot.cn/v1 with --region china

Coding Plan models

Model idModelContextInputEffort (default)Plans
kimi-for-codingK2.8 Preview1,048,576image, videolow / high / max (max)Plus and above
kimi-for-coding-highspeedK2.7 Code Highspeed: ~6× speed, ~3× quota262,144image, videonone; always thinksPro and above
k3K31,048,576 from Pro, 262,144 on Plusimage, videolow / high / max (high)Plus and above
k3-256kK3, about half k3’s quota262,144imagelow / high / max (high)Plus and above
k3.1-proK3.1 Pro1,048,576 from Pro, 262,144 on Plusimage, videolow / high / max (high)Plus and above
k3.1-pro-highspeedK3.1 Pro Highspeed: ~2–3× speed, ~2× quota1,048,576image, videolow / high / max (high)Pro and above

kimi-for-coding is the Coding Plan’s name for Kimi’s current coding model, upgraded in place. Rusta defaults to it: every plan that includes coding runs it with a 1M window, while k3 and k3.1-pro get 1M only from Pro.

Pay-per-token models

Model idContextThinkingEffort (default)Dynamic tools
kimi-k3.1-pro1,048,576alwayslow / high / max (max)yes
kimi-k3.1-pro-highspeed1,048,576alwayslow / high / max (max)yes
kimi-k31,048,576alwayslow / high / max (max)yes
kimi-k2.7-code262,144alwaysnoneno
kimi-k2.7-code-highspeed262,144alwaysnoneno
kimi-k2.6262,144on requestnoneno

kimi-k3.1-pro, Kimi’s flagship, which the platform unlocks after a top-up of at least $1. All of them take images; video goes through Kimi’s Files API, which Rusta uses on the Kimi Code endpoints only.

Reasoning effort

You passKimi receives
ultra, max, xhighmax
high, mediumhigh
low, minimum, minimal, lightlow
off, none, disabledthinking off, or the lowest effort where it cannot be turned off
unset or unrecognizednothing, so the model default applies (Kimi answers an unknown effort with HTTP 400)

Sent only to models that list effort levels: inside the thinking object as thinking.effort on Kimi Code, where Kimi validates it, and as a top-level reasoning_effort, with no thinking object, on the platform’s K3 series. A model without the mapped level gets the nearest one it has.

Two Coding hosts, one key

The Coding Plan has two hosts — api.kimi.com for kimi.com accounts, api.kimi.ai for kimi.ai accounts — and each refuses the other’s keys with the same invalid_authentication_error a mistyped key gets. rusta init asks both and pins the one that accepts the key; an unpinned run whose key is refused tries the other host once; rusta doctor names the host. A refusal that names a plan limit — no K3 access, K3 past 256K, no HighSpeed — is reported as it is.

The live model list

Each model’s window, image and video input, thinking and effort levels come from the endpoint’s GET /models, cached per host for a day in ~/.cache/rusta/ and refreshed in the background, so a new model or a changed window needs no Rusta release. /provider refresh fetches it at once; the tables above are the fallback for a machine that has never reached the endpoint. /model lists the models with Kimi’s names (kimi-for-coding — K2.8 Preview).

Thinking off, where it can be

kimi-for-coding, kimi-for-coding-highspeed, k3, k3-256k and kimi-k2.6 get thinking: {"type": "disabled"} (Kimi Code serves the first four with K2.8 Preview, without thinking). K3.1 Pro answers disabled with HTTP 400, the platform’s K3 series has no off switch, and kimi-k2.7-code’s thinking cannot be disabled: these run at their lowest effort instead, as Kimi advises for K3.1 Pro.

Sampling left to Kimi

Every model Kimi serves fixes its temperature (1.0; 0.6 for kimi-k2.6 without thinking) and its top-p (0.95), and answers any other value with HTTP 400. So the Kimi provider sends neither: a configured temperature or top_p is dropped, with a warning once per run.

Prompt cache, kept warm

Every request carries a prompt_cache_key — the session id, or a per-run id. The platform bills each cache write for its K3 series once, for five minutes by default or an hour at twice the write price: an interactive session asks for 1h, since its turns wait on you, and a headless run takes 5m; --prompt-cache-ttl chooses. Kimi Code and the K2 models bill no writes. Changing effort mid-session invalidates the cache, so pick one per session.

Tools loaded mid-session

Models whose list marks dynamic tools — kimi-for-coding, the k ids and the platform’s K3 series — take a tool loaded with select_tools on a system message, so the request’s tool list, and the cached prefix with it, stays unchanged. Kimi’s own $web_search built-in is offered too, and passed through as Kimi’s builtin_function.

Schemas Moonshot accepts

Moonshot’s validator is stricter than OpenAI’s, and realistic MCP tool schemas bounce. Rusta rewrites each one before it is sent: local $refs dereferenced, circular references kept, unreferenced definitions dropped, missing types filled in, and enum/const conflicts with type repaired.

Confirmed model switches

On the Coding Plan, /model <id> confirms the switches Kimi asks to confirm — to K3.1 inside a session begun on another model, which lowers output quality and cache hits, and to K3.1 Pro Highspeed, at about twice K3.1 Pro’s quota. Kimi serves the rules itself. In a session that has begun, the reply offers /new, /compact, or the same command again; in a new one the switch is made at once, with Kimi’s note.

Kimi Code’s own services

With the same key: /search and /fetch back web_search, $web_search and web_reader (the page comes back as Markdown; if the fetch fails, Rusta fetches the page itself), /tools writes session titles, and /files takes images and video by reference — uploaded once, referenced as ms://<id> afterwards, and uploaded again if Kimi no longer has it. A transient 402 “Unable to verify membership benefits” is retried, as Kimi documents.

rusta init, with a Kimi Coding Plan key
$ rusta init

  Rusta setup

  Which provider?
    1) Kimi   (Moonshot)  — kimi-for-coding / K2.8 Preview, 1M context
    2) GLM    (z.ai)      — glm-5.3, 1M context
    3) DeepSeek           — deepseek-flash, 1M context, hybrid thinking, vision
    4) OpenAI-compatible endpoint
  Provider [1]: 1

  Which key do you have? (they are not interchangeable)
    1) Coding Plan subscription
    2) API credits (pay-per-token)
  Key type [1]: 1

  endpoint  https://api.kimi.com/coding/v1
  model     kimi-for-coding

  Create a key: https://www.kimi.com/code/console
  Paste your API key:
  checking… key accepted

  models on https://api.kimi.com/coding/v1:
    kimi-for-coding (K2.8 Preview), 1M context, image and video input, effort low/high/max (default max)
    kimi-for-coding-highspeed (K2.7 Code Highspeed), 256K context, image and video input
    k3 (K3), 1M context, image and video input, effort low/high/max (default high)
    k3-256k (K3-256k), 256K context, image input, effort low/high/max (default high)
    k3.1-pro (K3.1 Pro), 1M context, image and video input, effort low/high/max (default high)
    k3.1-pro-highspeed (K3.1 Pro Highspeed 2x Usage Cost), 1M context, image and video input, effort low/high/max (default high)

  saved to ~/.config/rusta/config.toml
  using kimi-for-coding on https://api.kimi.com/coding/v1

Open weights. Kimi publishes open weights for K3, K2.7 Code and K2.6 (moonshotai/Kimi-K3, moonshotai/Kimi-K2.7-Code, moonshotai/Kimi-K2.6). K3.1 Pro and the K2.8 Preview that kimi-for-coding serves have none.

Signature feature

Preserved Thinking

Carry a turn's reasoning into the next request instead of discarding it. Rusta replays each stored reasoning block back to the provider unchanged, which is what the vendors require — and each spells it differently. Rusta translates.

KimiGLM (Z.AI)DeepSeek
Wire fieldthinking.keepthinking.clear_thinkingreasoning_content, echoed in the history
Enabled"all"falsealways, on requests that carry tools
Disabledfield omittedtrue—
Sent tokimi-for-coding*, the Kimi Code k ids, kimi-k2.6 and newerevery thinking modelevery model
Default when unseton, whenever thinking is onthe endpoint decidesreplayed

Why it matters: a reasoning model that loses its reasoning every turn re-derives the same conclusions on the next one — spending tokens and time to arrive back where it started. Precedence is --thinking-keep → KIMI_MODEL_THINKING_KEEP → thinking_keep in the config file → the model's own default. A Kimi model whose schema lacks the field never receives it, and the platform's K3 series always keeps its reasoning and takes no thinking object at all.

Deep integration

Devscriptor, wired in on first run

Rusta detects an installed Devscriptor and registers it as the devscriptor MCP server — 75 tools, with no configuration.

Discovery and startup

  1. 1$DEVSCRIPTOR_BIN — an explicit path
  2. 2$PATH
  3. 3The platform install directories — /usr/local/bin, ~/.local/bin, /opt/homebrew/bin, …; on Windows, %LOCALAPPDATA%\Programs\devscriptor and the like
Started as devscriptor mcp in the session's working directory, with an explicit absolute --database — the workspace's devscriptor.db, or, in a monorepo package without one, the index further up the repository — a 60 s startup timeout and a 180 s per-tool timeout. An explicit [[mcp_servers]] entry named devscriptor always wins over detection. The detected server comes from your own install, not from the repository, so it needs no workspace trust. rusta doctor reports whether it was found.

Approvals that fit

A tool its server declares read-only runs without asking. Devscriptor declares 59 of its 75 — every search, navigation and LSP query — so those run freely, while in the default mode the 16 that change something (scans, notes, formatting, renames, pruning, server stops) are asked about. To let the routine ones run for the session:

# ~/.config/rusta/config.toml — the first matching rule wins
[[permissions.rules]]
name   = "devscriptor-index-and-notes"
tool   = "mcp__devscriptor__{scan_codebase,start_analysis,generate_embeddings,add_context_note,start_watching}"
action = "allow"
scope  = "session"

Formatting, renames, pruning and server stops still ask. Path sandboxing applies independently, so an allow rule never escapes allowed_paths; in a project's .rusta.toml, an allow rule applies only once you trust the folder.

The main tools at hand, the rest on demand. Devscriptor's 75 tools would swamp a tool table, so Rusta keeps the twelve that find and follow code there — search, definitions and references, relationships, the index's state and the Context Graph — and loads the rest with select_tools when needed. With Devscriptor connected, the system prompt carries its workflow — find code with it before grep, index first, record durable notes in the Context Graph — each conversation's first prompt comes with a reminder to start with it, and the explore and plan sub-agents get its read-only tools, so the agents that research code search it with Devscriptor too. A model reaches first for the tools it holds and for what comes with its task: on eight benchmark tasks run by three models, Devscriptor was called in 5 of 24 runs with every tool behind a loading step, and in 19 with the main tools at hand and the reminder.

The harness

Scaffolding that earns its keep

A good model still needs somewhere good to run. agent-core is the turn loop, the tool scheduler, the context manager and the guardrails — the same for every vendor.

Concurrent tool calls

The calls of one step whose resource accesses do not conflict — two reads of one file, edits of different files — run concurrently, and their results keep the order of the calls. Identical calls in one step run once.

Progressive tool disclosure

A large MCP server does not flood the tool table. A server with more than ten tools is deferred: announced by name and description, and loaded with select_tools when the model needs it — except the tools its preload list keeps in the table, which the model holds from the first request. deferred = true/false on a server, or default_deferred under [mcp], overrides the rule.

Compaction that summarizes

Past 90 % of the model’s window — 786,432 tokens on DeepSeek, which keeps 256K for output — the model writes a handoff summary: goals and constraints, decisions, commands run and files changed, what is still unknown, and the plan. Your oldest and most recent messages stay verbatim, with the live todo list and a pointer to the replaced lines in the records. A context overrun the provider reports, Z.AI’s 1261 included, takes the same path.

Repeated-call guard

A tool call repeated across steps draws a reminder at 3, 5 and 8 in a row, and on repeats interleaved with other calls; twelve in a row stop the turn. repeat_breaker = false turns both off.

Turns that hand the work back

max_turns (--max-turns, RUSTA_MAX_TURNS; default 100) caps a turn’s model round-trips. When it, or the repeated-call guard, stops a turn, the model gets one more step, with tools refused, to say what it completed, what is blocked and what comes next. The result carries a stop_reason.

Sub-agents and swarms

agent delegates to a sub-agent, and agent_swarm runs many at once — only when you ask for delegation, and swarms only in swarm mode, which you turn on. Delegation nests one level unless max_subagent_depth raises it. Each sub-agent keeps an agent_id and its records, so one that stopped, failed or ran past its deadline can be resumed.

Profiles and a model pool

Four profiles are built in — explore and plan (read-only), coder and default — and YAML profiles add your own. Declare [subagent.models] and the delegation tools gain a model parameter, so a file-locating sub-agent runs on a small fast model while the session stays on the flagship. An unknown alias fails the call rather than billing the flagship.

Forking a sub-agent

agent takes fork: true: the sub-agent starts from a one-time snapshot of the calling conversation, with its instructions, tools and model, so its first request repeats the caller’s prefix and hits the prompt cache. The agent call that created it is answered as “still executing when you were spawned; outcome unknown”, not left dangling.

Write safety

write_file overwrites only a file this agent has read and that has not changed on disk since — judged on length, modification time and a content digest, since the first two miss an equal-length rewrite inside one clock tick. edit_file needs its old_string to match exactly once. Creating a file needs no read.

Permissions and guardrails

Three modes — default, accept_edits, bypass_permissions — and ordered rules, the first match winning; a compound shell command is matched per segment. Writes to secrets (.env*, .ssh/, *.key, *.pem, …) and git push, reset, rebase, checkout -f and clean -f ask in every mode, --yes included. No command, hook or MCP server Rusta starts sees the variables it reads its API keys from.

Dangerous-command guard

In the default and accept_edits modes, bash asks before rm -rf, shutdown, mkfs, wipefs, dd to a device and the like — checked across the whole chain, sudo, sh -c, eval and command substitutions included — and before a command whose name is known only at run time. rm -rf on literal /tmp paths is exempt.

Workspace trust

A cloned repository’s .rusta.toml cannot start MCP servers, redirect requests or your key, loosen permissions or reach outside the folder until you trust it, and cannot declare hooks at all. An interactive session lists those settings and asks; a headless run leaves them out and says so. rusta trust trusts a folder ahead of time.

Plan mode, reviewed by you

Only you turn plan mode on — /plan, --plan, or plan = true. The agent researches and writes a plan, and every edit waits until you approve the plan in exit_plan_mode’s review, in every permission mode. A headless --yes run has nobody to review it: plan = true from the config is not applied there, and an explicit --plan ends the run with the plan unapproved and nothing edited.

Background work and scheduling

Background commands and sub-agents outlive the step that started them: task_list, task_output and task_stop manage them, and wait_for blocks inside the turn until one finishes. cron_create schedules a prompt, re-injected into this session when it is idle.

Bounded tool output

No single result floods the context: each is capped at 50,000 characters, with the full output saved to a spill file the model can read. read_file returns 100,000 characters a call by default, with the exact offset to continue from, and images are downsampled to 256 KiB and 2000 px.

Hooks

Run your own commands on session, turn and tool events — PreToolUse, UserPromptSubmit and Stop can block. Hooks live in your own config only, and fail open, so a broken script never blocks work.

Web content stays data

fetch refuses loopback, private, link-local and cloud-metadata addresses, checked after DNS resolution and on every redirect. A fetched page cannot pose as the harness: the system-reminder tags in web results are escaped, and the model is told web content is untrusted data.

Headless, REPL and sessions

Headless (-p) for scripts and CI, with --stream-json events, and an interactive REPL; a terminal UI builds with --features tui. Sessions are JSONL records, written by one process at a time: --resume continues one, rusta fork copies one, and rusta export packs one into a ZIP archive.

Tools

26 built-in tools

What a fresh agent has before a single MCP server is attached. MCP tools are namespaced mcp__<server>__<tool>.

Filesystem

6
read_filewrite_fileedit_filelist_dirglobgrep

Execution

1
bash

Web

2
fetchweb_search

Planning

2
todo_listexit_plan_mode

Delegation

2
agentagent_swarm

Background work

4
task_listtask_outputtask_stopwait_for

Scheduling

3
cron_createcron_listcron_delete

Goals

2
create_goalget_goal

Interaction

2
ask_userask_user_question

Media

1
read_media

Tool disclosure

1
select_tools

update_goal and set_goal_budget are registered too, but hidden until a goal is active. web_reader joins when the provider has a page reader — Kimi’s Coding Plan, Z.AI’s pay-per-token API, DeepSeek — and skill when skills are loaded. A tool that cannot work in the session is not offered at all. The table is pinned by a snapshot test, so adding or renaming a tool fails the build until its documentation is updated.

Setup

One command, a key verified before it is saved

rusta init asks which provider you use, which kind of key you hold and, where it matters, the region; verifies the key against the endpoint before writing anything; and saves ~/.config/rusta/config.toml with mode 600. If the endpoint rejects the key, it offers the other plan rather than leaving you to guess. Re-run it to switch provider or rotate a key — it edits the config rather than replacing it. It is scriptable too: echo "$KEY" | rusta init. Each vendor's tab above shows a real session.

Or from the environment: Kimi Coding Plan
export KIMI_API_KEY=sk-...
rusta
Or from the environment: GLM (Z.AI)
export ZAI_API_KEY=...
rusta --provider glm
Or from the environment: DeepSeek
export DEEPSEEK_API_KEY=sk-...
rusta --provider deepseek
Configuration

Configure once, or not at all

Rusta layers ~/.config/rusta/config.toml, then .rusta.toml in the session's working directory, then a --config file, each overriding the one below key by key. Environment variables override the files, and command-line flags override both. Every key is optional.

provider = "glm"
api_key  = "zai-..."

# Which quota the key is billed against: subscription (default) | api.
# This picks the endpoint, and with it the default model.
billing  = "subscription"
region   = "global"        # global (default) | china

# Both optional: leaving them out lets provider + billing choose the
# flagship and its endpoint. Set them to pin a specific one.
# model    = "glm-5.3"
# base_url = "https://api.z.ai/api/coding/paas/v4"

# Sampling / budget
thinking         = true
reasoning_effort = "high"  # none | minimal | low | medium | high | xhigh | max
max_turns        = 100

# Filesystem and context
allowed_paths                 = ["/srv/data"]
additional_dirs               = ["../sibling-repo"]
project_context_files         = ["NOTES.md"]
project_context_budget_tokens = 8192   # the default

permission_mode = "accept_edits"

# Sub-agents may run on a cheaper model than the session's own.
[subagent]
default_model = "fast"

[subagent.models.fast]
model            = "glm-5.3-flash"
description      = "Locating files, reading configs, simple lookups."
reasoning_effort = "low"

# Devscriptor is auto-detected — no entry needed here.
[[mcp_servers]]
name = "http-tools"
url  = "http://localhost:8000/mcp"

# Permission policy; the first matching rule wins.
[[permissions.rules]]
name    = "allow-cargo"
tool    = "bash"
command = "^cargo (build|test|check)"
action  = "allow"
Permission modes
default · accept_edits · bypass_permissions (--yes)
Reasoning effort
none · minimal · low · medium · high · xhigh · max
Subcommands
init · doctor · version · completions · sessions list · fork · trust · export

A project's .rusta.toml cannot start MCP servers, redirect requests, loosen permissions or reach outside the folder until you trust it. The full reference is in the configuration guide.

Open weights

Own the whole stack, if you need to

All three vendors publish open weights for models Rusta runs — Kimi K3, K2.7 Code and K2.6; GLM-5.3 and GLM-5.3-Flash; DeepSeek V4.1-Flash and V4-Pro — so a team that cannot send source code to an outside provider can serve one on hardware it controls. Each vendor tab names its models.

Point --provider openai --base-url at your own OpenAI-compatible server, such as vLLM, and Rusta runs against weights you host. Pair it with Devscriptor, which analyses code on your machine with no backend, and every layer of the stack stays inside your perimeter: the model, the code index, and the agent that drives them.

The model
Open weights, self-hosted
The code index
Devscriptor — a local SQLite file
The agent
Rusta — a single binary
Free & open source · GPL-3.0-only

Download Rusta 1.0.1

One self-contained binary per platform — no OpenSSL, nothing else to install. The terminal UI is not in the release binaries; build with --features tui for it.

Open source under the GNU General Public License v3.0: free to use, change and share, for personal and commercial work alike. Source on GitHub.

Rusta is not affiliated with or endorsed by the Rust Foundation or the Rust Project.

All Downloads

Linux

Intel/AMD (x64)

tar.gz archivev1.0.1

Linux

Apple Silicon / ARM64

tar.gz archivev1.0.1

macOS

Apple Silicon

tar.gz archivev1.0.1

macOS

Intel

tar.gz archivev1.0.1

Windows

Intel/AMD (x64)

zip archivev1.0.1

One self-contained binary

Every archive holds one folder with the license and a single rusta executable — the agent, the Kimi, GLM, DeepSeek and OpenAI-compatible providers, the MCP client and the REPL. Run rusta init to pick a provider and verify your API key, then rusta doctor to check the rest. Download, extract, and add it to your PATH — or build it from source.

Linux x86_64Linux aarch64macOS (Apple Silicon)macOS (Intel)Windows x86_64

Rusta 1.0.1 release notes and files on GitHub

Or build from source

With Rust 1.89 or newer:

git clone https://github.com/vladimirpesic/rusta.git && cd rusta
cargo build --release -p rusta-cli                  # target/release/rusta
cargo build --release -p rusta-cli --features tui   # with the terminal UI

Better together

Rusta drives the model. Devscriptor gives it a map of your codebase. Install both and the agent starts with 75 code-intelligence tools within reach. Together they resolved 75–81% of SWE-bench Multilingual with Kimi, GLM and DeepSeek models.