Skip to content
CAI
Software that uses CAICheck a score

digimata/parrot

65.5

Adequate · 1 October 2026

8.2k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Parrot is a macOS-native dictation application that converts speech to text using local, on-device AI models. It features a push-to-talk interface with intelligent text injection, multilingual support, and a customizable settings UI. The system includes a command-line interface for configuration and a benchmarking tool for measuring latency and accuracy.

Features

Automated macOS build, signing, and notarization pipeline

New shell and Swift scripts in the \scripts/\ directory now automate the creation of a signed \Parrot.app\, a notarized DMG installer, and the Sparkle update archive. The \build-app.sh\ script assembles the app bundle, embeds the Sparkle framework, and applies hardened runtime codesigning to ensure permissions persist across builds. The \dev-install.sh\ script streamlines local testing by building, signing, and installing the app to \/Applications\ (or \\~/Applications\), while also linking the executable to \/usr/local/bin/parrot\. The \make-dmg.sh\ script handles the final packaging, including notarization via \notarytool\ and stapling, producing a distribution-ready DMG and a zipped update archive for in-app updates.

scripts · high confidence

New Settings UI with live model switching and language configuration

The application introduces a new Settings interface featuring a Hotkey row for push-to-talk configuration and a Transcription section that allows users to switch between transcription models in real-time, with visual indicators for download status and model trade-offs (speed vs. accuracy). This section also includes a language picker that lets users select specific spoken languages for multilingual models or rely on automatic detection based on the system's preferred languages, alongside a button to manage the list of languages the system trusts for automatic detection.

Sources/ParrotCore/UI/Sections · high confidence

New landing page and terminal installer for Parrot

The site now serves a new landing page at perroquet.xyz, featuring a minimalist design, Open Graph metadata for link previews, and Vercel Web Analytics for privacy-friendly page view tracking. Additionally, a new shell script installer (install.sh) is provided for macOS users, which automates downloading the latest release from GitHub, verifying its SHA-256 checksum, installing the app to /Applications, and linking the parrot command to /usr/local/bin.

site · high confidence

New menu bar, onboarding, settings, and recording overlay UI

Parrot now provides a complete user interface for configuration and interaction. A new menu bar controller displays recording status, the loaded model, and provides access to Settings, permissions, and updates. A one-page onboarding window guides first-time users through hotkey selection, language preferences, and required macOS permissions before dictation begins. The Settings window allows users to manage the hotkey, configure transcription languages, and reset to defaults, with a new option to launch the app at login. Additionally, a floating recording overlay pill appears at the bottom of the screen to show real-time audio levels and transcribing status, replacing the previous spinner.

Sources/ParrotCore/UI · high confidence

New parrot-bench tool for measuring microphone and transcription latency

A new command-line benchmark tool, parrot-bench, is available to measure performance metrics for the dictation system. The tool includes a 'capture' subcommand that times the press-to-first-sample latency for microphone input (both cold and warm starts) and verifies that the audio device is not running between captures. It also includes a 'transcription' subcommand that times the WhisperKit model over local audio recordings, reporting median and p90 latencies for each stage, word error rates, and first-word recall. The benchmark supports configurable options for model selection, compute units (ANE, GPU, CPU), silence trimming, padding, and language detection constraints.

Sources/parrot-bench · high confidence

Removals

Removal of WhisperKit-based transcription implementation

The WhisperKit-based transcription engine has been removed from the application. The \Transcriber\ protocol and the \WhisperKitTranscriber\ actor, which handled model loading, warm-up, and audio transcription via the WhisperKit library, are no longer present in the codebase.

Sources/parrot/Transcription · high confidence

Removed legacy hotkey monitoring and text injection components

The \HotkeyMonitor\ and \TextInjector\ classes have been removed from the \Sources/parrot/Input\ directory. This eliminates the previous implementation that relied on \CGEvent.tapCreate\ for detecting modifier key presses and \CGEvent\ synthesis for injecting text, which required explicit Accessibility permission prompts and had limitations with certain applications. Users will no longer interact with these specific low-level input mechanisms.

Sources/parrot/Input · high confidence

Architecture

ParrotCore library extracted and app launch flow restructured

The application logic has been reorganized into a dedicated ParrotCore library, separating the core functionality from the executable entry point. The app launch process now distinguishes between menu-bar app and CLI roles, handling symlink resolution, single-instance locking, and migration from legacy LaunchAgents. A new DictationController manages the dictation loop, while supporting components like ModelSwitcher, Onboarding, and Permissions are integrated into the startup sequence.

Sources/ParrotCore · high confidence

Behavioural changes

Configures macOS app packaging with Sparkle auto-updates and audio entitlements

The packaging directory now includes the necessary configuration files to build a signed and notarized macOS application. An Info.plist defines the app identity (com.humanitas.parrot), sets the minimum system version to macOS 14.0, and configures the Sparkle framework for automatic daily update checks with a signed feed. Additionally, a Parrot.entitlements file grants the app permission to access the microphone, which is required for the dictation feature described in the usage description.

packaging · high confidence

Default transcription model changed to Whisper Base (English)

The application now defaults to the 'Whisper Base (English)' model for transcription instead of the previous 'large-v3-turbo' model. This change reduces the initial download size from approximately 1.6GB to 145MB, making the app lighter out-of-the-box while still offering access to larger models like 'Whisper Large v3 Turbo' and 'Whisper Small (English)' via the registry. Additionally, the model registry has been refactored to embed model definitions directly in source code rather than loading them from an external JSON resource bundle, ensuring the binary remains self-contained.

Sources/parrot/Models · high confidence

Dictionary format changes from JSON to plain-text table

The custom dictionary now uses a plain-text table format instead of the previous JSON file, allowing users to edit spellings and replacements directly. A one-time migration converts existing \dictionary.json\ files to the new format, and the app automatically reloads the dictionary when the file changes without requiring a restart.

Sources/ParrotCore/Dictionary · high confidence

Intelligent dictation delivery with focus-aware security and spacing

The dictation input system now intelligently manages how transcripts are delivered to the active application. It automatically adds trailing spaces to all transcripts and inserts leading spaces only when the preceding character requires it, preventing words from running together. The system now checks keyboard focus at the start and end of dictation: if a secure field (like a password input) is focused, the transcript is discarded to protect privacy; if focus changes during recording, the transcript is copied to the clipboard instead of being injected. Additionally, the push-to-talk hotkey is now configurable via settings, allowing users to choose from various modifier keys, and the system handles hotkey tap recovery more robustly to maintain functionality even when macOS disables the event tap.

Sources/ParrotCore/Input · high confidence

Multilingual transcription with language detection and model switching

The transcription engine now supports multilingual models (e.g., Whisper Small/Multilingual) alongside English-only ones, allowing users to switch models live via settings. Language detection is restricted to the user's spoken languages (configured in settings or derived from system preferences) to prevent misidentification of similar languages. The pipeline includes silence trimming and 0.3s padding, decodes without timestamps for short audio, and logs detailed timing breakdowns for preprocessing, detection, encoding, and decoding.

Sources/ParrotCore/Transcription · high confidence

New audio capture pipeline with format conversion and silence trimming

The audio capture subsystem has been rewritten to provide a more robust and efficient recording experience. The new \AudioCapture\ class manages the microphone lifecycle, automatically converting incoming audio to a standardized 16 kHz mono Float32 format via a \ConverterCache\, which handles dynamic sample rate changes mid-recording without discarding data. The system now defaults to using a Core Audio AUHAL input unit (\HALInput\) for lower latency and better device change handling, while still supporting the legacy \AVAudioEngine\ path. Additionally, a \SilenceTrimmer\ is applied to recordings to remove leading and trailing silence, improving transcription accuracy by reducing the likelihood of hallucinations on quiet tails. The capture process now includes detailed logging of timing metrics (press-to-first-sample, first sound) and handles microphone permission requests more gracefully, ensuring users are prompted only when necessary.

Sources/ParrotCore/Audio · high confidence

Parrot CLI restructured with new daemon options and injection modes

The parrot command-line interface has been refactored to support new runtime configurations and improved text injection. Users can now specify the text injection method via the --inject-mode flag, choosing between 'paste' (the new default, which preserves clipboard state) and 'type-unicode'. Audio capture is configurable via --capture, allowing selection between 'standard' and 'hal' modes. Additional debugging and inspection capabilities include --dump-wav to save raw audio to \~/Library/Caches/parrot/last-capture.wav, --no-overlay to disable the recording indicator, and --debug-hotkey to log modifier key events. The CLI also introduces an --install command to manage launch-at-login settings and CLI symlinks, replacing the previous manual setup process.

Sources/parrot · high confidence

Standardized file paths and centralized logging

The application now manages its configuration, logs, and data in standardized locations: user settings and the dictionary are stored in \~/.config/parrot, while model weights and logs reside in \~/Library/Application Support/parrot and \~/Library/Logs/parrot respectively. A new centralized logging system routes diagnostic output to stderr (and disk when running as a background service), and the dictionary format has migrated from JSON to a plain-text table, with automatic migration support for legacy JSON files.

Sources/ParrotCore/Support · high confidence

Test coverage

Added test coverage for audio capture, delivery, dictionary, and input handling; Added unit tests for benchmarking utilities and transcription metrics.

Dependencies

Dependency updates and package restructuring

The project has updated its dependencies, replacing the WhisperKit package with argmax-oss-swift version 1.1.0 to fix issues with empty prompt tokens, and added Sparkle version 2.10.0 for in-app updates. Additionally, the package structure has been refactored to split the code into a ParrotCore library and a thin parrot executable, with benchmarks moved to a separate parrot-bench target.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 53 → 65 (+12.8)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 96 → 96 (+0.3)
  • Architecture 69 → 98 (+28.6)
  • Maturity 62 → 64 (+2.5)
  • Readiness 34 → 55 (+20.9)
  • Security 67 → 75 (+8.3)

Resolved (12)

  • Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Hotspot: Sources/parrot/Parrot.swift (Sources/parrot/Parrot.swift)
  • MethodTooLong: Run.run (Sources/parrot/Parrot.swift)
  • No ADRs found
  • No artifact signing
  • No automated tests
  • No tests found
  • Run.run (cognitive 33) (Sources/parrot/Parrot.swift)
  • Run.run (cyclomatic 19) (Sources/parrot/Parrot.swift)
  • Test reliability not included

New (18)

  • Coverage not measured — Swift suite
  • Daemon.runLoop (cognitive 21) (Sources/ParrotCore/App/Daemon.swift)
  • Daemon.runLoop (cyclomatic 17) (Sources/ParrotCore/App/Daemon.swift)
  • Documentation: no contributor guidance (README.md)
  • Documentation: no project overview (README.md)
  • Duplicated block (13 lines × 2) (Sources/ParrotCore/Input/HotkeySettings.swift)
  • Duplicated block (6 lines × 2) (Sources/parrot-bench/main.swift)
  • Duplicated block (7 lines × 2) (Sources/parrot-bench/main.swift)
  • Hotspot: Sources/ParrotCore/App/Daemon.swift (Sources/ParrotCore/App/Daemon.swift)
  • Hotspot: Sources/parrot-bench/TranscriptionBench.swift (Sources/parrot-bench/TranscriptionBench.swift)
  • Low cohesion: MenuBarController (LCOM4 7) (Sources/ParrotCore/UI/MenuBarController.swift)
  • No assertions: testStopWithoutStartIsSafe (Tests/ParrotTests/HALInputTests.swift)
  • Off the main sequence: ParrotCore
  • Outdated: swift-argument-parser
  • Secret passed as a command-line argument
  • TranscriptionBench.run (cognitive 49) (Sources/parrot-bench/TranscriptionBench.swift)
  • TranscriptionBench.run (cyclomatic 33) (Sources/parrot-bench/TranscriptionBench.swift)
  • WhisperKitTranscriber.migrateLegacyModels (cognitive 22) (Sources/ParrotCore/Transcription/WhisperKitTranscriber.swift)

Changes since last survey

  • 123 commits — 121 feature/other, 2 fixes

By area

  • Sources/ParrotCore — 78 commits
  • (root) — 15 commits
  • .github/workflows — 5 commits
  • docs/architecture.md — 5 commits
  • Sources/parrot — 4 commits
  • site/index.html — 4 commits
  • scripts/dev-install.sh — 3 commits
  • Tests/ParrotTests — 2 commits
  • docs/assets — 2 commits
  • docs/decisions — 2 commits
  • docs/app-icon.png — 1 commit
  • docs/dictionary.md — 1 commit
  • packaging/Info.plist — 1 commit

Notable commits

  • fix: fix install URLs after move to humanitas-labs
  • fix: run: exit 0 on startup failures a relaunch can't fix
  • change: app: a white icon macOS doesn't put on a gray tile
  • change: app: add UserFacingError for failures the user should see
  • change: app: check for updates daily and from the menu
  • change: app: drive the dictation loop from DictationController
  • change: app: run as Parrot.app, launch at login through SMAppService, move off the LaunchAgent
  • change: app: show a mid-recording route change in the pill
  • change: app: wait for Accessibility and load the model behind the menu-bar icon
  • change: audio: capture through an AUHAL input unit behind --capture hal
  • change: audio: follow a rate change mid-recording instead of discarding it
  • change: audio: fresh engine per recording, format-safe tap, mic permission
  • change: audio: log press-to-first-sample for every capture
  • change: audio: make the AUHAL input the default capture path
  • change: audio: prepare the input unit between presses behind --capture prepared
  • change: audio: run the microphone through a CaptureInput
  • change: audio: trim leading and trailing silence before transcription
  • change: bench: measure first-word recall with trim and padding flags
  • change: bench: move the benchmarks into a parrot-bench target, out of the app
  • change: bench: time press-to-first-sample with parrot bench capture
  • …and 103 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

digimata/parrot was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 0eb470847fa38095f60d727391a5098ee893de58 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.