# Show HN: Dictata – Local Whisper dictation with LLM cleanup

> Source: <https://github.com/AntoineChatry/Dictata>
> Published: 2026-08-15 00:58:34+00:00

**100% local** system-wide voice dictation for Windows, in native Rust. Press a
global hotkey, speak, press again: the text is transcribed locally by
[whisper.cpp](https://github.com/ggerganov/whisper.cpp) and pasted into the
active application. No data ever leaves the machine.

Current release: **v0.1.0** — see [CHANGELOG.md](/AntoineChatry/Dictata/blob/master/CHANGELOG.md).

**Hotkey dictation**(toggle or push-to-talk), automatic paste into the active application, floating dock with waveform (configurable size, opacity and position).**Continuous mode (streaming)**: text is inserted as you speak, at every detected pause.** Silence skipping (VAD)**: optional whisper.cpp voice-activity detection on standard (non-streaming) dictation — less compute and fewer hallucinations on silence. Downloads a small (~2 MB) model on first use; toggle in Configuration.**Vulkan GPU transcription**(AMD/Intel/NVIDIA) or CPU — whisper-rs with the`vulkan`

feature.**Audio sources**: microphone, system audio (WASAPI loopback) or a mix of both (meeting mode).** Output modes**: raw, or post-processing through a local OpenAI-compatible LLM (cleanup, email, message, list…), with customizable prompts.**Transcribe a file**(audio/video, History page) — any format handled by ffmpeg.- Custom
**vocabulary and replacements** injected as the initial prompt. - Built-in
**ggml model library**: download, delete, and hardware-aware recommendations (detected GPU/VRAM when running on Vulkan, CPU/RAM otherwise). **HuggingFace search**: install any ggml`.bin`

model from a direct URL, a repo (`owner/name`

) or a keyword search.**fr / en / es interface**, dark theme, system tray icon, transcription history.

- Windows 10/11. Linux is
**not supported** in this release — see[LINUX.md](/AntoineChatry/Dictata/blob/master/LINUX.md)for what works, what does not, and why. [ffmpeg](https://ffmpeg.org/)in`PATH`

(only for "Transcribe a file").- To build with GPU support: the
[Vulkan SDK](https://vulkan.lunarg.com/)and the Visual Studio Build Tools (CMake + Ninja included).

```
cargo build --release
```

Build specifics:

-
**MAX_PATH workaround (Windows)**: whisper.cpp's`vulkan-shaders-gen`

sub-project can exceed the Windows MAX_PATH limit (260 characters) and break MSBuild (FTK1011/C1083). If that happens, create a local (untracked)`.cargo/config.toml`

pointing the build to a short path at a drive root:

```
[build]
target-dir = "C:/wt"   # any short path
```

The executable and its

`config.json`

then live in`<target-dir>\<profile>\`

. -
After a

`cargo clean`

, rebuild inside a Visual Studio environment with the Ninja generator:

```
VsDevCmd.bat -arch=amd64 && set CMAKE_GENERATOR=Ninja && set CMAKE_GENERATOR_INSTANCE= && set VULKAN_SDK=<SDK path> && cargo build
```

For a CPU-only build (no Vulkan SDK required):

```
cargo build --release --no-default-features
powershell -ExecutionPolicy Bypass -File scripts\release-windows.ps1 -Variant both
```

Runs the tests, builds, and writes `dist\dictata-<version>-windows-x86_64[-cpu].zip`

with its SHA-256. The zip contains only `dictata.exe`

, `README.md`

, `LICENSE`

and `CHANGELOG.md`

: no `config.json`

is shipped (the app writes its own
defaults on first run, and a development `config.json`

carries personal data).
The binary is self-contained — no DLL to ship alongside it; the Vulkan build
uses the loader provided by the graphics driver.

The executable carries its icon and version metadata, embedded by `build.rs`

via `winresource`

. The icon itself is drawn by a script rather than checked in
as an opaque blob — edit the numbers and regenerate all sizes at once:

```
powershell -ExecutionPolicy Bypass -File scripts\make-icon.ps1
```

`scripts/release-linux.sh`

mirrors the packaging script, but has never been
run — see [LINUX.md](/AntoineChatry/Dictata/blob/master/LINUX.md).

- Launch the executable: the application lives in the system tray.
- Open
**Settings**(tray menu, or set the`DICTATA_OPEN_SETTINGS=1`

environment variable at launch): pick a model in the Models page (built-in download), set the hotkey, language and audio source. - Place the cursor where you want to write, press the hotkey (default
`Ctrl+Alt+Space`

), speak, press again.**Hold** for about half a second to cancel the current take — Escape is read globally, so a plain tap is left to the application you are typing into.`Esc`

The configuration is read from `config.json`

next to the executable, or from
the directory pointed to by the `DICTATA_HOME`

environment variable. The
file must be UTF-8 **without BOM**.

GPU: `gpu`

config field — `"auto"`

(default, uses Vulkan when available),
`"cpu"`

, `"vulkan"`

, `"cuda"`

.

| Module | Role |
|---|---|
`main.rs` |
Orchestration: states, hotkey, dock, transcription threads |
`audio.rs` |
cpal capture (mic / loopback / mix), 16 kHz resampling, ffmpeg decoding |
`transcriber.rs` |
whisper-rs wrapper (model loading, transcription) |
`streaming.rs` |
Continuous mode: pause-based chunking, progressive emission |
`settings.rs` |
Settings window (8 pages, egui) — presentation |
`settings_logic.rs` |
Settings business logic, testable without UI |
`dock.rs` |
Floating dock (waveform, states) |
`modes.rs` / `llm.rs` |
Output modes and local LLM post-processing |
`models.rs` |
ggml catalog, download/delete, HuggingFace search, paths |
`i18n.rs` |
fr/en/es translations (`tr()` ) |
`config.rs` / `history.rs` / `paste.rs` / `hotkey.rs` / `tray.rs` / `hardware.rs` / `platform.rs` |
Config, history, paste, global hotkey, tray, hardware detection, Windows integration |

```
cargo test
```

64 unit tests (config, resampling, mixing, modes, settings logic, hardware rating, HuggingFace query parsing, audio-context sizing, history retention, cancel gesture, download safety…). A CLI example is provided:

```
cargo run --example transcribe -- <file.wav>   # DICTATA_GPU=1 for GPU
```

Licensed under the **MIT License with the
Commons Clause** — see

[LICENSE](/AntoineChatry/Dictata/blob/master/LICENSE).

**Free** to use, copy, modify, distribute and self-host, for personal or any other purpose.**You may not**: you cannot sell the software, or offer a paid product or service (hosting, SaaS, paywall, paid support…) whose value derives substantially from it.*Sell*it

© 2026 Antoine Chatry.
