Releases: DatafyingTech/LocalFlow
Release list
LocalFlow 0.2.2 — installer self-heals
Fixed
install.batrun on its own, or from inside the ZIP, no longer fails with a confusing
"No such file or directory: requirements.txt". The installer now checks that it is inside a
complete copy of the project. If the files are missing it downloads them next to itself and
carries on; if it was launched from inside the ZIP (Windows runs it from a temp folder), it
says so and tells you to extract first.-FetchOnlydownloads the files and stops.
Upgrading: pull or re-download and re-run install.bat. If a previous attempt stopped at requirements.txt, delete the .venv folder it left behind or just re-run; the installer reuses it.
LocalFlow 0.2.1 — pre-warm for phone dictation
Added
POST /v1/warmon the phone API. The PC unloads its cleanup model after idling and reloading
it takes several seconds; the desktop hides that behind the hotkey key-down, but a phone gave
the PC no such signal, so the first dictation after a pause waited 4 to 9 s. The phone app
(0.1.3) now calls this the moment recording starts and when a text field gains focus, so the
reload overlaps with speaking. Contract indocs/API.md.
Upgrading: pull or re-download and re-run install.bat; if you use the phone app, update it to 0.1.3 as well.
LocalFlow 0.2.0 — phone access
LocalFlow can now serve its dictation pipeline to your other devices. Turn on phone access and your PC exposes a small HTTP API over your own Tailscale network, so a phone can send audio and get back the same cleaned text the desktop hotkey produces. Nothing new leaves your devices, and the feature is off until you switch it on.
Added
- Phone access. A small HTTP API on the PC (
server.enabled, off by default) lets another device send audio and get back the same cleaned text the desktop hotkey produces. It listens only on127.0.0.1:8770;tailscale serveexposes it on your Tailscale name with no firewall change. Bearer-token auth, WAV or raw PCM input with resampling,mode=pttorhandsfree, and the same one-at-a-time lock as the desktop path. - Tray menu gains Enable phone access and Phone setup (copies a
URL|TOKENline for the phone). API contract indocs/API.md. - Android app (
android/) — a floating dot over every app. Released separately, see below. run_pipelineinlocalflow/__main__.py: the transcribe-and-clean pipeline as a reusable, side-effect-free function shared by the hotkey path and the API.
Changed
- The privacy statement now distinguishes "never leaves this machine" (the default) from "never leaves your own devices" (phone access on).
Upgrading
Pull the repo or re-download the source, then re-run install.bat. Your existing config.yaml keeps working — the new server.* keys fall back to their defaults. Phone access stays off until you enable it from the tray menu.
Android
The phone app ships on its own tag. Grab the APK from the android-v0.1.0 release and follow docs/ANDROID.md.
LocalFlow for Android 0.1.3
What changed
The app now tells the PC to reload its cleanup model the moment you start recording, and again
when you tap into a text field, so the first dictation after a pause no longer waits several
seconds for the model to come back.
Requires LocalFlow 0.2.1 on the PC.
Updating
Install over 0.1.2. Your settings are kept.
Signature
SHA-256 fingerprint of the signing certificate:
1C:8F:39:86:F4:97:D8:97:47:E0:98:17:12:CB:4C:1D:4F:FF:B7:41:B6:2D:ED:F6:9F:21:13:CB:92:5E:A0:13
LocalFlow for Android 0.1.2
The floating dot for LocalFlow, now signed with a permanent key.
What changed
- Every release from here on is signed with the same key, so updates install in place over the previous version and keep your settings.
- The dot appears only when a text field is active or the keyboard is on screen, and hides everywhere else. A switch in the app turns that off if you want it always visible.
- With no PC connected yet, the app no longer records and then fails. It tells you it is not connected and opens its setup screen.
One-time step if you have 0.1.0 or 0.1.1 installed
Those builds were signed with throwaway keys, so this one cannot replace them. Uninstall LocalFlow, install this APK, then paste the setup line from your PC again (right-click the desktop dot, Phone setup, Copy setup line). You will never need to do this again.
Verify the download
The APK is signed by a certificate with SHA-256 fingerprint
1C:8F:39:86:F4:97:D8:97:47:E0:98:17:12:CB:4C:1D:4F:FF:B7:41:B6:2D:ED:F6:9F:21:13:CB:92:5E:A0:13.
apksigner verify --print-certs LocalFlow-android-v0.1.2.apk should show it.
Setup and troubleshooting: docs/ANDROID.md in the repository.
LocalFlow for Android 0.1.1
What changed
- The dot now appears only when you are actually typing. The floating dot shows up when a text field has focus or the keyboard is on screen, and hides everywhere else. Hiding is debounced so hopping between fields does not make it flicker, and the dot stays pinned while it is listening, hands-free, processing, or flashing done. A switch in the setup screen turns this off if you would rather it was always visible. Without the accessibility service enabled, the dot stays always visible and the setup screen explains why.
- A blank setup now guides you instead of failing. With no PC address or token saved, the app used to record and then fail with "Server URL is not valid". It now refuses to record, tells you it is not connected yet, and opens the setup screen at the connection card. Blank and malformed addresses get different messages.
Upgrading
Install the new APK straight over your existing install. Your settings, PC address, and token are kept.
Worth checking on your phone
- Tap into a text field in Chrome, WhatsApp, and Gmail. The dot should appear each time.
- Go back to the home screen. The dot should hide.
LocalFlow for Android 0.1.0 — the floating dot
LocalFlow for Android is a floating dot that sits over every app on your phone and dictates into whatever field you are looking at: hold it for one phrase, tap it for hands-free with a live waveform and discard/send buttons. It does no transcription itself — it sends the audio to your own LocalFlow PC over your Tailscale network and types the cleaned text back at your cursor, so nothing leaves your own devices.
Requires a PC running LocalFlow 0.2.0 with phone access enabled, Tailscale signed in on both devices, and Android 8.0 or newer (13+ recommended).
Install
- On the phone, download
LocalFlow-android-v0.1.0.apkbelow (app-debug.apkis the same file). - Open the download; when Android blocks it, tap Settings on the prompt and turn on Allow from this source for your browser (Stock: Settings → Apps → Special app access → Install unknown apps; Samsung: Settings → Apps → ⋮ → Special access → Install unknown apps).
- Go back, tap Install, and if Play Protect asks choose Install anyway — this is not a Play Store app and is signed with a development key.
- Open LocalFlow, and on the PC use the tray menu → Phone setup → Copy setup line; get that
URL|TOKENline onto the phone and tap Paste setup line. A connection test runs. - Grant the permissions (below), then flip Show the dot.
Permission order matters
Grant them in this order: Microphone → Display over other apps → Accessibility service → then flip Show the dot. On Android 14 and newer the dot runs as a microphone foreground service, and Android refuses to start one before the microphone permission exists. Also allow Notifications (Android 13+) and set Battery to Unrestricted so the dot is not killed in the background. Full tables, including the Samsung One UI paths, are in docs/ANDROID.md.
Honesty note
This first build compiles, passes unit tests and lint locally and in CI — but the author has not yet run it on a physical phone. Everything described above is what it is built to do, not what has been observed on real hardware. If it misbehaves, please open an issue with your phone model and Android version, which step failed, what the dot did (or did not do), and the connection-test line the app showed. The first bug reports are what will make it solid.
LocalFlow 0.1.1 — hands-free records the whole speech
Hands-free dictation used to paste text at every pause a voice detector found. The detector's loudness gate sat above a normal speaking level, so continuous speech from a quiet voice was classified as silence: chunks closed mid-sentence and the buffer trim discarded words. In 0.1.1, hands-free records the whole speech, transcribes it in one pass when you stop, and cleans it once.
- Hands-free records everything until you stop it (
audio.handsfree_mode: whole, the new default). Nothing is pasted while you talk. The result is cleaned at the newcleanup.handsfree_level(defaulthigh), the same enhanced pass the polish hotkey uses. - Segmented cleanup for long speech. A transcript is split at sentence boundaries into segments of about
llm.segment_words(400), each cleaned withllm.handsfree_timeout_ms(60000), then joined. A segment whose cleanup fails or times out falls back to the rules-based Backtrack for that segment alone, so one slow request no longer throws a whole speech back to raw text. - Corrections stay with what they correct. A sentence opening with a spoken correction ("no, no, wait", "I meant to say", "scratch that") is glued to the sentence before it, so a segment boundary never splits the pair.
llm.num_ctx(new, default 8192) raises the cleanup model's context window so about 25 minutes of speech fits. That costs roughly 0.5 GB more VRAM for gemma3:4b; set it back to 4096 on 4 GB and 6 GB cards.audio.handsfree_vad_thresholddefault lowered from 0.008 to 0.002, fixing chunked mode for quiet voices.- Fixed: a spoken "question mark" after a sentence the recogniser had already punctuated produced
??. Duplicate terminal punctuation is now collapsed, with ellipsis preserved. - A real-voice demo recording in the README.
Measured with the GPU idle: 88 words of continuous speech over 35 s transcribed in 524 ms with nothing dropped; a 215-word dictation cleaned in about 2.3 s.
Upgrading
Pull the repo or re-download it, then re-run install.bat — it is idempotent and safe to run over an existing install. The new configuration keys are added to your config.yaml automatically on next launch; any key you are missing is filled in from the defaults, and your existing settings are left alone.
If you preferred the old behaviour where hands-free pasted at each pause, set audio.handsfree_mode: chunked in config.yaml.
LocalFlow 0.1.0 — local voice dictation for Windows
Hold Ctrl+Win, talk, let go. Cleaned-up text appears in whatever you were typing into. Everything runs on your own machine.
What it does
- Push-to-talk or hands-free. Double-tap the hotkey to keep dictating continuously; text arrives at every natural pause.
- Fixes what you say as you say it. "no wait", "scratch that", "I meant", "oops" apply the correction instead of transcribing it.
- Formats lists. Three or more items in a row become a bulleted list.
- Whispering works. Audio is volume-normalized before transcription, so you can dictate at a murmur.
- Types into fullscreen games that ignore clipboard paste, using hardware scan codes. It never presses Enter unless you say "press enter".
- Stays out of your GPU's way. Capped video memory, the cleanup model unloads when idle, and a one-click Pause frees the GPU for gaming.
How it works
NVIDIA Parakeet TDT 0.6B v2 on ONNX Runtime CUDA for speech recognition, deterministic rules plus an optional local Ollama pass for cleanup, then clipboard or scan-code injection into the focused window.
Measured on an RTX 4070 SUPER with the GPU idle: about 150 ms end to end without the cleanup model, 250 to 500 ms with it.
Requirements
Windows 10 or 11, 64-bit. Python 3.11 to 3.13. An NVIDIA GPU with 6 GB of video memory is recommended; 4 GB works with a smaller cleanup model, and there is a CPU mode for machines with no NVIDIA card. About 10 GB of disk. Ollama is optional.
Linux and macOS are not supported. Speech recognition, audio, and cleanup are portable, but hotkeys, text injection, and the overlay are Windows-only today.
Install
Download the source ZIP below, extract it, and double-click install.bat. Then run.bat. Full instructions and troubleshooting are in the README.
Privacy
No audio, text, or telemetry ever leaves the machine. The only network access is during install. Diagnostics are written to be safe to share.