Flowkey is a Windows desktop assistant that adds local-LLM hotkeys for grammar fixes, prompt rewrites, summaries, explanations, tone changes, chat, ask-in-chat, note capture, and FastFlowLM benchmarks.
Everything runs locally through FastFlowLM (AMD Ryzen AI NPU) or, on machines without the NPU, through Ollama (CPU/GPU) as a secondary provider. No cloud service, analytics, or telemetry is used by the app.
Current version: 2.4.3
prompt:handles vague requests properly. If a request is too thin to break into concrete requirements, the generated prompt now names what's missing — platform, scope, data source, success criteria — and tells the coding agent to settle those before building, rather than handing your sentence back to you reworded. It still never invents requirements you didn't state. Typos and article agreement in your wording are cleaned up on the way out.- Benchmarks fail clearly, not cryptically. Starting a benchmark on a model too large for your machine used to end in a raw graphics-driver error code. Flowkey now checks the model's memory footprint (plus room for the context sweep) first and tells you what it needs versus what's available. Background model warmups also pause while a benchmark runs, instead of competing with it for the same memory, and errors reported by the local server are passed through verbatim rather than replaced with a generic message.
- The model picker shows every model, sized honestly. Config → Models is now one card, styled like the rest of the dashboard (the old picker used a native browser dropdown that ignored the app's theme). Nothing is hidden from it: models too big for your machine are marked rather than silently dropped, and Mixture-of-Experts models are sized by the parameters actually active per token plus FastFlowLM's own measured memory footprint — so a 35B-total / 3B-active model is no longer mistaken for a 35B one. If a FastFlowLM upgrade invalidates your active model, the card now says so instead of letting the next hotkey fail with an opaque error.
- Chat streams as it thinks. The dashboard Chat tab now fills the reply in token-by-token over a live stream instead of waiting on a blank "Thinking…" until the whole answer is ready — the first words typically appear in ~1.6 s (warm) rather than after the full response. It works on both FastFlowLM and Ollama, and if anything interrupts the stream the partial reply is kept and the error is shown. Grammar,
prompt:, and the other hotkeys are unchanged (they still paste the finished result).
prompt:is faster and more grounded. Prompt v2 uses one short local-model draft plus a deterministic source-grounding pass to return a compact four-section coding-agent prompt without inventing libraries, files, formats, tests, or other unstated requirements. On the fixed 12-inputqwen3.5:4bNPU gate, warm p50 fell from 18.18 s to 3.38 s, p90 from 22.69 s to 4.67 s, and median completion tokens from 222 to 26; all 12 v2 outputs passed the rubric with zero invented-requirement failures. Dashboard → Config → Prompt builder can instantly switch back to the legacy v1 prompt.- FastFlowLM stays warm. The daemon warms the configured NPU model in the background at startup and every 15 minutes by default (both controls are configurable). Measured first-post-restart wall time was 20.88 s versus 3.70 s immediately warm.
- Prompt builder settings for
prompt:mode. Dashboard → Config now lets you tune prompt output for Claude Code or generic chat targets, choose action/detail/structure, add acceptance criteria or verification sections, and preview the deterministic shape without a model call. Claude Code remains the default;generic_chatcleared the live FastFlowLM eval gate onqwen3.5:4b(10/10).
- Meetings, on your own time. Connect the local Quill note app to search your meetings and ask about them on the local model. Because asking about a full transcript costs real prefill time on the NPU, an after-hours scheduler pre-computes each meeting's digest (summary / goals / action items) during a configurable idle window (default 17:00–21:00) so daytime reads are instant. New Meetings tab + Config card; off by default.
- Runs without an AMD NPU. Ollama (any CPU/GPU) is now a first-class provider alongside FastFlowLM (AMD Ryzen AI NPU). Pick one in Dashboard → Config, or let the first-run wizard detect what's installed; if the configured provider isn't running, Flowkey falls back to the other automatically. Model suggestions are hardware-aware — they scale to your RAM/VRAM and hide models that won't fit.
- The web dashboard is the home for everything. Served by the local daemon at
127.0.0.1:52650, it's now where you chat, organize notes, manage models, run benchmarks, change settings, and control notifications. The old standalone chat popup and native AHK dashboard are retired. - Chat is a dashboard tab with optional "ground answers in my notes," carried-over threads, and history.
- Notes is an organizer — read a note, re-file it into a different bucket, or delete it (the LLM's categorization is no longer final).
- Notification controls + a feed — per-event toggles, a dedupe window, Do-Not-Disturb, and quiet hours (errors always come through), plus a log of every toast shown or muted in the Telemetry tab.
See CHANGELOG.md for the full list.
The dashboard is a web page served by the local daemon — these are the Overview and Config tabs (day theme):
- Windows 10/11 x64
- One local LLM backend:
- FastFlowLM (
flm) with a model such asqwen3.5:4b— needs an AMD Ryzen AI NPU, or - Ollama (
ollama) with a model such asllama3.2:3b— any CPU/GPU
- FastFlowLM (
- Python 3.11+ for source/developer installs
- AutoHotkey v2+ for source installs
Pick the provider in Dashboard → Config → "LLM provider & server" (or let the first-run wizard detect what's installed). If the configured provider isn't available at runtime, Flowkey falls back to the other one automatically.
Install these first on a new machine:
- Install the latest AMD Ryzen AI / NPU driver from AMD Support or from your laptop manufacturer's support page.
- Reboot Windows after the driver install.
- Confirm the NPU appears in Device Manager under Neural processors or as an AMD Ryzen AI / NPU device.
- Install FastFlowLM from fastflowlm.com or directly with PowerShell:
Invoke-WebRequest https://github.com/FastFlowLM/FastFlowLM/releases/latest/download/flm-setup.exe -OutFile flm-setup.exe
Start-Process .\flm-setup.exe -Wait- Open a new terminal and verify FastFlowLM:
flm --version
flm pull qwen3.5:4b
flm run qwen3.5:4bOn machines without an AMD Ryzen AI NPU, install Ollama instead:
winget install Ollama.Ollama
ollama pull llama3.2:3bThen pick Ollama in Dashboard → Config → "LLM provider & server" and click "Start server" (or run ollama serve yourself). Suggested starter models: llama3.2:3b, qwen2.5:3b, gemma3:4b.
For source installs from this repository:
.\INSTALL.cmdFor Python/developer installs:
python -m pip install -e ".[dev]"Launch the app with AutoHotkey v2:
& "C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe" .\scripts\grammarFix.ahk| Hotkey | Action |
|---|---|
Ctrl+Shift+G |
Grammar fix on selected text |
prompt: + Ctrl+Shift+G |
Rewrite rough text into a structured prompt |
summarize: + Ctrl+Shift+G |
Create a 3-bullet summary |
explain: + Ctrl+Shift+G |
Explain code, regex, SQL, or technical text |
tone: + Ctrl+Shift+G |
Rewrite in the selected tone preset |
<custom>: + Ctrl+Shift+G |
Any mode you define in Dashboard → Config → Custom modes (e.g. translate:) |
Ctrl+Alt+C |
Open chat (the Chat tab has a "My notes" toggle that grounds replies in your notes vault) |
Ctrl+Shift+A |
Ask in chat with selected text |
Ctrl+Alt+N |
Capture a note |
Prefix tip: put the keyword on the first line of your selection — prompt: rough idea here (or prompt on its own line, then the text). Without a prefix, Ctrl+Shift+G always runs a grammar fix.
The dashboard is a web page served by the local daemon — open it from the tray menu ("Dashboard") or browse to http://127.0.0.1:52650/. It is loopback-only and works in any browser.
- Tabs: Overview, Chat, Telemetry, History, Notes, Meetings, Config, Benchmark.
- Theme: auto-follows your OS day/night setting; the topbar button cycles auto → light → dark.
- Custom modes: Config → Custom modes lets you add your own
prefix:commands (id + system prompt). Changes apply to the running app within a second. - Prompt builder: Config → Prompt builder controls the built-in
prompt:output style without allowing raw edits to the locked system prompt. - Models: pull models with live progress — pick a suggestion or type any name (on Ollama, anything from the library works); set active, remove. Suggestions are hardware-aware: detected RAM/VRAM caps the model size (e.g. 32 GB RAM → ~4B on the NPU; 8 GB VRAM → ~9B on the GPU), oversized models are hidden, and free-typing one asks before pulling.
- Benchmark: works on both providers —
flm benchon FastFlowLM (~10–20 min, NPU), timed generations with native metrics on Ollama (~1–3 min, server keeps running). - History: Telemetry view shows what ran and how fast; Exposed view shows stored request/result text only for rows captured while history storage was visible. The History tab includes the same redacted/visible storage toggle as Config.
- Notes: browse or search your vault.
- Meetings: connect the local Quill app to search meetings, read AI digests (pre-computed after-hours), review action items (accept / reject), and generate a weekly review. Off by default — enable in Config → Meetings.
- Notifications: per-event toggles, dedupe window, Do-Not-Disturb, and quiet hours; every toast (shown or muted) is logged to the Telemetry feed.
- Chat is web-only. Chat lives in the dashboard's Chat tab (
Ctrl+Alt+Cor tray → "Open Chat"). The old standalone modal chat popup is retired — there is no separate chat window. - Two install paths. The signed Inno Setup installer (
Flowkey-Setup-<version>.exe, per-machine, admin) or a source install (INSTALL.cmd, runs from an unzipped folder — no build, no signing). Both are supported; pick one. - Autostart is per-user. "Launch Flowkey when I sign in" is a single per-user
HKCU\…\Runentry the daemon manages from Dashboard → Config — that toggle is the source of truth. The installer doesn't add machine-wide autostart.
scripts/- Python modules and AutoHotkey v2 app code.installer/- optional installer build scripts.setup/defaults/- default config used on first run.tests/- Python and AutoHotkey regression tests.config/grammar_hotkey.config.example.json- example user config.assets/screenshots/- README screenshots.
Runtime data, logs, build output, downloaded vendor binaries, caches, and local editor state are intentionally ignored. The only data/ exception is sanitized fixed-input prompt benchmark evidence under data/benchmarks/prompt_v*.json.
python -m pip install -e ".[dev]"
ruff check scripts tests tools
python -m pytest -q
node --check scripts/ui/web/app.jsAutoHotkey tests are run by CI on Windows. Locally, run them with AutoHotkey v2:
& "C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe" /ErrorStdOut tests\test_parse_mode.ahk
& "C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe" /ErrorStdOut tests\test_classify_clipboard.ahk
