Everything the lenses do, on one page.
COS Glasses turns your Even Realities G2 into a heads-up chief of staff, powered by the AI agents already on your Mac. Ten minutes here and the glasses feel like muscle memory.
Three pieces, one loop.
Ask from the glasses. The G2 relays over Bluetooth to the Even app on your iPhone, the iPhone reaches your Mac over Wi-Fi or Tailscale, and the server runs your prompt through your own signed-in Claude Code, Codex, or Cursor CLI. The answer renders on the lens. The history stays on your Mac.
2. Setup
Live in about ten minutes.
Three moving pieces: the server on your Mac, the app on your glasses, one paste to connect them. The wizard walks you through all of it. This is the short version.
-
Check the basics
A Mac that stays on, with Node.js 20.11 or newer. Run
node -vfirst; any newer compatible major version is fine, so do not installnode@20beside it. At least one agent CLI must be signed in. Claude Desktop does not install the terminal CLI: runnpm install -g @anthropic-ai/claude-codewithout sudo, then runclaudeand finish sign-in. Or install Codex and runcodex login. Your G2 must be paired to the Even Realities app, version 2.2.6 or newer. -
Start the server
$npx --yes @gotcos/glasses-server@latest --setup-transcription --transcription-tier balancedFirst run writes its config to
~/.cos-glasses/.env, then prints your server URLs and an API token. The token is saved, so it stays the same across restarts. Server 6.27.2 provides two Mac transcription tiers. Balanced (recommended) uses Small.en only for provisional prompt text, Large-v3-Turbo for the authoritative live transcript, and Large-v3 for saved-work polish. Max uses Large-v3-Turbo for low-latency provisional preview while Large-v3 remains authoritative for live commit and saved-work polish. Canonical transcription preempts cosmetic preview instead of competing for Metal. Missing Max weights fall back visibly to Turbo. Interrupted model downloads retain their partial file and resume on the next Guided Setup run instead of restarting from zero. Required for Mac voice transcription: runbrew install whisper-cpponce and have about 6 GB free. Phone-local Moonshine Tiny or Base is optional and downloads its own model on the iPhone. It can now provide rolling provisional text for both Messages and Meetings; Mac Whisper remains authoritative for speaker-attributed meeting transcription and saved-work polish. Optional local spoken replies on Apple silicon: runbrew install python@3.12 ffmpeg espeak-ng; Python 3.11 or 3.12 is supported. The first normal start provisions the pinned private Kokoro environment asynchronously. Text chat works without either voice dependency.Running the full COS? Add the
/cos-glassesskill from the Starter Kit and your agent will start the server, confirm it's healthy, keep it on the latest release, and troubleshoot connection issues on request — so you never babysit the terminal. Pair it with/glasses-dayto pull a day of glasses questions and answers into your desk session and pick up what was top of mind. -
Install the app
In the Even Realities app, open Even Hub and install COS Glasses.
-
Connect once
Open the setup wizard on your phone. Paste the server URL and the API token. COS saves the pair only after it proves the server’s authenticated API identity and a live stream, so a reachable-but-not-ready server is never stored as connected. It remembers both from then on.
Same Wi-Fi or anywhere. On the same network, use the http://192.168.x.x:3141 address the server prints. To use COS away from home, install Tailscale on the Mac and iPhone with the same account and use the http://100.x.x.x:3141 address instead. The server rejects any request that does not come from your private network or mesh; it never answers the public internet.
Latest release package: Control 0.5.149, glasses 6.8.437. COS Control 0.5.149 is the public Mac download. The pet's idle chrome is now a ledger bar riding under the sprite: amber for sessions waiting on you, breathing green for running work, gold for finished, with a counted caption. Hover cross-fades the bar into RUNNING, DONE, and WAITING pills in the same slot; the pills pin the live and finished lists, WAITING jumps to the session that needs you, and every finished row carries an x that clears just that entry. Finished sessions persist per session for four hours across relaunches, and a Claude Code session running in a terminal opens iTerm2 or Terminal instead of Claude Desktop. Session Pet settings, state sprites, and the unified gallery live behind compact disclosures. The gallery reads Characters 304: Miles Windu, three additional bundled Jedi, and 300 searchable OpenPets community stills; advanced animated packs carry a badge. Miles's V15.4 active-session strips contain 16 frames for one session, 17 for two, 13 for three, and 26 for four-plus. Two sessions add a rightward jump-roll, a clean landing, and droid re-entry. Three sessions begin with three defensive bolt deflections. Four-plus sessions flow through a continuous clockwise spin and reverse-grip strike into the lower-right droid, electrical breakup, then a visible saber release, flip, and catch. Force control, pull-to-strike, and complete droid dissolves remain intact. The full 26-frame swarm runs at 0.22 seconds per frame, or 5.72 seconds at 100% speed. Its rear-facing block now feeds an underhand rising cut, an added slash follow-through resolves the upper droid, and the Force lift, chest thrust, and blaster travel stay connected. The loader preserves every authored frame instead of truncating longer strips at 16. Miles's idle portrait uses the approved 1.30x pack scale to match combat character size. Character speed sits below Character size with a saved 25% to 200% playback control; 100% is the authored pace. Speed does not resize the figure, card, or buttons, and macOS Reduced Motion still freezes animation. Elara Vale's V1.1 strips remove the oversized white matte around her green saber without changing the source blade geometry or choreography. Exact stock Miles V15/V15.1/V15.2/V15.3 and Elara V1 installs migrate automatically; custom packs are never overwritten. Nia Solari and Rowan Vale keep their own advanced combat strips. A pet session card opens that session. A Codex turn that is writing shows on the pet. A Codex pet click opens that thread. A Claude pet click opens that session. The Cursor card opens the Agents Window, then selects that session's tab. An off-screen pet snaps back onto the display. Pet size is Small, Medium, Large, or a custom pixel value. Character scale defaults to 300%, reaches 600%, and fits oversized combinations to the active display without losing the saved preference. A session row idle for ten minutes shows an x that drops it from the list only; the session keeps running and returns on its own when it does something. COS Glasses 6.8.437 is the current companion pack: Sessions look back 7 days across Claude, Codex, and Cursor. Even Hub still lists 6.8.353. Server identity is 6.41.0.
2A. COS Control for Mac
The server, without the terminal babysitting.
COS Control is a native menu bar companion for the same public npm server. It starts COS at login, shows the effective Balanced or Max tier plus each transcription model, reports real Agent CLI versions, runs Doctor, and performs safe updates, restarts, and rollbacks.
See what is actually running, not what you hope is running.
One server owner
The managed LaunchAgent prevents split port ownership. COS Control refuses to replace an unknown process.
Check for updates
Since COS Control 0.5.67 the panel footer carries a Check for updates button, so you no longer have to wait for the periodic check to notice a new release.
Notices from the publisher
Since COS Control 0.5.71 a short notice can appear at the top of the panel when a new capability lands, so something you can now do does not go unnoticed. It shows whether or not an update is waiting — the moment you finish updating is exactly when it is worth reading. Dismiss it with the × and it does not come back; a later notice still appears.
Browse and search your archive
Since COS Control 0.5.72 and server 6.38.0, Activity → Messages has a Recent / Archive switch. Archive lists every stored day with its chat and message counts and searches months of history by text — results point at a day with the wording around each match. Search runs when you press return; it is a real scan on your server, not a filter.
Your archive will shrink — that is the fix working
Server 6.38.1 fixed a long-standing bug where the daily archive quietly stored the same conversations repeatedly (one real install held 1.2 GB that was 99% duplicates). After updating, day files dedupe themselves as they are touched, and archive sizes and search counts drop sharply. Nothing real is lost — duplicates are collapsed to the most complete copy. A bundled repair tool (npx tsx server/scripts/repair-archive-duplicates.ts, dry-run by default) clears any days the server no longer touches.
Local models via Ollama
Server 6.39.0 adds Ollama as a fourth model family. It appears in the pickers only when a local daemon answers on 127.0.0.1:11434 with at least one pulled model, and hides again when it does not; a saved Ollama choice with the daemon down safely resets to Opus. Loopback only. Since server 6.40.1 a local model can use three read-only COS tools (search meetings, search memories, read a meeting) when the pulled tag advertises tool support and COS_SCRIPTS_DIR is set; still no vision, Continue/Fork, or Live Cues on local models. Pin one with COS_OLLAMA_MODEL; Control 0.5.73 and newer keeps that setting (and COS_OLLAMA_HOST) across server updates. Since Control 0.5.74 the About view shows an Ollama row with the live model whenever the daemon is ready, and Doctor prints a matching line; no row simply means no local daemon. Setup steps live under Models.
Recording-safe controls
Restart is blocked while meetings or jobs are active. Updates stage a complete new generation before switching.
Fast meeting preview
Provisional Turbo text appears before the canonical speaker-attributed Large-v3 chunk lands. Introduced default-off in 6.21.7, this is on by default since server 6.21.22 and app 6.8.315; the committed Large-v3 transcript stays authoritative and still atomically replaces the provisional line. Control owns the machine-wide switch and applies it with verified restart and rollback.
Adaptive review audio
Control 0.5.11 and server 6.21.32 add a default-off canary for retained playback. Pressing Play may create a temporary cleaned replay while the immutable raw WAV remains authoritative and available through an exact bypass. Cleanup never enters live capture, transcription, speaker attribution, save, HQ polish, or meeting sync. Live work preempts it, a busy or failed worker returns raw immediately, and Control rolls back if activation proof fails.
Use the meetings you already have
Control 0.5.41 and server 6.27.6 keep the common case one click: choose the folder that already contains YYYY-MM/*.md. COS browses it in place. If you already keep several libraries, choose their parent; every child name is customizable and only needs meetings/YYYY-MM/*.md inside. Control explains an incomplete selection and lets setup continue without one. Activity → Meetings adds a day calendar, transcript, summary, copy, and keyword plus meaning search across stored calls. Lookup Recency next to Domain sorts Newest (default), Oldest, or Best match.
Connect Memory and Threads
Update to Control 0.5.41 and server 6.27.6. In COS Control, click COS Data and choose your full COS workspace or its operations/scripts folder. This is separate from Work Folder and Meetings Library. Control verifies cos_api_bridge.py, the workspace Python environment, bridge protocol 1, and the authenticated server response before saving the LaunchAgent change. Memory needs an existing local Qdrant cos_memory collection. Threads use the workspace thread cache and manual-thread store. Control reports an existing empty store as healthy, while a missing collection, degraded dependency, or outdated workspace is shown as setup-needed. It never creates, moves, or rewrites your stored data. Memories and Threads lookup share the same Recency control as Meetings and Sessions.
Sessions from this Mac
Activity → Sessions is a sixth view alongside Messages, Speakers, Meetings, Memories, and Threads. Updated and Opened look back 7 days across Claude, Codex, and Cursor. Pinned is its own clock: ChatGPT/Codex pinned-thread-ids, Cursor sidebar pins, and Claude Desktop stars stay listed at any age, including Desktop-only chats with no local jsonl. Keep-warm ready rows stay out. Search matches sidebar titles and recent transcript bodies; Recency sorts Newest, Oldest, or Best match. Click a row to read the transcript; Copy session puts a redacted kickstart brief on the clipboard. On glasses 6.8.360, Sessions list a DISCUSSION gist when the running server returns discussion_summary.
Live sessions on the desktop
Since COS Control 0.5.87 Running and Waiting sessions stay on the desktop as a COS figure when Activity is closed. Since 0.5.88 Open in platform on the session jumps to Cursor, Claude Desktop, or ChatGPT; the waveform still opens Activity. Choose sprite copies a PNG into Application Support without resampling, so a 32x32 figure stays blocky. Since 0.5.126 character scale defaults to 300%, reaches 600%, and fits the active display without changing the saved preference. Since 0.5.139 Miles's idle state declares its own 2x pack scale; the stable viewport, combat states, and saved global scale do not change. Since 0.5.142 stock idle used 3x scale, an additional 1.5x. Since 0.5.149 the stock idle is normalized to the approved 1.30x to match combat character size. Non-stock pose scales stay intact. Character speed is a separate saved control below Character size, ranging from 25% to 200% with a 100% authored default. It scales the complete playback clock, including patrol rest beats, without resizing the character or card. macOS Reduced Motion still freezes animation. Use COS figure switches to the drawn figure; choose Miles under Characters to restore the animated Jedi.
Accessibility that survives updates
Since COS Control 0.5.107 the app signs with a stable identity, so the macOS Accessibility grant you make once keeps working across updates. Earlier builds lost the grant on every update while System Settings still showed it enabled. If a session jump cannot use Accessibility, the pet now opens that Settings pane and says the fix: toggle COS Control off and on, then reopen it.
A sprite pack that escalates with session count
Since COS Control 0.5.109 the session pet can use a different sprite for each live state. Install sprite pack maps a folder of strips onto Idle, Waiting, Running, Success, Error, Attention, patrol, a droid duel, a three-droid cluster, and a five-droid swarm. Since 0.5.127 the gallery combines bundled animated characters and OpenPets stills in one searchable count; Miles Windu is bundled character 301. Since 0.5.129 the gallery contains four bundled Jedi and 300 OpenPets characters, advanced animation packs carry a badge, and the settings live behind compact disclosures. Since 0.5.135 Miles's V15 pack uses reviewed 2x masters for four directed stories. Since 0.5.139 V15.1 replaces those active-session strips with the approved 16-, 12-, 13-, and 16-frame stories for one, two, three, and four-plus sessions. Droid positions persist until a visible hit removes them, the saber stays attached except during the visible rotating hand toss, and every story closes on its opening composition. Since 0.5.134 Nia Solari, Elara Vale and Rowan Vale each carry their own combat animation for the two, three and four-plus session states. Since 0.5.139 Elara V1.1 removes the oversized white background matte around the green saber without changing her source blade geometry or choreography. The V15-to-V15.1 and Elara V1-to-V1.1 migrations require an exact stock byte/state match; custom packs are never overwritten. Since 0.5.142 Miles V15.2 has 16-, 17-, 13-, and 23-frame stories, including the rightward jump-roll, three defensive opening blocks, counterclockwise spin into a visible back-thrust, and Force pull into a chest strike. The frame limit is 32 so the longer stories retain exact cell boundaries. Recognized stock V15 and V15.1 installs receive V15.2 automatically; custom artwork stays untouched. Since 0.5.143 Miles V15.3 replaces only the four-plus-session story with 25 approved frames: a clockwise spin, continuous reverse-grip contact and breakup, then a visible saber release, flip, and catch. The one-, two-, and three-session strips stay byte-identical. Exact stock V15.2 and earlier installs upgrade automatically; custom artwork and pose scales stay intact. Since 0.5.149 Miles V15.4 uses 26 swarm frames, with a rear-facing block, underhand rising-cut preparation, slash follow-through, staged Force lift and chest thrust, and believable blaster travel. Exact-stock V15.3 and earlier packs migrate automatically; the other three session strips are unchanged. Since 0.5.130 installing a pack replaces the whole character instead of layering over the last one, so switching back to a legacy pack works and every state still draws. An enabled pet remains idle with no active sessions, keeps one collapsed viewport across every state, and since 0.5.142 carries a ledger bar under the character — amber for waiting, a breathing green for running, gold for finished — whose hover pills pin the live and finished session lists; a double-click on the character still opens the live list. Choose sprite is still your own PNG.
Chat into a session from the Mac
Since COS Control 0.5.75 a text composer sits under every Claude, Codex, and Cursor session detail. Open Activity, choose Sessions, pick a session, and type. Your message lands in the real thread on this Mac, and the reply comes back in the same pane. A long turn keeps running even with the window closed; reopen the session and the newest reply is there. Text only, by design. The Continue agent threads toggle in Settings gates the feature and is on by default.
See what is attached, and open it
Since COS Control 0.5.85 a message carrying rich media says so before you open it. The message icon wears a filled type mark on its corner — a camcorder for video, a framed peak for photos, a folded page for files, stacked cards when a turn holds more than one kind — and the row badge repeats the type with a count. Opening the message shows a video’s poster frame with its length; clicking hands the file to QuickTime or Preview. Before 0.5.85 a video was dropped silently at four separate layers and never appeared at all. Timestamps in the same list carry their day in 12-hour time, so a list spanning several days is readable at a glance.
Busy thread? Retry, or fork it
Since COS Control 0.5.76 a thread that is mid-turn refuses politely and offers Retry and Fork with this message. The fork runs your message in a copy of the thread, seeded with its history, while the original stays untouched. The new thread appears at the top of the Sessions list. Cursor sessions accept messages but do not fork, and say so in the server’s own words.
Same data and token
Your existing ~/.cos-glasses configuration, recordings, meetings, messages, and token remain compatible.
Migrating from Terminal? Stop the foreground server with Control-C first. Then install COS Control and run Guided Setup. You can return to the npx command later without converting your data.
3. Ask anything
Voice in. Context out.
From Home, one tap opens your latest answer. Scroll up for the Messages list, tap ✉ Record Message, and talk.
Answers stream to the lens and read as one continuous message, scrolled natively by the glasses like a news feed. No pages. No chunk-tapping. The footer keeps the receipts: model, message number, elapsed time, session date, battery.
Reading controls
| ↑ ↓ | Scroll the message. The glasses handle it natively, so it feels like the firmware because it is. |
| Tap | Opens the footer menu: Messages | Reply. Tap again to confirm the highlighted choice; scroll to switch between them. |
| Double-tap | Reply straight away: dictate a voice follow-up to the open message. |
The two-tap footer menu is deliberate. G2 firmware occasionally reports phantom ring taps, and the confirmation step means a stray tap never throws you out of a message.
4. Rich media
Show it. Share it. Ask from the lens.
Tap + to attach photos, text files, Markdown, CSV, JSON, PDFs, MP4, or MOV. COS keeps the source durable through upload and retry, then gives Claude Code, Codex, or Cursor bounded text and representative visual frames instead of a fragile temporary link.
MESSAGES (30)
Q: Which of these two is the drought-tolerant one?
Q: What is the part number on this filter, and what fits it?
Q: Read this label and tell me if it has dairy in it.
Bigleaf hydrangea. The blue flowers mean acidic soil, under about pH 6. It will survive Texas heat in morning sun with afternoon shade, but it wilts daily above 95 and needs deep water twice a week.
Capture on the phone. Read the answer on the lens.
One attachment menu
Tap +, then choose Photo Library, Take Photo, Take Video, or Choose Files. Add an optional prompt, then tap Ask or Queue. Choosing media only stages it; nothing sends until you explicitly submit. The G2 has no camera, so capture is always on the phone.
Documents become useful context
Plain text, Markdown, CSV, and JSON remain bounded text. PDFs become bounded extracted text plus page previews, so the agent can reason over both the words and layout without receiving an unbounded document.
Videos become representative frames
Attach a clip from Photos or record one on the iPhone. The original MP4 or MOV is stored; the agent receives sampled stills, not a live stream. Large uploads use resumable 1 MiB chunks with two pieces in flight, a status line such as Uploading clip.mov 12/237 (5%), and resume from the server’s confirmed offset after a drop. Meeting audio keeps priority, with a 20-second cap so video is not starved. Settings → Recovery Center has Clear stranded video uploads for leftovers that have not received bytes for 60 seconds.
Keep useful answer images
Generated images, research images, and email images the agent explicitly used can follow the completed answer into its phone gallery. Turn on Lens images to open a private 288×144 grayscale preview on G2. COS does not crawl arbitrary URLs or scan your mailbox for pictures.
Durable and bounded. Attachments retain their retry, cancellation, and recovery state. Size and type are checked before processing; identifiers cross the message ledger instead of private filesystem paths. Nothing auto-paints over what you are reading, and lens images stay blocked during meetings or microphone-critical flows. Install ffmpeg on the server Mac for image and video processing: brew install ffmpeg.
5. The lens
Four screens. Three gestures.
Everything runs on tap, double-tap, and scroll. Each screen prints its own hint line, so the lens always tells you what is live.
Home
Shows the version, your latest message number and age, weather, and your next calendar event. Hint line: Tap=Latest ↓ Menu ↑ Messages
| Gesture | What happens |
|---|---|
| Tap | Open the latest message. |
| ↓ | Open the Quick Actions menu. |
| ↑ | Open the Messages list. |
| Double-tap | Ask to exit COS. Home is exit-only by design, so you can always find your way out. |
Quick Actions
The main menu. Scroll moves the ▸ cursor, tap runs the highlighted item:
| Home | Back to the idle screen. |
| Review Meetings | Summaries, topics, decisions, and action items from past recordings. |
| Start Meeting AI | Begin a live-transcribed recording. While recording, this slot becomes Resume Meeting and Stop Meeting AI. |
| Messages | The live list of recent conversations. |
| Message History | The full archive, back to day one. |
| Threads | Ongoing work with stable IDs, meetings, milestones, sources, and status. Double-tap a detail to attach its refreshed context to a new prompt. |
| Memory | Recent stored context with full-store type totals, summary, stable ID, and bounded detail. Double-tap a detail to attach its refreshed context to a new prompt. |
| Sessions | Claude, Codex, and Cursor chats from this Mac. Updated and Opened look back 7 days. Pinned lists ChatGPT pins, Cursor sidebar pins, and Claude Desktop stars at any age. On 6.8.360, list rows and the first detail page show a DISCUSSION gist when the server sends discussion_summary. Opening a session gives you the action menu below. |
| Network | Connection status. |
Messages list
Rows read ▶ #4 09:14 what did we decide… with the newest activity on top.
| Tap | Open the highlighted message in the reader. Tapping ✉ Record Message at the top starts a new dictation. |
| ↑ ↓ | Move through the list. |
| Double-tap | Start dictating a new prompt from anywhere in the list. |
Running, queued, and ✓ Done rows appear in this list while jobs work. Jobs covers those.
Session detail
Open Sessions from Quick Actions and tap a row to read it. From the detail page, a single tap opens the action menu: the short list of things COS can do with that thread. It arrived in its current home in 6.8.364, when Continue and Fork moved off the list row and into the session itself, so you read the context before deciding to write into it.
Two taps, never one. The first tap opens the menu. The second tap runs the highlighted row. That is deliberate, not friction: the ring reports the occasional phantom touch, and both Continue and Fork start a real model turn on your machine.
| Gesture | What happens |
|---|---|
| Tap | Open the menu. Tap again to run the highlighted row. |
| ↑ ↓ | Move the ▶ cursor. The list wraps, so scrolling past Ask COS returns to Back to list instead of dead-ending. |
| Double-tap | Leave for Quick Actions, behind a confirmation. The footer reads Double-tap again for Quick Actions and you have three seconds. An open menu closes on the way out. |
| Wait | The menu retires itself after three seconds of no input and the normal footer returns. |
The cursor opens on Back to list, the one row that cannot change anything, so a phantom double touch lands somewhere harmless. Continue sits exactly one scroll away.
| Row | What it does |
|---|---|
| Back to list | Return to Sessions. Nothing is written, and it is always present, so the menu can never trap you. |
| Continue | Attach to the original thread and start recording a turn. Selecting it only opens the microphone. Nothing enters the conversation until you send, which is its own confirmed step. |
| Fork | Record against a copy of the thread and leave the original untouched. This is what every refusal points you to. |
| Ask COS | Ask a question about the session without writing into it at all. |
When Continue is unavailable
COS asks the server whether the thread is free before it offers to write into it, and it fails closed. Anything short of a clear yes disables Continue rather than guessing: a check that has not run yet, a reply it cannot read, or another process already holding the thread. The row says so in words, the reason prints under the list, and the footer stops advertising a tap.
A greyed word with no explanation is indistinguishable from a rendering glitch on a monochrome lens, so the refusal is spelled out rather than implied. If the thread is merely busy rather than refused, the row instead reads Continue (queue): COS takes the dictation now and sends it when the thread frees.
The menu only appears for a session whose provider COS has a write path for, which today means Claude, Codex, and Cursor. Any other provider leaves the page exactly as it reads, with no menu at all, rather than offering an action that cannot run.
6. Jobs
Watch it work.
Every prompt is a job that lives on your Mac. Watch it, queue it, or cancel it, and once it starts it keeps running even if you close the app. Nothing ever hijacks your screen.
Queue, watch, cancel
Ask while a reply is streaming and the new prompt queues: up to five wait in line, first in, first out. Rows in Messages show the state as … Queued 1/2, Running · Searching web..., and ◆ Done #4 09:14 summarize the pilot.
Tap a running row to watch. The activity page is a terminal-style tail with mm:ss stamps and SENT, TOOL, OUT, LIVE, DONE tags. The lens shows the newest seven lines; scroll back through the last 80 events, all the way to the complete original request pinned at the top. If a reply finishes while you are watching, double-tap opens it before the two-step cancel gesture. Hidden phone-only or tool activity never shifts a history window you scrolled to by hand. LIVE lines are the answer being written. OUT lines are bounded, redacted tool output, shown only if you opt in under Settings.
The job lives on your Mac
The moment your Mac accepts a prompt, the job belongs to the server, not the phone connection. Closing or backgrounding Even Hub, losing Wi-Fi, or switching networks does not stop it. Reopen COS and it reattaches to the same job, replays the activity you missed, and delivers the finished reply. Only an explicit Cancel ends the work.
A send moves through Submitting, Accepted, Running. A dropped connection shows Reconnecting · job still running, never a false Failed. If the Mac server itself restarts, COS shows Interrupted · prompt preserved and offers a one-tap retry; it never silently reruns.
Catch up when you return
Updates while away reconstructs accepted, running, finished, and interrupted work from the server ledger after the app reopens. Resume always targets the original job and model settings, so a reconnect cannot create a silent duplicate.
Restored photo-and-message rows verify their attachments before they run. If a photo still needs to be recovered, the row waits and explains why; it never submits the text alone or loses the queued prompt.
| Cancel | A deliberate two-step: double-tap arms it (Double-tap again to cancel, three-second window), a second double-tap cancels. Canceling pauses the queue; nothing auto-fires until you tap a queued row. |
| Close or disconnect | Not the same as cancel. An Accepted job keeps running on your Mac; closing the app, losing Wi-Fi, or switching networks shows Reconnecting · job still running, then reattaches the moment you reopen. Only Cancel ends the work on purpose. |
| Done rows | Finished jobs leave a short ◆ Done #4 09:14 summary trail in Messages (the last three). Tap one to jump straight to the reply; the row retires itself after the jump. |
| No-yank rule | If you are reading, browsing a list, or viewing a photo when a job finishes, the reply never steals the screen. You get a ✓ Reply #4 ready flash instead; double-tap when you want to open it. Only idle Home may open a finished reply automatically. |
| Edit a waiting prompt | Tap a queued G2 row and it opens in the prompt reviewer instead of firing: read the full request, edit with undo, re-record, keep the original, or save it for now or next. Photos, references, and model choice are preserved, and abandoning the edit leaves the original queued row intact. |
| Empty reply | If a model finishes with no answer, the job does not become a blank Done. It stays a visible, retryable empty_response row with your original prompt intact, and a blank reply can never be armed as a reference. |
7. Recall
Never lose an answer.
Every reply gets a stable short number in the current message era. Your full archive remains intact when a fresh era starts again at #1.
The Messages list keeps a recent window; the complete record lives in Message History. Numbers stay stable inside an era, so you can say “reference message 4” instead of repeating a prompt. A blank, incomplete, or no-longer-current reply cannot be armed as a reference; COS preserves the new prompt for a clean retry instead. If an operator starts a fresh era, old messages keep their original numbers in the dated archive while ordinary voice references resolve only within the new short list. No deletion, no collision.
8. Meetings
Record the room. Then talk to it.
Start Meeting AI from Quick Actions and the HUD becomes a live, speaker-labeled transcript with a single meeting-owned recording indicator. Audio is written to private phone storage first, so a network interruption does not become a lost meeting. A saved meeting is not a document you go back and skim. Double-tap a processed meeting and it opens as a conversation in Messages, grounded in the full transcript, and it keeps answering follow-ups.
▸ Pilot scope · 41m
Roadmap sync · 28m
Open Review Meetings and double-tap any idle, processed meeting.
“What did we actually commit to, and who owns it?”
Record a voice follow-up with that exact meeting attached as context.
Grounded in the full transcript, not a summary. Follow-ups keep the thread.
| Tap | Bookmark the moment. The lens flashes ★ Bookmarked and stamps the elapsed time. |
| ↓ | Scroll back through the transcript history. |
| ↑↑ | Back to Home. Recording keeps going; a REC timer stays in the header while you browse anywhere else. |
Stop Meeting AI ends the session. Review Meetings then holds the transcript, summary, topics, decisions, and action items, readable right on the glasses.
Connection dropped? Keep talking. Every audio chunk enters a local write-ahead log before upload. Each meeting is pinned to the Mac that admitted it, and raw audio receipt, transcription completion, and the final canonical transcript are tracked separately — so a silent stretch counts as complete without being mistaken for transcript text, and a delivered-but-not-yet-transcribed chunk stays retryable. When the server returns, COS reconciles those ledgers, sends only the ranges that are missing, and keeps the phone copy until the Mac has durably stored both the audio and its received-range record. A retryable server response never discards the local chunk.
Turn a saved meeting into a question
A saved meeting is also the starting point for a new question. Open it in Review Meetings and double-tap an idle meeting to record a voice follow-up with that exact meeting attached as context. A compact Meeting context attached indicator replaces the usual message-reference label, and the finished answer is stamped with the meeting so you can see what it was grounded in, both on the lens and in phone message review.
The grounding is the real record, not a summary. The paired server hands the Mac agent a bounded, UTF-8-safe copy of the canonical meeting so it can read the full transcript for decisions, outcomes, sentiment, details, or related topics. This needs server 6.12.7: an older server fails closed for this one action with a truthful update-server message, and COS never silently sends an ungrounded meeting question. A follow-up you queue or recover re-fetches the exact meeting before it runs, and survives the automatic post-meeting rename.
Connect an existing meeting library
In COS Control, choose Meetings Library. The recommended choice is the folder you already use: its immediate children are months such as 2026-08, containing Markdown meetings. COS browses it without moving, renaming, or rewriting anything. If you already organize meetings into several libraries, choose their parent instead; each custom-named folder only needs meetings/YYYY-MM/*.md inside.
Your COS role never determines these names. The same setup works for executives, marketers, engineers, product and people leaders, attorneys, chiefs of staff, clinicians, and other roles. The Blueprint adapts COS behavior to the person; your existing filesystem remains yours.
A direct library can coexist with a separate operations pipeline. Review Meetings merges direct, enriched, and standalone G2 records, then prefers the enriched writable copy when the same session exists more than once. Direct-only records show as read-only for speaker edits. If the picker finds an incomplete shape, it names both valid layouts and offers Choose Again or Skip for Now.
The lens catches up
The phone can keep receiving transcript chunks while the G2 display bridge is busy or disconnected. COS retains the newest unpainted transcript body and catches the lens up through one ordered display lane after reconnection. Scrolling into history intentionally pauses the live reveal; choose Resume Meeting to return to the newest text.
Stopping is durability-aware
A normal stop is one tap, and it returns within a bounded five-second foreground budget. If storage or connectivity is changing at that instant, COS shows Meeting paused · tap Stop again instead of claiming the recording was saved — a slow network returns a truthful pending state while your audio and retry ledger stay intact in phone storage. The second tap finishes the durable close; message recording unlocks only after the meeting reaches idle.
The live transcript remains canonical. A higher-quality post-meeting pass replaces it only when coverage and repetition checks pass; a bad rewrite is rejected without touching the complete streaming transcript.
Early Sync: the meeting arrives before the polish
Since server 6.21.9, COS separates when a meeting becomes findable from when its highest-quality transcript is finished. Previously a saved meeting waited for the whole post-meeting Large-v3 pass before it reached your Operations pipeline, and a long batch could hold it for many minutes. With COS_MEETING_EARLY_SYNC=1 in ~/.cos-glasses/.env, the saved meeting claims its stable session identity immediately, then the same artifact is enriched in place when the polish lands. Fireflies and Granola match that one meeting instead of racing it, so you never get two owners for the same conversation. The switch is I/O only: it changes when identity is written, never what gets transcribed.
Progressive HQ: polish while you talk
Also since 6.21.9, and off by default: COS_MEETING_PROGRESSIVE_HQ=1 lets Large-v3 work through sealed 30-second windows during the meeting on one preemptible CPU-only worker, so Stop mostly has the unfinished tail left rather than the whole recording. Admission is tier-aware. Balanced is capped at two background threads for fanless M1/M2-class Macs; Max defaults to six and is still capped by available CPUs. COS_MEETING_PROGRESSIVE_HQ_THREADS can lower that but never raise the tier cap. Checkpoints are reused at Stop only when audio, context, model, and session identity all still match, so provisional text can never become canonical on its own, and an abandoned recording cannot monopolize the worker.
Leave progressive HQ off for now. It is compute that runs beside your live transcription, and it stays default-off until the latency and thermal gate passes across more hardware. Early Sync is the safer of the two and is deliberately independent, so you can enable it alone. Either switch can be turned off on its own, and a restart returns you to the established behavior.
Idle Metal HQ: GPU for the polish, never against a live meeting
Since 6.14.1 the post-meeting Large-v3 polish has run on CPU so it can never fight a live meeting's ASR for the GPU — going meeting to meeting, the polish of one call overlaps the capture of the next, and two Metal workloads degrade each other. The tax was that idle polish stayed slow too. COS_BATCH_HQ_METAL=1 opts into GPU-when-idle: each segment picks Metal only when nothing live is contending, and a meeting starting mid-batch preempts the GPU immediately. The interrupted segment is discarded and retried on CPU, so a truncated transcript is never saved.
Measured on a real mixed workload, post-stop batches ran 6.1× faster per word on Metal than CPU (30.5 ms/word against 187.4). Note what this does not change: progressive checkpoints during a meeting still run on CPU by design, so the during-meeting path is unchanged. This is off by default — run a meeting-to-meeting smoke on your own machine first. COS_BATCH_HQ_FORCE_CPU=1 is the blunt rollback and wins over everything.
Named speakers need the voiceprint model
Telling one voice from another uses a ~26 MB voiceprint model that is deliberately not bundled in the npm package. Server 6.37.3 fetches it during ordinary setup. Without it nothing breaks and nothing warns you on the glasses: every voice is simply recorded as Me or Ext.
If speakers are not being named, install it and restart the server: npx --yes @gotcos/glasses-server@latest --setup-speaker-model. Set SKIP_SPEAKER_MODEL_DOWNLOAD=1 to opt out on a metered connection. COS Control (0.5.70 and newer) shows a banner on Review speakers with a Guided Setup button whenever the model is missing.
Two ways to enrol a voice, and they do different jobs. Activity window → Add a voice creates a brand-new profile from unrecognized audio the server is still holding (72 hours). Review speakers renames a voice inside a saved meeting; given a new name with the “Just this meeting” scope, it also creates the profile.
Enrolment does not reach back past the model install. Voice evidence is only banked while the model is loaded, so meetings recorded before you installed it can be relabeled but cannot produce a voice profile. Record a fresh meeting after setup, or enrol from held audio inside the 72-hour window.
Retries do not duplicate meetings
Saving is idempotent: repeating the same save request returns the original receipt and filename instead of creating another meeting. Closed-session markers also prevent delayed uploads from recreating a meeting after it has been saved.
Compatibility: glasses 6.8.437 plus server 6.41.0 is the current companion pair; Even Hub still lists 6.8.353. Phone-local Moonshine remains opt-in; Mac Whisper remains the default. Enabling Tiny or Base adds rolling provisional text to Messages and Meetings without changing canonical meeting capture, speaker attribution, save, HQ polish, recovery, or sync. Core queries, rich media, display, queues, Memory, Threads, and Sessions preserve their established contracts. Memory and Threads still require a compatible full-COS workspace bridge; standalone installs keep all core glasses features and show those two surfaces as unavailable. Older persisted meeting references remain valid.
9. Dictation
Long prompts, hands free or phone local.
Dictate a sentence or a page. Mac Whisper remains the default. Build 336 lets English Moonshine Tiny or Base form and revise text on the iPhone while you speak in both Messages and Meetings. Nothing sends until you approve a Message transcript, and Meeting preview never becomes the canonical record. Long on-device dictations no longer freeze. Moonshine yields the main thread now, so the footer progress bar fills and audio capture keeps up on long recordings. Video uploads no longer stall behind meeting audio: a stuck meeting transfer could starve media uploads indefinitely, now capped at 20 seconds. Adds rolled-up upload timing and a dictation finalize breadcrumb so the next issue is measurable instead of invisible. Requires server 6.27.4.
-
Record
Tap ✉ Record Message in the Messages list (or double-tap anywhere in the list). The lens shows Listening... and fills with warm transcript text while you speak. Moonshine reruns over the still-open phrase, so words may revise as more audio arrives. If COS is speaking an earlier reply, opening the microphone stops playback first so the old answer cannot overlap or enter the new prompt.
-
Review
Tap to finish. COS runs one complete Moonshine transcription, then reuses the same deterministic glossary and optional Haiku/Sonnet finalizer used by Mac dictation. The complete draft remains reviewable before anything is sent. Final polish is on by default and can be disabled under Voice. The recording remains recoverable on the phone, with a server backup when reachable.
-
Send, edit, or redo
The cursor starts on Send, so sending as-is is one tap. Or choose Edit and speak the change (“make the second sentence shorter”), Re-record, or Cancel. After an edit you also get Send revised and Undo edit.
Mac Whisper, default
Your durable prompt audio uploads to the paired Mac and uses the established Whisper lane. This remains the fallback if phone storage, download, model startup, or inference is unavailable.
Moonshine Tiny
The smallest, fastest English phone model. Select Settings, Voice, Dictation + live preview, On phone: Tiny. The model downloads once, is verified before loading, and is reused for rolling Message and Meeting preview.
Moonshine Base
The larger English phone model for better accuracy when a little more local processing time is acceptable. Select On phone: Base. It uses the same rolling-preview and settled-finalizer contract as Tiny. Both are optional, so the EHPK stays small instead of bundling hundreds of megabytes of weights.
Local audio boundary
After successful phone-local transcription, prompt audio never goes to the Mac. Only the transcript continues through your paired server to the agent you selected. If local inference fails, COS visibly falls back and resumes from the same durable WAV instead of asking you to record again.
Preview is not the record. Moonshine can show fast, unlabeled Meeting text while a phrase is still open. When it settles, the shared finalizer may clean that provisional phrase, but only after the durable audio capture succeeds. Speaker-attributed Large-v3 remains authoritative and atomically replaces it. Preview is never persisted, indexed, saved, sent to HQ polish, or used by recovery and sync. Final polish is on by default; turn it off to keep settled Moonshine text raw.
10. Models
Choose your brain. Keep it current.
Seven entries in Settings under Default chat model, spanning all three agent CLIs: Claude Code, Codex, and Cursor. Every slot resolves the newest model at the moment you send, so the picker never goes stale and the app never needs an update to follow a release. Run a local Ollama daemon and an eighth entry appears: a fourth model family that answers entirely on your Mac.
The newest Opus, resolved through your Claude Code CLI at the moment you send. 1M-token context.
The newest Fable-tier model, same send-time resolution, same 1M context.
The newest Sonnet: fast, capable, and cheap enough for the everyday questions.
The strongest capable model in the newest GPT generation, discovered live from Codex's model catalog. Settings shows the exact model serving today.
The strong-and-efficient sibling from that same live generation. When the catalog advances, both GPT slots follow it automatically.
Cursor’s fast reasoning slot. It follows the newest cursor-grok-<ver>-high-fast id from agent models (today Grok 4.6 / cursor-grok-4.6-high-fast). Low, medium, xhigh, and non-fast SKUs stay out. If the live catalog is empty, the fallback is cursor-grok-4.5-high-fast. CLI DEBUG shows the concrete id that served the last message.
Cursor’s own model, composer-2.5-fast, tuned for speed on everyday work. Both Cursor slots stay recognized even when the Cursor CLI is absent, so version skew fails closed instead of silently remapping to Opus.
If the live catalog is unreachable, COS falls back to the local catalog cache, then lets the CLI pick its own current default. It never pins a stale model, and economy or hidden variants are excluded from the slots. The CLI DEBUG card in Settings always shows the exact model that served the last message.
Reasoning effort
Four levels ride along with every message: High (default) Extra High Max Ultracode. Higher effort means deeper reasoning with slower, costlier answers. On GPT models that advertise support, Max stays Max and Ultracode maps to Codex Ultra; older models clamp safely to what they can do.
Local models via Ollama
Server 6.39.0 adds Ollama as a fourth model family beside Claude, Codex, and Cursor. The model runs entirely on your Mac, so a query never leaves the machine. Install Ollama (the Mac app from ollama.com, or Homebrew) and pull at least one model:
brew install ollama && brew services start ollamaollama pull qwen2.5-coderThat is the whole setup. When the daemon answers on 127.0.0.1:11434 with at least one pulled model, Ollama appears in the glasses and companion pickers. When the daemon is down, the slot hides again, and a saved Ollama choice safely resets to Opus. Since server 6.40.1 a local model can search your meetings and memories and read one meeting, read-only, when the pulled tag advertises tool support and the COS pipeline is configured. Writes, Bash, MCP, web search and web fetch are not on this path. Still no vision, no Continue or Fork, no Live Cues.
Two optional keys in ~/.cos-glasses/.env: COS_OLLAMA_MODEL pins the model COS uses, and COS_OLLAMA_HOST points at an alternate loopback address (LAN addresses and 0.0.0.0 are refused). COS Control 0.5.73 and newer preserves both keys across server updates, so Update Server never drops your local-model settings. Since Control 0.5.74 the About view shows an Ollama row with the live model when the daemon is ready, and Doctor prints a matching line; no row is the correct render for a Mac without a local daemon.
Requires server 6.39.0 or newer. 6.40.1 or newer is strongly recommended: 6.39.1 fixed durable Ollama jobs forgetting their engine, and since 6.40.0 hidden thinking follows the effort you ask for: the default effort keeps local turns instant (a thinking chain once turned a 2-second answer into 98 seconds), while xhigh and max raise the thinking budget with them. In a controlled flag test a thinking local Qwen matched an Opus 5 reference at 10/10 where the same model without thinking scored 6 to 7. COS_OLLAMA_THINK pins the behavior in either direction (1/0 or a budget: low, medium, high, max), and Control 0.5.79 adds a Local model picker in Settings that pins COS_OLLAMA_MODEL, so pulling a new model no longer silently repoints selection.
11. Privacy
Private by architecture.
There is no COS cloud. Prompts run through the CLIs you already trust, and the history stays on your Mac.
Your Mac is the brain
Queries spawn your local claude or codex CLI and bill to the subscription you already have. Conversation history is a JSON file per day under ~/.cos-glasses/data on your Mac.
Off means off at the source
With Tool activity set to Off, previews are never transmitted to the phone, not merely hidden, and tool status flattens to a generic Processing...
Safe output is actually safe
Preview lines are capped at about 180 characters, control codes are stripped, bearer tokens, API keys, passwords, and JWTs are redacted, and opaque blobs are hidden. Raw tool payloads never reach the phone.
Nothing lingers
Live response lines and tool output exist only in the running job's memory. The trail kept with a finished message is tool names and timing, twelve entries at most.
Rich media stays opaque
Messages and ledgers carry random attachment IDs, never raw attachment bytes or private filesystem paths. Photos, documents, PDFs, and videos are size/type checked, bounded for model context, and served only through the authenticated server.
Phone-local means audio stays local
When Moonshine Tiny or Base succeeds, the iPhone turns audio into text before contacting the Mac. Rolling inference stays on the phone. At a settled Message or Meeting boundary, only bounded text may reach the authenticated finalizer; raw phone audio does not. A visible Mac fallback is the only path that uploads the durable Message WAV. Meeting audio continues through its existing local-first capture contract.
Offline meeting audio is temporary
Meeting chunks wait in private phone storage only until the Mac acknowledges the complete canonical recording. Exact missing ranges are retried idempotently; acknowledged audio can then be removed without risking an un-uploaded tail.
No hidden reasoning
COS surfaces observable work only. Model thinking appears as a generic Reasoning... status, never as text on your lens or phone.
You choose what shows
Four Activity Visibility controls in Settings decide what job detail appears, and where. Defaults below.
| Control | Options | Default |
|---|---|---|
| Tool activity | Off / Status only / Status + safe output | Status only |
| Live response lines | On / Off | On |
| Completed activity trail | On / Off | On |
| Detailed output location | Phone + G2 / Phone only | Phone + G2 |
12. Settings
Three tabs, one place.
Open the phone companion and tap the gear. Build 336 groups controls under System, AI, and Voice. Every preference, including dictation + live preview, final polish, the spoken-reply engine, and local voice, persists through Even Hub storage.
| Section | What it holds |
|---|---|
| SYSTEM · CONNECTION | Status, server URL, and Disconnect. Disconnect wipes the saved URL and token; reconnect through the wizard. |
| AI · MODEL | Default chat model: the always-current entries above, plus Ollama whenever a local daemon is live with a pulled model. |
| AI · REASONING EFFORT | High (default), Extra High, Max, Ultracode. |
| SYSTEM · RECOVERY CENTER | App API, live stream, G2 bridge, local Whisper, transcription policy, Claude CLI, Codex CLI, and Cursor CLI are evaluated independently. Refresh diagnostics checks them together without converting an unsupported optional route into a false system-wide disconnect. Build 228 actively checks current G2 device evidence: definitive attachment is green, a definitive disconnect is red, and transitional or unavailable evidence stays Unknown. |
| SYSTEM · CLI DEBUG | Claude CLI and Codex CLI each show support, last-run status, and whether action is needed. Last run OK describes the most recent run; it is not a live login guarantee. Diagnostic responses are metadata-only: no prompts, answers, tool output, paths, commands, raw session IDs, tokens, or credentials are returned to the phone. Sign-in and credential updates happen on the Mac with claude auth login or codex login. |
| AI · ACTIVITY VISIBILITY | The four job-detail controls: Tool activity, Live response lines, Completed activity trail, Detailed output location. |
| VOICE · DICTATION + LIVE PREVIEW | Mac Whisper is the default. On phone: Tiny favors speed and On phone: Base favors accuracy. Both are English-only, download verified model assets on first use, and can form and revise provisional text in Messages and Meetings. Local setup or inference failure falls back visibly. Successful phone-local Message dictation keeps its audio on the iPhone. |
| VOICE · FINAL POLISH (AI) | On by default. Reuses the existing dictionary plus Haiku or Sonnet finalizer only after a Moonshine Message or Meeting phrase settles. Live preview stays fast; failures keep the raw transcript. Turn this off for verbatim settled Moonshine text. |
| VOICE · LIVE MEETING ASR | Server Whisper remains canonical for Meetings. Balanced uses Small.en for provisional server text, Large-v3-Turbo for committed live text, and Large-v3 for polish. Max uses Large-v3-Turbo for provisional server preview and Large-v3 for authoritative commit and polish. Phone Moonshine preview may appear earlier, but canonical work always replaces it. Add the names, companies, acronyms, and specialist terms you say often in ~/.cos-glasses/.cos-profile.json; factory placeholders are ignored. |
| VOICE · VOICE (TTS) | Choose Local, Local-first, or OpenAI. Local uses on-Mac Kokoro and fails closed; Local-first may fall back only after a local failure and only when OpenAI is configured. The voice picker is engine-aware, persists through reinstall, and includes a test button. Connect Bluetooth audio to hear playback. |
| VOICE · OPENAI KEY | Optional server-side key for administrators who deliberately enable cloud transcription fallback. A key by itself does not upload audio. Server 6.12.0 also requires COS_OPENAI_WHISPER_FALLBACK=1; otherwise transcription stays local. The key is never returned to the phone. |
| AI · LIVE CUES | Off unless you set COS_LIVE_CUES=1. Every cue is a model call on your own agent quota, not a free local pass. Bounded at 8 cue pipelines per meeting, one start per 60 seconds, and a 30-second cooldown after a cue fires. Runs on Cursor Composer; any other model fails closed rather than quietly billing one you did not choose. |
| SYSTEM · Reset preferences | Restores every preference to defaults. Your connection is kept. |
| SYSTEM · ABOUT | Version, build, and the local-data note. |
13. Troubleshooting
When something looks stuck.
Almost everything comes back to one question: can the phone reach the Mac?
A capture that recorded only silence
Server 6.37.3 records a silent capture as no_speech and clears it, instead of re-attempting recovery on every pass; earlier builds could retry the same empty capture indefinitely. The audio is not deleted — it stays in the unsaved-audio store until the normal retention clock removes it, so it is still available to enrol a voice from.
“Query failed. Check COS server connection.”
The phone cannot reach the Mac. Confirm the Mac is awake and the server is running (npx --yes @gotcos/glasses-server@latest), and that the phone is on the same Wi-Fi, or that Tailscale is up on both devices. Quick check: open http://YOUR-SERVER-IP:3141/api/health in the phone browser.
Claude Desktop is installed, but COS cannot find Claude
Desktop and Claude Code are separate apps. In Terminal, run npm install -g @anthropic-ai/claude-code on one line without sudo. Then run claude, finish the browser sign-in, and confirm claude --version works before starting COS again.
npm reports EACCES or a root-owned cache
Do not use sudo and do not recursively change system ownership. Start COS with a private user-owned cache: npm_config_cache="$HOME/.cos-glasses/npm-cache" npx --yes @gotcos/glasses-server@latest. Server 6.12.2+ resolves the dependencies npm already installed and never launches a second install from npm's temporary package folder.
@latest started an older server
Compare server_version in /api/health with npm view @gotcos/glasses-server dist-tags.latest. If they differ, stop the old process and rerun with fresh metadata: npm_config_prefer_online=true npm_config_cache="$HOME/.cos-glasses/npm-cache" npx --yes @gotcos/glasses-server@latest. Do not use sudo or delete system caches.
Restarted the server?
Force-quit the Even app and reopen it. Settings and the connection survive. Disconnect in Settings is the last resort: it clears the saved URL and token, so you would re-paste them from the wizard.
Closed the app while it was working?
Nothing is lost. Once a prompt is Accepted, the job runs on your Mac, not the phone. Reopen COS and it reattaches to the same job and shows the reply. A brief drop reads Reconnecting · job still running, not Failed. If the Mac server restarted, you will see Interrupted · prompt preserved with a one-tap retry. Only Cancel stops a job on purpose.
Voice feels slow or local Whisper is unavailable
Mac Whisper transcribes for free and remains the default. It is a one-time prerequisite for Mac voice and canonical Meetings: run brew install whisper-cpp, stop COS with Control-C, rerun npx --yes @gotcos/glasses-server@latest, then confirm Recovery Center shows Local Whisper ready. Phone-local Tiny or Base can provide Message dictation and provisional Meeting text, but final speaker-attributed Meeting text still requires Mac Whisper. Text chat remains available without either path. COS keeps retryable audio instead of discarding a prompt. Cloud fallback stays off unless the server operator explicitly enables it and configures a key.
Phone dictation says text/html is not a valid JavaScript MIME type
You are running build 334. Its bundled ONNX runtime asked the Even WKWebView for a relative JavaScript loader and received the EHPK document instead. Install COS Glasses 6.8.353 from Even Hub. Build 335 and newer pin the loader URL explicitly and reuse any verified Tiny or Base model already on the phone, so you do not need to redownload the model. Until you update, select Mac Whisper under Settings, Voice, Dictation + live preview.
Tiny or Base is downloading
Keep the Even app in the foreground for the first model download. COS downloads one asset at a time, verifies its expected size and SHA-256 hash, then stores it privately on the phone. A failed or incomplete setup falls back visibly to Mac Whisper. Retry later on a stable connection; do not reinstall or clear Even app data unless support asks you to.
Recovery Center shows a disconnected component
Build 337 evaluates each layer independently. Server updates means the display-event connection is live; it does not claim that the Mac is transcribing speech. Transcription route reports the route COS will actually use: iPhone Moonshine Tiny or Base, Mac Whisper, or a visible Mac fallback while the selected phone model is unavailable. During a Meeting, an iPhone route is labeled preview because canonical speaker-attributed Large-v3 still runs on the Mac. Mac ASR policy separately reports whether the Mac permits local-only or cloud fallback. Tap Refresh diagnostics for one coordinated check.
The COS splash stays over a ready lens
Install build 338 or newer. The splash now hands off automatically when startup and welcome context settle; no swipe is required. Tap or scroll can still skip it, and a 10-second failsafe prevents it from remaining indefinitely if startup never reports ready. A foreground-return inbox glance still waits for your input by design.
Claude CLI or Codex CLI says “Sign in on Mac”
Provider authentication is intentionally managed on the Mac, never from the phone. Run claude auth login or codex login, complete the provider sign-in, then tap Refresh diagnostics. A successful prior run appears as Last run OK; if credentials expire afterward, the next attempted run will safely surface the new sign-in state.
Only the CLI rows say “Update server”
The connected server predates the authenticated metadata-only /api/cli/debug route. Queries, meetings, images, queues, G2 display, and local Whisper remain usable. Rerun npx --yes @gotcos/glasses-server@latest on the Mac to install the current server; COS does not clear drafts or credentials just because this optional route is absent.
Server dropped during a meeting
Keep talking. The phone journals audio locally and reconnects without restarting the meeting. When the server returns, COS reconciles the Mac identity and its audio and transcription ledgers before draining, uploads the exact missing ranges, catches transcription up, and retains local audio until the complete receipt arrives. If Mac storage is unavailable or full, COS returns a retryable error and preserves the phone copy instead of silently accepting the audio.
“Meeting paused · tap Stop again”
The first stop reached a transient storage or reconnect boundary, so COS refused to show a false success. Tap Stop Meeting AI once more. Your audio is retained, and new message recording unlocks after the meeting reaches idle.
Phone transcript is ahead of G2
The recorder is still working. COS keeps the newest unpainted body and normally catches the lens up within the existing display cadence after the bridge returns. If you scrolled through history, choose Resume Meeting. If it persists, check the G2 connection while leaving the meeting running.
Photos unavailable
Run brew install ffmpeg, then rerun npx --yes @gotcos/glasses-server@latest. Lens viewing requires server 6.5.0+ and an exact 288×144 G2 variant. Turn on Lens images and retry outside any active meeting or microphone flow.
Confirm offline-safe meeting support
Open http://YOUR-SERVER-IP:3141/api/health. Build 337's meeting recovery is ready when the response includes features.localFirstMeetings: true and capabilities.localFirstMeetings.protocolVersion: 1. On server 6.27.2, local speech readiness remains additive under tts_local, the selected transcription policy is reported under capabilities.transcription.live, and retained Adaptive replay reports its exact scope and raw-preservation contract. Phone-local Moonshine is a companion capability, so it does not turn the Mac server health row green or red.
Message numbers are in the thousands
If replies come back numbered #14820 instead of #12, your install predates message eras and is still counting from the whole archive. Check it with your pairing token (every /api route is token-gated, so a plain curl returns 401 — copy the token from COS Control → Copy Pairing Token):
curl -H "X-Cos-Token: YOUR-TOKEN" http://YOUR-SERVER-IP:3141/api/message-counter
A healthy install returns both a max and an era. If era is missing, update to server 6.16.9 or newer, then start a fresh era once:
npx --yes tsx server/scripts/reset-message-era.ts --confirm
Run it from inside the installed package. For a COS Control managed install that is ~/Library/Application Support/COS Control/runtime/generations/<version>-<hash>/node_modules/@gotcos/glasses-server/. Restart the server afterwards and reconnect the phone. Your archives are not deleted — past conversations stay searchable, and only the short numbering restarts at #1. Fresh installs are unaffected and already start at #1.
Updating
Current supported versions are COS Control 0.5.149, server 6.41.0, and COS Glasses 6.8.353 from Even Hub. Sideload 6.8.437 for the newest companion build; Even Hub still lists 6.8.353. Rerun npx --yes @gotcos/glasses-server@latest --setup-transcription --transcription-tier balanced, then compare /api/health with npm view @gotcos/glasses-server dist-tags.latest. For immediate feature rollback, select Mac Whisper under Dictation + live preview or turn off Final polish. The package-level rollback is COS Glasses 6.8.353 with the same server 6.41.0. Do not roll back to 6.8.334 because that build contains the WKWebView loader defect. Check npm view @gotcos/glasses-server@VERSION version before pinning any server build. The /cos-glasses skill handles server health and updates.
14. FAQ
The short answers.
Which hardware and app versions do I need?
Even Realities G2 glasses with the Even Realities app 2.2.6 or newer. The current supported pair is COS Glasses 6.8.437 (Even Hub still lists 6.8.353) and server 6.41.0; COS Control 0.5.149 is recommended on Apple silicon. The server side needs Node.js 20.11 or newer on macOS, Windows, or Linux. Phone-local Moonshine Tiny and Base are English-only and download on demand to the iPhone. Mac Whisper remains required for canonical speaker-attributed meetings. Optional Kokoro spoken replies require Python 3.11 or 3.12, ffmpeg, and espeak-ng.
Do I need Claude Code, Codex, and Cursor?
One is enough. COS detects what is installed and signed in. Pick your default under Settings and switch whenever you like.
What does it cost to run?
The server is free and MIT-licensed. Prompts bill to the Claude, Codex, Cursor, or other supported subscription you already use. Mac Whisper and phone-local Moonshine transcription are free. Cloud transcription is disabled by default; administrators who explicitly opt in and provide an OpenAI key pay the provider's current audio-transcription rate.
Does anything leave my network?
Prompts go to the AI provider behind your own signed-in CLI, exactly as they would from your terminal. History, meetings, settings, and indexes stay on your Mac and phone. There is no COS-hosted copy.
What happens if my connection drops during a meeting?
Recording continues into private phone storage. On reconnect, COS uploads only the missing audio ranges and keeps the local copy until the Mac confirms the meeting is complete. The G2 transcript catches up separately, so a paused lens display does not mean recording stopped.
A new GPT or Claude model just shipped. Do I update anything?
No. Claude tiers resolve at send time through your CLI, and GPT Frontier and Balanced follow Codex's live catalog to the newest generation automatically. The picker updates itself.
Where do I report a bug or ask for help?
Open an issue on GitHub, or book a working session and bring the question.
Stay in the loop.
Run the glasses? Leave your email. New feature drops and beta access, nothing else.