TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Mac용 로컬 기반 음성 입력, 회의록 자동 작성, iPhone용 음성 키보드 모두 내 기기에서 실행
Free, local-first dictation for the Mac, meeting notes that write themselves, and a dictation keyboard for iPhone. Everything runs on your own device.
생산성Swift · ShellGitHub @robgough온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Hello Computer: a native Mac application for speaking instead of typing
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Tiny native macOS dictation app. Hold a hotkey, talk, release — Dictator transcribes locally with WhisperKit, runs the text through one to three small local-LLM passes (MLX Swift) to format punctuation / "new line" / named emojis, optionally tidy grammar and restructure into paragraphs/lists, then pastes the result into the focused app.README 전문 보기 ↗Tiny native macOS dictation app. Hold a hotkey, talk, release — Dictator transcribes locally with WhisperKit, runs the text through one to three small local-LLM passes (MLX Swift) to format punctuation / "new line" / named emojis, optionally tidy grammar and restructure into paragraphs/lists, then pastes the result into the focused app.
This repo also builds Dictator Meetings, a separate windowed app for recording calls and writing meeting notes on-device — see Sources/DictatorMeetings/. It's a distinct scheme, bundle ID, and release channel from Dictator; the two apps share code (not a compiled framework — each gets its own copy) under Sources/DictatorMac/ and Sources/DictatorCore/, and Dictator can share its already-loaded LLM with Meetings over a local socket rather than both apps holding a copy in memory.
Apple Silicon only. Built and tested on macOS 26.
brew install xcodegen
# Copy the env template and fill in your 10-char Apple Personal Team ID.
# (Find it in Xcode → Settings → Accounts → your Apple ID, or via `codesign -dv`
# on any Mac app you've signed.) `.env` is gitignored.
cp .env.example .env
$EDITOR .env
# Regenerate the Xcode project. `./gen` is a wrapper that sources `.env` first
# so xcodegen sees DICTATOR_TEAM_ID; calling `xcodegen generate` directly works
# too, but only if you've exported the variable in your shell.
./gen
open Dictator.xcodeproj # then ⌘R the "Dictator" scheme (dictation),
# or switch to "DictatorMeetings" for the notes app
Without DICTATOR_TEAM_ID set, the app still builds — Xcode falls back to ad-hoc signing. The trade-off: you'll be re-prompted for Microphone and Accessibility permission after every Clean Build Folder, because TCC can't anchor the grants to a stable identity.
A post-build phase also installs a re-signed copy of the .app to ~/Applications/Dictator.app. Launching from that stable path keeps TCC grants stable across rebuilds; ⌘R from Xcode also works fine once the team ID is set.
Xcode resolves four SPM packages on first build:
argmaxinc/WhisperKit — speech-to-textml-explore/mlx-swift-examples — MLX LLM runtime (pinned to commit eb76c5b7 so its swift-transformers requirement overlaps with WhisperKit's)sindresorhus/KeyboardShortcuts — global hotkey + recorder UIhuggingface/swift-transformers, apple/swift-numerics, …You'll also be prompted once to install the Metal Toolchain (~688 MB) — MLX needs it to compile its kernels.
Models are not bundled — download them on first run from Settings → Models. They land in ~/Library/Application Support/Dictator/Models/.
On first run macOS will prompt for:
System Settings → Privacy & Security → Accessibility → add Dictator.app if the prompt doesn't appear. Settings → General → Permissions shows the current Accessibility status with a one-click jump to the right pane.
The menu-bar dropdown also shows a Recent list (last 10) — click a row to copy its final text.
Hotkey (KeyboardShortcuts or NSEvent flagsChanged)
│ hold / release
▼
AudioRecorder (AVAudioEngine, fresh engine per session, preferred device
pinned via kAudioOutputUnitProperty_CurrentDevice)
│ on release: [Float] samples (16 kHz mono)
▼
TranscriptionService (WhisperKit 0.18)
│ raw transcript
▼
Pass 1 — Format (MLX, strict prompt, deterministic temperature=0)
│ formatted text
▼
Dictionary — case-insensitive whole-word substitutions
│ corrected text
▼
Pass 2 — Grammar (optional, MLX, validated by word-level Levenshtein)
│ tidied text
▼
Pass 3 — Structure (optional, MLX, validated by word-sequence equality)
│ final text
▼
TextInjector (NSPasteboard + synthetic ⌘V via CGEvent) — or
clipboard-only fallback if Accessibility isn't granted
│
▼
DictationHistory (JSON at ~/Library/Application Support/Dictator/history.json)
The whole flow is driven by the Pipeline state machine, which the floating HUDPanel observes for live waveform / status / device-name / result display.
ditto in the post-build phase: cp -R doesn't reliably preserve code-signature metadata on app bundles. ditto does.postBuildScripts run before Xcode's CodeSign phase, so the freshly-copied .app would otherwise be unsigned.mlx-swift-examples pinned to commit eb76c5b7: later commits require swift-transformers ≥1.3, which conflicts with WhisperKit 0.18's cap at <1.2. That commit is the last one on the compatible line.@Sendable: Swift 6 otherwise treats them as @MainActor-isolated because they're declared inside @MainActor methods, and dispatch traps the moment AVAudioEngine invokes them from its realtime audio queue.format: nil in installTap: setting the audio device via AudioUnitSetProperty doesn't always update the input node's reported format synchronously, so caching the format and passing it explicitly leads to Failed to create tap due to format mismatch. Passing nil lets AVAudioEngine pull the actual current format.