Voice on the lenses, Claude on the server.
A personal AI exocortex accessible through Even Realities G2 smart glasses. Voice query on the lenses, full pipeline runs through self-hosted infrastructure on a Fedora server, all routed through Claude Max OAuth so there's no per-token API billing. Multilingual from day one (English, German, Russian, French) with a personal knowledge base ingesting in the background.
Conversation as the primary input.
Sitting down at a laptop, opening a terminal, typing a question; that whole loop is too heavy for most of what I want to ask an AI throughout a day. The glasses remove the loop. Voice goes in through the bone conduction mic, a few seconds later the answer lives on the lenses. No device taken out of a pocket, no app opened, no context switch.
The goal isn't to replace the laptop for real work; it's to make the ten-second questions actually take ten seconds, instead of a minute of friction that means they never get asked.
Self-hosted, end-to-end.
Voice and display happen on the glasses. Everything else runs on a Fedora server at home. The glasses reach the server over Tailscale, so latency is ~6 ms even when I'm not at the desk.
G2 glasses (voice in, lens display out)
↓ Bluetooth
Pixel 7 phone (Even Realities companion app)
↓ Tailscale (LAN, ~6 ms)
Fedora 43 server
↳ Even Terminal :3456 (the glasses bridge to Claude)
↳ Claude Code (patched: Sonnet default, MCPs allowlisted)
↳ CLAUDE.md (one source of truth for tool routing)
↳ openkb MCP (personal knowledge base, stdio FastMCP)
↳ openkb CLI
↳ LiteLLM → Meridian :4000 → Claude Max OAuth
↳ Sonnet 4.6
↳ Notion / Asana / Calendar / Gmail MCPs
↳ opus-thinker (subagent, on the literal word "opus") One systemd unit (Meridian) is always on; everything else launches on demand. MCP servers are stdio subprocesses Claude Code spawns when a tool is called; there's no daemon, no port, no container.
Verified, on the lenses.
Status as of day five: each of these paths runs cleanly from a voice prompt to a lens display. The tag in brackets is the model + tool-use signal each response carries so I always know which path handled the query.
The things that cost me an evening.
systemctl restart; you can patch and restart without re-pairing the phone. Type=simple does the opposite. Learned the hard way after re-pairing four times. ANTHROPIC_API_KEY everywhere. If it's set in any shell, LiteLLM bypasses the Meridian proxy and silently bills the real API. The whole point of routing through Claude Max OAuth is to keep marginal cost at zero; one stray env var burns that. [sonnet], [sonnet + N tool calls], [opus subagent]) so you always know which path answered. Honest about what's in the box.
- Hardware
- Even Realities G2 smart glasses · Pixel 7 phone · home Fedora 43 server · smart ring as secondary biometric capture. Tailscale mesh between all of them.
- Models
- Claude Sonnet 4.6 by default (
claude-sonnet-4-6), Claude Opus 4.7 (claude-opus-4-7) on opt-in. Both routed through Meridian, which talks to Claude Max via OAuth. - Bridge
- Even Terminal (vendored, patched in-place) on
:3456. Patch is idempotent and survives npm upgrades. - Knowledge
- openkb, a self-hosted personal KB with a FastMCP stdio interface. Compiles a queryable wiki from PDFs, contracts, research notes, journals. Sonnet 4.6 does the compile.
- Tool routing
- One
CLAUDE.mdauto-loaded into every session via--setting-sources=user,project. Explicit rules: openkb only on explicit invocation, Notion for "my notes", web search for current events, internal for everything else. - Always-on
- One systemd unit (
meridian.service, Type=simple). Everything else launches on demand. - Languages
- English, German, Russian, French, used live; legal and tax corpus ingesting overnight in each.
- What's next
- POV video capture from the lenses into a passive memory loop; a calendar-aware morning briefing pipeline; a personal-life agent swarm in the spirit of DevSwarm but for non-dev work.