# v2.28.0 — it now tells you what broke, and stops lying about the rest

**Released 2026-08-18.** Upgrade:

```sh
sudo snap refresh yazses     # snap
pipx upgrade yazses          # or: uv tool upgrade yazses
```

The previous release was about YazSes describing itself accurately. This one is about
what it does when something goes wrong — which, until now, was mostly nothing. A failed
injection wrote a line to a log file nobody opens and left the tray icon idle blue. The
person holding the key learned that dictation had failed by noticing that no text
appeared.

## When something breaks, YazSes now tells you

A failure in capture, injection, or a meeting is classified and shown as a desktop
notification naming both the fault and the command that addresses it — "Run
`yazses doctor` to check the injection backend" rather than silence. Repeats of the same
fault are suppressed, because five identical toasts teach you to dismiss YazSes
notifications, which costs more than the repeats are worth.

Where YazSes **cannot** identify the fault, and only there, the notification carries a
**[Prepare a bug report]** button. It opens GitHub's issue form pre-filled in your
browser. YazSes itself sends nothing — the request is made by the browser, to a page you
read and submit yourself, which is why this adds no entry to the egress inventory. A
recognised failure gets no button, because it already carries its own fix and an issue
about a missing `ydotool` helps nobody.

## The notification that never went away

Shipping the above surfaced a defect underneath it. A toast carrying a button runs
`notify-send --wait`, which blocks until someone clicks — and `--urgency critical` means
it never expires on its own. That wait ran on a daemon thread with its two-minute cap
*inside* that thread, so the cap only fired in a process that outlived it. The
long-lived daemon does. No short-lived process can: a CLI command, `yazses verify`, or
one test run exits in seconds, the thread is abandoned without unwinding, nothing ever
kills `notify-send`, and the pop-up is orphaned onto your desktop until you log out.

Found on a real machine with 33 of them stacked up, each describing an injection failure
that had never happened. In-flight toasts are now tracked and killed when the process
that raised them exits.

## A bug report could carry your personal dictionary

`yazses report` redacts paths and identifiers from your config, and did not redact free
text. Your `initial_prompt` and personal vocabulary are exactly where proper nouns
live — colleagues' names, employers, project code names — and they went into the bundle
in clear. Free-text config values are now redacted too.

## Spoken git and shell commands used the words you said

`push to main` rendered a bare `git push`, discarding the branch you named — so standing
on a different branch pushed *that* one instead, and `force push to main` did it
destructively. `shellpipe` had the same shape: "search for the word error" searched for
the word *"for"*. Both now use the ref and the term you actually said.

## Four more settings in the window, chosen for how each one fails

Model, language, compute type, vocabulary, injection backend, the no-text-target guard,
and pre-speech padding are now editable in the Settings window. Each one refuses rather
than writes when the value cannot work, because the runtime failure names the wrong
cause: a mismatched model/language pair produces fluent English nonsense with no error
at all, and an unsupported compute type is reported as a *missing model*.

## Also

- **Meeting Mode from the tray icon.** It is the one capability with no key to hold, so
  the icon was the only surface that could start or end one without a terminal. When it
  cannot, the menu says why, in the daemon's own words rather than a paraphrase.
- **`yazses tune --limit N`**, taking the newest clips, and a time estimate instead of
  "a while".
- **"Speaker labels unavailable"** stopped recommending a 45 MB download that does not
  fix it.
- **The Snap Store showed a different logo** from every other surface — a white square
  with a blue speech bubble that appears nowhere else in the project.
- **The Windows Settings window could not open**, and explained itself where nobody
  could see.
- **Every docs link in a user-visible string is now guarded** to resolve to a real page.
  Three broken ones shipped in three days; a URL compiled into the `.exe` fails in front
  of a user who was already stuck.
- **The clipboard history named its ends.** `list` numbers newest-first, but
  "the first thing I copied" means the oldest — both readings are correct English and
  they point opposite ways, so the list now says which end is which rather than leaving
  you to guess from a number.

Full detail in the [changelog](https://github.com/MSKazemi/yazses/blob/main/CHANGELOG.md).
