Per-hotkey language routing for Aqua Voice on macOS.
Aquarium is a native menu-bar companion. Assign up to three languages to Aqua Voice activation keys, then keep Aqua's normal interaction model:
- Hold a key for streaming dictation in its assigned language.
- Release to finish.
- Double-tap the same key for Aqua Voice hands-free mode.
Example mappings:
| Trigger | Language |
|---|---|
| Right Command | English |
| Right Option | Hebrew |
Triggers are recorded directly. They can be a modifier-only key, such as Right Command, a pure modifier chord such as Shift + Command + Control + Option, or any normal key combination.
- macOS 14 or newer
- Aqua Voice installed at
/Applications/Aqua Voice.app - Input Monitoring and Accessibility permissions for Aquarium
Aquarium currently integrates with Aqua Voice's local, undocumented automation socket. An Aqua Voice update may change that interface.
- In Aqua Voice, enable streaming mode.
- Set one Aqua Voice activation hotkey. A complex shortcut such as
Meta+Alt+Control+Shift+F17avoids conflicts. - Open Aquarium Settings and record the same shortcut in Aqua hotkey.
- For each language, choose a language and record any trigger you want.
- Click Apply.
Aquarium never reads or changes Aqua's settings.
brew tap dan-dr/tap
brew trust --cask dan-dr/tap/aquarium
brew install --cask aquarium
xattr -dr com.apple.quarantine /Applications/Aquarium.appThe initial release is ad-hoc signed, so the quarantine-clear command is required before first launch. Once release signing and notarization are configured, that command can be removed.
git clone https://github.com/dan-dr/aquarium.git
cd aquarium
./script/install.shswift test
./script/build_and_run.sh --verifyThe build script creates dist/Aquarium.app, generates the app icon, applies a
stable local signature, and launches the bundle. The Codex Run action uses the
same script.
Aquarium:
- Stores up to three language and arbitrary-hotkey mappings.
- Stores the Aqua Voice activation hotkey you record manually.
- Launches Aqua Voice with its local automation socket enabled.
- On trigger press, switches Aqua's language and waits for confirmation. A same-language second tap skips the repeated switch so it reaches Aqua inside the native hands-free timing window.
- Posts the shared Aqua hotkey press and release to macOS's global keyboard stream so Aqua's global shortcut listener receives it, keeping hold-to-stream and double-tap hands-free behavior intact.
Aquarium does not capture audio, transcribe speech, or replace Aqua Voice. Injected relay events carry an Aquarium marker, so Aquarium ignores its own events instead of relaying them again. A pure modifier chord is recommended for the shared Aqua hotkey because it cannot type into the focused app.
See Architecture for implementation and security details.
MIT