diff --git a/CHANGELOG.md b/CHANGELOG.md index 208ea3b..9c80d42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 1.0.0-rc.1 — v1.0.0-rc.1 · Say it, it's done (prerelease) + +- First installed build of everything since 0.8.0: the stages 0.9.0 to 0.14.0 below — Settings with search and no Save button, text actions on the ChatGPT subscription, the Context action, an action per application, audio files and the first-run assistant. +- Published as a prerelease for acceptance on Linux, Windows and macOS; the stable download stays 0.8.0. The installers of this candidate install it by default. The checks are in [docs/plans/v1.0-acceptance.md](docs/plans/v1.0-acceptance.md). +- App version 1.0.0 in `package.json`, `Cargo.toml` and `tauri.conf.json`. + +See [1.0.0-rc.1 release notes](docs/releases/v1.0.0-rc.1.md). + ## 0.14.0 · Set up in a minute (on `main`, ships with 1.0) - Add a first-run assistant. A new installation opens on four short screens: where to transcribe (Cloud, recommended, or on this device), then the OpenAI key — with **Create key ↗** to OpenAI's key page — or the local model (Base recommended), then the language as a code such as `de`, suggested from the system language, and optional words, and last the ChatGPT subscription for text actions (experimental, only with a Codex login), the dictation key and start at login. diff --git a/README.md b/README.md index ae33ab9..c283ae7 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Utterform records a short voice clip, transcribes it with **OpenAI GPT Transcrib the cursor. The window can stay out of the way while a global shortcut controls the whole flow. -> Utterform is under active development. **0.8.0 — Omarchy's dictation key** makes Utterform a dictation backend for Omarchy: choose it in Setup → Defaults → Dictation, then press Alt + Space or hold Right Alt. The Apple-Silicon build is Developer ID signed and notarized; Windows remains unsigned. See the [release notes](docs/releases/v0.8.0.md) and [downloads](https://github.com/jli-software/utterform/releases/tag/v0.8.0). Settings were rebuilt on `main` since (search, no Save button) and ship with 1.0. +> Utterform is under active development. **0.8.0 — Omarchy's dictation key** makes Utterform a dictation backend for Omarchy: choose it in Setup → Defaults → Dictation, then press Alt + Space or hold Right Alt. The Apple-Silicon build is Developer ID signed and notarized; Windows remains unsigned. See the [release notes](docs/releases/v0.8.0.md) and [downloads](https://github.com/jli-software/utterform/releases/tag/v0.8.0). **1.0.0 release candidate 1** brings everything since — first-run assistant, Settings with search, ChatGPT text actions, Context, an action per app and audio files — and waits for acceptance on all three platforms: [release notes](docs/releases/v1.0.0-rc.1.md), [downloads](https://github.com/jli-software/utterform/releases/tag/v1.0.0-rc.1). ## How it works diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index f22420d..5c3432f 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -4,7 +4,7 @@ - Canonical repository: https://github.com/jli-software/utterform - Fetch `main` before starting; work on a dedicated branch and preserve other contributors' changes. Commit and push validated work; integrate through a pull request only when authorized. Never force-push. -- **Until 1.0: merge only, no previews, no releases (Jonas, 2026-11-07, after 0.8.0 was released; supersedes the preview gate below):** a finished stage whose validation and PR CI pass is merged into `main` straight away. No `Desktop builds` preview, no tag, no release: Jonas tests everything once, at 1.0, and that is the next release. The installers, the README and the app version (`package.json`, `Cargo.toml`, `tauri.conf.json`) stay at the last real release, 0.8.0, which the release-metadata test requires; stage numbers such as 0.9.0 name roadmap stages and changelog entries only. 1.0 bumps everything at once. Style samples (mock-ups, images) and occasional questions still go to Jonas. Never move a published tag or publish failing/partial work. Other open pull requests are merged only when Jonas says so. +- **Until 1.0: merge only, no previews, no releases (Jonas, 2026-11-07, after 0.8.0 was released; supersedes the preview gate below):** a finished stage whose validation and PR CI pass is merged into `main` straight away. No `Desktop builds` preview, no tag, no release: Jonas tests everything once, at 1.0, and that is the next release. The installers, the README and the app version (`package.json`, `Cargo.toml`, `tauri.conf.json`) stay at the last real release, 0.8.0, which the release-metadata test requires; stage numbers such as 0.9.0 name roadmap stages and changelog entries only. 1.0 bumps everything at once. **Since 2026-11-08 (stage 1.0.0):** the app is at 1.0.0 and the installers and README point to the prerelease `v1.0.0-rc.1` that Jonas accepts; `releases/latest` still serves 0.8.0. Style samples (mock-ups, images) and occasional questions still go to Jonas. Never move a published tag or publish failing/partial work. Other open pull requests are merged only when Jonas says so. - *Superseded:* **Test one platform before release:** finish the change on a branch/PR, run validation, then build only the first-test platform chosen by Jonas with `Desktop builds`. For 0.7.8 that platform is Linux. Share the exact commit and downloadable Actions artifact; leave `main`, release tags and the stable release unchanged while Jonas evaluates it. Iterate on that branch if needed. Only after his acceptance and authorization to finalize, merge and tag for the complete Linux/Windows/macOS release. An explicit “release everything at once” request may skip the manual preview gate. Platform-specific changes still need their relevant native checks before final release. Default to a patch increment unless a version or minor increment is requested. Never move a published tag or publish failing/partial work. - Development is shared across machines and coding assistants. Keep architecture, decisions, release notes, and the current handoff in this repository, not only in chat history. - Keep credentials, recordings, local transcript history, dependencies, and machine-specific configuration out of Git. @@ -19,7 +19,21 @@ proposals are in [plans/v1.0-roadmap.md](plans/v1.0-roadmap.md). The plan of 202 (reliability, assistant, finish) is superseded; 0.7.13 shipped, 0.7.14 (`feat/simple-settings`) was rejected and will not be merged. -## Current handoff — 0.14.0 First-run assistant +## Current handoff — 1.0.0 Finish + +Stage 1.0.0 of [the roadmap](plans/v1.0-roadmap.md), branch `work/utterform-1.0.0-finish`. +Jonas decided on 2026-11-08 to accept a real signed prerelease: the app is 1.0.0, the +installers default to `v1.0.0-rc.1`, and the tag publishes it as a prerelease, so +`releases/latest` keeps serving 0.8.0. What he checks is in +[plans/v1.0-acceptance.md](plans/v1.0-acceptance.md) (upgrade, clean profile and assistant, +dictation and tray, ChatGPT, Context, per-app, audio files, start at login with issue #40, +Omarchy keys, macOS Gatekeeper). Stages 0.9.0–0.14.0 had only Linux CI; the full +Desktop-builds run on this branch was the first Windows and macOS build of them. +Next: Jonas's results. A fix → `v1.0.0-rc.2`; acceptance → installers, README and notes to +`v1.0.0`, tag, verify assets and macOS signing, then a new WinGet submission (PR #27 is the +last one, at 0.7.11). + +## Previous handoff — 0.14.0 First-run assistant Stage 0.14.0 of [the roadmap](plans/v1.0-roadmap.md), branch `work/utterform-0.14.0-assistant`. Jonas accepted the mock-up on 2026-11-08: four steps diff --git a/docs/plans/v1.0-acceptance.md b/docs/plans/v1.0-acceptance.md new file mode 100644 index 0000000..9ab4c91 --- /dev/null +++ b/docs/plans/v1.0-acceptance.md @@ -0,0 +1,66 @@ +# Utterform 1.0 — acceptance + +What Jonas checks on the installed **1.0.0-rc.1** before it is released as 1.0.0. Install +commands are in [the candidate's notes](../releases/v1.0.0-rc.1.md). Each line is one thing +to try; a failure goes into an issue (or the chat) with the platform and, where there is +one, the diagnostics reference from Settings → App. + +The settings folder (to start on a clean profile, rename it first and back afterwards): +Linux `~/.config/software.jli.utterform`, Windows `%APPDATA%\software.jli.utterform`, +macOS `~/Library/Application Support/software.jli.utterform`. + +## Every platform + +**Upgrade and first start** +- [ ] Install over 0.8.0: settings, key and history are kept, no assistant appears. +- [ ] Clean profile: the assistant opens; Cloud with a key (Create key ↗ opens the browser), + Finish → dictation works. +- [ ] Clean profile: On this device, Base model downloads on Finish → dictation works offline. +- [ ] Clean profile: Skip on the first screen → main window, nothing changed. +- [ ] While the assistant is open, the dictation key and a second launch only bring it forward. + +**Dictation** +- [ ] Dictation key in another app: text arrives at the cursor. +- [ ] Tray: red dot while recording, green for five seconds after delivery (also with sounds off). +- [ ] Settings: search finds a row, a change applies at once, a new dictation key works at once. + +**Text actions** +- [ ] Provider ChatGPT (Codex login): Polish or Email runs, quickly. +- [ ] Context: select (Linux) or copy (Windows, macOS) an email, say "reply that …", the reply + arrives at the cursor. +- [ ] Per app: rule Thunderbird (or another app) → Email; the dictation key there shows + "Utterform · Email — for …", elsewhere the window's action. + +**Audio files** +- [ ] Folder button / `O`, and dropping a file on the window: text in history and clipboard. +- [ ] A real WhatsApp voice message from the phone. +- [ ] "Open with → Utterform" in the file manager; the default player stays as it was. + +**Start at login** +- [ ] Switch on, sign out and in: Utterform starts in the tray, no window. Switch off: gone. + +## Linux (asus16, Omarchy) + +- [ ] Setup → Defaults → Dictation → Utterform: Alt+Space dictates, holding Right Alt + dictates while held, Super+D keeps working. + +## Windows (CBZIT004 or another PC) + +- [ ] Start at login (issue #40): after switching on, both values exist — + `HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Utterform` and + `…\Explorer\StartupApproved\Run\Utterform` — and Utterform starts after sign-in. +- [ ] Explorer → Open with lists Utterform for an `.m4a` or `.ogg`. +- [ ] The app in front is recognised for a per-app rule (Outlook, Teams or a browser). + +## macOS (MacBook Air M2) + +- [ ] The DMG opens without a Gatekeeper warning, also offline (stapled ticket). +- [ ] Microphone and Accessibility prompts appear once; typing at the cursor works. +- [ ] Finder → Open With lists Utterform for an audio file. +- [ ] The frontmost app is recognised for a per-app rule (Mail). + +## Then + +All boxes ticked or the rest accepted by Jonas → bump the installers, README and notes from +`v1.0.0-rc.1` to `v1.0.0`, tag `v1.0.0`, verify the assets, and send the new WinGet +submission. A fix found here → `v1.0.0-rc.2` first. diff --git a/docs/plans/v1.0-roadmap.md b/docs/plans/v1.0-roadmap.md index 86b32e4..2a573af 100644 --- a/docs/plans/v1.0-roadmap.md +++ b/docs/plans/v1.0-roadmap.md @@ -60,6 +60,7 @@ and without its subscription: | 2026-11-07 | Settings mock-up accepted: search field on top, categories as tabs below, one row per setting. The "Context" category appears only once 0.11.0 gives it rows. | | 2026-11-08 | 0.12.0 is built, small: Settings → Context → "Per app", empty by default; "+ App" offers the apps dictated into lately or a typed name; a rule applies only to the dictation key, everywhere else the window's action; a notification "Utterform · Email — for Thunderbird" only when a rule changes the action. Mock-up accepted. | | 2026-11-08 | 0.14.0: four steps — where to transcribe · OpenAI key or local model · language code (system language suggested) and optional words · ChatGPT (only with Codex login), dictation key, start at login. Skip on every step, nothing applied before Finish. Mock-up accepted. | +| 2026-11-08 | 1.0.0: Jonas tests a real signed prerelease **1.0.0-rc.1** (installers default to it, Latest stays 0.8.0); after his acceptance the same build is released as 1.0.0. Checklist in [v1.0-acceptance.md](v1.0-acceptance.md). | | 2026-11-07 | 0.10.0: ChatGPT is marked "Experimental" in Settings; **no fallback** to the OpenAI key — a ChatGPT failure is shown and the plain transcript delivered. Mock-up (AI → Provider: OpenAI key \| ChatGPT) accepted. | | 2026-11-07 | 0.11.0: context is its **own action "Context"**, no per-action switch; other actions never read context. **Linux first**: Linux reads the selection, Windows/macOS use the clipboard only — no simulated Ctrl+C, which would interrupt a terminal. | @@ -76,7 +77,7 @@ Proposals not yet confirmed by Jonas are marked **Proposal**. | 0.12.0 | Action per application | merged, ships with 1.0 | | 0.13.0 | Audio files | merged, ships with 1.0 | | 0.14.0 | First-run assistant | merged, ships with 1.0 | -| 1.0.0 | Acceptance on Linux, Windows, macOS; release; WinGet | planned | +| 1.0.0 | Acceptance on Linux, Windows, macOS; release; WinGet | in progress: rc.1 out for acceptance | **Proposal (order):** the Omarchy backend first because it is small and the CLI already exists; Settings next so every later feature gets a fixed place; Codex before context @@ -183,7 +184,12 @@ local model, optional Codex login, language by typing `de`, vocabulary optional. ### 1.0.0 — Finish +Decided 2026-11-08: version 1.0.0 in the app, published first as the prerelease +`v1.0.0-rc.1`; [the acceptance checklist](v1.0-acceptance.md) is what Jonas checks on it. +A fix found there becomes `v1.0.0-rc.2`. After acceptance: installers, README and notes +to `v1.0.0`, tag, verify, WinGet. `fix/macos-staple-ticket` was merged on 2026-10-31 (#45). + - Installed acceptance on Linux, Windows and macOS, including issue #40 (Windows autostart) and the outstanding 0.7.12 tray checks. -- `fix/macos-staple-ticket` merged before the release. +- `fix/macos-staple-ticket` merged before the release (done, #45). - Release, then a new WinGet submission (it does not follow GitHub releases by itself). diff --git a/docs/releases/v1.0.0-rc.1.md b/docs/releases/v1.0.0-rc.1.md new file mode 100644 index 0000000..4792776 --- /dev/null +++ b/docs/releases/v1.0.0-rc.1.md @@ -0,0 +1,47 @@ +# Utterform 1.0.0 release candidate 1 — Say it, it's done + +*A test version of 1.0, published as a prerelease. The stable version stays 0.8.0 until +this candidate has been checked on Linux, Windows and macOS; then the same build is +released as 1.0.0.* + +Everything built since 0.8.0 comes together here for the first time in an installed app. + +**Set up in a minute.** A new installation opens on four short screens: where to +transcribe, the OpenAI key or the local model, the language, and the ChatGPT subscription, +dictation key and start at login. Skip ends it, and nothing is applied before Finish. +Existing users never see it. + +**Settings, found at once.** One page with a search field on top, categories as tabs and +one row per setting. No Save button: every change applies at once. + +**Text actions on your ChatGPT subscription.** Clean, Polish, Email, Context and your own +actions can run through the Codex CLI login at no extra cost. Experimental, with no +fallback to the API key. Transcription keeps using the OpenAI key or the local model. + +**Say what to do with the selected text.** The new action **Context**: select an email, +say "reply that Monday at ten works", get the reply at the cursor. Linux reads the +selection itself; Windows and macOS use the clipboard. + +**The right action in every app.** Settings → Context → Per app gives an application its +own action for the dictation key, for example Email in Thunderbird. A short notification +says when it takes over. + +**Voice messages and recordings.** Open an audio file with the folder button or `O`, drop +it on the window, use `utterform --file` or "Open with". WhatsApp and Telegram voice +messages, M4A, MP3, WAV, FLAC and more, up to two hours. + +The details are in the changelog under 0.9.0 to 0.14.0. + +## Install this candidate + +Quit Utterform first. + +- **Linux (Omarchy / Arch):** + `curl -fsSL https://github.com/jli-software/utterform/releases/download/v1.0.0-rc.1/install-linux.sh | sh` +- **Windows (PowerShell):** + `irm https://github.com/jli-software/utterform/releases/download/v1.0.0-rc.1/install-windows.ps1 | iex` +- **macOS:** the [DMG](https://github.com/jli-software/utterform/releases/download/v1.0.0-rc.1/utterform-macos-aarch64.dmg), + Developer ID signed and notarized. + +The normal download links keep pointing to 0.8.0. The checks for this candidate are in +[docs/plans/v1.0-acceptance.md](../plans/v1.0-acceptance.md). diff --git a/package-lock.json b/package-lock.json index 7290b1f..babbc03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "utterform", - "version": "0.8.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "utterform", - "version": "0.8.0", + "version": "1.0.0", "dependencies": { "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-dialog": "^2.4.0", diff --git a/package.json b/package.json index cae3dce..c5d672d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "utterform", "private": true, - "version": "0.8.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", diff --git a/scripts/install-linux.sh b/scripts/install-linux.sh index 1a86ee9..f95f89a 100755 --- a/scripts/install-linux.sh +++ b/scripts/install-linux.sh @@ -2,7 +2,7 @@ set -eu -version="${UTTERFORM_VERSION:-v0.8.0}" +version="${UTTERFORM_VERSION:-v1.0.0-rc.1}" release_base="${UTTERFORM_RELEASE_BASE_URL:-https://github.com/jli-software/utterform/releases/download/${version}}" asset="utterform-linux-x86_64-system.tar.gz" prefix="${UTTERFORM_PREFIX:-${HOME}/.local}" diff --git a/scripts/install-windows.ps1 b/scripts/install-windows.ps1 index dbc2cfd..358179b 100644 --- a/scripts/install-windows.ps1 +++ b/scripts/install-windows.ps1 @@ -1,6 +1,6 @@ # Verify the NSIS setup before opening it; no elevation or forced app shutdown. param( - [string]$Version = 'v0.8.0', + [string]$Version = 'v1.0.0-rc.1', [switch]$VerifyOnly ) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 09f4f8b..4676cee 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -5904,7 +5904,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utterform" -version = "0.8.0" +version = "1.0.0" dependencies = [ "anyhow", "base64 0.22.1", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8f21d0d..980e2d5 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "utterform" -version = "0.8.0" +version = "1.0.0" description = "Fast, lightweight voice-to-text transformation for the desktop" authors = ["Jonas"] edition = "2024" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index da8d17d..4e0600c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Utterform", - "version": "0.8.0", + "version": "1.0.0", "identifier": "software.jli.utterform", "build": { "beforeDevCommand": "npm run dev",