README.md

September 21, 2026 · View on GitHub

Haynoi

Push-to-talk dictation for macOS.
Hold a key, speak, release — your words appear in whatever app you're typing in.

Vietnamese-first, English-friendly. Powered by Kyma API.

haynoi.com · Download for macOS

License Stars Release macOS 14+ Swift 5.9 Native


Why Haynoi

Most dictation tools treat Vietnamese as an afterthought. Haynoi is built for the way Vietnamese people actually speak — tiếng Việt with English mixed in mid-sentence ("deadline", "deploy", "team marketing") — and keeps both languages intact instead of translating or mangling one of them.

  • Speaks your language(s). Vietnamese-optimized speech-to-text that handles Vi/En code-switching — and a personal dictionary that learns from your corrections, so names and jargon come out right the next time without you configuring anything.
  • Works in every app. Text is inserted directly where your cursor is — editor, browser, chat, terminal — via the Accessibility API, with clipboard fallback.
  • Nothing to configure. Sign in once with Google. No API keys to paste, no model menus to study. Free tier included.

How it works

Hold ⌥  →  speak  →  release  →  text appears

That's the whole product. A floating bar shows the waveform while you talk; a layered chord confirms start/stop.

Smart modes

ModeWhat it does
NormalTranscribes exactly what you say
CleanDrops filler words (ừm, à, uh…)
Email / FormalRewrites your rambling into a professional message
AutoPicks a mode from the app you're in — formal in Mail, clean in chat

It learns you

Haynoi's dictionary fills itself instead of asking you to maintain it:

  • Fix it once, it sticks. Say "fix that" (⌃⌥) and re-dictate, edit the inserted text in place, or just repeat yourself — Haynoi notices the correction and suggests remembering it. Confirmed fixes are applied automatically from then on.
  • It knows when it wasn't sure. When the transcriber hesitates on a word that sounds like a name you use — "Afider" for "Affitor", "Sun" for "Sơn" — that one dictation gets an extra cleanup pass with your personal terms. Confident dictations skip it, so nothing gets slower.
  • You stay in charge. A master learning switch, a counter of what's been learned, and a one-tap "Forget all" live in Settings → Dictionary. Learning runs on transcript text only — never audio — and your dictionary never leaves your Mac.

Features

  • Push-to-talk — hold the left ⌥ Option key (or ⌘ / ⌃ / fn), release to transcribe
  • Language preference — auto-detect by default, or pin Tiếng Việt / English
  • Your words are never lost — if the network fails mid-transcription, the recording is saved locally and retried with one click
  • Survives real life — AirPods disconnecting mid-sentence, permission hiccups, and flaky Wi-Fi all degrade gracefully instead of eating your dictation
  • Auto-paste into the active app, with clipboard fallback — and your previous clipboard is restored afterwards (dictated text is also hidden from clipboard managers)
  • Other audio gets out of your way — music and video pause and resume around your dictation; a live call or stream is dipped in volume instead, decided from what your Mac is actually playing
  • Living status orb — recording, transcribing, success, and error each have their own state, so you always know where your words are
  • Snippets — say a trigger word, get expanded text
  • Transcription history — searchable, stored locally, grouped by date
  • Premium sound feedback — harmonic chords for start / stop / cancel / success
  • Silent auto-updates via Sparkle, launch at login, guided onboarding

Install

Download the latest Haynoi.dmg from haynoi.com or GitHub Releases, drag it to Applications, and open it. The app is signed and notarized — no security warnings, and updates install themselves.

Prefer building from source?

git clone https://github.com/sonpiaz/haynoi.git
cd haynoi
brew install xcodegen    # if not installed
make run

First run, either way:

  1. The onboarding wizard walks you through Microphone and Accessibility permissions — that's all Haynoi needs
  2. Sign in with Google — one click, no passwords, nothing to paste
  3. Hold the left ⌥ Option key, say something, release — the guided first dictation shows you the loop

Runs on Kyma API. Kyma handles speech-to-text and rewrite for every dictation so Haynoi never holds a model key.

Pricing

Free: 5,000 words per week, resetting every Monday. That covers everyday dictation for most people — no card required, just the Google sign-in.

Haynoi Pro (unlimited words) is coming soon.

Two transcription tiers, switchable any time in Settings:

TierModelKyma API endpointBest for
Quality (default)gpt-4o-mini-transcribe-2025-12-15POST https://kymaapi.com/v1/audio/transcriptionsVietnamese + English, noisy rooms, technical vocabulary
Fastwhisper-v3-turboPOST https://kymaapi.com/v1/audio/transcriptionsClear, simple speech
Rewritegemini-3.5-flash-litePOST https://kymaapi.com/v1/chat/completionsEmail mode, and the grounded correction pass when the transcriber flags a word

Haynoi's server calls these endpoints on Kyma API for you, so the app never holds a model key.

Privacy

  • Audio is sent to Haynoi's backend for transcription, then discarded — recordings are never stored server-side
  • Your dictionary, learned corrections, and transcription history stay on your Mac — learning uses transcript text only, never audio, and nothing about it syncs anywhere
  • Your sign-in session lives in the macOS Keychain
  • Anonymous usage analytics (feature counts and timings — never your words, never transcript content) help improve the app; there's an opt-out toggle in Settings

Development

make generate    # Generate Xcode project (XcodeGen)
make build       # Build via xcodebuild
make run         # Build and run
make clean       # Clean build artifacts
Project structure
Sources/Haynoi/
├── App/
│   ├── HaynoiApp.swift           — App entry, menu bar, onboarding
│   ├── AppState.swift            — Shared state, transcription history
│   └── PipelineController.swift  — Hotkey → Record → Transcribe → Insert
├── Audio/
│   ├── AudioRecorder.swift       — 16kHz mono mic capture via AVAudioEngine
│   └── SoundFeedback.swift       — Harmonic chord audio cues
├── Auth/
│   ├── HaynoiAuth.swift          — Google sign-in via Haynoi's backend
│   └── KeychainStorage.swift     — Session storage in the macOS Keychain
├── Input/
│   ├── HotkeyManager.swift       — Global hotkey via NSEvent monitors (Accessibility)
│   └── TextInserter.swift        — AX API + clipboard text insertion
├── Transcription/
│   ├── STTProvider.swift         — Transcription + confidence-gated correction pass
│   └── TranscriptionMode.swift   — Normal / Clean / Email / Auto modes
├── Settings/
│   └── SettingsView.swift        — Account, quality, hotkey, dictionary
├── UI/                           — History list, main window, floating bar
└── System/                       — Personal dictionary + correction learning,
                                    media control, launch at login, usage stats

Tech stack

TechnologyPurpose
Swift 5.9 + SwiftUIApp
AVFoundationAudio capture & sound synthesis
Kyma APISpeech-to-text (gpt-4o-mini-transcribe-2025-12-15 / whisper-v3-turbo) and rewrite (gemini-3.5-flash-lite)
Accessibility API + NSEventText insertion + global hotkey (no Input Monitoring needed)
XcodeGenProject generation
  • Pheme — AI meeting notes for macOS, Vietnamese-optimized
  • kyma-dub — time-aligned AI video dubbing CLI
  • Kapt — macOS screenshot tool with annotation & OCR

License

MIT — see LICENSE.


Built by Son Piaz · Powered by Kyma API