0.7.1· 58 changes
Release 0.7.1
19 new features, 9 changes, 25 bug fixes, 5 removals
Added
- The agent works in the background through accessibility actions and events posted to the target process, so you can keep typing while Juno works (#547)
- Juno asks before taking the physical mouse, and says so on screen while she has it (#547)
- You can hide Juno's Dock icon and run her from the menu bar alone (#547)
- The menu bar icon is a five-bar waveform whose state reads from its shape rather than its color, with frames for idle, armed, recording, transcribing, agent, paused, and error. The first tray menu row and the tooltip name the state in words. (#549)
- The Claude CLI provider reaches Juno's computer-use tools through the juno-cua MCP server, instead of falling back to cliclick over Bash (#496)
- Demo copies of Juno carry their own compiled-in Anthropic key, bundle under a separate identifier so they install beside a normal Juno, and tell the recipient when the demo budget ends (#550, #551)
- Your own key takes precedence over the demo key, so adding a key to a demo copy stops it spending the demo budget (#550)
- Settings shows a Demo access row naming the cohort, so a build in the wild traces back to the key that can revoke it (#550)
- Holding Fn is a push-to-talk binding (#551)
- The floating bar has a composer, and the bar grows as the text grows (#551, #553)
- You can share or export a chat through the native macOS share sheet, with Save as Markdown and Save as HTML as Juno services inside it (#545)
- An export has the same shape every time: front matter, a title taken from your question, and Asked, Spoken, Written, and Generated sections (#545)
- Copy flips to a check for a second and a half and writes through the native pasteboard, since WebKit refuses
navigator.clipboardin a window that is never key (#545) - Copy takes the reply as read, meaning spoken lines, prose, and the words inside generated components, and never the
<TTS>markers or the JSX (#545) - The chat pane header reaches Open in window and Settings, and the hover pill offers Reopen chat once you have closed a conversation (#545)
- A ring drawn around the cursor replaces pointer scaling while the agent has control (#551)
- Cmd+W closes a window. The menu had no Close item, so it was inert everywhere. (#558)
- A permissions diagnostic reports what macOS actually thinks, in five states rather than a boolean, and refuses to read Juno's own cached answer (#558)
- You can reset a single permission from the debug toggle (#558)
Changed
- Voice is one trigger method alongside key and mouse bindings, rather than a subsystem of its own (#555)
- Each macOS permission is asked for at the point it is needed instead of all at once during setup (#550)
- One event fires per agent phase, so nothing has to infer what "agent active" means (#557)
- The X means one thing everywhere: stop what is happening and go back to rest. The composer, the voice row, wake capture, driving, and working all call the same function, and the arrow still commits, so dictation is still typed. (#555)
- A voice session has an identity. There is one microphone, so there is at most one session: every start registers one, every stop claims it, and a claim that does not match is refused rather than acted on. (#556)
- Fn is a keyboard binding rather than its own kind of trigger, and older settings migrate on read (#558)
- Wake word matching is phonetic, so "juneau" reaches "juno" without anyone spelling homophones by hand. Vowels are kept on purpose, because dropping them the way Soundex does collapses juno, june, john, and jane onto one key. (#558)
- Each window is described once, in
tauri.conf.json, so a window Juno rebuilds is indistinguishable from one Tauri made at startup (#558) - shiki carries a curated grammar set, which cuts the frontend bundle (#541)
Removed
- The abandoned settings redesign left behind in the codebase is gone (#548)
- The keyboard shortcuts pane is retired. Escape and Cmd+Comma keep their behavior as constants, normalized on read, so an older build's custom value cannot outlive the decision. (#555)
- The global voice activation shortcut is deleted outright, so its combination is claimable again (#555)
- The silent save to Downloads is gone, replaced by the share sheet's save panel (#545)
- The second text to speech implementation is deleted. Rust plays audio through afplay. (#558)
Fixed
<TTS>blocks are spoken from every provider; previously only the Anthropic API path spoke them (#544)- A dictation transcript is typed at the cursor instead of being handed to the agent (#553)
- Stored voice triggers re-register at startup, so a saved wake phrase still listens after a restart (#555)
- A wake phrase survives the speech to text model loading late. A ready watcher re-applies the triggers, and it is armed before the first attempt so the engine cannot become ready in the gap. (#555)
- Cancel cancels. Both cancel paths called
stop_dictation, which finalises and types what you had just abandoned. (#555) - Releasing a held key no longer resurrects a cancelled session and submits it (#555)
- A coordinated stop re-arms the wake phrase from the stored triggers instead of revoking it until the next launch (#555)
- A trigger with no binding can never fire, so it no longer persists claiming to be on (#555)
- A trigger switches back on after you record a key, instead of staying off forever and reading as unbindable (#558)
- The tray icon is re-asserted as a template image after every icon change, so it stops rendering flat black on a dark menu bar (#553)
- Adding a trigger that already exists reports the collision instead of dropping the row and returning success (#553)
- Onboarding auto-grant registers the right row and checks real Input Monitoring state (#543)
- The bar's snap wells keep their place across displays, and a wide screen offers five stops (#546)
- The bar opens where you left it. Rust restores the stored well while the window is still hidden, instead of letting macOS cascade the window to mid-screen. (#558)
- The composer opens one row tall instead of several (#558)
- The pill stays where it is on hover. Well anchoring pinned a screen edge while the pill is centred in its window, so every hover teleported it 38px sideways and every collapse teleported it back. (#558)
- A quickly spoken "juno" is heard. Detection needed a full second of continuous speech, and the word takes about 450ms. (#558)
- The settings window keeps its transparency, shadow, and title bar style after a rebuild, instead of coming back opaque (#558)
- A typed agent run lights the tray. The single start site announced nothing, and every typed run goes through it. (#556)
- A spoken media command no longer animates the tray for an agent that was never asked to run (#556)
- A transcript with no owner is dropped with a warning instead of going to whichever session happened to be current when the text landed (#556)
- A transcription error stops recovering by committing whatever the failing engine managed to hear (#556)
- The composer mic targets the agent and says so. It was labelled "switch to dictation" while dictation types into whatever has focus, which is useless from inside Juno's own composer. (#558)
- The build script looks in the workspace target directory. The guard meant to stop an Anthropic key shipping inside a public build had been reporting success without reading a byte of the binary, and the artifact naming never ran. (#554)
- A build no longer reports success when tauri really failed, or failure when tauri exited non-zero after writing both bundles (#554)