/changelogBuilt in public

Ship early, ship often, write it down.

Every release, newest first. Sourced from the changelog in the app repo — the same file the in-app updater reads — so this page can’t drift from reality.

v0.4.0

latest

First open-source release (MIT). Command Mode, per-app profiles, adaptive prompt refinement, usage metering, and a full reliability pass across the pipeline.

Added

  • Command Mode — select text anywhere, hold ⌘⇧C, speak an instruction ("make this formal", "translate to French") — the selection is rewritten in place.
  • Dictation edit-before-insert — opt-in review window for dictation, reusing Prompt Mode's review gate.
  • Usage metering — Anthropic token counts per history row, with a running total in the History tab.
  • Per-app profiles — per-app tone + vocabulary for dictation (new Profiles settings tab).
  • Prompt personalisation — optional free-text user profile injected as standing preferences; adaptive two-pass refinement for complex asks (on by default).
  • Eval harness — 30 property-scored fixtures run against the real rewrite path.
  • Mic input selection and automatic update check on launch.
  • Toggle recording mode — press to start, press again to stop.
  • STT model + language selection, max recording length slider (10–120 s).
  • History search, mode filter, re-inject, and 1000-row pruning.
  • Recording overlay feedback — live input level meter, elapsed timer, esc-to-cancel hint.
  • Pipeline resilience — one retry on transient failures, Prompt Mode falls back to the raw transcript instead of losing the utterance.
  • OSS scaffolding: SECURITY.md, CONTRIBUTING.md, issue templates; cargo test + frontend typecheck in CI.

Changed

  • Prompt-rewrite system prompt v2 — insufficient-intent passthrough (noise never becomes a fabricated task), a silent quality bar, few-shot exemplars.
  • Confidence-based silence gating — Whisper segment confidence replaces the phrase denylist that discarded real dictations like "thank you"; quiet speakers no longer suppressed.
  • Latency — Anthropic prompt caching on static system prompts; event-driven clipboard restore replaces the fixed 250 ms post-paste sleep.

Fixed

  • Esc no longer plays a cancel sound system-wide when nothing is recording.
  • Clipboard is restored even when app activation or ⌘V dispatch fails mid-injection; non-text clipboards survive selection capture.
  • {query} in open_url actions is percent-encoded.
  • Onboarding: hotkeys are editable during first-run setup, and the test-box dictation no longer pastes into whatever app was previously focused.

Security

  • Voice transcripts delimited as untrusted input in Prompt Mode — closing the last two prompt-injection gaps.
  • Real CSP replaces "csp": null; devtools removed from production builds.
  • History rewritten before publication to remove internal planning docs and personal data; gitleaks + cargo audit + semgrep enforced green in CI.
Full diff on GitHub →

v0.3.0

Real logs at last, an Export Diagnostics button, prompt-injection hardening for selected text, and clipboard flavours that survive dictation.

Added

  • File logger with rotation and a Settings → Privacy toggle. Logs go to ~/Library/Logs/Wisspa/wisspa.log — previously they went to /dev/null, which made bug reports tricky.
  • Export Diagnostics button in the About tab — bundles redacted logs, app version, permission state, and hotkey config into one .zip for bug reports.
  • Default actions are seeded into packaged installs — fresh installs ship all 14 voice commands instead of an empty Actions tab.

Changed

  • Prompt Mode treats selected text as untrusted — selection content is wrapped in an explicitly-marked block so a malicious web page or email can’t smuggle instructions into your prompt.
  • Recording session ids threaded through the pipeline — Esc now aborts the in-flight backend work, and overlapping recordings no longer race the clipboard restore.
  • Clipboard flavours preserved — images, files, and other non-text clipboard content survive a dictation paste.
  • Logging redaction policy — full transcripts and LLM outputs are no longer logged; length + content hash only.
Full diff on GitHub →

v0.2.0

Prompt Mode reads the active browser tab to decide between writing a prompt and writing the thing itself. Plus a quieter, better-behaved pill.

Added

  • Prompt Mode reads the active browser tab. Press the prompt hotkey with claude.ai or chatgpt.com focused and you get a structured prompt for that tool. Press it with Gmail, LinkedIn, or Notion focused and you get the finished content directly — because asking Gmail for a prompt would be odd. Browser context travels sanitised (scheme + host only) in an untrusted block.
  • Quiet notifications toggle — suppress the success toast after a paste.

Changed

  • The pill is now an agent app (no Dock icon, no menu-bar focus) — it stops disappearing when another app takes focus.
  • Paste lands in the target app, pill follows the cursor — activation switched to a single System Events grant that works for any visible process, and the pill anchors to whichever display your cursor is on.
Full diff on GitHub →

v0.1.0

First public preview. All seven PRD phases implemented — three modes, onboarding, settings, local-first storage.

Modes

  • Dictation (⌘⇧Space) — Groq Whisper transcription + Claude Haiku cleanup with app-aware tone adaptation.
  • Action (⌘⇧A) — 14 default voice actions defined as hot-reloading YAML.
  • Prompt (⌘⇧P) — Claude Sonnet prompt rewriting, formatted for the active AI tool (Claude XML / ChatGPT Markdown / Cursor terse / Gemini steps).
  • Cancel (Esc) — abort the current recording without an API call.

Settings

  • Seven tabs: General, API Keys, Hotkeys, Actions, Prompt Mode, History, About — with a live permissions diagnostic and deep links to System Settings.

Onboarding

  • Eight-step first-launch wizard: microphone, accessibility, screen recording, automation, API key entry, hotkey overview, test dictation.

Storage

  • Settings as JSON. History in SQLite. API keys in macOS Keychain. No backend, no telemetry, no account.
Full diff on GitHub →