Side project · ongoing · May 2026

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.

4 working languages ~1-3 s Sonnet round-trip from the lenses $0 marginal API cost (Claude Max OAuth) 1 always-on service (Meridian) Day 5 · base process complete
The premise

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.

Architecture

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 16 shades green HUD Pixel 7 Tailscale node Fedora server Even Terminal :3456 patched Claude Code OpenKB 44 docs indexed Meridian Sonnet 4.6 router Notion notes / journal Asana tasks All endpoints reached via MCP, scoped per query
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.

What works end-to-end

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.

Direct knowledge query
[sonnet] · ~1-3 s
Voice in, Sonnet 4.6 answers from training, lenses show the result. The default path for most questions.
Personal KB retrieval
[sonnet + 1 tool call] · ~5-10 s
Explicit invocation reads from the local openkb wiki: contracts, custody docs, research, anything ingested.
Notion writes by voice
[sonnet + 1 tool call]
"Save this to Notion under X" creates a page in the right teamspace. Routing rules live in CLAUDE.md.
Deep reasoning on demand
[opus subagent] · ~30-60 s
The literal word "opus" in a prompt escalates to a claude-opus-4-7 subagent. Slow on purpose, used for hard questions.
Self-healing services
systemd
Both Meridian and Even Terminal auto-restart. Logs flow into journalctl. Lid close while plugged in keeps the box running.
Six-of-six health check
one command
A single script verifies all six moving parts: Even Terminal listening, Meridian responding, openkb reachable, MCP registered, claude CLI authed, Tailscale up.
Hard-won lessons

The things that cost me an evening.

Auth caching Stale-token 401 loop. Editing the auth token in the companion app isn't enough; the app caches sessions. You have to force-stop the app, reopen, re-paste the token, probe and save. Without the force-stop, hundreds of 401s pile up in the bridge log and lens queries hang forever.
systemd type Type=forking + tmux survives restart. The bridge unit's tmux session preserves auth across 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.
API key hygiene Unset 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.
Model choice openkb compiles on Sonnet, not Haiku. Original architecture doc said Haiku for the wiki-compile step. In practice Sonnet 4.6 produces stronger concept linking and denser cross-doc graphs, and the speed difference doesn't matter for a background job.
Opt-in escalation Opus is opt-in only. Default to Sonnet for speed, escalate to claude-opus-4-7 only when the prompt literally contains "opus" or "use opus". Every response carries a tag ([sonnet], [sonnet + N tool calls], [opus subagent]) so you always know which path answered.
Stack & status

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.md auto-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.