{"id":49290442,"url":"https://github.com/forjd/muesli","last_synced_at":"2026-04-26T00:01:29.079Z","repository":{"id":353858048,"uuid":"1221141492","full_name":"forjd/muesli","owner":"forjd","description":"Native macOS voice-to-text app using SwiftUI, FluidAudio, and NVIDIA Parakeet","archived":false,"fork":false,"pushed_at":"2026-04-25T22:30:56.000Z","size":6435,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T23:31:54.171Z","etag":null,"topics":["dictation","fluidaudio","local-first","macos","nvidia-parakeet","speech-to-text","swift","swiftui","transcription","voice-to-text"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/forjd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"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}},"created_at":"2026-04-25T20:05:51.000Z","updated_at":"2026-04-25T22:31:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/forjd/muesli","commit_stats":null,"previous_names":["forjd/muesli"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/forjd/muesli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forjd%2Fmuesli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forjd%2Fmuesli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forjd%2Fmuesli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forjd%2Fmuesli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/forjd","download_url":"https://codeload.github.com/forjd/muesli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forjd%2Fmuesli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32280981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"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","fluidaudio","local-first","macos","nvidia-parakeet","speech-to-text","swift","swiftui","transcription","voice-to-text"],"created_at":"2026-04-26T00:01:28.195Z","updated_at":"2026-04-26T00:01:29.069Z","avatar_url":"https://github.com/forjd.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Muesli\n\nMuesli is a native macOS voice-to-text app built with SwiftUI. It records audio,\ntranscribes it locally with NVIDIA Parakeet through\n[FluidAudio](https://github.com/FluidInference/FluidAudio), and can paste a\nfinished dictation back into the app you were using.\n\nThe app is intentionally local-first: recordings stay on disk, transcription runs\non-device, and FluidAudio caches the Parakeet Core ML model artifacts after the\nfirst load.\n\n## Features\n\n- Local Parakeet transcription through FluidAudio.\n- Model picker for Parakeet TDT 0.6B v3 and v2.\n- Live recording view with level meter and stabilized partial transcript.\n- Saved recording history with transcript editing.\n- One-shot global dictation using `Command-Shift-D`.\n- Export transcripts as plain text, JSON, or SRT.\n- Benchmark action for comparing model speed on a recording.\n- Development launcher that creates a stable local signing identity so macOS\n  permissions survive rebuilds.\n\n## Requirements\n\n- macOS 14 or newer.\n- Xcode command line tools or Xcode with Swift 5.9 support.\n- Microphone permission for recording.\n- Accessibility permission for global dictation paste.\n- Network access on first model use so FluidAudio can download model artifacts.\n\n## Quick Start\n\n```bash\ngit clone https://github.com/forjd/muesli.git\ncd muesli\n./script/build_and_run.sh\n```\n\nThe first launch may take longer because Swift Package Manager resolves\nFluidAudio and FluidAudio downloads the selected Parakeet model. Later launches\nreuse the cached build and model files.\n\n## Installing Release Builds\n\nRelease archives are signed but not notarized yet. If macOS blocks a downloaded\nrelease build, remove the quarantine attribute after unzipping it:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/Muesli.app\nopen /Applications/Muesli.app\n```\n\nAdjust the path if you run Muesli from somewhere other than `/Applications`.\nThis only bypasses the Gatekeeper quarantine warning; Microphone and\nAccessibility permissions still need to be granted in System Settings.\n\n## Permissions\n\nMuesli needs two macOS permissions:\n\n- **Microphone**: required to record audio.\n- **Accessibility**: required for the `Command-Shift-D` dictation workflow to\n  paste text into the app that was active when recording started.\n\nFor Accessibility, add this app bundle:\n\n```text\n/path/to/muesli/dist/Muesli.app\n```\n\nThe development launcher signs the app with a local project-specific signing\nidentity. If you previously granted Accessibility to an older build, remove it\nfrom System Settings and add the current `dist/Muesli.app` once.\n\n## Usage\n\nRun the app:\n\n```bash\n./script/build_and_run.sh\n```\n\nUse the main window to record, transcribe, benchmark, export, copy, delete, and\nedit transcripts.\n\nUse global dictation:\n\n1. Click into a text field in another app.\n2. Press `Command-Shift-D` to start recording.\n3. Speak.\n4. Press `Command-Shift-D` again to stop, transcribe, and paste.\n\n## Development\n\nBuild without launching:\n\n```bash\nswift build\n```\n\nLaunch with app logs:\n\n```bash\n./script/build_and_run.sh --logs\n```\n\nLaunch with focused Muesli telemetry:\n\n```bash\n./script/build_and_run.sh --telemetry\n```\n\nVerify that the app can build, sign, and launch:\n\n```bash\n./script/build_and_run.sh --verify\n```\n\nRun focused logic tests:\n\n```bash\nswift run MuesliTests\n```\n\nGitHub Actions also runs `swift build` and `swift run MuesliTests` on pushes,\npull requests, and manual CI workflow dispatches.\n\n## Packaging\n\nCreate a release app bundle and zip archive:\n\n```bash\n./script/package_release.sh\n```\n\nThe script writes artifacts to `dist/release/`, verifies the app signature, and\ngenerates release notes. Set `MUESLI_VERSION` to override the default release\nversion, and set `MUESLI_CODESIGN_IDENTITY` to sign with a distribution identity.\n\nIn GitHub Actions, archives use ad-hoc signing unless\n`MUESLI_CODESIGN_IDENTITY` is configured. Local builds without\n`MUESLI_CODESIGN_IDENTITY` use Muesli's local development identity. Archives are\nnot notarized yet.\n\n## GitHub Releases\n\nReleases are automated from Conventional Commits with\n[release-please](https://github.com/googleapis/release-please-action).\n\nThe normal release flow is:\n\n1. Merge feature and fix commits into `main` using Conventional Commit messages.\n2. GitHub Actions opens or updates a release PR that bumps `version.txt` and\n   updates `CHANGELOG.md`.\n3. Merge the release PR when ready.\n4. GitHub Actions creates the GitHub release, builds the signed macOS archive,\n   and uploads the zip plus SHA-256 file to the release.\n\nYou can also run the `Release` workflow manually from GitHub Actions with a\nversion number. Manual runs can build artifacts only or publish a release for the\ncurrent commit.\n\n## Model Cache\n\nFluidAudio manages the Parakeet model cache. Muesli checks whether the selected\nmodel is already cached and shows the difference between downloading model files\nand loading cached files.\n\nIf you switch models, the new model may need to download once. After that,\ntranscription should warm from the local cache.\n\n## Project Structure\n\n```text\nSources/Muesli/App/              App entry point and global hotkey wiring\nSources/Muesli/Models/           Recording, transcript, benchmark models\nSources/Muesli/Services/         Audio recording, Parakeet, transcript helpers\nSources/Muesli/Stores/           App state, persistence, exports, paste flow\nSources/Muesli/Views/            SwiftUI interface\nResources/Muesli.icns            App icon used by the local app bundle\nlogo.icon/                       Source icon package\nlogo Exports/                    Exported PNG source artwork\nscript/build_and_run.sh          Build, sign, launch, and telemetry helper\nscript/package_release.sh        Release app bundle and zip archive helper\n```\n\n## Notes\n\nMuesli is currently a developer-oriented macOS app. Release archives can be\ncreated locally, but they are not notarized unless you provide your own Apple\nDeveloper signing and notarization workflow. The local scripts create\ndevelopment signing material under `.dev-certs/`, which is ignored by Git.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforjd%2Fmuesli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fforjd%2Fmuesli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforjd%2Fmuesli/lists"}