# v2.41.0 — dictation that was heard and typed into nothing

**Released 2026-10-04.** Upgrade:

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

## Heard, transcribed, "typed" — and nothing on screen

On native Wayland (Ubuntu's default GNOME session) the compositor gives keyboard focus to
every new window, and an application cannot opt out. The voice-activity overlay is a window
that appears the moment you press the hotkey, so focus moved from your text field to the
overlay and the dictated text was typed into it.

Every signal stayed green: `yazses doctor` passed, `yazses status` reported the burst as
typed, the log said `Injecting N chars`, and `ydotoold` accepted the client. None of them
can see where the keystrokes land.

Two changes:

- The daemon no longer starts the overlay on a native Wayland session, and logs why
  (`overlay_steals_focus`). Setting `QT_QPA_PLATFORM` yourself lifts that block.
- The overlay is now **optional and off by default** on every platform. Turn it on with
  `yazses features enable overlay`.

If you are on 2.40.1 or earlier and dictation types nothing: `yazses features disable overlay`,
then `yazses restart`. See [Troubleshooting](../troubleshooting.md#dictation-is-heard-and-typed-but-nothing-appears-gnome-wayland).

**Upgrade note.** An install whose `config.toml` has no `[overlay]` section no longer shows
the sonar rings after upgrading. To keep them, run `yazses features enable overlay`.

## When the daemon does not start, you are told why

`yazses start` and `yazses doctor` now read the systemd unit state and journal tail and name
the cause, the exact commands, and the distribution's package for it (missing `ExecStart`,
start-limit-hit, a crash loop, an unreadable `/dev/input`, a missing Qt library, PortAudio,
`ydotoold`, `ffmpeg`). A broken systemd unit is repaired by `yazses start` instead of being
reported as started, and the Debian source package got the same fix.

## Windows and macOS read the config the CLI writes

`default_config_path()` returned `~/.config/yazses/config.toml` on every platform. That is the
real location on Linux only; on Windows and macOS the daemon read built-in defaults while the
CLI wrote the platform file, so `hotkey set …` changed a file the running daemon never opened
([#330](https://github.com/MSKazemi/yazses/issues/330)). The path now comes from the platform
layer, a stranded old config is carried over, and `restart` waits for the daemon to actually
exit. On macOS the login agent now launches the daemon through the same resolver as the other
platforms ([#562](https://github.com/MSKazemi/yazses/issues/562)); that one is not
hardware-verified.

## Also in this release

- `yazses setup` provisions Windows, and the Wayland hint leads with the command.
- Persian: conservative normalisation (off until the profile enables it), script-aware
  continuation spacing (contract 7.0.0), and a benchmark harness with confidence intervals.
- Hands-free input: the eye-control foundations (grounded targets, pointer output on X11,
  Wayland, macOS and Windows, one camera owner, an evaluation command). Nothing changes
  until the feature is turned on.

The complete list is in the [changelog](https://github.com/MSKazemi/yazses/blob/main/CHANGELOG.md).
