Todoist and Vikunja tasks on Even Realities G2 smart glasses. Bring your own API token — no developer-operated server, no OAuth flow, no data leaving your device except to your chosen provider.
0.2.0 — read, complete, create-by-voice, and phone-side settings all work end-to-end against both Todoist and Vikunja. With no token configured, Glassist runs in demo mode against an in-memory sample dataset, so the first-run and Vercel-preview experiences are immediately exercisable.
- Vite 6 + TypeScript (strict) + React 19 + Tailwind 4
@evenrealities/even_hub_sdkdirectly@evenrealities/evenhub-clifor QR sideload +.ehpkpackaging@doist/todoist-sdk(Todoist) + hand-rolled REST (Vikunja v2.x)even-toolkit/sttfor on-glass voice quick-add (Soniox or Deepgram)- Vitest + jsdom for tests
npm install
npm run dev # Vite on :5173
npm run typecheck
npm testOpen http://localhost:5173 in a desktop browser for the phone settings UI. Sideload to G2 glasses:
npm run qr # shows QR; scan with the Even AppA static web build deploys to Vercel as-is. Push to GitHub, import the repo at vercel.com, and it'll pick up vercel.json (buildCommand: npm run build, outputDirectory: dist). The deployed site runs the phone UI; it'll only drive the glasses via the SDK bridge when opened from inside the Even Hub WebView.
First-time visitors (no token configured) land in demo mode: the Connect tab flags it explicitly, and the app is pre-populated with non-persistent sample tasks so the nav, completions, and voice flow are all exercisable without signing in. Pasting a real Todoist or Vikunja token swaps the demo data for live data on the next settings-changed event.
- Todoist: Settings → Integrations → Developer → Copy API token.
- Vikunja Cloud: app.vikunja.cloud → Settings → API Tokens → create a
tk_…token. - Vikunja self-hosted: same flow on your instance; configure
cors.originsto allow the deployed origin (or use a proxy — see below).
Paste the token into the Connect tab. It's stored only on-device (via the Even Hub bridge with localStorage fallback) and sent directly to the provider — never to any Glassist-operated server.
Vikunja Cloud's CORS allowlist includes localhost / 127.0.0.1 only, so any LAN IP (phone sideload), Even Hub WebView, or Vercel host will be blocked.
Dev mode — the Vite server runs a /vikunja-proxy middleware that forwards to Vikunja server-side. Works transparently; just run npm run dev and sideload.
# For a self-hosted Vikunja during dev, point the middleware at your instance:
VIKUNJA_PROXY_TARGET=https://vikunja.my-domain.com npm run devProduction — the Vite middleware doesn't run in packaged builds. Options:
- Use the community Worker: paste
https://glassist-vikunja-proxy.mark-83e.workers.devinto the Connect tab's "CORS proxy URL" field. Pure relay, no server-side token, forwards to Vikunja Cloud. - Deploy your own Worker from
proxy/— sub-2-minute setup if you'd rather not trust the community instance, or if you're pointing at self-hosted Vikunja. - Self-host Vikunja with
cors.originsconfigured to allow the Even Hub WebView / Vercel origin. Leave the proxy URL blank. - Use Todoist — its CORS allows
*, so no proxy is ever needed.
Set a Soniox or Deepgram API key in the Voice tab. A + Speak a task row appears at the top of Home on-glass. Tap it → speak → tap to submit (or pause 2s for auto-submit) → the transcript is created as a task in your default project.
npm run pack # Builds and produces glassist.ehpkUpload glassist.ehpk to the Even Hub portal.
MIT