Skip to content

Install UX: zee -setup wizard, credentials.json, configurable hotkey#27

Draft
sumerc wants to merge 49 commits into
mainfrom
improve-install-ux
Draft

Install UX: zee -setup wizard, credentials.json, configurable hotkey#27
sumerc wants to merge 49 commits into
mainfrom
improve-install-ux

Conversation

@sumerc

@sumerc sumerc commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Summary

Replaces env-var API keys and the launchctl setenv install hints with a single interactive zee -setup wizard that configures a working install end to end (provider + API key, device, auto-paste, Microphone + Accessibility permissions, custom hotkey) and verifies it. install.sh downloads then hands off to the wizard.

Breaking: the *_API_KEY environment variables are no longer read — keys now live in credentials.json (0600). Existing users must re-add their key (via zee -setup).

What changed

  • config: credentials.json (0600) via config.APIKey/SetAPIKey; dev/app config split (<binary dir>/.zee, isolated from the installed app); ZEE_CONFIG_DIR override. Login-item plist no longer bakes keys into its environment.
  • transcriber: env lookups replaced by an injected key source (SetKeySource), keeping the package free of app-config deps.
  • setup (new pkg): zee -setup wizard — provider+key, device, auto-paste, permissions, live hotkey capture with registration validation, verify pass. Idempotent; on macOS re-execs as the bundle so TCC attributes prompts to Zee. Absorbs and removes -doctor.
  • permissions (new pkg): macOS TCC prompting — mic via AVFoundation, accessibility via AXIsProcessTrustedWithOptions.
  • hotkey: capture engine (Combo/Capture/Rebind); push-to-talk hotkey is now user-configurable, persisted in config.json, loaded at startup.
  • tray: "Edit Settings…" opens config.json; disabled "Hotkey: " label (changed via zee -setup, not the tray).
  • install.sh: hands off to zee -setup after install; quits a running instance before replacing the bundle.

Testing

  • Full unit suite green (10 packages), incl. new tests for credentials, key-source injection, wizard logic, and an input-buffering regression.
  • zee -setup smoke-tested locally end to end (Deepgram → key saved to credentials.json 0600 → verify table → complete).
  • Not yet covered — needs a second Mac (draft blocker): interactive open --stdin $(tty) re-exec as the installed bundle, hotkey capture actually firing under -setup, and live TCC prompts attributing to Zee.app (require GUI + human clicks).

Deferred

  • Modifier-only "can't be a hotkey" FlagsChanged feedback (the Register() test already rejects unusable combos).
  • Live provider auth-ping in verify (currently checks "key present").

🤖 Generated with Claude Code

sumerc and others added 30 commits July 12, 2026 01:44
…hotkey

Replace env-var API keys and the launchctl-based install hints with a
single interactive setup flow that configures a working install end to
end and verifies it.

- config: cloud provider API keys move to credentials.json (0600) via
  config.APIKey/SetAPIKey; the *_API_KEY env vars are no longer read
  (breaking — users must re-add keys). Dev builds keep all state in
  <binary dir>/.zee, isolated from the installed app; ZEE_CONFIG_DIR
  overrides the location. The login-item plist no longer bakes keys.
- transcriber: env lookups replaced by an injected key source
  (SetKeySource), keeping the package free of app-config deps.
- setup: new `zee -setup` wizard (provider + key, device, auto-paste,
  Microphone + Accessibility permissions, live hotkey capture with
  registration validation, verify pass). Idempotent; on macOS it
  re-execs as the bundle so TCC attributes prompts to Zee. Absorbs and
  removes the -doctor command.
- permissions: new package for macOS TCC prompting (mic via
  AVFoundation, accessibility via AXIsProcessTrustedWithOptions).
- hotkey: capture engine (Combo/Capture/Rebind) + saved combo loaded at
  startup; push-to-talk hotkey is now user-configurable in config.json.
- tray: "Edit Settings…" opens config.json; disabled "Hotkey: <combo>"
  label (changed via `zee -setup`, not the tray).
- install.sh: hands off to `zee -setup` after install; quits a running
  instance before replacing the bundle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Repro + verification for 6537b3f: a scripted rawStreamSession fake covers
both the happy path (fed PCM comes back as WAV, chunked part + tail flush)
and the connect-error path (offline dictation must survive for auto-save).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ion tests

- update/{install_darwin,install_other,wait_unix}.go (+tests) and
  hotkey_linux_test.go were left untracked, so main.go's committed
  update.Install/WaitForPID calls failed the CI build (undefined symbols).
- Integration tests now pin -provider before the positional wav (else
  flag.Parse ignores it), so Groq-named tests test Groq instead of silently
  falling through to auto-selected Deepgram.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bump parakeet.cpp to v0.4.0, which fixes the macOS Metal crash
(upstream #2 / PR #4: GPU→CPU scheduler fallback + native depthwise-conv
kernel). Same ggml pin (v0.13.0). Enable the Metal backend in the build
and cgo link (libggml-metal.a + Metal/MetalKit/Foundation frameworks;
shaders are embedded so the binary stays self-contained).

Pre-compile the GPU pipelines at model load via a warmup transcribe so
the first dictation isn't stalled, and silence ggml's verbose per-run
backend logging. Steady-state ~1.7x faster on 110m, ~2.6x on 0.6b.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
sumerc and others added 19 commits July 24, 2026 21:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants