{"slug": "typewhisper-open-source-dictation-and-workflows-for-macos-and-windows", "title": "TypeWhisper – open-source dictation and workflows for macOS and Windows", "summary": "TypeWhisper 1.5, an open-source dictation and AI text processing tool for macOS and Windows, is now stable with system-wide dictation, file transcription, and support for on-device or cloud speech-to-text providers including Groq, OpenAI, and xAI/Grok. The release introduces app-aware insertion, expanded AI providers, local model reliability improvements, and dictionary learning, while the main branch prepares for version 1.6.", "body_md": "Speech-to-text and AI text processing for macOS. Transcribe audio using on-device AI models or cloud APIs (Groq, OpenAI, xAI/Grok), then transform the result with reusable workflows. Your voice data stays on your Mac with local models - or use cloud APIs for faster processing.\n\nTypeWhisper `1.5`\n\nis the current stable release for macOS. It includes system-wide dictation, file transcription, unified workflows, history, dictionary, snippets, bundled integrations, the community plugin registry, local automation APIs, app-aware insertion, expanded provider support, and local-model reliability improvements. The `main`\n\nbranch is now preparing the `1.6`\n\nrelease-candidate line; `1.5`\n\nreceives hotfixes only from `release/1.5`\n\n.\n\nSee the [release readiness guide](/TypeWhisper/typewhisper-mac/blob/main/docs/release-readiness.md), [support matrix](/TypeWhisper/typewhisper-mac/blob/main/docs/support-matrix.md), and [release checklist](/TypeWhisper/typewhisper-mac/blob/main/docs/release-checklist.md) for the active `1.6`\n\nrelease definition and ship gates.\n\n## typewhisper-demo-full-with-voiceover.mp4\n\n**App-aware dictation insertion**- Dictation output now better respects sentence position, trailing spaces, terminal paste behavior, rich-text targets, and target-app context**Expanded speech and AI providers**- Gemini speech transcription, Cartesia speech transcription, Sber SaluteSpeech, OpenRouter speech-to-text, Reson8, Mistral AI, Soniox regions and TTS, and OpenAI-compatible profiles broaden the bundled provider set**Local model reliability**- MLX memory-footprint controls, idle auto-unload behavior, stalled Gemma 4 download recovery, and Parakeet vocabulary repair improve local model setup and day-to-day stability**Dictionary learning and normalization**- Auto-learned corrections, target-app correction learning, per-term CTC tuning plumbing, multilingual number-word normalization, English ordinals, digit sequences, and French decimal cleanup improve recognition output**Workflow and hotkey reliability**- Hybrid modifier timing, non-Control modifier taps, global push-to-talk, Pages workflow hotkeys, menu-based dictation pause, Esc confirmation, and automatic workflow output resolution all received targeted fixes**Recording and indicator polish**- Virtual audio input support, media pause/resume hardening, fullscreen indicator fixes, recorder final-failure surfacing, FaceTime built-in microphone capture, and TaskForge insertion fallback improve real-world capture and insertion flows**Release and plugin metadata cleanup**- Cloud ASR upload fallback handling, plugin host-compatibility metadata, plugin uninstall cleanup, and GitHub Latest protection keep the 1.5 distribution path clean\n\n**Eleven engines**- WhisperKit (99+ languages, streaming, translation), Parakeet TDT v3 (25 European languages, extremely fast), Apple SpeechAnalyzer (macOS 26+, no model download needed), Granite Speech (MLX-based), Qwen3 ASR (MLX-based), Voxtral (local Voxtral Mini 4B, MLX-based), Groq Whisper, OpenAI Whisper, Smallest Pulse, xAI/Grok STT, and OpenAI Compatible (any OpenAI-compatible API)**On-device or cloud**- All processing happens locally on your Mac, or use Groq/OpenAI/xAI APIs for faster processing** Streaming preview**- See partial transcription in real-time while speaking (WhisperKit)** Short-clip handling**- Better retention of brief utterances and fewer false no-speech discards** File transcription**- Batch-process multiple audio/video files with drag & drop** Subtitle export**- Export transcriptions as SRT or WebVTT with timestamps\n\n**System-wide**- Push-to-talk, toggle, or hybrid mode via global hotkey, auto-pastes into any app** Modifier-key hotkeys**- Use a single modifier key (Command, Shift, Option, Control) as your hotkey** Indicator styles**- Choose Notch, Overlay, or Minimal, with optional live transcript preview where supported** Sound feedback**- Audio cues for recording start, transcription success, and errors** Microphone selection**- Choose a specific input device with live preview and improved recovery after route changes\n\n**Workflows**- Build reusable transformations for translation, rewriting, extraction, formatting, and app-specific automation. Workflows can run automatically by app, website, or app + website combinations, from a dedicated hotkey, as a global fallback, or manually from the Workflow Palette. Hotkey workflows can either start dictation or process the current selection/clipboard directly.**LLM provider fallbacks**- Order Apple Intelligence (macOS 26+), Groq, OpenAI / ChatGPT, xAI/Grok, Gemini, OpenAI Compatible, and local providers in one global provider/model list. Prompts and workflows inherit that order by default; a workflow with an explicit provider stays on that single provider**Speech providers**- System voices, xAI/Grok TTS, and experimental local Supertonic TTS can provide spoken feedback and readback** Local prompt processing**- Gemma 4 via MLX runs on-device on Apple Silicon, with the current verified release path limited to the E2B/E4B 4-bit models**Translation**- Translate transcriptions on-device using Apple Translate\n\n**Workflow triggers**- Per-app, per-website, combined app + website, hotkey, global fallback, and manual palette-only triggers for language, task, engine, prompt, and auto-submit behavior. Website matching supports subdomains**Dictionary**- Terms improve cloud recognition accuracy. Corrections fix common transcription mistakes automatically. Auto-learns high-confidence local single-word manual corrections, while broader rewrites and deletions are skipped. Includes importable term packs**Localized term packs**- Built-in term pack names and descriptions are localized in English and German** Snippets**- Text shortcuts with trigger/replacement. Supports placeholders like`{{DATE}}`\n\n,`{{TIME}}`\n\n, and`{{CLIPBOARD}}`\n\n**History**- Searchable transcription history with inline editing, correction detection, app context tracking, timeline grouping, filters, bulk delete, multi-select export, auto-retention, and a standalone window accessible from the tray menu\n\n**Plugin system**- Extend TypeWhisper with custom LLM providers, transcription engines, TTS providers, post-processors, and action plugins. Gemini, Granite, Groq, Linear, OpenAI / ChatGPT, OpenAI Compatible, Qwen3, Smallest Pulse, Supertonic, Voxtral, Webhook, and xAI/Grok ship as bundled plugins, alongside the local engine plugins. Linear plugin enables voice-to-issue creation. See[TypeWhisperPluginSDK/Plugins/README.md](/TypeWhisper/typewhisper-mac/blob/main/TypeWhisperPluginSDK/Plugins/README.md)**Local model download controls**- Bundled Qwen3, Granite, Voxtral, and Supertonic plugins support an optional HuggingFace token for higher rate limits and clearer download errors. Supertonic requires explicit OpenRAIL-M model-license acceptance before model assets download.**HTTP API**- Local REST API for integration with external tools and scripts** CLI tool**- Shell-friendly transcription via the command line** Discord claim service**- Optional external service for Polar supporter and GitHub Sponsors Discord role claims\n\n**Home dashboard**- Usage statistics, activity chart, and onboarding tutorial** Auto-update**- Built-in updates via Sparkle with stable, release-candidate, and daily channels** Universal binary**- Runs natively on Apple Silicon and Intel Macs** Widgets**- Desktop widgets for usage stats, last transcription, activity chart, and transcription history** Multilingual UI**- English and German** Launch at Login**- Start automatically with macOS\n\n```\nbrew install --cask typewhisper/tap/typewhisper\n```\n\nDownload the latest DMG from [GitHub Releases](https://github.com/TypeWhisper/typewhisper-mac/releases/latest).\n\nStable direct-download releases use the default Sparkle channel. Release candidates such as `1.6.0-rc*`\n\nand daily builds such as `v1.6.0-daily.*`\n\nare published as GitHub prereleases, update the shared Sparkle appcast on their own channels, and are excluded from Homebrew.\nInstalled builds can switch channels in `Settings -> About`\n\nvia the `Update Channel`\n\npicker.\n\n- Install TypeWhisper from Homebrew or the latest DMG.\n- Open Settings and grant Microphone plus Accessibility access.\n- Pick an engine and, if needed, download a local model.\n- Trigger the global hotkey and complete your first dictation.\n\nThese steps are for official TypeWhisper release builds on macOS. They remove the app itself, its local state, widget data, and stored secrets so you can reinstall from a clean slate.\n\nIf you installed via Homebrew, you can optionally start with:\n\n```\nbrew uninstall --cask typewhisper\n```\n\nThat removes the app bundle, but it does not reliably remove all files in `~/Library`\n\nor TypeWhisper entries in Keychain.\n\nIf `~/Library`\n\nis hidden in Finder, use `Go -> Go to Folder...`\n\nand paste the paths below.\n\n- Quit TypeWhisper if it is running.\n- Delete the app bundle:\n\n```\nrm -rf /Applications/TypeWhisper.app\n```\n\n- Delete app data and plugins:\n\n```\nrm -rf ~/Library/Application\\ Support/TypeWhisper\n```\n\n- Delete preferences:\n\n```\nrm -f ~/Library/Preferences/com.typewhisper.mac.plist\n```\n\n- Delete widget and app group data used by official releases:\n\n```\nrm -rf ~/Library/Group\\ Containers/2D8ALY3LCL.com.typewhisper.mac\n```\n\n- Remove TypeWhisper secrets from Keychain:\n- In Keychain Access, search for\n`com.typewhisper.mac.apikey`\n\nand delete matching items. - This includes API and plugin secrets stored under the\n`com.typewhisper.mac.apikey.*`\n\nservice prefix. - Also remove the license items stored under service\n`com.typewhisper.mac.apikey.license`\n\n, especially the`polar-license`\n\nand`polar-supporter`\n\naccounts.\n\n- In Keychain Access, search for\n- If you installed the CLI tool from Settings > Advanced, remove it too:\n\n```\nrm -f /usr/local/bin/typewhisper\n```\n\n- Optional: if you want to remove exported user files as well, delete:\n\n```\nrm -rf ~/Documents/TypeWhisper\\ Recordings\n```\n\n- Restart your Mac, then install the latest build again.\n\nIf a fresh install still crashes immediately after these steps, please open an issue and include your macOS version, how you installed TypeWhisper, and whether the crash happens on first launch or after granting permissions.\n\n- macOS 14.0 (Sonoma) or later\n- Apple Silicon (M1 or later) recommended\n- 8 GB RAM minimum, 16 GB+ recommended for larger models\n- Some features (Apple Translate, improved Settings UI) require macOS 15+. Apple Intelligence and SpeechAnalyzer require macOS 26+.\n\nTypeWhisper includes a bundled local Gemma 4 plugin powered by MLX for on-device prompt processing on Apple Silicon. In the current verified release path, Gemma 4 support is limited to the dense `E2B 4-bit`\n\nand `E4B 4-bit`\n\nvariants; larger or unverified variants stay visible in the UI but remain disabled until they are validated end to end.\n\n| RAM | Recommended Models |\n|---|---|\n| < 8 GB | Whisper Tiny, Whisper Base |\n| 8-16 GB | Whisper Small, Whisper Large v3 Turbo, Parakeet TDT v3, Voxtral Mini 4B |\n| > 16 GB | Whisper Large v3 |\n\n-\nClone the repository:\n\n```\ngit clone https://github.com/TypeWhisper/typewhisper-mac.git\ncd typewhisper-mac\n```\n\n-\nOpen in Xcode 16+:\n\n```\nopen TypeWhisper.xcodeproj\n```\n\n-\nSelect the TypeWhisper scheme and build (Cmd+B). Swift Package dependencies (WhisperKit, FluidAudio, Sparkle, TypeWhisperPluginSDK) resolve automatically.\n\n-\nRun the app. It appears as a menu bar icon - open Settings to download a model.\n\n-\nRun the automated checks before shipping changes:\n\n```\nxcodebuild test -project TypeWhisper.xcodeproj -scheme TypeWhisper -destination 'platform=macOS,arch=arm64' -parallel-testing-enabled NO CODE_SIGN_IDENTITY='-' CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO\nswift test --package-path TypeWhisperPluginSDK\n```\n\nThe HTTP API is an advanced local automation surface. It binds to `127.0.0.1`\n\nonly, is disabled by default, and is intended for local tools and scripts.\n\nEnable the API server in Settings > Advanced (default port: `8978`\n\n).\n\n```\ncurl http://localhost:8978/v1/status\n{\n  \"status\": \"ready\",\n  \"engine\": \"whisper\",\n  \"model\": \"openai_whisper-large-v3_turbo\",\n  \"supports_streaming\": true,\n  \"supports_translation\": true\n}\ncurl -X POST http://localhost:8978/v1/transcribe \\\n  -F \"file=@recording.wav\" \\\n  -F \"language=en\"\n\ncurl -X POST http://localhost:8978/v1/transcribe \\\n  -F \"file=@recording.wav\" \\\n  -F \"language_hint=de\" \\\n  -F \"language_hint=en\"\n{\n  \"text\": \"Hello, world!\",\n  \"language\": \"en\",\n  \"duration\": 2.5,\n  \"processing_time\": 0.8,\n  \"engine\": \"whisper\",\n  \"model\": \"openai_whisper-large-v3_turbo\"\n}\n```\n\nOptional parameters:\n\n`language`\n\n- ISO 639-1 code (e.g.,`en`\n\n,`de`\n\n). Omit for full auto-detection.`language_hint`\n\n- Repeatable, ordered language hint for restricted auto-detection. Hint-aware engines receive the full list; other engines use the first hint as the requested language. Do not combine with`language`\n\n.`task`\n\n-`transcribe`\n\n(default) or`translate`\n\n(translates to English, WhisperKit only).`target_language`\n\n- ISO 639-1 code for translation target language (e.g.,`es`\n\n,`fr`\n\n). Uses Apple Translate.`apply_corrections`\n\n- Boolean, default`true`\n\n. Set to`false`\n\nto return raw transcription text without Dictionary Corrections. For raw body uploads, send`x-apply-corrections: false`\n\n.\n\nUploads to `/v1/transcribe`\n\nare limited to 256 MiB, including stdin uploads from the CLI. Requests above that size return `413 Payload Too Large`\n\n. Local CLI file paths use a direct handoff to the running TypeWhisper app instead of uploading the file bytes.\n\n```\ncurl http://localhost:8978/v1/models\n{\n  \"models\": [\n    {\n      \"id\": \"openai_whisper-large-v3_turbo\",\n      \"engine\": \"whisper\",\n      \"ready\": true\n    }\n  ]\n}\n# Search history\ncurl \"http://localhost:8978/v1/history?q=meeting&limit=10&offset=0\"\n\n# Delete entry\ncurl -X DELETE \"http://localhost:8978/v1/history?id=<uuid>\"\n# List recognition terms\ncurl http://localhost:8978/v1/dictionary/terms\n\n# Merge terms, or set replace=true to replace all terms\ncurl -X PUT http://localhost:8978/v1/dictionary/terms \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"terms\":[\"TypeWhisper\",\"WhisperKit\"],\"replace\":false}'\n\n# Delete one term\ncurl -X DELETE http://localhost:8978/v1/dictionary/terms \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"term\":\"TypeWhisper\"}'\n\n# List post-transcription corrections\ncurl http://localhost:8978/v1/dictionary/corrections\n\n# Add or update one correction by original text\ncurl -X PUT http://localhost:8978/v1/dictionary/corrections \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"original\":\"teh\",\"replacement\":\"the\",\"caseSensitive\":false}'\n\n# Delete one correction\ncurl -X DELETE http://localhost:8978/v1/dictionary/corrections \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"original\":\"teh\"}'\n# List all workflow-backed rules\ncurl http://localhost:8978/v1/rules\n\n# Toggle a workflow-backed rule on/off\ncurl -X PUT \"http://localhost:8978/v1/rules/toggle?id=<uuid>\"\n# Start dictation (returns session id)\ncurl -X POST http://localhost:8978/v1/dictation/start\n\n# Stop dictation (returns same session id)\ncurl -X POST http://localhost:8978/v1/dictation/stop\n\n# Check whether dictation is currently recording\ncurl http://localhost:8978/v1/dictation/status\n\n# Fetch status/result for a specific dictation session\ncurl \"http://localhost:8978/v1/dictation/transcription?id=<uuid>\"\n```\n\nDictation control records microphone audio for system-wide insertion. A completed dictation session returns text that TypeWhisper can paste back into the active app.\n\nRecorder control uses the same recorder path as the TypeWhisper UI, including microphone capture, optional system audio capture, mixing, finalization, and final transcription. Use it for automations that need a saved recording file or meeting/system-audio transcription without auto-pasting into another app.\n\n```\n# Start recorder with microphone and system audio\ncurl -X POST \"http://localhost:8978/v1/recorder/start?mic=true&system_audio=true\"\n\n# Stop the active API recorder session\ncurl -X POST http://localhost:8978/v1/recorder/stop\n\n# Check whether the recorder is currently recording\ncurl http://localhost:8978/v1/recorder/status\n\n# Fetch status/result for a specific recorder session\ncurl \"http://localhost:8978/v1/recorder/session?id=<uuid>\"\n```\n\n`POST /v1/recorder/start`\n\naccepts optional query flags:\n\n`mic`\n\n-`true`\n\n,`false`\n\n,`1`\n\n, or`0`\n\n. If omitted, TypeWhisper uses the current recorder microphone setting.`system_audio`\n\n-`true`\n\n,`false`\n\n,`1`\n\n, or`0`\n\n. If omitted, TypeWhisper uses the current recorder system-audio setting.\n\nAt least one source must be enabled. If both resolved sources are disabled, the API returns `400 Bad Request`\n\n.\n\nStart response:\n\n```\n{\n  \"id\": \"8F8C1F45-6D03-44D2-A38C-0C4DE4F7E5F7\",\n  \"status\": \"recording\"\n}\n```\n\nStop response:\n\n```\n{\n  \"id\": \"8F8C1F45-6D03-44D2-A38C-0C4DE4F7E5F7\",\n  \"status\": \"finalizing\"\n}\n```\n\nStatus response:\n\n```\n{\n  \"recording\": true\n}\n```\n\nSession response:\n\n```\n{\n  \"id\": \"8F8C1F45-6D03-44D2-A38C-0C4DE4F7E5F7\",\n  \"status\": \"completed\",\n  \"text\": \"Meeting notes from the recording.\",\n  \"output_file\": \"/Users/alex/Documents/TypeWhisper Recordings/Recording 2026-05-20 14-30-00.m4a\"\n}\n```\n\nRecorder sessions move through `recording -> finalizing -> completed`\n\nor `failed`\n\n. If recorder transcription is disabled or produces no transcript, `text`\n\nis omitted and `output_file`\n\nstill points to the finalized recording when available. Failed sessions include an `error`\n\nfield.\n\nConflict and lookup behavior:\n\n- Starting while the recorder is already recording or finalizing returns\n`409 Conflict`\n\n. - Stopping without an active API recorder session returns\n`409 Conflict`\n\n. - Polling with a missing or invalid\n`id`\n\nreturns`400 Bad Request`\n\n. - Polling a valid but unknown session id returns\n`404 Not Found`\n\n.\n\nTypeWhisper includes a command-line tool for shell-friendly transcription. It is part of the advanced automation surface and connects to the running local API server.\n\nInstall via Settings > Advanced > CLI Tool > Install. This places the `typewhisper`\n\nbinary in `/usr/local/bin`\n\n.\n\n```\ntypewhisper status              # Show server status\ntypewhisper models              # List available models\ntypewhisper transcribe file.wav # Transcribe an audio file\n```\n\n| Option | Description |\n|---|---|\n`--port <N>` |\nServer port (default: auto-detect) |\n`--json` |\nOutput as JSON |\n`--language <code>` |\nSource language (e.g. `en` , `de` ) |\n`--language-hint <code>` |\nRepeatable, ordered language hint for restricted auto-detection; engines without hint support use the first hint |\n`--task <task>` |\n`transcribe` (default) or `translate` |\n`--translate-to <code>` |\nTarget language for translation |\n`--no-corrections` |\nReturn raw transcription text without Dictionary Corrections |\n\n```\n# Transcribe with language and JSON output\ntypewhisper transcribe recording.wav --language de --json\n\n# Restrict auto-detection to a shortlist\ntypewhisper transcribe recording.wav --language-hint de --language-hint en\n\n# Pipe audio from stdin\ncat audio.wav | typewhisper transcribe -\n\n# Use in a script\ntypewhisper transcribe meeting.m4a --json | jq -r '.text'\n```\n\nThe CLI requires the API server to be running (Settings > Advanced) and follows the documented command and flag surface for the current stable release.\n\nDictionary Corrections apply to CLI transcriptions by default. Use `--no-corrections`\n\nwhen a script needs the raw engine output.\n\nLocal file paths are handed to the running TypeWhisper app directly, so large files do not need to fit inside an HTTP upload body. Stdin usage (`typewhisper transcribe -`\n\n) still uses the regular `/v1/transcribe`\n\nupload endpoint and is limited to 256 MiB.\n\nWorkflows let you configure transcription, transformation, and automation behavior per application, website, combined app + website context, hotkey, global fallback, or manual palette-only workflow. For example:\n\n**Mail**- German language, Whisper Large v3** Slack**- English language, Parakeet TDT v3** Terminal**- English language, auto-submit enabled** github.com**- English cleanup workflow that matches in any browser** docs.google.com**- German dictation workflow that translates to English\n\nCreate workflows in Settings > Workflows. Choose a template, then use Automatic to enable app, website, hotkey, or any combination of those trigger components. Always stays the global fallback, and Manual keeps the workflow palette-only. Hotkey workflows choose whether the shortcut starts dictation or processes the current selection/clipboard through the same insertion path as the Workflow Palette. Spoken language can be left on full auto-detect, fixed to one exact language, or restricted to a shortlist of likely languages for better detection accuracy. Website patterns support subdomain matching - e.g. `google.com`\n\nalso matches `docs.google.com`\n\n.\n\nLLM Prompt workflows inherit the ordered global LLM fallback list shown at the top of Settings > Workflows. TypeWhisper moves to the next provider/model when an inherited attempt is unavailable, cannot restore, is rate-limited, hits a network or API error, or returns no text. Selecting a provider inside a workflow disables that fallback behavior for the workflow and makes one strict provider call instead.\n\nWhen you start dictating, TypeWhisper matches the active app and browser URL against enabled workflows with the following priority:\n\n**App + URL match**- highest specificity (e.g. Chrome + github.com)** URL-only match**- cross-browser workflows (e.g. github.com in any browser)** App-only match**- generic app workflows (e.g. all of Chrome)** Always fallback**- global workflow when no more specific workflow matches\n\nHotkeys are direct workflow shortcuts, not context conditions in the app/URL matching order. Manual workflows are excluded from automatic dictation matching. They appear only in the Workflow Palette and use the existing Workflow Palette hotkey.\n\nThe active workflow name is shown as a badge in the indicator, together with a short explanation of why it matched.\n\nMultiple engines can be loaded simultaneously during a session for instant switching between workflows. Note that loading multiple local models increases memory usage. Set `Auto-unload model`\n\nto `Never`\n\nif you want TypeWhisper to restore previously loaded local models at launch; any active auto-unload policy keeps startup lazy and reloads the selected/downloaded model on first real use. Cloud engines (Groq, OpenAI, xAI/Grok) have negligible memory overhead.\n\nTypeWhisper supports plugins for adding custom LLM providers, transcription engines, TTS providers, post-processors, and action plugins. Plugins are macOS `.bundle`\n\nfiles placed in `~/Library/Application Support/TypeWhisper/Plugins/`\n\n.\n\nBundled engines and integrations (WhisperKit, Parakeet, SpeechAnalyzer, Granite, Qwen3, Voxtral, Supertonic, Groq, OpenAI, xAI/Grok, OpenAI Compatible, Gemini, Linear, Webhook, and more) are implemented as plugins and serve as reference implementations.\n\nSee [TypeWhisperPluginSDK/Plugins/README.md](/TypeWhisper/typewhisper-mac/blob/main/TypeWhisperPluginSDK/Plugins/README.md) for the full plugin development guide, including the event bus, host services API, and manifest format.\n\n```\nTypeWhisper/\n├── typewhisper-cli/           # Command-line tool (status, models, transcribe)\n├── PluginRegistry/            # Source registry entries for community plugin feeds\n├── Plugins/                # Redirect docs and legacy entrypoint for moved first-party plugin sources\n├── TypeWhisperPluginSDK/   # Plugin SDK (Swift package)\n│   ├── Plugins/            # First-party plugin sources and manifests\n├── TypeWhisperWidgetExtension/ # WidgetKit widgets (stats, activity, history)\n├── TypeWhisperWidgetShared/    # Shared widget data models\n├── App/                    # App entry point, dependency injection\n├── Models/                 # Data models (TranscriptionResult, Profile, PromptAction, etc.)\n├── Services/\n│   ├── Cloud/              # KeychainService, WavEncoder (shared cloud utilities)\n│   ├── LLM/               # Apple Intelligence provider (cloud LLM providers are plugins)\n│   ├── HTTPServer/         # Local REST API (HTTPServer, APIRouter, APIHandlers)\n│   ├── ModelManagerService # Transcription dispatch (delegates to plugins)\n│   ├── AudioRecordingService\n│   ├── AudioFileService    # Audio/video - 16kHz PCM conversion\n│   ├── HotkeyService\n│   ├── TextInsertionService\n│   ├── WorkflowService     # Workflow matching and persistence\n│   ├── HistoryService      # Transcription history persistence (SwiftData)\n│   ├── DictionaryService   # Custom term corrections\n│   ├── SnippetService      # Text snippets with placeholders\n│   ├── PromptActionService # Prompt action persistence (SwiftData)\n│   ├── PromptProcessingService # LLM orchestration for prompt execution\n│   ├── PluginManager       # Plugin discovery, loading, and lifecycle\n│   ├── PluginRegistryService # Plugin marketplace (download, install, update)\n│   ├── PostProcessingPipeline # Priority-based text processing chain\n│   ├── EventBus            # Typed publish/subscribe event system\n│   ├── TranslationService  # On-device translation via Apple Translate\n│   ├── SubtitleExporter    # SRT/VTT export\n│   └── SoundService        # Audio feedback for recording events\n├── ViewModels/             # MVVM view models with Combine\n├── Views/                  # SwiftUI views\n└── Resources/              # Info.plist, entitlements, localization, sounds\n```\n\n**Patterns:** MVVM with `ServiceContainer`\n\nsingleton for dependency injection. ViewModels use a static `_shared`\n\npattern. Localization via `String(localized:)`\n\nwith `Localizable.xcstrings`\n\n.\n\nGPLv3 - see [LICENSE](/TypeWhisper/typewhisper-mac/blob/main/LICENSE) for details. Commercial licensing available - see [LICENSE-COMMERCIAL.md](/TypeWhisper/typewhisper-mac/blob/main/LICENSE-COMMERCIAL.md).", "url": "https://wpnews.pro/news/typewhisper-open-source-dictation-and-workflows-for-macos-and-windows", "canonical_source": "https://github.com/TypeWhisper/typewhisper-mac", "published_at": "2026-07-15 06:17:13+00:00", "updated_at": "2026-07-15 06:47:50.195621+00:00", "lang": "en", "topics": ["artificial-intelligence", "developer-tools"], "entities": ["TypeWhisper", "Groq", "OpenAI", "xAI", "Grok", "Mistral AI", "Cartesia", "Soniox"], "alternates": {"html": "https://wpnews.pro/news/typewhisper-open-source-dictation-and-workflows-for-macos-and-windows", "markdown": "https://wpnews.pro/news/typewhisper-open-source-dictation-and-workflows-for-macos-and-windows.md", "text": "https://wpnews.pro/news/typewhisper-open-source-dictation-and-workflows-for-macos-and-windows.txt", "jsonld": "https://wpnews.pro/news/typewhisper-open-source-dictation-and-workflows-for-macos-and-windows.jsonld"}}