LirahA workspace for CLI coding agents
ContextEDIT · READ · COPYIndexgrep-first indexJobsheadless agentsacme-apiGitcommits draftedPlanschunk by chunkacme-webinfra

Your agent reads less.
You decide what.

Claude Code or opencode runs unchanged in a real terminal. It greps Lirah's index instead of reading your repo, and gets the files you pick at the detail you pick.

24%cheaper per cross-file question
16%faster to the same answer

Against Claude Code alone, on Lirah's own codebase · how we measured

Install on Linux ↓Linux, macOS and Windows · free and open source

Plate I · The workspace. The terminal at the centre; everything else orbits it.Scale: Claude Code alone = 1.00

In the terminalClaude Codeopencode/As headless jobsCodexGeminiCursorAmp/Your own CLI, login and plan/No account/MIT licensed/

1Filespick what the agent sees2Terminalthe real CLI, unchanged3Contextedit, read or copy, per file4Workspacean agent per project tab
Plate II · the full app, Rivendell theme, one task in flightDemo data

Same agent, same questions. With and without the index.

8 questions that each need 3+ files, 3 runs each way, on a small repo and on Lirah's own app. Every answer graded against the files it should name. Sonnet · Claude Code 2.1.280. The evals

MeasureClaude Code alone vs with LirahChange
Cost per cross-file questionLirah's codebase−24%
Time to the same answerLirah's codebase−16%
API costboth repos−13%
Tool callsboth repos−18%
Tasks that got cheaper7 of 8
Answers correctalone 100% · with Lirah 100%Sameevery answer right
01 / 06Context

Stop paying for files your agent didn't need.

Pick what the agent sees, and send big files as signatures. schema.ts goes from 12.6k tokens to 2.1k.

Fig. 1a · One file at three detail levelssrc/db/schema.ts · demo project
Intent per fileMark each file EDIT, READ or COPY: change it, read it, or copy its pattern.
Box or terminalType into Claude Code; a hook appends your picks.
Context setsSave a selection by name, load it later.

Your agent greps an index instead of reading the repo.

Lirah keeps a symbol index of your project. The agent greps it, then reads only the lines a hit names.

Fig. 1b · One index hitdemo data
Finds the right lines firstEach hit names the lines, the callers and the enclosing function.
Stays current on its ownRebuilds when sources change. Never lands in git.
Never in your wayPer tab, with the key or :compact on. A failing hook never blocks a prompt.
02 / 06Workspace

One window, an agent per project.

Every project tab runs its own agent, and its row lights up when the agent needs you.

  1. 1acme-apiclaudeediting limiter.ts
  2. 2acme-webopencodeasks: run the migration now?
  3. 3acme-dbclaudeidle
  4. 4infraopencodeidle
Fig. 2a · Four tabs, one agent waiting on youdemo data

Budgets that catch a runaway session.

Daily or weekly token budgets per project, with warnings at 80% and 95%.

Fig. 2b · Tokens used today against each daily budgetmarks at 80% and 95% · demo data
03 / 06Jobs and plans

Work you don't have to watch. You choose what lands.

Race headless agents in their own worktrees, or let a plan commit itself chunk by chunk. You apply what you want.

Fig. 3a · Race: rate limit /login
  1. 1–3implemented · 3 commitsdone
  2. 4rotate refresh tokens on usenow
  3. 6–7add api key scopes · audit log for auth eventsqueued

Autopilot stops when the agent asks a question, needs permission or skips a commit.

Fig. 3b · Plan on autopilot
04 / 06Git

Commits drafted. Merges shown first.

An agent drafts the commit message. A merge lists every git command before it runs.

  1. 1git checkout mainlisted
  2. 2git merge --no-ff feat/token-rotationlisted
  3. 3git branch -d feat/token-rotationlisted

Nothing runs until you confirm. Lirah never pushes or pulls.

Fig. 4 · Auto merge into maindemo data
05 / 06Sandbox

Let the agent run, inside a sandbox.

On Linux each tab can run in bubblewrap: the system read-only, the project writable, keys and git config locked. macOS and Windows run without it.

  1. Iisolatedpid · ipc · uts namespacesown
  2. IIread-only/ · ~/.ssh · ~/.gnupg · ~/.gitconfig · shell rc fileslocked
  3. IIIread-write~ · ~/projects/acme-apiopen
  4. IVprivate/tmpper tab
Fig. 5 · One tab in bubblewrapLinux
Network isolationOne more switch cuts the network.
UbuntuInstalls the AppArmor profile on Ubuntu 24.04+.
Never a dead endIf it can't start, retry the tab without it.
?Questions

Questions before you install.

Does Lirah replace or wrap my agent?

No. It starts the agent's own CLI in a real terminal, with your config, login and plan. Lirah never calls a model API itself.

Which agents and platforms does it support?

Claude Code and opencode run in tabs; Codex, Gemini, Cursor and Amp run as background jobs. Linux first; macOS and Windows work without the sandbox.

Does anything leave my machine?

Only an update check to GitHub's API, with none of your data. No telemetry, and Lirah never pushes or pulls.

Is it free?

Yes. MIT licensed, no account, source at github.com/emdmed/lirah. You still pay for your agent plan.

What happens if I stop using Lirah?

Nothing to migrate. The agents are the same CLIs, and every commit is ordinary local git.

Why not tmux and my editor?

Keep them; nvim and lazygit open in the second terminal. Lirah adds what a multiplexer can't see: what the agent reads, how full its context is, whether it's waiting on you, and jobs and plans.

06 / 06Install

Install Lirah.

The script picks .deb, .rpm or AppImage for your distro, and builds from source on Arch.

curl -fsSL https://raw.githubusercontent.com/emdmed/lirah/main/scripts/install.sh | bash

Linux x86_64: .AppImage · .deb · .rpmmacOS: .dmg for Intel and Apple siliconWindows x64: .exe · .msiBuild from source