smart glasses app · 2026

now-playing

a full spotify controller for my even realities g2 smart glasses: now playing, time-synced lyrics, gestures, and the whole library, on a monochrome heads-up display.

view source on github ↗the live app ↗

what it does

The glasses show the current song, artist, progress, what's up next, and lyrics that scroll in sync. Tap to play/pause, swipe for next/restart/previous, double-tap for a menu that reaches the entire library — playlists, albums, artists, podcasts, the queue, spotify connect device switching, volume, seek. It runs inside the even realities phone app and deploys straight from github pages; you sideload it onto the glasses with a QR code.

the glasses display playing maniac by michael sembello: dithered album art, play state, progress bar, next up, and the current lyric line
The display itself: dithered cover, progress, next up, synced lyrics.

everything that fought back

This project is mostly a list of platform fights, each with a workaround shipped:

  • 5-user cap Spotify development-mode apps max out at 5 users, so every user brings their own free spotify app and connects it with PKCE — no shared secret anywhere.
  • oauth in a webview Google/apple/facebook sign-in is blocked inside the even app's webview, so there's a "copy sign-in key" escape hatch: connect in your phone's real browser, carry the key across.
  • lyrics Spotify's own lyrics ride a private endpoint that would break ToS, so lyrics come from LRCLIB, a community database, with LRC timestamps binary-searched for the current line.
  • liked songs Can't be played as one context via the API, so shuffle plays a random 50-song stretch instead. Documented limitation, not a bug. Mostly.
  • hardware Swipes don't report which arm of the glasses they came from, but taps do — so tap actions are configurable per arm and swipe actions aren't.
the phone-side setup screen: connect spotify with your own client id, sign-in key fallback, gesture reference
The result of the 5-user cap: everyone brings their own spotify app.

album art in 16 shades of green

The display is monochrome green with 16 luminance levels. Naively mapping album covers onto that comes out muddy, so the art pipeline crops, contrast-stretches, then runs Floyd-Steinberg dithering to fake smooth gradients out of 16 shades. There's also a retry budget: after three straight failed cover downloads it stops trying, because a music app that hammers a dead CDN is worse than one with no art.

Text has its own pipeline — titles get sanitized for the glasses' font, and pixel widths are estimated from measurements taken off simulator screenshots via a purpose-built calibration page. You know a display is weird when you need a calibration page.

testing it without glasses on

The part i'm proudest of: a stateful mock of the spotify API, including spotify's real propagation delay before it reports your own changes back to you. End-to-end scenarios run against the simulator and inject faults — rate limiting, 502s, a request that simply never answers, an expired token racing a rotated refresh token. The glasses are the one place you really don't want to debug a hang.

stack

app
Typescript + vite, ~2,500 lines. Two surfaces from one codebase: the phone webview UI and the glasses render loop.
apis
Spotify web API (PKCE oauth), LRCLIB for lyrics, the even realities G2 bridge.
deploy
Github pages via actions on every push; the hosted build is the sideload target.
status
Live — it's what's on my glasses right now.