For Claude Code, Cursor, Codex and Antigravity on Apple Silicon

Stop polluting your coding agent's context window. Let it ask your Mac.

Repeated rounds of grep and full-file reads fill your cloud context window and push your CLAUDE.md rules out of attention. localctx answers repo questions on your Mac—finding the right file on 53.3% of held-out PR descriptions vs. 23.3% for ripgrep and cutting estimated cloud input tokens by 84.5% without uploading your code.

brew install apolloswave/tap/localctx && localctx init

Requires an M1 or newer Mac with 16 GB+ RAM on macOS 14+ · 0.85 ms zero-GPU code index · 99.5 ms warm zero-GPU repo search · 6.58 s local GPU answers (E4B) · Currently in private beta.

Benchmark methodology & confidence intervals (Held-Out Set 3 & Set 5, n = 90 + 90)

Held-Out Set 3 (measured on v4.8.0-pre (commit 0dcccf6, pre-73bddeb); 90 changes merged post-2026-09-01 across 9 unseen polyglot repos, evaluated on pre-fix parent commits fix_commit~1 from PR descriptions to locate the code a merged change describes right after git clone, 0 s setup wait): 53.3% first-try file match for localctx ask ([43.3%, 63.3%]) and 37.8% for zero-GPU localctx search ([27.8%, 47.8%], 10.0% (9/90) router abstention rate, 0 crashes) vs. 23.3% for our ripgrep active control ([14.4%, 32.2%]; paired bootstrap diff +14.4 pp for search vs. ripgrep, [+3.3 pp, +25.6 pp], McNemar p = 0.0241).

On 45 PR descriptions without code identifiers: 44.4% (localctx ask E4B) and 33.3% (localctx search) vs 4.4% (ripgrep) first-try file match — v4.8.0-pre (commit 0dcccf6, pre-73bddeb). Single-shot cloud input tokens: −85.7% (localctx search, 1,016 vs 7,086) and −84.5% (localctx ask E4B, 1,101 vs 7,086) estimated cloud input tokens per query across 90 held-out merged PRs across 9 open-source repositories — v4.8.0-pre (commit 0dcccf6, pre-73bddeb), freeze SHA a496b98edc337d95, while re-attaching matching CLAUDE.md and AGENTS.md rules at the edit site.

Held-Out Set 5 & v4.9 updates: First-try file match on 90 held-out merged PRs across 9 unseen repositories (Held-Out Set 5, freeze SHA 5871d7ab0e253504): 38.9% for zero-GPU localctx search (95% CI 28.9–48.9%) vs 28.9% for ripgrep (95% CI 20.0–38.9%, +10.0 pp); top-3 file match 65.6% vs 53.3% (+12.2 pp, McNemar p = 0.0266); on 45 PR descriptions without code identifiers, 37.8% vs 20.0% (+17.8 pp, McNemar p = 0.0386); cutting estimated cloud input tokens by −83.1% (1,070 vs 6,322). Warm zero-GPU localctx search answers in 99.5 ms median on Held-Out Set 5 (down from 183.7 ms cold, 0.10 s warm vs 0.18 s cold across 90 queries) and 65.5 ms median on CLI flag queries (595.5 ms cold to 225.3 ms warm across 25 runs on 10k-file mastodon/mastodon, 0 output divergences). Independent symbol navigation audit against Universal Ctags across 10 repositories in Go, Python, Ruby, Rust, and TypeScript (out-of-sample seed 43): 300/300 (100.0%) symbol definition recall and 200/200 (100.0%) symbol reference recall, with 249/250 (99.6%) definition precision and 249/250 (99.6%) reference precision (seed 44).

Zero-GPU structural CLI tools (defs/impact/route/schema/context/review) answer in 0.85 ms warm p50 (1.63 ms warm p95, 3.46 ms cold p95, 22.5 ms cold max across 750 runs; 0 MB GPU memory, v4.7.0-beta.1). Warm GPU answers on a 568K-token Rails repo average 6.58 s p50 (E4B) to 8.03 s p50 (26B), 4.36 s p50 (26B) with 50 uncommitted file edits, or 1.83 s/question in warm batch mode.

The problem

Grep loops pollute your context window—and dilute scoped repo conventions.

Ask an agent to trace a change across a Rails, Rust, Go, Python or TypeScript monorepo and it burns multiple rounds of grep and full-file reads. Every false lead stays in the cloud prompt, gets re-billed on every turn, triggers early context compaction, and pushes your Turn-0 CLAUDE.md and AGENTS.md rules out of attention.

Without localctx (ripgrep active control)
> locate the code described by a merged change
rg -n "close" app/               # 214 matches
read app/models/card.rb
rg -n "Closure" app/
read app/models/card/closeable.rb
read app/models/concerns/eventable.rb
rg -n "notify" app/jobs
read app/jobs/notify_recipients_job.rb
... 6,955 est. cloud input tokens / query (Set 2 held-out mean) · scoped CLAUDE.md rules not re-attached
With localctx
> locate the code described by a merged change
localctx ask "closing a card not notifying watchers"

app/models/card/closeable.rb:L18-L34
  close! records a Closure, then track_event
app/models/concerns/eventable.rb:L40-L57
  event callback enqueues notifications
app/jobs/notify_recipients_job.rb:L6-L22
CLAUDE.md:L42-L47 [rule] event jobs must stay idempotent
... 850 est. cloud input tokens / query (Set 2 held-out mean, 8.2× fewer vs. ripgrep)

Single-shot held-out averages: 1,101 est. vs. 7,086 est. tokens/query on Held-Out Set 3 (n = 90); 850 est. vs. 6,955 est. on Held-Out Set 2 (n = 60).

Single-shot token benchmark provenance (Set 3 & v4.7 180-PR)

−85.7% (localctx search, 1,016 vs 7,086) and −84.5% (localctx ask E4B, 1,101 vs 7,086) estimated cloud input tokens per query across 90 held-out merged PRs across 9 open-source repositories — v4.8.0-pre (commit 0dcccf6, pre-73bddeb), freeze SHA a496b98edc337d95. In prior v4.7 evaluations across 60 unseen held-out merged PRs (Set 2, c2849dad01162079) and 120 dev PRs (Set 1, 1140fef86dc2db02) across six open-source repositories right after git clone (0 s setup): estimated cloud input tokens per query averaged 850 est. for localctx ask and 1,059 est. for zero-GPU localctx search vs. 6,955 est. for ripgrep on unseen Set 2 (8.2× and 6.6× fewer tokens; 6,105 est. tokens saved per ask), and 881 est. vs. 6,876 est. across all 180 PRs (7.8× fewer).

How it works

Cost-ordered local tools your agent calls automatically.

  1. Answer structure in 0.85 ms warm p50 (0 GPU)

    Our compiled 12-language syntax parser builds a structural code index right after git clone (0 s cold setup) that traces definitions (defs), references (refs), 3-hop caller blast radius (impact), covering test commands (tests), Rails routes (route), ActiveRecord schemas (schema), stack traces (triage) and pre-commit diffs (review) with zero GPU memory.

  2. Synthesize cross-file flow on Apple Metal

    When a bug has no symbol names yet, Gemma 4 runs natively on your Mac's GPU via our compiled Apple Silicon arm64 binary (zero Python), reading 50 uncommitted file edits in 4.36 s p50 (26B) and returning verbatim path:Lx-Ly source slices.

  3. Make existing CLAUDE.md & AGENTS.md stick

    Zero migration: localctx indexes your existing CLAUDE.md, nested AGENTS.md, .cursor/rules/*.mdc globs and remember notes in place—re-injecting matching rules (≤ 120 tokens) right when the agent touches that file and flagging broken rule paths in localctx review.

localctx init configures Claude Code, Cursor, Codex and Antigravity via MCP stdio and cost-ordered skill routing so agents call zero-GPU structural tools before escalating to GPU synthesis. Existing configs are backed up to .bak-localctx first.

Results · Held-Out Set 3 (n = 90)

Evaluated right after git clone across 9 unseen polyglot repos.

Each tool tries to locate the code a merged change describes from its PR description on the pre-fix parent commit (fix_commit~1, 0 s setup wait): 45 natural descriptions and 45 symptom_only PR descriptions without code identifiers.

Corpus repositories, freeze hash & paired statistical tests

Part 1A — Frozen Held-Out Set 3 (a496b98edc337d95, measured on v4.8.0-pre (commit 0dcccf6, pre-73bddeb)) across astral-sh/ruff, astral-sh/uv, caddyserver/caddy, cli/cli, colinhacks/zod, honojs/hono, pydantic/pydantic, rubocop/rubocop, tokio-rs/tokio (90/90 git-ancestor verified). Zero-GPU localctx search beats ripgrep on first-try file match by +14.4 pts (95% CI +3.3 to +25.6, McNemar p = 0.024, n = 90) — v4.8.0-pre (commit 0dcccf6, pre-73bddeb); localctx ask vs. localctx search: +15.6 pp ([+8.9 pp, +23.3 pp], McNemar p = 0.0001).

Tool & operating mode (Held-Out Set 3, n = 90 pre-fix PR descriptions, v4.8.0-pre (commit 0dcccf6, pre-73bddeb)) Right file on first try
Overall (n=90)
Symptom-only (n = 45)
Identifiers stripped
Multi-file coverage (top 3 / top 5) Hunk overlap (top-3 files) Router abstention / crashes Answer p50 Est. tokens sent to Claude / q
localctx ask · E4B (4.24 GB, 0 s setup, v4.8.0-pre (commit 0dcccf6, pre-73bddeb)) 53.3%
[43.3%, 63.3%]
44.4% 63.1% / 68.0% 22.0% 0.0% (0/90) / 0 crashes 11.32 s 1,101 est.
localctx search (12-language code index, 0 GPU, v4.8.0-pre (commit 0dcccf6, pre-73bddeb)) 37.8%
[27.8%, 47.8%]
33.3% 54.4% / 61.7% 23.0% 10.0% (9/90) / 0 crashes 0.30 s 1,016 est.
Active control — ripgrep (rg -n + snippet read) 23.3%
[14.4%, 32.2%]
4.4% 47.4% / 57.6% 10.6% 0.0% (0/90) / 0 crashes 0.10 s (96.6 ms) 7,086 est.

Held-Out Set 5 & 5-language symbol audit (n = 90 unseen PRs across 9 new repos, v4.9)

Single-shot zero-GPU localctx search evaluation across 9 additional unseen polyglot repositories (lobsters/lobsters, mastodon/mastodon, gofiber/fiber, junegunn/fzf, typst/typst, helix-editor/helix, trpc/trpc, TanStack/query, Textualize/textual) at fix_commit~1 (0 s setup wait), paired with an independent Universal Ctags symbol recall and precision audit.

Held-Out Set 5 freeze hash, warm search cache & Universal Ctags audit

Part 1B — First-try file match on 90 held-out merged PRs across 9 unseen repositories (Held-Out Set 5, freeze SHA 5871d7ab0e253504): 38.9% for zero-GPU localctx search (95% CI 28.9–48.9%) vs 28.9% for ripgrep (95% CI 20.0–38.9%, +10.0 pp); top-3 file match 65.6% vs 53.3% (+12.2 pp, McNemar p = 0.0266); on 45 PR descriptions without code identifiers, 37.8% vs 20.0% (+17.8 pp, McNemar p = 0.0386); cutting estimated cloud input tokens by −83.1% (1,070 vs 6,322).

Warm zero-GPU localctx search answers in 99.5 ms median on Held-Out Set 5 (down from 183.7 ms cold, 0.10 s warm vs 0.18 s cold across 90 queries) and 65.5 ms median on CLI flag queries (595.5 ms cold to 225.3 ms warm across 25 runs on 10k-file mastodon/mastodon, 0 output divergences).

Independent symbol navigation audit against Universal Ctags across 10 repositories in Go, Python, Ruby, Rust, and TypeScript (out-of-sample seed 43): 300/300 (100.0%) symbol definition recall and 200/200 (100.0%) symbol reference recall, with 249/250 (99.6%) definition precision and 249/250 (99.6%) reference precision (seed 44).

Tool & operating mode (Held-Out Set 5, n = 90 pre-fix PR descriptions, v4.9) Right file on first try
Overall (n=90)
Right file in top 3
McNemar p = 0.0266
Symptom-only (n = 45)
McNemar p = 0.0386
Multi-file coverage (top 3 / top 5) Hunk overlap (top-3 files) Router abstention / crashes Answer p50 (cold / warm) Est. tokens sent to Claude / q
localctx search (12-language code index, 0 GPU, v4.9) 38.9%
[28.9%, 48.9%]
65.6%
[55.6%, 75.6%]
37.8% 58.6% / 67.4% 28.5% 3.3% (3/90) / 0 crashes 0.18 s cold / 0.10 s warm (99.5 ms) 1,070 est. (−83.1%)
Active control — ripgrep (rg -n + snippet read) 28.9%
[20.0%, 38.9%]
53.3%
[43.3%, 63.3%]
20.0% 46.9% / 55.2% 16.9% 1.1% (1/90) / 0 crashes 0.07 s (72.5 ms) 6,322 est.

Secondary v4.7 benchmark across 180 merged upstream PRs (60 unseen Set 2 + 120 Set 1 dev)

Prior cold evaluation right after git clone (0 s setup wait) comparing localctx against ripgrep, sense 1.14.2 (local embeddings), and aider repo map across six open-source repositories.

v4.7 180-PR corpus & split provenance

Evaluated at fix_commit~1 across 60 unseen held-out Set 2 PRs (c2849dad01162079, seed = 20261101, never inspected during v4.7 tuning) and 120 Set 1 dev PRs (1140fef86dc2db02, used to diagnose v4.6 failure modes during v4.7 development; 90 with code symbol names, 90 symptom-only) across rails/rails, discourse/discourse, vercel/next.js, fastapi/fastapi, tokio-rs/axum and cloudflare/cloudflared on MacBook Pro M1 Max (32 GB).

Tool & operating mode (n = 180 upstream PRs, v4.7) Right file on first try
Set 2 held-out (n=60) / Set 1 dev (n=120) / Combined (n=180)
Multi-file coverage (top 3 / top 5) Hunk overlap (top-3 files) Vague descriptions (no code names) Answer p50 Setup wait after clone Est. tokens sent to Claude / q
Set 2 held-out / Combined 180
localctx ask · E4B (4.24 GB, 0 s setup, v4.7)40.0% / 50.0% / 46.7%56.0% / 64.7%23.8% (Set 2: 22.9%)34.4%10.21 s0.0 s850 est. / 881 est.
localctx search (12-language code index, 0 GPU, v4.7)41.7% / 45.8% / 44.4%56.2% / 67.0%22.8% (Set 2: 20.2%)37.8%0.42 s0.0 s1,059 est. / 1,063 est.
Active control — ripgrep (rg -n + snippet read)28.3% / 36.7% / 33.9%47.2% / 55.9%17.0% (Set 2: 14.8%)18.9%0.07 s0.0 s6,955 est. / 6,876 est.
Embedding control — sense 1.14.2 (local embeddings + SQLite)35.0% / 40.0% / 38.3%48.7% / 56.5%23.7% (Set 2: 18.3%)42.2%0.18 s477.2 s906 est. / 911 est.
aider repo map (8k cross-file symbol graph)20.0% / 20.0% / 20.0%26.6% / 32.8%4.9% (Set 2: 4.0%)20.0%0.01 s0.0 s9,490 est. / 9,496 est.

When active control (ripgrep) wins — don't use localctx:

  • Know the exact unique class, method, or constant name? Use ripgrep (37.7 ms p50 on Agent-Audit 50 / 96.6 ms p50 on Set 3, 0 index build).
  • Already built a local vector index? Once its 477.2 s 6-repo index build finishes, sense 1.14.2 leads top-3 hunk overlap on Agent-Audit 50 (85.0% vs. 77.5% ask / 72.5% search) and leads v4.7 Set 1/2 symptom-only PRs (42.2% vs. 37.8%).
  • Cloning cold or working from a symptom without burning your cloud token budget? localctx leads first-try file match on Set 3 (53.3% ask / 37.8% search vs. 23.3% ripgrep) while cutting estimated cloud input tokens to 1,016–1,101 est. vs. 7,086 est.
Full per-repository loss & slice disclosures

Disclosed losses: ripgrep is faster on raw p50 latency (37.7 ms vs 459.0 ms search / 11202.0 ms ask on Agent Audit 50, and 96.64 ms vs 300.5 ms search / 11323.3 ms ask on Set 3); sense beats localctx on top-3 line-hunk overlap in Agent Audit 50 (85.0% vs 77.5% ask / 72.5% search on 40 positive probes); on Set 3 rubocop/rubocop, ripgrep beats zero-GPU localctx search on first-try file match (30.0% vs 20.0%, while localctx ask E4B reaches 50.0%); and on Set 3 top-3 line-hunk overlap, ripgrep beats localctx ask on astral-sh/uv (5.28% vs 3.33%), cli/cli (20.0% vs 18.33%), and rubocop/rubocop (20.0% vs 13.33%).

On Held-Out Set 5 per-repo slices (n = 10 PRs per repo, v4.9), ripgrep beats zero-GPU localctx search on lobsters/lobsters first-try file match (20.0% vs. 10.0%), on mastodon/mastodon first-try file match (40.0% vs. 30.0%), and on helix-editor/helix top-3 hunk overlap (26.7% vs. 21.4%), and remains faster on raw median latency (72.5 ms vs. 99.5 ms warm / 183.7 ms cold).

On Set 3 per-repo slices (n = 10 PRs per repo), ripgrep beats zero-GPU localctx search on rubocop/rubocop first-try file match (30.0% vs. 20.0%, while localctx ask scores 50.0%). Across v4.7 180-PR per-repository slices (n = 30 PRs per repo), ripgrep leads fastapi/fastapi top-5 file hit (90.0% vs. 86.7% localctx search) and top-5 file coverage (83.3% vs. 81.7%), edges vercel/next.js hunk overlap (9.5% vs. 9.0%), beats zero-GPU localctx search on rails/rails first-try file hit (40.0% vs. 36.7%, while localctx ask scores 43.3%) and on discourse/discourse hunk overlap (17.1% vs. 15.8%, while localctx ask scores 29.1%), and leads the 10-PR unseen Set 2 discourse/discourse slice on first-try file hit (50.0% vs. 40.0%).

On Agent-Audit 50 (measured on v4.8.0-pre (commit 0dcccf6, pre-73bddeb); n = 40 positive code-question probes across 5 repos), localctx ask leads first-try file match at 85.0% vs. 77.5% sense. Across v4.7 Set 1/2, sense 1.14.2 leads Set 2 symptom-only (50.0% vs. 46.7%), rails/rails (46.7% vs. 43.3% first-try file match and 38.9% vs. 36.9% hunk overlap), and cloudflare/cloudflared (40.0% vs. 30.0% first-try file match and 31.9% vs. 27.6% hunk overlap), and edges tokio-rs/axum hunk overlap (22.0% vs. 20.5%). On Held-Out Set 3 (measured on v4.8.0-pre (commit 0dcccf6, pre-73bddeb); n = 90), symptom_only first-try file match is 44.4% and 33.3% vs. 4.4%; on unseen Set 2 (n = 60), first-try file match is 41.7% (search) and 40.0% (ask) vs. 35.0% (sense) and 28.3% (ripgrep) at 850 est. tokens (8.2× fewer than ripgrep's 6,955 est.; 881 est. vs. 6,876 est. across all 180 PRs).

Part 2 — Internal warm-cache speed check on basecamp/fizzy (43 self-authored dev-set tasks, v4.6 / v4.7)

Internal regression and warm repeat-query speed check inside a single warm-indexed Rails app (basecamp/fizzy, 1,017 files, 568K-token codebase of Ruby, ERB, JavaScript and CSS) plus 10 polyglot onboarding probes. Because we authored these 43 tasks while building v4.0–v4.6, treat the accuracy rows below as internal engineering checks rather than unseen held-out external benchmarks. Hardware: MacBook Pro M1 Max, 32 GB (zero Python).

Self-authored dev-set slice (warm session) Compact model
Gemma 4 E4B · 4.24 GB RAM
Large model
Gemma 4 26B-A4B · 14.47 GB RAM
Trace a behavior across several files (fizzy)20 / 2020 / 20
Follow a view into its JavaScript controller and Rails endpoint (fizzy)16 / 1616 / 16
Find the cause of a bug described without code names (fizzy)9 / 1010 / 10
Refuse to cite deleted uncommitted code (fizzy)5 / 55 / 5
Answer on 10 unfamiliar repos in 10 languages, zero tuning21 / 2121 / 21
basecamp/fizzy 43-probe dev-set (v4.6 / v4.7, self-authored)42 / 43 (98%)43 / 43 (100%)
Local answer time, warm p50 on 568K-token repo (v4.7, M1 Max 32 GB)6.58 s8.03 s
Speed with 50 uncommitted file edits / 10-question warm batch per query (v4.7)not measured / not measured4.36 s / 1.83 s

Read all 16 dated benchmark reports across 14 releases (v0.0 Apr 10 → v4.9 Nov 4) →

Apple Silicon leaderboard

How fast is your Mac?

Run one command. It benchmarks your machine on a fixed open-source fixture, not on your code, and compares medians across Apple Silicon chips.

localctx bench --share
Chip RAM Machines Decode tok/s Prefill tok/s Answer p50 Files parsed/s
Loading…

PostgreSQL exact medians (PERCENTILE_CONT 0.5, best of last 5 runs per machine) per chip and memory size. Submissions contain hardware model and timings only—never code, paths or questions.

See what you saved

localctx stats separates literal local slice tokens read on your Mac from an active-control estimate of cloud input tokens avoided vs. ripgrep (6,105 est. tok/ask saved on our unseen Set 2 held-out benchmark: 6,955 est. for ripgrep minus 850 est. for localctx ask). Add --share to generate a summary card. The card never includes code or private repo names.

$ localctx stats
Local context read : 10.68M slice tokens processed on-device across 212 asks
Est. cloud avoided : 1.29M input tokens ($3.88 est. @ $3.00/MTok, based on 6,105 tok/ask saved vs. ripgrep active control)
Model              : Gemma 4 E4B · Apple M2 Pro · 32 GB
Estimate = 212 asks × 6,105 est. tok/ask saved vs. ripgrep active control (Set 2 held-out benchmark).

Privacy

Runs on your Mac. Sends nothing by default.

Indexing, the model and every answer stay on the machine. Telemetry is off by default; if you opt in during activation, only daily counts and latency percentiles are sent—never source code, file paths, prompts or answers.

Secrets stay out of answers: localctx respects .gitignore, blocks traversal outside the repository root, skips .env*, private keys and credential files, and redacts token patterns before output.

Zero source code, prompts, or file contents leave your Mac (0 outbound network calls on Free tier after the one-time huggingface.co model download on init; paid license lease checks and explicit opt-in --share / update / feedback commands send only metadata, verified across 5 CLI source modules). Explicit licensing and support commands include activate, login, logout, license --refresh, feedback, and update, plus optional opt-in daily aggregate telemetry (--telemetry, off by default) and explicit --share benchmark runs. Paid licenses include a 14-day offline grace window beyond the 7-day lease. Free-tier users without login make zero outbound calls after model download.

Pricing

Free for small repos. Pro for full monorepos.

Keep thousands of tokens of grep noise out of your coding agent's working context—whether you pay per API token or run on a flat-rate plan. Every paid plan includes a 30-day refund.

Free

$0

For small projects and evaluating on your Mac.

  • 1 active repo slot (24h switch cooldown), up to 65,536 tokens indexed (2 shards × 32,768 tokens)
  • On larger repositories, the top 65,536 tokens from the cross-file symbol graph are indexed
  • Compact Gemma 4 E4B model (4.24 GB RAM on 16 GB+ Macs)
  • Zero-GPU 12-language structural MCP tools (defs, refs, impact, schema, route) and cited answers
  • Works with Claude Code, Cursor, Codex, Antigravity
Request beta access

Founding

$150 / year

Locked at $150/yr · Window closes Nov 23 (19 days left) · Capped at 1,200.

  • Everything in Pro, locked at $150/yr for as long as active ($60/yr below Pro)
  • Capped at first 1,200 members (21-day enrollment window closes Nov 23, 2026)
  • Up to 3 Macs per license (early-backer perk), 30-day refund
  • Direct engineering feedback channel
  • Optional name credit in release notes
Join Founding waitlist

Team

Minimum 3 seats ($420/seat/yr annual) · Shared CI-built local cache shards & team memory rules · 1-click seat revocation & single company invoice · 3 Macs per seat.

$42 / seat / month
Join Team waitlist

Referrals: Give 1 free month ($21 credit), get 1 free month ($21 credit) on every paid Pro or Founding referral. Questions or team pilots: localctx@apolloswave.com. Maintain a popular open-source project (1,000+ GitHub stars, non-fork, active commits in the last 90 days)? Apply for a free 12-month Pro license (capped at the first 200 approvals).

Questions

Before you install

Which Macs does it run on?

Any Apple Silicon Mac (M1 or newer) running macOS 14 Sonoma or newer. In v4.7 (native Apple Silicon arm64 binary, zero Python), the compact Gemma 4 E4B model uses 4.24 GB of unified memory and is the default on 16 and 24 GB machines. The large 26B-A4B model uses 14.47 GB and requires 32 GB or more. Zero-GPU 12-language structural MCP tools (defs, refs, impact, schema, route) use 0 GB of GPU memory. Intel Macs, Linux and Windows are not supported.

How reliable are the file and line citations?

Every answer attaches verbatim source lines from disk so both you and your coding agent can verify before editing, and in all 5/5 test cases, deleted uncommitted lines were not cited.

  • Held-Out Set 3 (n = 90, 0 s setup): 53.3% first-try file match for localctx ask and 37.8% for zero-GPU localctx search vs. 23.3% for ripgrep.
  • Held-Out Set 5 (n = 90, v4.9) & 5-language symbol audit: 38.9% first-try file match vs. 28.9% for ripgrep (65.6% vs. 53.3% in top 3, p = 0.0266; 37.8% vs. 20.0% on symptom-only PRs, p = 0.0386). Independent symbol navigation audit against Universal Ctags across 10 repositories in Go, Python, Ruby, Rust, and TypeScript (out-of-sample seed 43): 300/300 (100.0%) symbol definition recall and 200/200 (100.0%) symbol reference recall, with 249/250 (99.6%) definition precision and 249/250 (99.6%) reference precision (seed 44).
  • Held-Out Set 2 (n = 60) & Combined 180-PR (v4.7): 41.7% (search) and 40.0% (ask) vs. 28.3% (ripgrep) on Set 2 (46.7% / 44.4% vs. 33.9% across all 180 PRs), cutting estimated cloud tokens by 7.8×–8.2× (850 est. vs. 6,955 est. on Set 2; 881 est. vs. 6,876 est. on all 180).
  • Internal warm-cache dev set (basecamp/fizzy, 43 probes): 42 / 43 (98%) with E4B and 43 / 43 (100%) with 26B-A4B.
How is this different from Aider's repo map or cloud code indexing?

A static repo map lists symbol names, so the cloud agent still reads full files to understand control flow. Cloud vector indexing uploads your repository to third-party servers. localctx runs a local GPU model over your repository on-device and returns cited file and line-range slices, keeping source code on your Mac.

How long does setup take?

About five minutes, mostly the one-time Hugging Face model download (around 4.2 GB for the compact 4-bit model). Zero-GPU structural CLI tools (defs/impact/route/schema/context/review) answer in 0.85 ms warm p50 (1.63 ms warm p95, 3.46 ms cold p95, 22.5 ms cold max across 750 runs; 0 MB GPU memory, v4.7.0-beta.1).

Which model does it use and under what license?

Google's open Gemma 4 models (E4B and 26B-A4B), quantized for Apple Metal via MLX and downloaded directly from Hugging Face during localctx init under the Google Gemma Terms of Use.

What happens if I cancel Pro or go offline?

Paid licenses refresh a signed 7-day lease in the background and include a 14-day offline grace window (21 days total offline operation). If you cancel Pro or Founding, your CLI drops back cleanly to the Free tier (1 repo slot with a 24-hour switch cooldown, 65,536 tokens, compact model) at the end of your billing period. Nothing on your disk is deleted. Founding subscriptions lock in the $150/yr rate for as long as your annual subscription remains active.