Horseflow is a self-hosted push-to-talk dictation tool that records speech on a global hotkey, transcribes locally with Whisper, cleans the text with a local LLM via Ollama, and pastes the result into the focused application.

Stars

0

7-day growth

No data

Forks

0

Open issues

0

License

MIT

Last updated

2026-07-24

AI repository intelligence
FR-AI / ANALYSIS

Why it is worth attention

It offers fully local speech transcription and cleanup with no cloud dependency, giving users complete privacy and offline capability.

Who it is for

  • Privacy-conscious users who avoid cloud-based dictation
  • Developers who want a self-hosted, customizable dictation pipeline
  • Power users who need hands-free text input across applications
  • Users on Linux or macOS requiring low-latency local dictation

Use cases

  • Dictating notes, emails, or code snippets into any text field
  • Providing hands-free input for accessibility or productivity
  • Offline transcription in environments with strict data controls
  • Fast, privacy-preserving dictation over a private network like Tailscale

Strengths

  • Local Whisper and Ollama processing ensures no data leaves the machine or private network
  • The hotkey's space event is swallowed, preventing accidental input in the focused application
  • Supports both Linux (evdev-based) and macOS (native event tap) clients with similar workflow
  • Cross-machine operation via Tailscale without exposing the API to the internet

Considerations

  • Server requires a Linux host with Docker Compose and an NVIDIA GPU with ~11 GB VRAM
  • No built-in authentication; the API must be bound to localhost or a trusted private network
  • Only Ctrl+Space (Linux) and Command+Space (macOS) hotkeys are supported, and macOS requires 15+

README quick start

Horseflow

Horseflow is self-hosted push-to-talk dictation. It records while a global hotkey is held, transcribes locally with Whisper, cleans punctuation and false starts with a local LLM, then pastes the result into the focused application.

  • Local speech recognition with faster-whisper
  • Local cleanup through Ollama
  • Linux client: hold Ctrl+Space
  • macOS client: hold Command+Space
  • The hotkey's Space event is swallowed before the focused application sees it
  • No cloud API or account required

Architecture

keyboard hotkey -> local recording -> Horseflow API
                                      |-> Whisper large-v3
                                      `-> Ollama cleanup model
                                           -> clipboard -> synthetic paste

The server and clients may run on the same machine or communicate over a private network such as Tailscale.

Server

Requirements

  • Linux host with Docker Compose
  • NVIDIA GPU and NVIDIA Container Toolkit
  • Approximately 11 GB VRAM for Whisper large-v3 and an 8B/9B quantized LLM

Configure

cd deploy
cp .env.example .env
nvidia-smi --query-gpu=uuid,name --format=csv

Edit .env. Set:

  • HORSEFLOW_GPU to the selected GPU UUID
  • HORSEFLOW_BIND_ADDRESS to 127.0.0.1
  • model storage paths
  • custom vocabulary and ASR context

Start

docker compose up -d ollama
docker compose exec ollama ollama pull qwen3:8b
docker compose up -d --build api
curl http://127.0.0.1:8100/health

The API documentation is available at /docs.

Run the server and clients on different machines

Use Tailscale Serve to expose the localhost-bound API as a stable, tailnet-only HTTPS endpoint. Linux and macOS clients can use the same endpoint:

https://horseflow-server.example-tailnet.ts.net/dictate

Follow the complete cross-machine Tailscale setup. Do not bind Horseflow publicly or use Tailscale Funnel.

Linux client

The Linux client exclusively grabs physical keyboards through evdev, forwards normal input through a virtual keyboard, and swallows Ctrl+Space. It records through PipeWire and pastes through ydotool.

Requirements

  • Python 3.10+
  • pw-record
  • wl-copy
  • ydotool
  • notify-send
  • Permission to read /dev/input/event* and write /dev/uinput

On many distributions, the user must belong to the input and

Description

Self-hosted push-to-talk dictation with local Whisper and LLM cleanup

Related repositories

Similar projects matched by category, topics, and programming language.

lopopolo
Featured
lopopolo GitHub avatar

harness-engineering

Harness Engineering is a methodology for improving coding agent outputs by carefully crafting the environment around them—providing curated context, tools, and executable constraints that encode an organization’s nonfunctional requirements and cumulative lessons.

AI & Machine LearningAI Agents
2,390
slvDev
Featured
slvDev GitHub avatar

esp32-ai

A 28.9 million parameter language model runs on an $8 ESP32-S3 microcontroller entirely on-device, generating simple stories at about 9.5 tokens per second.

AI & Machine LearningLarge Language Models
1,960
littledivy
Featured
littledivy GitHub avatar

mimic

mimic captures traffic from any iOS or web app and automatically generates a Python client library that lets you call the app's API like a regular library.

AI & Machine Learning
1,482