{"id":51487626,"url":"https://github.com/glebmish/limn","last_synced_at":"2026-07-07T08:30:24.734Z","repository":{"id":367826603,"uuid":"1278373736","full_name":"glebmish/limn","owner":"glebmish","description":"Agentic local branch review — guided code review backed by Claude or Codex","archived":false,"fork":false,"pushed_at":"2026-06-27T20:17:25.000Z","size":2714,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T22:10:31.556Z","etag":null,"topics":["claude","code-review","codex","electron","git","macos"],"latest_commit_sha":null,"homepage":"https://github.com/glebmish/limn/releases/latest","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/glebmish.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-23T18:21:03.000Z","updated_at":"2026-06-27T20:17:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/glebmish/limn","commit_stats":null,"previous_names":["glebmish/limn"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/glebmish/limn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebmish%2Flimn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebmish%2Flimn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebmish%2Flimn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebmish%2Flimn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/glebmish","download_url":"https://codeload.github.com/glebmish/limn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glebmish%2Flimn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35221308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude","code-review","codex","electron","git","macos"],"created_at":"2026-07-07T08:30:19.638Z","updated_at":"2026-07-07T08:30:24.706Z","avatar_url":"https://github.com/glebmish.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# limn\n\n[![CI](https://github.com/glebmish/limn/actions/workflows/ci.yml/badge.svg)](https://github.com/glebmish/limn/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/glebmish/limn)](https://github.com/glebmish/limn/releases/latest)\n[![License](https://img.shields.io/github/license/glebmish/limn)](LICENSE)\n\nA macOS app for **agentic review of local git branches** that helps you understand the code.\n\n![A 27-file branch under guided review in Limn: the diff grouped into logical sections with per-section narration in the sidebar, a plain-language summary of what the branch does, and an \"Agent needs 2 decisions\" panel where the agent asks the reviewer to make a call before it proceeds.](docs/media/hero-review-question.png)\n\n- **Guided review** — Agent explains what has changed, splits changes on semantical groups and asks clarifying questions.\n- **Agentic tools** — Tools for agent to help user navigate: navigate to a file that builds a database query, explain the auth workflow across multiple files, etc.\n- **Spec/plan cross-check** — flags where the implementation diverged from what the spec and plan define.\n- **Comment on anything** — diff lines, spec lines, plan steps, section narration — comment and agent will follow up on it.\n- **Agent agnostic** — Supports both Claude and Codex via SDKs.\n- **Native support for quick local iterations** — see diff from the last reviewed state, update narration for the new commits.\n\n\n## What it does\n\n**Narrates the change.** The agent explores callers, tests, and history, then explains how the change actually works — here, a seven-stop tour that follows one value from the UI selector through IPC down to the engine, scrolling the diff to each stop.\n\n![The chat drawer showing a seven-stop \"propagation tour\"; each stop is a file and line, and selecting one jumps the diff to that code.](docs/media/review-tour.webp)\n\n**Checks the change against the spec.** Limn auto-discovers specs and plans based on popular conventions and flags where the implementation diverged, criteria by criteria.\n\n![The spec view with a \"Where the implementation diverged\" callout listing four divergences, beside a list of acceptance criteria tagged DONE or PARTIAL.](docs/media/spec-divergence.png)\n\n**Follows up on comments.** Leave comments on any line, section, or spec point, send them to the agent — it will read callers, run commands, edit files — then report a resolution per comment and commit the changes.\n\n![Queued reviewer comments sent to the agent; the chat drawer streams its tool calls — grep, read, edit — and returns one resolution per comment.](docs/media/apply-loop.webp)\n\n**Shows updates as they come.** When new commits land — from the agent or the user — a titlebar pill shows the drift; after reload, diff shows just the delta. Agent can also update the narration based on the new changes.\n\n![A titlebar drift pill showing the branch is a commit behind; after reload the \"Since viewed\" filter highlights the changed section and a new working-tree file, ready to re-approve.](docs/media/drift-freshness.webp)\n\n## Security \u0026 privacy\n\nLimn is a local app with no telemetry, accounts, hosted backend, or cloud sync of\nits own. It does not store Claude, Codex, Anthropic, or OpenAI credentials. It uses\nthe credentials and command-line agents already installed and authorized on your\nmachine (`claude`, `codex`). Limn also does not use macOS Keychain.\n\nReview state lives in one local SQLite database at the app's user-data location\n(`~/Library/Application Support/limn/limn.db` on macOS). That database stores the\nreview layer: repositories you opened, sessions, comments, chat, generated review\nnotes, viewed flags, and approvals. Git remains the source of truth for code:\ndiffs, file contents, and branch state are read from your working tree.\n\nWhen you choose Claude or Codex, the selected provider receives the prompts and\nrepository context needed for the review, using your existing provider account or\nAPI key. Limn itself does not send data anywhere else.\n\nLimn runs a coding agent against your repo. The execution tier, set per agent,\ncontrols how much it can do on its own:\n\n- **Ask for approval** / **Accept edits** — the agent confirms before running\n  commands; safe defaults for unfamiliar code.\n- **Auto mode** / **Full access** — the agent runs shell commands and edits/commits\n  without confirming each step.\n\nOnly use **Auto mode** or **Full access** on repos you trust. For code you have not\nvetted, stay on **Ask for approval** or **Accept edits**.\n\n## Install\n\n### Download the DMG\n\nDownload the latest macOS Apple Silicon DMG from [GitHub Releases](https://github.com/glebmish/limn/releases/latest). The release asset is named `Limn-\u003cversion\u003e-arm64.dmg`.\n\nThe app is distributed as-is: ad-hoc signed, but not Developer ID signed or\nApple-notarized. That is because Limn is a demo tool, not a production product\ndistribution, and there is no active paid Apple Developer account behind these\nbuilds. After dragging `Limn.app` to `/Applications`, macOS may show **\"Limn Not\nOpened\"** with **\"Apple could not verify 'Limn' is free of malware...\"**. Remove\nthe quarantine flag for this app, then open it again:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/Limn.app\nopen /Applications/Limn.app\n```\n\nIf you installed it somewhere else, replace `/Applications/Limn.app` with that\npath.\n\n### Build from source\n\nThis avoids the downloaded-app quarantine path because the app is built on your\nmachine.\n\n```bash\nnpm install\nnpm run package\nopen dist/mac-arm64/Limn.app\n```\n\nYou can also move `dist/mac-arm64/Limn.app` to `/Applications`.\n\n## Prerequisites\n\n- `git` on your PATH.\n- **Claude engine**: a [Claude Code](https://code.claude.com) login (run `claude` once) or `ANTHROPIC_API_KEY`.\n- **Codex engine**: `codex login` (ChatGPT plan) or `OPENAI_API_KEY`.\n\nEither engine alone is enough — the picker shows what's authenticated. Subscription logins are inherited from the local Claude/Codex credentials; usage is billed to them.\n\n## Using it\n\n1. **Open a repository** (*Open repository…* / ⌘O) via the native dialog — Limn adds\n   it to the **Dashboard**'s repository index and remembers it across launches.\n2. On the Dashboard: type to filter the list, ↑/↓ to move, ⏎ (or click) to open a\n   repo's sessions. Each row shows its current branch (click the branch chip to open\n   that branch's review) and when it was last active.\n3. **Opening a repo lands directly on the review** for its current branch — the diff\n   against the default base (`main` → `master` → first branch), already loaded. No\n   session is minted until you act (comment, mark something viewed, generate, or\n   approve); until then the header reads **Draft**.\n4. Change the **base** with the ref picker (branches, recent commits, or a typed\n   SHA / `HEAD~N` / tag); switch the **branch** — and where it's checked out — with the\n   branch/worktree picker. Pick an engine — and optionally a model and reasoning effort\n   (Claude Opus/Sonnet `low→max`, Codex GPT-5.x `low→xhigh`; *Auto* uses the engine\n   default) — then **Generate guided review**.\n5. **Review**: mark files viewed, mark sections reviewed, comment on any diff line,\n   section, agent question, or spec/plan line; **Chat** shares the agent's session.\n   The **Sessions** button opens the repo hub with every saved review for the repo.\n6. **Send N changes to agent** — it edits, commits on your branch, and reports\n   per-comment resolutions. **Approve** records the reviewed SHA.\n\nThe app **watches the branch** — when commits land from outside (e.g. a Claude Code session in a terminal), a titlebar fetch pill shows the drift and lets you reload when ready. After reload, \"changed since viewed\" / \"changed since approval\" rails highlight what moved. You also get a **macOS notification** when an agent run finishes while the app is in the background. Diffs are syntax-highlighted with word-level change marks.\n\n## Limitations\n\n- **macOS, Apple Silicon (arm64) only** — the build target is arm64; there is no Intel or non-macOS build.\n- **Not Apple-notarized** — downloaded DMGs require the quarantine-removal step above unless you build locally from source.\n- **Local credentials required** — a Claude and/or Codex login (or `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`) must be present on the machine.\n- **Single-machine state** — review state is a local SQLite file; it does not sync across machines.\n- Early, active development — storage layout and APIs may change.\n\n## Development\n\nRequires Node 20+.\n\n```bash\nnpm install\nnpm run dev        # live-reload app\nnpm test           # vitest: diff parser, ref resolution, sessions DAO, launch args, anchoring, engine contract\nnpm run typecheck\nnpm run lint\nnpm run package    # local package: dist/mac-arm64/Limn.app, plus DMG and zip in dist/\n```\n\nRelease builds are created by pushing a `v*` tag that matches `package.json`\n(`v0.1.2`, for example). The release workflow builds macOS arm64 artifacts and\nattaches the DMG, zip, and blockmaps to the GitHub Release.\n\nUseful dev env vars: `LIMN_DEMO=1` (deterministic fake engine), `LIMN_OPEN_REPO` / `LIMN_OPEN_BRANCH` (open straight to the review for a repo/branch), `LIMN_FLOW=generate|chat` (auto-run a flow / open the chat drawer), `LIMN_SHOT=/path.png` (capture the window, with `LIMN_SHOT_DELAY` / `LIMN_SHOT_QUIT`). Real-engine smoke scripts: `npx tsx scripts/smoke-claude.ts` / `smoke-codex.ts`.\n\n**Screenshots:** `npx tsx scripts/shoot.mts` seeds a fixture repo + db and prints `{ repo, db, sessionId, reviewChat, userChat }`; launch Electron with `LIMN_DB` / `LIMN_OPEN_SESSION` + the dev hooks `LIMN_ACTIVE_CHAT=\u003cid\u003e` (activate a chat), `LIMN_OPEN_PICKER=1` (open the agent popover), `LIMN_OPEN_CHATLIST=1` (open the chat dropdown) to capture a specific UI state.\n\nArchitecture: see [docs/architecture.md](docs/architecture.md), with deeper dives in [docs/agent-layer.md](docs/agent-layer.md), [docs/storage-layer.md](docs/storage-layer.md), and the [Codex app-server protocol](docs/codex-app-server.md).\n\n## License\n\n[MIT](LICENSE) © Gleb Mishchenko\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglebmish%2Flimn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglebmish%2Flimn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglebmish%2Flimn/lists"}