{"id":47796070,"url":"https://github.com/typewhisper/typewhisper-ios","last_synced_at":"2026-04-15T12:01:08.622Z","repository":{"id":339083345,"uuid":"1158190115","full_name":"TypeWhisper/typewhisper-ios","owner":"TypeWhisper","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-15T10:10:50.000Z","size":334,"stargazers_count":15,"open_issues_count":7,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-15T11:29:56.331Z","etag":null,"topics":["dictation","ios","ipad","iphone","on-device","privacy","speech-to-text","swift","transcription","whisper"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TypeWhisper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"seofood","ko_fi":"seofood"}},"created_at":"2026-02-14T23:56:57.000Z","updated_at":"2026-04-15T10:10:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"a633a0aa-9afe-4528-b489-9031caa076b7","html_url":"https://github.com/TypeWhisper/typewhisper-ios","commit_stats":null,"previous_names":["typewhisper/typewhisper-ios"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/TypeWhisper/typewhisper-ios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TypeWhisper%2Ftypewhisper-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TypeWhisper%2Ftypewhisper-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TypeWhisper%2Ftypewhisper-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TypeWhisper%2Ftypewhisper-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TypeWhisper","download_url":"https://codeload.github.com/TypeWhisper/typewhisper-ios/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TypeWhisper%2Ftypewhisper-ios/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31840113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T11:29:19.690Z","status":"ssl_error","status_checked_at":"2026-04-15T11:29:19.171Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dictation","ios","ipad","iphone","on-device","privacy","speech-to-text","swift","transcription","whisper"],"created_at":"2026-04-03T16:23:29.480Z","updated_at":"2026-04-15T12:01:08.615Z","avatar_url":"https://github.com/TypeWhisper.png","language":"Swift","funding_links":["https://github.com/sponsors/seofood","https://ko-fi.com/seofood"],"categories":[],"sub_categories":[],"readme":"# TypeWhisper for iOS\n\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![iOS](https://img.shields.io/badge/iOS-18.0%2B-black.svg)](https://www.apple.com/ios/)\n[![Swift](https://img.shields.io/badge/Swift-6-orange.svg)](https://swift.org)\n\nSpeech-to-text for iPhone. Transcribe audio using on-device AI models (WhisperKit, Apple Speech). Includes a custom keyboard with voice input - dictate directly into any app without switching.\n\n## Features\n\n### Custom Keyboard\n\n- **Voice input in any app** - Tap the mic on the TypeWhisper keyboard to dictate text directly into any text field. No app switching needed\n- **Flow mode** - The main app records audio in the background while the keyboard captures your speech and inserts the transcription\n- **Multi-language layout** - Full keyboard with English, German, Spanish, French, and Italian layouts\n- **Long-press characters** - Hold keys to access alternative characters and accents\n- **Profile switching** - Quickly switch between language and translation profiles from the keyboard\n- **Translation** - Translate dictated text on-device using Apple Translate before inserting\n- **Snippet expansion** - Text shortcuts with dynamic placeholders (`{{DATE}}`, `{{TIME}}`, `{{CLIPBOARD}}`)\n\n### Main App\n\n- **On-device transcription** - All processing happens locally on your iPhone\n- **Two AI engines** - WhisperKit (99+ languages, streaming, translation) and Apple Speech (fast, no model download needed)\n- **Streaming preview** - See partial transcription in real-time while speaking\n- **Translation** - Translate transcriptions on-device using Apple Translate (20+ languages)\n- **File transcription** - Transcribe pre-recorded audio files\n- **Whisper mode** - Boosted microphone gain for quiet speech\n- **Sound feedback** - Audio cues for recording start, transcription success, and errors\n\n### Profiles\n\n- **Per-context settings** - Save language, translation target, engine, and whisper mode per profile\n- **Quick switching** - Activate profiles from the keyboard or main app\n- **Synced to keyboard** - Profile changes in the main app are automatically available in the keyboard\n\n### Dictionary \u0026 Snippets\n\n- **Terms** - Help Whisper recognize technical and proper nouns\n- **Corrections** - Automatic post-transcription find-and-replace for common mistakes\n- **Snippets** - Text shortcuts with triggers like `thanks` expanding to a full signature. Supports `{{DATE:yyyy-MM-dd}}`, `{{TIME:HH:mm}}`, `{{DATETIME}}`, and `{{CLIPBOARD}}` placeholders\n\n### History\n\n- **Searchable history** - All transcriptions saved with timestamp, word count, duration, and engine used\n- **Raw vs final text** - View both original and post-processed transcription\n- **Auto-purge** - Records older than 90 days are automatically removed\n\n## System Requirements\n\n- iOS 18.0 or later\n- iPhone with Apple Silicon (A-series) recommended for WhisperKit\n- Keyboard requires Full Access for voice input\n\n## Model Recommendations\n\n| Device | Recommended Models |\n|--------|-------------------|\n| Older iPhones | Whisper Tiny, Whisper Base, Apple Speech |\n| iPhone 15+ | Whisper Small, Whisper Large v3 Turbo |\n\n## Build\n\n1. Clone the repository:\n   ```bash\n   git clone https://github.com/TypeWhisper/typewhisper-ios.git\n   cd typewhisper-ios\n   ```\n\n2. Generate the Xcode project:\n   ```bash\n   brew install xcodegen  # if not installed\n   xcodegen generate\n   ```\n\n3. Open in Xcode 16+:\n   ```bash\n   open TypeWhisper.xcodeproj\n   ```\n\n4. Select the `typewhisper-ios` scheme and build (Cmd+B). Swift Package dependencies (WhisperKit) resolve automatically.\n\n5. Run on a device or simulator. Go to Settings \u003e Models to download a transcription model.\n\n## Releases / Sideloading\n\n- Official GitHub releases are triggered by pushing a tag in the `vX.Y.Z` format, for example `v0.2.8`\n- Each release publishes a signed `.ipa` asset for AltStore and Sideloadly\n- The release `.ipa` is intended for sideloading and is separate from the App Store Connect upload flow\n\n### Keyboard Setup\n\n1. Open **Settings \u003e General \u003e Keyboard \u003e Keyboards \u003e Add New Keyboard**\n2. Select **TypeWhisper**\n3. Tap **TypeWhisper** again and enable **Allow Full Access** (required for voice input)\n4. Switch to the TypeWhisper keyboard in any text field using the globe key\n\n## Architecture\n\n```\nTypeWhisper/\n├── App/                    # App entry point, dependency injection\n├── Models/                 # SwiftData models (Profile, TranscriptionRecord, Snippet, DictionaryEntry)\n├── Services/\n│   ├── Engine/             # WhisperEngine, AppleSpeechEngine, TranscriptionEngine protocol\n│   ├── ModelManagerService # Model download, loading, transcription dispatch\n│   ├── AudioRecordingService\n│   ├── FlowSessionManager  # Background recording for keyboard Flow mode\n│   ├── ProfileService      # Profile persistence and keyboard sync\n│   ├── HistoryService      # Transcription history (SwiftData)\n│   ├── DictionaryService   # Terms and corrections\n│   ├── SnippetService      # Text shortcuts with placeholders\n│   └── TranslationService  # On-device translation via Apple Translate\n├── ViewModels/             # MVVM view models\n└── Views/                  # SwiftUI views\n\nTypeWhisperKeyboard/\n├── KeyboardViewController  # UIInputViewController entry point\n├── KeyboardViewModel       # Keyboard state machine\n├── Views/                  # Keyboard layout, profile selector, long-press popups\n├── Services/               # Audio service for Flow recording\n└── Models/                 # Key definitions, alternative characters\n\nShared/                     # Constants, DTOs shared between app and keyboard\n```\n\n**Patterns:** MVVM with `ServiceContainer` for dependency injection. App and keyboard communicate via App Group (`group.com.typewhisper.shared`) using UserDefaults and JSON files. Swift 6 strict concurrency throughout.\n\n## License\n\nGPLv3 - see [LICENSE](LICENSE) for details. Commercial licensing available - see [LICENSE-COMMERCIAL.md](LICENSE-COMMERCIAL.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypewhisper%2Ftypewhisper-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftypewhisper%2Ftypewhisper-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftypewhisper%2Ftypewhisper-ios/lists"}