Skip to content

sanwidee/typeflow

Repository files navigation

TypeFlow

A local, private voice-to-text app for macOS. Press ⌘\ anywhere, speak, release — your transcription lands on the clipboard, ready to paste.

Runs entirely offline using Whisper via faster-whisper. No accounts, no cloud, no telemetry.

TypeFlow icon

Features

  • Global hotkey⌘\ to start/stop recording from any app
  • Local Whisper — choose from small (240 MB, fast) up to large-v3-turbo (1.5 GB, ChatGPT-grade)
  • English + Indonesian — selectable from the menu bar (Whisper supports 99 languages — only EN/ID exposed in the UI)
  • Floating overlay — ChatGPT-voice-mode-style pill at the bottom of your screen, with live audio levels
  • Main window — animated orb showing current state + last transcript
  • Menu bar item — quick access to language, model, microphone
  • Microphone picker + test mode — works with any input device on your system
  • Fully local — model weights cached at ~/.cache/huggingface, used offline forever after

Requirements

  • macOS 13 (Ventura) or later. Tested on macOS 14 / 15.
  • Python 3.11+ (only needed to build from source — the bundled .dmg ships its own Python)
  • ~2 GB of disk for the largest model

Quick start (build & run from source)

git clone https://github.com/sanwidee/typeflow.git
cd typeflow
./run.sh

run.sh creates a virtualenv, installs dependencies, and launches the app. The first transcription downloads the Whisper model (one-time, ~240 MB for small).

Build a .app for your menu bar

./build_app.sh

This produces ~/Applications/TypeFlow.app — a thin launcher that points at your local venv. Double-click to run. macOS will prompt for:

  • Microphone (for recording)
  • Accessibility + Input Monitoring (for the global hotkey)

Grant all three, then quit and relaunch the .app.

Build a distributable .dmg

./scripts/build_release.sh

This uses PyInstaller to produce a fully self-contained .app that bundles its own Python + dependencies (no Anaconda or system Python needed). Then:

./scripts/make_dmg.sh

…packages that .app into dist/TypeFlow.dmg, ready to upload to GitHub Releases.

Installing an unsigned .dmg

The DMG is not signed by Apple (paying $99/yr for a Developer ID isn't reasonable for a free hobby project). The first time someone downloads it, macOS will refuse to open it. Two ways to bypass:

Option A — right-click → Open (recommended):

  1. Drag TypeFlow.app to /Applications
  2. Right-click → Open
  3. Click Open in the warning dialog
  4. After this, double-click works normally

Option B — strip the quarantine flag (for "App is damaged" errors):

xattr -dr com.apple.quarantine "/Applications/TypeFlow.app"

Usage

Action How
Start/stop recording ⌘\
Change language Menu bar TFLanguage
Change Whisper model Menu bar TFModel
Pick microphone Menu bar TFMicrophone
Test microphone (3s) Menu bar TFTest Microphone
Show main window Menu bar TFShow Window, or click the Dock icon
Quit Menu bar TFQuit
Logs ~/.typeflow.log
Settings file ~/.typeflow.json

Architecture

app.py          — main entry point, rumps menu bar, state machine
main_window.py  — animated NSWindow with orb, status, transcript
overlay.py      — floating NSPanel pill (ChatGPT-voice-mode style)
build_app.sh    — wraps the venv into a clickable .app
assets/icon.svg — source for the .icns app icon
scripts/
  build_icon.sh    — SVG → .icns via qlmanage + sips
  build_release.sh — PyInstaller bundle (self-contained .app)
  make_dmg.sh      — wraps the .app into a .dmg
  install_launcher.sh — internal helper for build_app.sh

License

MIT — see LICENSE.

This project bundles open-source components under MIT, BSD, Apache-2.0, and LGPL-3.0. See NOTICE for full attribution and LGPL compliance details.

Acknowledgements

About

Local voice typing for macOS. Press a key, speak, paste anywhere. Powered by Whisper, runs entirely on your machine. Free & open source.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors