Skip to content
CLI Tool Actively developed

smith

smith is a fast, local-first LLM Agent Harness written in Crystal

smith in a terminal
smith in a terminal
  1. v0.4.0 · Sep 2026 · Latest

    v0.4.0

    Added

    • Chat commands with autocomplete: new built-ins /help, /clear, /sessions, /resume <session> and /quit join /plan, /normal, /rewind, /context and /rename. In the fullscreen UI, typing / opens a popup that filters built-ins and skills as you type — ↑/↓ select, Tab completes, Enter runs, Esc dismisses. /resume switches sessions inside the running loop; /clear wipes the context and the screen.
    • MCP over HTTP: entries in mcp.json with a type of http/sse or a bare url connect via Streamable-HTTP POST instead of spawning a subprocess — JSON and SSE answers alike, the session id the server assigns carried on every later request, bearer tokens from the environment via ${VAR} header expansion. Everything the stdio path already had applies unchanged: approval gate, untrusted marking, restart-once, per-call timeout (#84).
    • smith stats: aggregates cost and tokens across all saved sessions from the index alone — a grand total, a prompt/completion/cache split and a per-provider/model breakdown. Unknown rates add tokens but show n/a, never a guess; [pricing] overrides from config apply (#85).
    • Session hygiene: smith sessions delete <ref>… removes sessions by name or id — file, directory and index entry — and smith sessions prune drops sessions older than --older-than (30d default) while keeping --keep-last N; both support --dry-run. The newest session is never pruned, and [sessions] retention_days prunes at startup (#82).
    • Cost per session: smith sessions shows a COST column per row, priced from the index and honouring [pricing] overrides; unknown models and entries predating usage tracking show n/a (#83).

    Changed

    • The fullscreen UI now sits on anvil: text, editor and popup layers, the event loop, terminal handling and the live region come from the published anvil and termisu libraries — smith keeps the domain: what keys mean while a popup is open, the status line, the event-stream-to-blocks renderer and the gates. src/smith/ui shrank from 2 699 to 1 392 lines.
  2. v0.3.0 · Sep 2026

    v0.3.0

    [0.3.0] — 2026-09-01

    Added

    • Bash Sandbox (macOS): bash is confined to the project via sandbox-exec — writes outside it fail, reads can be denied per path, and confined commands can skip the approval prompt entirely (--yes stays meaningful). Configured via [sandbox] in config.toml; smith sandbox shows what is in force (#79).
    • Image & PDF input, on three paths: @screenshot.png attaches the file itself (#72), a tool result can carry an image (#73), and an MCP server may answer with one (#78). The format is decided from the magic bytes, not the extension or a claimed mimeType; PDFs go to Anthropic natively.
    • Raw transcript log: every message is appended to transcript.jsonl beside the session before compaction can touch it — the untouched record of a run (#58).
    • Context compaction, deeply and rarely: instead of shallowly every turn, compaction now acts in stages — stale thinking, superseded reads and staged caps reclaim context gently (#55, #58).
    • Prompt caching through OpenRouter: caching works on the OpenRouter route to an anthropic/ model too, with two breakpoints instead of three (#70).
    • Releases ship binaries: tags now build signed release binaries for Linux and macOS in CI and attach them to the GitHub release.

    Changed

    • Checkpoints are anchored to a message id, not a position in the transcript — rewinding stays correct across compaction (#59).
    • bash output names the git boundary where checkpoints cannot reach, and the git root is recognised when .git is a file (worktrees) (#75, #77).

    Fixed

    • read_file refuses binary files instead of inlining their bytes (#67).
    • Headless runs get the checkpoints they already had a session for (#68).
    • Dropped the headless branch bash job logs never took (#71).
    • The Makefile builds on Linux too.
  3. v0.2.0 · Aug 2026

    v0.2.0 — providers, permissions and a fullscreen UI

    ⚒️ Smith v0.2.0 — the release where the harness grew up: it talks to four providers, runs a fullscreen terminal UI, and asks before it changes anything.

    46 commits since v0.1.0.

    Providers & models

    • Native Anthropic Messages API and native OpenAI API providers, alongside OpenRouter and a new Ollama provider for local models.
    • Each provider defines its own default model, so -m is an override rather than a requirement.
    • Streaming (SSE) for every provider — tokens appear as they are produced.
    • Prompt caching for Anthropic: the system prompt and tool definitions are cached across turns.
    • Thinking / reasoning blocks are requested, parsed and shown for Anthropic and OpenAI.
    • Auto-continue when a response is cut off at the output-token limit, instead of handing back a truncated answer.
    • HTTP timeouts on every provider call, and a Ctrl+C that saves the session before it exits.

    The fullscreen terminal UI

    Interactive sessions on a real terminal now render through a fullscreen interface. The transcript stays in the terminal's scrollback — copyable, searchable, no alternate screen — while the bottom of the screen carries a live region: streaming text, running tools with spinner and elapsed time, a status bar with model, mode, tokens and cost, and the input line.

    • Enter submits, Esc clears the input, Up/Down walks prompt history, Ctrl+L redraws from scratch. Resizing the window redraws it too, once the drag has come to rest.
    • While the agent works, Esc asks it to stop; a second press within two seconds exits.
    • Approval, plan review and the hooks trust prompt are panels answered with a single key — nothing reads from plain stdin any more.
    • --no-tui falls back to the line renderer. Headless smith run stays plain, so its output remains scriptable.

    Deciding what the agent may do

    • Approval gate for mutating tools (bash, write_file, edit_file), with an allowlist for commands you trust.
    • Fine-grained permission rules — allow / ask / deny with path scoping.
    • Plan mode (--plan, or /plan in chat): research first, act only after the plan is approved.
    • Hooks as extension points around the agent loop (PreToolUse, PostToolUse, Stop and friends), gated behind a one-time per-project trust decision.
    • Checkpoints & rewind: undo a run's file changes, one step at a time or back to the start.

    Tools

    • Background bash jobs — dev servers and long builds keep running, with auto-backgrounding instead of a kill.
    • web_fetch and web_search, with an SSRF guard and Brave / Tavily / SearxNG adapters.
    • todo_write for structured multi-step plans.
    • MCP client (stage 1): stdio transport, tools/list and tools/call, so MCP servers register as ordinary smith tools.
    • Custom agent definitions in .smith/agents/<name>.md, plus bounded subagent nesting depth and a shared spawn budget.

    Sessions & context

    • ~/.smith/config.toml with a documented precedence chain, instead of hardcoded defaults.
    • Transcript compaction to stay inside the context window.
    • Session ergonomics: names, -c to continue, smith context for a token breakdown, cost reporting and a spend budget, and fork.
    • @-mentions embed files directly in the prompt, with budgets and a path guard.
    • --json for machine-readable headless output.

    Fixes worth naming

    • A background job's exit notification could crash the fiber that reported it.
    • An empty model response was swallowed silently instead of being shown.
    • rewind undid the whole session where it should have undone one step.
    • Hook stdin is written directly rather than handed to Process as an IO.
    • Assistant messages with neither content nor tool calls are never sent.

    Install

    tar -xzf smith-v0.2.0-darwin-arm64.tar.gz
    mv smith ~/.local/bin/
    

    The attached binary is macOS arm64, ad-hoc signed — built with Crystal 1.21. On other platforms, build from source with make release.

    Full changelog: https://github.com/webmatze/smith/compare/v0.1.0...v0.2.0

  4. v0.1.0 · Aug 2026

    v0.1.0 - Initial Release

    ⚒️ Smith v0.1.0 - Initial Release of the fast, local-first LLM Agent Harness written in Crystal.

    ✨ Features

    • Policy-Free Core Loop (): Complete decoupling of agent loop, LLM provider, tools, and CLI.
    • Fiber-Based Parallel Tool Execution (): Concurrent execution of parallel-safe tools (read_file, grep, glob) via Crystal Fibers (spawn & Channel).
    • Subagent Supervision (Smith::Subagents): Parent agent can delegate subtasks to autonomous child subagents running in isolated fibers in work (full capabilities) or inspect (read-only) mode.
    • OpenRouter Provider (Smith::LLM): Default model qwen/qwen3.8-max with exponential backoff retry logic.
    • Project Context & Skills Catalog: Automatically loads SMITH.md / AGENTS.md and expands -name or /#skill-name references at runtime.
    • Session Persistence (Smith::Session): Saves local conversation history under ~/.smith/sessions/ with seamless smith list and smith resume capabilities.