Related projects¶
letscode exists in a busy space. This page is a short field guide — what other tools occupy similar ground, what they do well, and where letscode is the same vs. different.
Coding agents in the terminal¶
Claude Code¶
Anthropic's first-party CLI agent. Native Claude integration, sub-agents, plan mode, permission popups, MCP support. Mature, polished, free for Claude Pro / Max subscribers.
How letscode differs. letscode targets the OpenAI Chat Completions wire format, so it works with any compatible endpoint (OpenAI, Ollama, Fireworks, OpenRouter, …). Native Claude API support is out of scope by design — if you want native Anthropic, use Claude Code. letscode also stays deliberately smaller: no sub-agents, no plan mode, no permission popups in core.
Skill compatibility. Both tools use the agentskills.io format. A skill in ~/.claude/skills/ loads in letscode unchanged.
pi.dev¶
An open-source agent written in TypeScript by Armin Ronacher (creator of Flask, Werkzeug, Jinja2, Click). Five-package npm monorepo: pi-tui, pi-ai, pi-agent-core, pi-coding-agent, pi-web-ui. 20+ native providers including Anthropic, Bedrock, Vertex, OpenAI Responses, GitHub Copilot, Codex via OAuth. Differential terminal rendering, inline Kitty/iTerm2 graphics, IME-aware cursor. Custom event-driven agent loop, "harness" with sessions, ExecutionEnv, compaction primitives, skills/prompt-templates.
Influence on letscode. Several letscode design decisions trace back to pi's published documentation — the event-driven agent-loop shape, the two-tier message model (broad AgentMessage vs narrow LLM-visible Message), the ExecutionEnv filesystem abstraction, the steering / follow-up queue model, the compaction-marker pattern, and skill-format compatibility. The extension model design doc cites pi's contracts where they directly inspired letscode's.
How letscode differs.
- Language. letscode is Python; pi is TypeScript.
- Scope, for now. pi ships five packages including its own terminal renderer (
pi-tui) and a web UI. letscode is currently a single package usingrich+prompt_toolkit, with a monorepo split (carving outletscode-llm,letscode-agent, andletscodeitself) planned once the plugin contracts are exercised by at least one external frontend. See the roadmap. - Providers, for now. pi has 20+ native modules with OAuth flows. letscode currently ships one OpenAI-compatible client, which covers OpenAI, Ollama, Fireworks, OpenRouter, vLLM, llama.cpp, and similar — roughly ~80% coverage at ~5% of the code. Native modules for specific providers (Anthropic prompt caching, OAuth flows, vendor-specific reasoning controls) are an open question for later releases.
- Plugin system. pi has a hand-rolled extension runner with npm/git package distribution. letscode uses pluggy + standard Python entry points.
- Approach to "the model wants to invoke a skill." pi parses assistant text for
/skill:<name>patterns. letscode auto-wraps each skill as a synthesised tool namedskill_<normalised-name>so the model invokes via native tool-calling. Both work; letscode's path generalises across more providers without depending on the model emitting a specific text shape.
Aider¶
A long-running Python coding-agent project with a strong git-aware workflow (auto-commits, diff-based edits, repo-map context). Mature multi-provider support via LiteLLM. Different design philosophy from letscode — Aider is deeply opinionated about how it edits files (search-and-replace with verification, diff-and-apply); letscode keeps file editing as a tool the model decides when to call.
Codex CLI¶
OpenAI's own terminal coding agent. Tighter integration with OpenAI's API surface (Responses API, native reasoning, tool-calling specifics). Smaller scope than Claude Code or pi but well-tuned to OpenAI's models. letscode and Codex CLI can target the same endpoint; the choice is mostly about which abstractions you prefer.
Skill format¶
The agentskills.io format — SKILL.md with name and description YAML frontmatter, plus markdown body — is a small de-facto standard used by Claude Code, pi.dev, and letscode. Same files load in all three. letscode's skills page lists every directory the loader scans, including the ~/.claude/skills/, ~/.pi/agent/skills/, and ~/.agents/skills/ paths.
Plugin / extension systems¶
| Tool | Mechanism |
|---|---|
| letscode | pluggy + Python entry points |
| pi.dev | Hand-rolled extension runner; npm + git URL distribution (pi install npm:@foo/...) |
| Claude Code | Slash commands + custom Markdown extensions; MCP for external tool integration |
| Aider | Plugin commands via Python entry points (less formal than letscode's) |
letscode's choice of pluggy buys mature plugin infrastructure for free (pluggy is used by pytest, tox, datasette) at the cost of a slightly heavier "register a plugin" ceremony for plugin authors.
Wire protocols¶
Most agent CLIs today either target one provider's native API (Claude Code → Anthropic, Codex CLI → OpenAI) or use a translation layer like LiteLLM to abstract across many (Aider). letscode currently speaks the OpenAI Chat Completions wire format directly, which covers any endpoint implementing it without per-provider code paths. Whether to ever ship a second wire protocol is an open question — see the roadmap.
Why does letscode exist?¶
The combination is the answer: small Python codebase + cross-provider via OpenAI-compat + agentskills.io format support + pluggy plugin system. None of the existing tools occupy quite the same point in the design space:
- Want Python and small? letscode is ~2k source lines + tests. Claude Code, pi, Codex CLI are bigger or in a different language.
- Want OpenAI-compat across many endpoints? letscode works against Ollama, Fireworks, OpenRouter, vLLM, llama.cpp without per-provider code.
- Want a stable plugin contract you can build on? The extension model is documented and versioned starting v0.3.0; the reference plugin is a working example.
For people who don't need any of these — use the tool that fits your situation. The agent landscape has room for many.