A keyboard-first dictation/send workflow for macOS. Fn is the first-class trigger, and if you have a DJI Mic Mini you can optionally map its hardware button to the same workflow.
Works with any app that accepts text input: Claude Code, WeChat, Feishu/Lark, Telegram, Slack, VS Code, Notes, and more. If you find an app that doesn't work, open an issue or submit a PR!
Run the installer directly:
npx github:Johnixr/dji-mic-dictation installThe installer checks for a connected DJI Mic Mini automatically:
- if detected, it enables the optional hardware trigger on top of the keyboard workflow
- if not detected, it installs the keyboard workflow by default and may ask if you want to preconfigure the optional DJI trigger anyway
Useful follow-up commands:
npx github:Johnixr/dji-mic-dictation update
npx github:Johnixr/dji-mic-dictation doctor
npx github:Johnixr/dji-mic-dictation config
npx github:Johnixr/dji-mic-dictation uninstallUse the CLI as the default path. If you want an AI assistant to help, have it call the same CLI instead of reimplementing the setup steps.
Typeless adds an LLM layer on top of macOS dictation — it cleans up your speech, removes filler words, fixes grammar, and handles mixed Chinese/English seamlessly.
Free tier: 4,000 characters/week. Pro: $12/month.
You can use the workflow with the keyboard alone. If you also have a DJI Mic Mini, you can enable it as an optional trigger that mirrors the same Fn workflow.
10g, clips to your collar, 400m range, active noise cancellation, ~$27 USD.
npx github:Johnixr/dji-mic-dictation installFn press 1 → start dictation → speak freely, any duration
Fn press 2 → stop dictation → send window opens (ready overlay + sound once text lands)
Fn press 3 → send / Enter to current app → AI starts working
No press? → auto-reset after 4 seconds, no side effects
Optional: if you enable the DJI trigger during install, the Mic Mini button mirrors the same workflow.
| Requirement | Notes |
|---|---|
| macOS | Tested on macOS Sequoia |
| Karabiner-Elements | brew install --cask karabiner-elements |
| DJI Mic Mini | Optional hardware trigger; vendor_id: 11427, product_id: 16401 |
| macOS Dictation | System Settings → Keyboard → Dictation → On |
| Typeless | Required in the current version because detection relies on the Typeless DB |
dji-mic-dictation/
├── cli/ # CLI installer / update / doctor / config / uninstall
├── README.md # You're reading this
├── README_CN.md # 中文文档
├── CLAUDE.md # Instructions for AI assistants
├── AGENTS.md # Symlink to CLAUDE.md (for Codex)
├── package.json # npm bin entry for the CLI
├── scripts/
│ └── dictation-enter.sh # Main script (save/tap/enter)
└── karabiner/
└── dji-mic-mini.json # Karabiner config to merge
Find your device's vendor_id and product_id:
# With Karabiner installed:
'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --list-connected-devicesThen update the managed device identifiers and reinstall with --trigger-mode keyboard+dji.
Check the debug log first:
cat /tmp/dji-dictation/debug.log| Symptom | Likely cause | Fix |
|---|---|---|
| The optional hardware button does nothing | Karabiner can't see the device | Grant Input Monitoring permission to Karabiner in System Settings → Privacy & Security |
| The optional hardware button changes volume instead of dictation | The installer did not detect the device when you installed, so only the keyboard workflow was configured | Re-run npx github:Johnixr/dji-mic-dictation install with the DJI receiver connected |
| Dictation works but no sound / no ready overlay | Accessibility permission missing | Grant Accessibility permission to /usr/bin/osascript (or the terminal app running the script) |
| Sound plays but overlay doesn't appear | The ready overlay requires a compiled Swift binary; run npx github:Johnixr/dji-mic-dictation update to refresh. Some apps have non-standard windows (e.g. Electron overlay); already handled for Feishu/Lark; open an issue for other apps |
|
| CLI says Typeless DB is missing | Typeless is not installed or has never been opened | Install Typeless, launch it once, then run npx github:Johnixr/dji-mic-dictation install or npx github:Johnixr/dji-mic-dictation doctor again |
| Overlay shows but Enter doesn't send | Terminal app needs Accessibility permission | Grant Accessibility to your terminal (iTerm2 / Terminal.app) |
| Enter sends to wrong app | Old build or stale install | Run npx github:Johnixr/dji-mic-dictation update from the latest repo version |
All of these must be granted in System Settings → Privacy & Security:
- Input Monitoring → Karabiner-Elements, karabiner_grabber
- Accessibility → Karabiner-Elements, your terminal app (iTerm2 / Terminal.app)
- Dictation → System Settings → Keyboard → Dictation → On
MIT
Built with Claude Code via pure voice-driven Vibe Coding.