Distill Terminal Coding Agent
A terminal coding harness that edits repositories, runs commands, and routes work across model tiers to reduce token use.
Per-dimension scores and reasoning
Least privilege scores 1: the release workflow uses contents: read and raises only the publishing job to contents: write, but runtime file, network, shell, and sandbox privileges are not shown. User confirmation scores 1: a PTY scenario shows a user-entered “!” command labeled “Run (user),” but no confirmation gate is evidenced for agent-initiated high-impact actions. Data-flow transparency scores 0: auth, telemetry, Mixpanel, HTTP, and cloud-storage components are named without disclosing what data is sent, where it goes, or how collection is disabled. Sensitive-data handling scores 1: dedicated secrets, auth, and extra-CA modules exist, but storage, redaction, logging, and lifecycle controls are not shown. Dependency security scores 2: builds use --locked, Git dependencies pin revisions, and downloaded protoc archives receive SHA-256 verification; deductions apply for the very large dependency surface, a short Git revision, major-tag-only GitHub Actions pins, and an unpinned Homebrew tool install. External effects score 1: user shell execution and release uploads are visible, but the agent's possible file changes, commands, network calls, and service interactions are not systematically disclosed. Rollback scores 0 because no recovery mechanism for file edits, command side effects, or session actions is shown. Source attribution scores 2: the license names SpaceXAI and the Distill modifier, Cargo marks modifications, and releases include NOTICE and third-party notices; the upstream relationship and complete modification scope remain unclear.
Self-consistency scores 2: Distill naming, workspace modules, TUI scenarios, and the released binary broadly agree, and README.en consistently redirects to the main README; the absent main README and residual GROK configuration names reduce clarity. Dependency availability scores 2: four macOS/Linux targets, locked builds, pinned and verified protoc, caching, and an installer test are present; Git dependencies, system packages, Homebrew protobuf, the large dependency graph, and no Windows release target prevent full credit. Failure messages score 1: the workflow includes an explicit “protoc checksum mismatch,” version assertions, and timed PTY assertions, but no evidence covers user-facing runtime, authentication, provider, network, or tool-failure messages.
Audience and scenarios score 2: the evidence clearly targets coding and terminal users and covers shell output, prompt entry, terminal resizing, and multi-platform releases; skill levels, representative workflows, and unsuitable scenarios are not documented here. Capability boundaries score 1: module names expose broad shell, MCP, memory, plugin, telemetry, and workspace capabilities, but defaults, permission boundaries, and unsupported behavior are not stated. Trigger precision scores 2: “!” command execution, tag-driven releases, and terminal-height thresholds have concrete triggers and regression scenarios; ordinary agent tool-selection and hazardous-action triggers are absent. Environment fit scores 2: tests cover multiple terminal sizes and releases cover four macOS/Linux architecture combinations, with Windows dependencies declared; no Windows artifact, prerequisites guide, or compatibility matrix is supplied.
Information architecture scores 1: the workspace is grouped into build, codegen, common, third_party, and prod areas, but it is extremely broad and the supplied user-facing README is only a redirect to an unavailable file. Install notes score 1 because README.en asserts that installation, upgrades, and provider setup exist, but the actual instructions cannot be inspected. Naming stability scores 2: crates and artifacts consistently use the distill prefix; residual GROK_VERSION and GROK_CONTEXTUAL_HINTS names impose configuration ambiguity. Examples and FAQ score 1: PTY scenarios offer concrete interaction examples, but they are test fixtures rather than user tutorials or an FAQ. Known limitations score 1: comments document small-terminal compaction, release-profile distinctions, and CI lint compromises, but no consolidated user-facing limitations are present. License scores 3: the complete Apache-2.0 text, copyright notices, Cargo metadata, and release packaging agree without an evidenced gap. Versioning and changelog score 2: a dedicated version crate feeds tag validation, releases verify tags, and release notes are generated; no standalone changelog or compatibility and migration history is supplied. Maintenance responsibility scores 1: Samuel Fajreldines is identified as modifier, a HackerOne route is stated, and the release path is defined; publisher identity remains unknown, the HackerOne URL is only a generic “x,” and no maintenance team, support scope, or response commitment is given.
Output usability scores 2: PTY regressions cover clean ANSI rendering, reversible compact layout, and immediate bracket input, showing concrete attention to terminal usability; complete agent outputs and real task outcomes are absent. Marginal value scores 1: the broad module set and lightweight-TUI positioning suggest value beyond a plain chat interface, but no comparison substantiates the token-efficiency claim. Cost-benefit scores 1: the product claims more work with far fewer tokens and its compact UI may improve interaction, but no token, latency, resource, or task-success measurements are supplied, while the large workspace and dependency surface imply meaningful build and maintenance cost.
Claim traceability scores 1: named PTY scenarios support specific interface behaviors, and the workflow supports build and release statements; the central “FAR FEWER tokens” claim has no benchmark, data, or matching test. Cross-source corroboration scores 2: Cargo, LICENSE, the release workflow, and PTY tests jointly corroborate product identity, Apache licensing, multi-platform builds, and TUI behavior; the missing main README and implementation files prevent corroboration of safety and product claims. Fact/inference separation scores 1: tests and build comments generally distinguish expected behavior and configuration rationale, but the marketing efficiency claim is not identified as unverified and several capabilities can only be inferred from module names.
- The main README and runtime permission implementation are absent, so installation, provider configuration, sandboxing, confirmation gates, and default external effects cannot be verified.
- The repository names telemetry, Mixpanel, auth, secrets, HTTP, and cloud-storage components, but the supplied material gives no data inventory, destinations, retention policy, or opt-out procedure.
- The “FAR FEWER tokens” claim has no benchmark, measurement method, or results and should not be treated as a verified cost advantage.
- The supply-chain surface is large; despite pinned Git revisions and protoc checksum verification, major-tag Actions, Homebrew tooling, and numerous dependencies need separate auditing.
- The HackerOne address in SECURITY.md is only the generic “x”; confirm that it belongs to this project before submitting sensitive reports.
- No evidence shows rollback for file or command side effects; evaluate it in a controlled, versioned workspace with minimal credentials.
What does this agent do, and when should you use it?
Distill is a lightweight terminal coding harness and TUI maintained by Samuel Fajreldines. It reads a codebase, edits files, executes commands, and keeps the working conversation inside the terminal. Version 2.0.0 supports Grok, ChatGPT, OpenRouter, and locally hosted OpenAI-compatible model servers. Its three model tiers separate the main Reasoning model from an optional same-conversation Worker and a Utility model that receives bounded extraction, summarization, and compression tasks. A decision layer named Jev routes eligible work and controls automatic effort selection, while failed, timed-out, or low-confidence decisions fall back to the harness's normal path. Distill is delivered as prebuilt macOS and Linux binaries or as a Rust source build, with profiles, credentials, and sessions stored locally.
After the user launches distill in a terminal, the harness can inspect the current codebase, edit its files, and run commands in response to the conversation. The Reasoning model handles the main conversation, difficult reasoning, and code changes by default; when a compatible Worker model is configured, Jev may send suitable calls to it without moving them out of the conversation. The Utility model receives bounded inputs such as tool results, log excerpts, and candidate lists for literal extraction, log digestion, text compression, candidate-ID selection, and classification. Distill validates these results before use and falls back to its normal path when a result is rejected. The e_retention route selects material to retain from large outputs, while b2_local_model can hand over a complete call when capacity and context checks permit. Jev chooses only among candidates supplied by the code and does not control permissions; plan mode, auto approval, YOLO, and permission policies remain the responsibility of the Distill harness.
- A developer who wants to inspect a repository, modify files, and run commands without leaving the terminal.
- A ChatGPT, Grok, or OpenRouter user who wants one coding interface with selectable models and reasoning efforts.
- A developer who wants an optional lighter Worker to handle eligible calls while retaining a stronger Reasoning model for complex changes.
- A team operating an OpenAI-compatible local server that wants to connect it to a terminal coding workflow.
- A user processing large command outputs or logs who wants checked extraction, summarization, and retention before the original text is discarded.
What are this agent's strengths and limitations?
- It documents direct support for Grok, ChatGPT, OpenRouter, and local OpenAI-compatible servers instead of requiring one model provider.
- The Reasoning, Worker, and Utility tiers separate difficult code work, eligible same-conversation calls, and bounded mechanical tasks.
- Utility outputs receive task-specific checks for details such as literal paths, error messages, quoted spans, and supplied IDs before use.
- Failed, timed-out, low-confidence, or rejected decisions fall back to the normal execution path, with per-turn failure limits for routes.
- The release installer verifies checksums and tests the binary before activation, while upgrades preserve settings, credentials, and sessions.
- Answer generation still requires either a reachable provider model or a separately operated local model server.
- Reasoning and Worker models must share a compatible base URL, API backend, and credential scheme, limiting arbitrary provider combinations.
- Prebuilt Linux releases require glibc; other Linux environments must use a source build.
- Source installation adds Rust, C/C++ compiler, CMake, pkg-config, and Protocol Buffers requirements.
- OpenRouter availability and charges remain provider-controlled, and a separately configured Jev decision endpoint needs its own credentials.
How do you install or deploy this agent?
On macOS or Linux, install a release binary with:
curl -fsSL https://raw.githubusercontent.com/samuelfaj/distill/main/install.sh -o /tmp/distill-install.sh
sh /tmp/distill-install.sh
export PATH="$HOME/.local/share/distill/bin:$PATH"
distillThe installer selects the binary for the detected OS and CPU, verifies its SHA-256 checksum, and runs --version before activation. Prebuilt targets cover Apple Silicon and Intel Macs plus glibc-based Linux on x86_64 and ARM64. Install version 2.0.0 with DISTILL_VERSION=2.0.0 sh /tmp/distill-install.sh, or set DISTILL_INSTALL_DIR to choose another location. A source build requires the Rust toolchain specified by rust-toolchain.toml, a C/C++ compiler, CMake, pkg-config, and Protocol Buffers:
git clone https://github.com/samuelfaj/distill.git
cd distill
cargo build --locked --release -p distill-pager-bin --bin distill
./target/release/distillHow do you use this agent?
Run distill to open the TUI. Opening it requires no provider login, but generating an answer requires a reachable model. Use the separate home-screen login actions for Grok, ChatGPT, or OpenRouter; OpenRouter can alternatively use OPENROUTER_API_KEY. Configure tiers from Model tiers or with /tiers, /model, /worker-model, and /utility-model, for example:
/model gpt-6-astra auto
/worker-model gpt-5.6-luna auto
/utility-model openrouter-qwen37 autoFor a local model, first start an OpenAI-compatible server, then add its model ID, base_url, and api_backend = "chat_completions" to the profile's config.toml. New profiles default to ~/.distill; DISTILL_HOME selects another directory. Start Distill from the repository you want it to work on and submit code-reading, file-editing, or command-execution requests through the terminal conversation. To inspect routing decisions, run GROK_LOG_JEV=1 distill; records are written to logs/jev.jsonl under the active profile.
How does this agent compare with similar options?
Compared with a terminal coding setup that sends every request to one main model, Distill can route eligible calls to a same-conversation Worker and assign bounded extraction, summarization, or compression jobs to a Utility model. Unlike an exclusively cloud-hosted setup, it can also use a local OpenAI-compatible server, though the user must operate that server and stay within its capacity and context limits.
FAQ
Can Distill work without signing in to a model provider?
Can Jev approve commands or bypass permission prompts?
What happens when a routing decision fails?
Can the Worker use an unrelated provider connection?
Does upgrading remove configuration or sessions?
distill update or rerunning the installer preserves settings, credentials, and sessions, although open Distill sessions must be restarted.