Tempest v0.1.23
Agent quotas now sit in the status bar with a per-agent panel that lets you pick the window (peak / weekly / monthly) that drives each row. Four more CLI agents land — Qwen Code, Droid, plus MiniMax and Z.ai provider presets — and their icons ship in the bundle so first-launch and offline no longer fall back to a generic square. The diff pane is rewritten and finally renders untracked files. Terminal gets three focus/resize fixes for the post-idle hitch, WSL stops crashing on WebGL, and Atlas indexing is fixed for people who installed from the registry after #117.
What's in this release
Agent quota strip in the status bar
A glanceable per-agent quota row sits next to Indexed / Isolated. Three display modes — scrolling marquee, all inline, or active-only — with per-user preferences. Click any row to open a panel styled like the title-bar quota island, scoped to that one agent. A segmented control (Peak / Weekly / Monthly) chooses which window drives the row's bar and persists in localStorage. Options grey out for providers that lack a window (Claude has no monthly, Copilot has no window at all). Panel dismisses on outside-click or Escape. Backend adds a Grok reader that reads Grok CLI auth and hits xAI billing directly.
Four more CLI agents
- Qwen Code and Droid CLI agents added to the agent picker.
- MiniMax and Z.ai provider presets — no CLI of their own, but any agent that speaks the OpenAI-compatible shape can point at them without hand-editing config.
- Icons for hermes, pi, amp, fx, qwen, and grok are now bundled in
src/assets/agent-icons/instead of only being fetched over jsDelivr. First launch, offline, and restrictive networks no longer show aTerminalSquarefallback for those six. Between-release agents still resolve via jsDelivr. Closes #118.
New DiffPane + untracked files render
The rewritten DiffPane replaces the old component outright — no parallel Next variant, no dead code left behind. groupHunks now synthesizes a @@ new file @@ header when a bare added-line stream arrives with no hunk header (the shape untracked files come back in), so the renderer groups and shows them instead of dropping them silently.
Terminal: post-idle hitch, WebGL under WSL
Three related fixes for the terminal that landed together as #123:
- Skip redundant focus work and unchanged PTY resizes. Refocusing after idle used to schedule a fit +
resize_ptyIPC + a full-row repaint every time, even with identical dimensions. Cached last-sent PTY dims per session; the IPC is skipped when nothing changed. Restore callbacks now coalesce into a single pending slot, and full repaints only happen when the page was actually hidden. - Latch restore state, guard rAF lifecycle. The hidden flag is now latched until focus consumes recovery, so an early visible event can't skip the restore repaint. All queued rAF fits/refreshes route through a per-mount restore controller that cancels frames and neuters callbacks on dispose, so stale restores can't run against a remounted session. Failed
resize_ptyinvalidates only its own cached request. - Prune completed rAF tracking and pin deferred IPC scope. The restore controller retains only pending frame ids, so cancellation only touches live callbacks and the set can't grow across a mount's lifetime.
Separately, WebGL rendering is disabled under WSL — the WSL WebGL stack was crashing xterm's WebGL renderer; falling back to canvas keeps the terminal alive there. #116.
Atlas: registry resolution restored (#117)
Atlas indexing had been broken on installs from main: node_modules/@usetempest/atlas had become a local link to packages/atlas (a workspace-glob side effect that a later commit never regenerated the lock for). That checkout ships no dist/ and root npm ci never builds it, so the installer staged a tree missing both src/ and dist/mcp/server-entry.js. This release re-resolves the published 1.3.2 tarball, drops the dead workspace-linked dev closure from the lock, removes an accidental self-dependency, and makes staging fail loudly when the source lacks compiled output or pruning drops runtime assets. A new release-contract test guards the regression.
Local dev checkouts of Atlas can still be staged fully-built via the same installer path.
Right sidebar: pill-style bottom tabs
Underline + pipe separators are gone. Bottom tabs are now rounded pills with hover/active fills, matching the pill treatment used elsewhere. Widened default width. Task's GitHub repo picker switched to the shared SpSelect. Session status glyphs got some breathing room.
Mobile: crash boundary, foreground reconnect, push on waiting
Three robustness fixes for the experimental mobile app:
- ErrorBoundary wraps the router — a render throw now shows a retry card instead of a white screen.
- Foreground reconnect on AppState
active: iOS suspend/resume no longer strands a silently-dead WebSocket for up to 60s. - Expo push wired end-to-end. The phone registers its push token via a new
push.registerRPC afterprotocol.hello; the desktop persists tokens locally and POSTs Expo's push service on non-waiting → waiting session transitions. No hosted relay, no paid infra. Ceiling: the desktop has to be running to send; off-desktop wake needs a relay (tracked separately).
Fullscreen QR display page
New /display route on the site — full-bleed logo + aurora + a corner QR, meant for booth displays or a laptop screen pointed at visitors. robots: noindex so it stays out of search.
Dependencies
Three grouped dependabot bumps (Node minor-and-patch × 26, Cargo minor-and-patch × 3, uuid in src-tauri).
Platform Support
| Platform | Status |
|---|---|
| Windows 11 (x64) | Supported. Pre-built binary available. MSI and NSIS installers. |
| macOS | Supported. Signed + notarized. Separate arm64 and x86_64 DMGs. |
| Linux | Supported. x86_64 and arm64 AppImage + deb. |
| Android (mobile) | Experimental. APK only, sideload, LAN-only transport. No Play Store. |
| iOS (mobile) | Not yet. Following the Android APK. |
Windows requires WebView2 (bundled automatically when necessary).
Database Branches (from v0.1.5) additionally require Docker; without it the feature stays dormant and everything else works normally.
Atlas semantic search (from v0.1.10) downloads a ~25 MB embedding model on first opt-in.
The mobile companion (from v0.1.21) requires enabling Experimental → Mobile companion app on the desktop and installing the APK on an Android phone on the same Wi-Fi.
Required configuration
- Anyone on v0.1.22 with Atlas indexing stuck at Starting…: upgrade to v0.1.23 — no config change needed. This closes the registry-side of #117 (the Linux-packaging side was fixed in v0.1.22).
- Grok quota row: requires an authenticated Grok CLI on the machine; the reader picks up its credential automatically. Nothing to configure if the CLI already works.
- Mobile push notifications: flip Settings → Experimental → Mobile companion app on and re-pair once so the phone re-registers its Expo push token. Existing v0.1.21/v0.1.22 pairings keep working, but they won't send push until they re-hello.
- Quota strip display mode: default is scrolling marquee. Change under Settings → Status bar → Agent quotas if you'd rather see all inline or active-only.
What's next
Mobile: iOS build, Play Store distribution, and a relay so push works with the desktop asleep. Desktop: streaming for the Warp backend when the upstream SDK ships it, more agent presets, and a pass on the quota panel to cover the last few providers that don't expose a window API. Terminal: continue chasing focus/resize edges as they surface.