Skip to content

letscode

A minimal, OpenAI-compatible coding agent for the terminal, written in Python.

Point it at any OpenAI-API-compatible endpoint (Ollama, Fireworks, OpenRouter, vLLM, llama.cpp's llama-server, …) and get a streaming agent loop with the four tools that cover 95% of coding sessions: read, write, edit, bash. Plus skills, slash commands, and a plugin system you can extend.

Using an AI coding tool?

letscode publishes an llms.txt index and a self-contained llms-full.txt reference following the llmstxt.org convention. Point your agent at those for the whole surface in one fetch.

  • Get started in 60 seconds


    Install, set an API key, type a prompt.

    Getting started

  • Configure to your taste


    User and project TOML, env vars, CLI flags: predictable precedence.

    Configuration

  • Extend with plugins


    Pluggy + entry points. Bring your own tools, commands, skills, frontends.

    Plugin authoring

  • Understand the model


    Stable contracts, ten hooks, versioning rule, what's internal vs public.

    Extension model

What it is

A three-layer Python application: LLM client at the bottom (openai.AsyncOpenAI with base_url set), agent loop in the middle (event-driven async generator, parallel tool execution, hooks for everything), basic terminal frontend on top (prompt_toolkit + rich). Plugins extend any layer.

flowchart TD
    User[User input] --> Frontend
    Frontend[Basic TUI<br/>prompt_toolkit + rich] --> Agent
    Agent[Agent loop<br/>event-driven async] --> LLM
    LLM[LLM client<br/>OpenAI Chat Completions] --> Provider[(Any OpenAI-<br/>compatible<br/>endpoint)]
    Agent --> Tools[Built-in tools<br/>read · write · edit · bash]
    Plugins[(Pluggy + entry points)] -.extend.-> Tools
    Plugins -.extend.-> Frontend
    Plugins -.lifecycle hooks.-> Agent

What it isn't

Deliberate non-goals

  • Not a Claude Code competitor. Anthropic ships its own first-class harness; letscode is for people who want a small, hackable Python harness against whatever endpoint they prefer.
  • Not a framework. It's an application. The plugin system shapes this app; it isn't a library for building agents.
  • No subscription OAuth flows, no bespoke package manager, no permission popups, no built-in to-dos. See the full list.

Providers

letscode speaks the OpenAI Chat Completions wire format, so any endpoint that implements it works without per-provider code paths.

export OPENAI_API_KEY="sk-..."
letscode --model gpt-4o "your prompt here"
export OPENAI_BASE_URL="http://localhost:11434/v1"
export OPENAI_API_KEY="ollama"  # any non-empty string
letscode --model llama3.2 "your prompt here"
export DEEPSEEK_API_KEY="..."
letscode --model deepseek-chat "your prompt"

No OPENAI_BASE_URL needed: the built-in catalog routes deepseek-chat to DeepSeek for you (v0.7). Same for fireworks, zai, gemini, openrouter.

export OPENAI_BASE_URL="https://openrouter.ai/api/v1"
export OPENAI_API_KEY="$OPENROUTER_API_KEY"
letscode --model anthropic/claude-sonnet-4-5 "your prompt"

Works without changes against Groq, Fireworks, Together, vLLM, LM Studio, xAI, Cerebras, Mistral, ZAI: anything OpenAI-compatible.

Status

Latest release: v0.7.0, 2026-07-28. Provider-aware model selection, plugin distribution, editor ergonomics. Next up (in devel): the 0.7.x patch line (plugin-load hardening, subagent model propagation) and v0.8 (ctx.ui interaction primitives, /login OAuth); 864 tests passing, ruff + ty + pyrefly + mypy --strict all clean. See the changelog.

The roadmap tracks where the project is going. The lessons learned tracks what we've learned along the way.