Your agent, on your face.
HALO — Hands-free Agent Layer for Optics — is an open bridge between ** AI agent** and smart glasses. Click your temple, speak a task, and your agent running on your own laptop streams the answer straight onto the display.
Coding, research, writing, browsing, ops, travel planning, knowledge lookup, daily triage — if an agent can do it, HALO puts it on your face, hands-free.
Agents (Claude Code, Eigent, CAMEL, Codex…) have become capable enough to do real work — read files, hit APIs, execute tools, hold long-running conversations. Smart glasses have become good enough to be always-on: mic, tiny display, temple touch. The missing layer is a thin, opinionated bridge so your agent follows you around instead of being pinned to a keyboard.
That's HALO.
You ──speak──▶ Glasses ──PCM audio──▶ Bridge ──▶ Agent (any)
▲ │ │
└──── streamed text ────┴──────────────┘
(rendered line by line on-lens)
Two pluggable layers:
- Glasses adapter — owns mic capture, display rendering, gesture events. Pluggable per hardware platform.
- Agent adapter — owns the conversation loop, streaming, session memory, tool permissions. Pluggable per agent.
A few example prompts the system is designed for — not a feature list, just shape:
- "Fix the failing test in
auth.ts" — coding agent with repo tools - "Summarize the last 10 emails from Priya" — research / inbox agent with MCP
- "Draft a 3-bullet status update for the 2pm standup" — writing agent
- "Pull up today's flight — am I going to make it?" — travel / status agent
- "What did I decide about the pricing page last Thursday?" — memory / notes agent
Whatever agent you already use from a terminal — put it behind the bridge, and it's on your face.
What's working today:
- Glasses adapter: Even Realities G2 via the Even Hub webview SDK — single click / double click / scroll / mic / streaming text render.
- Agent adapter: Claude Code via the official Claude Agent SDK, with full Bash / Edit / Read tools and rolling session memory. Claude Code is the first agent because it ships a clean SDK — but the adapter interface is generic; see roadmap.
- Speech-to-text: OpenAI
gpt-audio(default) orwhisper-1(opt-in). Backend is pluggable — anything OpenAI-compatible works out of the box.
| Target | Status | Notes |
|---|---|---|
| Claude Code | ✅ shipped | Via @anthropic-ai/claude-agent-sdk, permissionMode: 'bypassPermissions' |
| Eigent | 🔜 planned | Multi-agent "Cowork" desktop app built on CAMEL |
| CAMEL | 🔜 planned | Chat Agent from camel framework |
| Codex CLI | 🔜 planned | OpenAI's terminal coding agent |
| ... |
| Target | Status | Notes |
|---|---|---|
| Even Realities G2 (Even Hub SDK) | ✅ shipped | Webview app, PCM mic, TextContainer rendering |
| MentraOS | 🔜 planned | Open-source glasses OS |
| Other vendors | 💡 ideas | PRs welcome |
git clone https://github.com/camel-ai/halo.git
cd halo && npm install
cd bridge-server && npm installCopy .env.example to .env and fill in your keys:
cd bridge-server
cp .env.example .env # first time only — edit .env with your real values
npm startOr use shell vars instead of a file (shell wins over .env):
cd bridge-server
export ANTHROPIC_API_KEY=sk-ant-...
export OPENAI_API_KEY=sk-...
export PROJECT_DIR=/absolute/path/to/your/repo
npm startcd halo
npm run dev -- --host
# note the LAN URL, e.g. http://192.168.1.100:5173/# Simulator (no hardware needed):
npx evenhub-simulator http://localhost:5173
# Real hardware — pass the bridge URL via query string:
npx evenhub qr --url "http://192.168.1.100:5173/?bridge=http://192.168.1.100:8787"
# Scan with the Even Realities appTip: append
?debug=1to the webview URL to show the raw event type on the display — handy when mapping new hardware buttons.
| Gesture on glasses | HTML button | Action |
|---|---|---|
| Single click | 🎤 Click | Start / stop recording (PTT toggle). On stop, audio is transcribed and sent. |
| Double click | ✕ Double Click | In-flight request → cancel; recording → discard; idle → reset session |
| Scroll up | ▲ Scroll up | Page the display up (~6 lines) |
| Scroll down | ▼ Scroll down | Page the display down |
| — | New session | Reset Claude session memory |
| — | Text field + Send | Send a prompt directly, skipping STT |
The reply streams token by token. Only ~6 lines fit at once; the display auto-follows the tail until you manually scroll, then it holds position until the next prompt.
| Method & path | Purpose |
|---|---|
GET /health |
Readiness check |
POST /stt |
Speech-to-text: { audioBase64, mimeType } → { text } |
POST /chat |
SSE stream of { type: 'delta' | 'tool' | 'done' | 'error' } |
POST /session/reset |
Clear the rolling agent session |
| Variable | Scope | Default | Purpose |
|---|---|---|---|
ANTHROPIC_API_KEY |
bridge | — (required) | Claude Agent SDK (BYOK) |
OPENAI_API_KEY |
bridge | — (required) | Speech-to-text |
PROJECT_DIR |
bridge | current working directory | Project root the agent can read/edit |
CLAUDE_MODEL |
bridge | claude-opus-4-7 |
Claude model to use |
BRIDGE_PORT |
bridge | 8787 |
Bridge listen port |
STT_BACKEND |
bridge | gpt-audio |
STT backend: gpt-audio or whisper |
OPENAI_STT_MODEL |
bridge | picked from backend | Override transcription model (e.g. whisper-1) |
OPENAI_BASE_URL |
bridge | https://api.openai.com/v1 |
Custom OpenAI-compatible endpoint |
ANTHROPIC_BASE_URL |
bridge | https://api.anthropic.com |
Custom Anthropic-compatible endpoint |
HTTPS_PROXY / HTTP_PROXY |
bridge | — | Node's built-in fetch ignores the system proxy — set this to force one |
The bridge uses permissionMode: 'bypassPermissions', so voice commands can run Bash / Edit tools without any prompt. It binds to 0.0.0.0 so the glasses can reach it over the LAN. Only run on a trusted network, or bind to 127.0.0.1 and tunnel in, or add auth to the bridge (PRs welcome).
PROJECT_DIR scopes what the agent can touch. Keep it pointed at the repo you want to work on, not at your home directory.
Apache License 2.0 — see LICENSE and NOTICE.
Copyright 2026 CAMEL-AI.org.