Why I built this
I kept burning my weekly credits before the week was out. Every "token-saving" tool I tried claimed wins but none measured what I actually paid — real dollars, end to end, on real tasks. Token counts aren't a bill.
So I built LemonCrow: a runtime that lives inside your existing agent host, changes nothing about your workflow, and squeezes out the maximum saving it can. Every number below is an absolute-dollar measurement (BENCHMARKS.md) — not a token-count hand-wave.
Quick start
Install from a checksummed GitHub release:
curl -fsSL https://github.com/lemoncrow-lab/lemoncrow/releases/latest/download/install.sh | bash
Then initialize it inside the project where you use your coding agent — no login, no network:
cd your-project
lc init # Initializes your repo and index it.
Or code from ChatGPT instead — free
ChatGPT chat usage doesn't burn API/agent-plan credits the way a coding agent's own usage-based billing does. So LemonCrow's tools (search, read, edit, bash) can be exposed through a tunnel and driven straight from a ChatGPT conversation instead — same grounded tool surface, no separate agent bill:
lc chatgpt serve
Prints a pairing code and, by default, an auto-launched cloudflared tunnel URL (installs cloudflared on first use if missing). In ChatGPT: Settings → Plugins → Browse Plugins → (next to search) + → Create, paste the printed MCP server URL, set Authentication to OAuth, and approve the browser prompt with the pairing code.
| Flag | Effect |
|---|---|
--no-tunnel |
Bring your own tunnel (named cloudflared tunnel, ngrok). |
--persistent --hostname X |
Stable URL via a Cloudflare named tunnel (needs a domain in your Cloudflare DNS); survives restarts instead of rotating. |
--no-auth |
Serve/mcp with no authentication — the tunnel URL alone grants access. Prefer OAuth (default). |
Full request/response traffic is logged locally per run (path printed at startup; credentials and tokens are redacted) so you can audit exactly what ChatGPT sent and got back.
Known ChatGPT-side quirk: Sometimes chatgpt looses the tool aceess on a new chat message conversation and without reattaching it can't access the tool. Workaround is branchoff the chat and then reattach the tool and continue with your message.
Permissions: If it complains about permissions or asks to reconnect, check in the Setting -> Plugins, it has Allow All permission
⚠ The pairing code is a password — don't share the tunnel URL. This exposes shell-grade tool access (
bash,edit) to this machine while the server runs. Stop it (Ctrl-C) when you're done.
Or Inspect your past sessions (Offline Replay, dry mode) before trying
LemonCrow records all sessions locally so you can inspect, audit, and debug exactly what your agent did.
lc session stats # read-only report of wasted tool calls and round-trips
lc session replay # replay a recorded session through the real LemonCrow tools
Both are local and read-only — no model re-run, nothing transmitted.
What LemonCrow does
LemonCrow keeps your existing coding agent and changes the working set around it:
| Stage | Runtime behavior |
|---|---|
| Find | Rank symbols, definitions, callers, callees, usages, and exact source ranges before broad file exploration. |
| Read | Return an outline or only the requested lines; cap noisy command and web output with recoverable spill files. |
| Carry | Preserve useful task state through memory, deduplication, compaction manifests, and handover packets. |
| Verify | Notice code changes without tests or checks, then nudge the agent before it declares completion. |
What actually gets replaced
On Claude Code, lc init gives the agent five grounded tools and hides the
equivalent built-ins — one way to do each job, not two. Other hosts use the
strongest equivalent controls they expose.
| LemonCrow tool | Replaces (hidden from the model) | Why |
|---|---|---|
code_search |
Grep, Glob | One call returns the symbol, its callers/callees, and ranked source — no grep-loop-then-read-whole-file. Ranked by call-graph centrality over a tree-sitter symbol table |
read |
Read | Returns an outline or the exact:L10-L40 range, budgeted, instead of the full file |
edit |
Edit, Write | Verified, cross-file edits in one call instead of per-file patch-or-create guessing |
bash |
Bash | Output is capped and structured so a noisy build log can't blow the context window |
web_fetch |
WebFetch | Strips a page to clean Markdown instead of a raw HTML dump |
What's unchanged: the host, the model, your workflow. Full internals: Architecture.
Agents
Packaged in integrations/agents/ — each a distinct
capability grant (subagent name lemoncrow:<mode>):
| Agent | Writes? | Use |
|---|---|---|
code |
Yes | default interactive — edits, refactors, features |
auto |
Yes | fully autonomous — CI/headless runs |
solve |
Yes | end-to-end solving of a well-defined task |
execute |
Yes | one verified pass of an accepted plan |
general |
Yes | catch-all for mixed work |
bare |
Yes | minimal toolset, same discipline |
explore |
No | read-only exploration — locate and cite |
plan |
No | read-only planning, stops for human checkpoint |
review |
No | adversarial read-only review |
research |
No | external web research — cited memo |
Skills
Optional Packaged in integrations/skills/: /lemoncrow, /benchmark,
/orchestrate, /swarm, /perf-review, /ux-review, /recall.
Code hygiene
The best code is the code you never wrote. Every LemonCrow persona climbs a fixed ladder before writing anything, stopping at the first rung that holds:
| # | Rung | Do |
|---|---|---|
| 1 | Need it at all? | Skip what the task doesn't require (YAGNI). |
| 2 | Already here? | Reuse the helper, util, or pattern already in the repo. |
| 3 | Stdlib? | Use the standard library before rolling your own. |
| 4 | Native feature? | Reach for the platform capability that already exists. |
| 5 | Installed dep? | Solve it with a dependency already in the tree. |
| 6 | One line? | If it collapses to one line, make it one line. |
| 7 | Otherwise | Write the minimum new code that works. |
The ladder runs after the agent understands the problem, not instead of it, and it never trades away validation, error handling, security, or accessibility. Lazy about the solution, never about reading the code first.
When a change deliberately cuts a corner with a known ceiling (a global lock, an
O(n²) scan, a naive heuristic), the agent leaves an lc-debt: <ceiling>; <upgrade path> marker. Harvest them any time into a ledger — lc debt flags any marker
that names no upgrade path (no-trigger), the ones that silently rot:
lc debt # ceiling + upgrade per deferred simplification, no-trigger flagged
lc debt --json # same, machine-readable
The packaged code-audit workflow (Claude Code) adds an over-engineering lens
that returns a concrete delete-list — code to remove, not rewrite.
What LemonCrow does not do
- It is not a hosted service. There is no cloud backend, dashboard account, or team collaboration server.
- It does not run your model for you — you bring and configure your own provider/API key (Anthropic, OpenAI, Ollama, …).
- It does not guarantee the benchmark deltas below on your repository; results vary by task, codebase, and model.
- Some integrations are early or in progress; behavior varies by host (e.g. session-close verification is enforced on Claude Code, advisory elsewhere).
Privacy and network behavior
- Runs locally. After install, all core functionality works offline and contacts no LemonCrow-controlled server.
- Telemetry is OFF by default and strictly opt-in. A global
DO_NOT_TRACK=1/LEMONCROW_TELEMETRY=offenvironment kill switch is honored. - No identifier, repository path, source code, or symbol name leaves your machine. There is no crash reporting.
- The only network calls the runtime makes are ones you initiate (
lc update, which checks GitHub Releases). - Full detail: docs/privacy.md.
Supported environments
- Operating systems: Linux and macOS (primary); Windows is partially, never tested.
- Runtime: Python 3.12–3.13, managed with
uv. - Agent hosts: Claude Code, Codex and opencode today; Copilot, Cursor, Hermes, and Antigravity are in progress. Any MCP-compatible agent can connect to the same tools.
- Build requirements:
uv, a C toolchain (only if you opt into themypycperformance build; a pure-Python build works without it), andgit. - Known limitations: see What LemonCrow does not do and Troubleshooting.
Results
These are fixed results from pinned benchmark runs — not a live counter. Every headline number links back to committed raw runs and methodology in BENCHMARKS.md. The model, tasks, containers, turn limits, and verification harness were held constant. Results are mixed by design and include a regression (SWE-bench Lite below).
| Benchmark | Baseline correct | LemonCrow correct | Correct delta | Baseline cost | LemonCrow cost | Cost delta |
|---|---|---|---|---|---|---|
| SWE-bench Verified, 50 tasks x 5 reps | 80.8% | 92.8% | +12.0 pp | $234.84 | $165.45 | 29.5% cheaper |
| SWE-bench Lite, 10 tasks x 5 reps | 98.0% | 96.0% | -2.0 pp | $19.83 | $17.51 | 11.7% cheaper |
| SWE-bench Pro, 10 tasks x 5 reps | 88.0% | 90.0% | +2.0 pp | $39.01 | $30.61 | 21.5% cheaper |
| Exploration tasks across 7 large repos x 5 reps | - | - | - | $19.11 | $6.29 | 67% cheaper |
| Telegraphic Q&A, 20 prompts x 5 reps | - | - | - | $8.40 | $4.48 | 46.7% cheaper |
| Terminal-Bench 2.1, 89 tasks x 5 reps (matched)* | 78.9% | 80.0% | +1.1 pp | — | — | — |
Both arms 89 tasks x 5 reps = 445 trials on the same dataset (LemonCrow's Harbor run vs the Claude Code 2.1.205 leaderboard run), so correctness is directly comparable. LemonCrow also sends 91.8% fewer fresh input tokens (1.05M vs 12.87M); cost is not a matched comparison here — see .
SWE-bench Verified detail (250 runs a side) — one-shot search collapses the grep-and-read loop, so turns, wall-clock, and tool calls drop together:
| Metric | Baseline | LemonCrow | Delta |
|---|---|---|---|
| Turns | 6,962 | 4,336 | 37.7% fewer |
| Wall-clock | 14.3h | 10.9h | 23.7% faster |
| Total tool calls | 6,700 | 4,167 | -37.8% |
| Output tokens | 3.04M | 2.19M | 27.9% fewer |
Scale
Indexing throughput and search quality hold up at repository sizes agents actually hit. A cold full rebuild of the Linux kernel core (1.24M symbols, 4.5M lines) and retrieval quality vs grep-class tools on ~7,200 query/answer pairs across 14 repos:
| Metric | LemonCrow | Grep-class baseline |
|---|---|---|
| Linux cold index, lexical (1.24M symbols) | 179s (~3 min) | — |
| Linux cold index, zoekt trigram | 13.7s | — |
| Retrieval MRR (higher = better) | 0.727 semantic / 0.676 lexical | 0.376 (ripgrep) |
| Query latency, p95 | 134ms lexical / 390ms semantic | 66ms (ripgrep) |
Ranked search is ~1.9x more accurate than ripgrep at a still-interactive p95; ripgrep wins raw latency but not what it finds. Per-repo indexing table and the full 13-tool retrieval comparison: BENCHMARKS.md.
Reproduce any of this from committed raw data: see BENCHMARKS.md and docs/benchmarks/results.md.
Learn more
- Installation
- Troubleshooting
- Benchmarks · full results with methodology
- CLI reference
- Architecture
- Privacy & network behavior
- Maintenance-mode transition (audit & rationale)
Removal
Uninstall LemonCrow and its host integrations, preserving your data by default:
bash scripts/uninstall.sh
To also remove all LemonCrow-managed local state (databases, caches, logs, the local installation identifier, and configuration):
bash scripts/uninstall.sh --purge
The uninstaller stops background services, removes user-level systemd/launchd
units, removes LemonCrow-owned host-integration entries (without touching
unrelated agent-host configuration), reverts LemonCrow's PATH changes, and prints
exactly what was removed and preserved. Preview with --dry-run.
Development & Building from Source
If you want to build LemonCrow from source or run a local development setup, clone the repository and run the local installation script (see Installation for full details):
git clone https://github.com/lemoncrow-lab/lemoncrow
cd lemoncrow
bash scripts/local.sh
License
LemonCrow is free and open-source software under the
Apache License, Version 2.0
lemoncrow.pro engine is planned to be released soon. See LICENSE and NOTICE.
No comments yet
Be the first to share your take.