Download the latest prebuilt app for macOS:
WhisloAI helps you translate and dictate text from anywhere in your desktop workflow.
I built WhisloAI because I want to keep improving my English every day.
I used to do the same loop all the time: write something, translate it, tweak the tone, paste it back, and repeat. After a while, I thought: why not automate this?
So this app started as a personal tool for my daily workflow. I am sharing it publicly because I want honest feedback, I want to see if it is useful to others, and I want to keep learning by building in public with the community.
Current MVP focuses on:
Translate: source language to target language (configurable in Settings)Dictate: record voice, transcribe, translate, and insert back- Bring-your-own provider credentials (
OpenAIand OpenAI-compatible endpoints) - Quick overlay actions near focused text inputs
- Lightweight desktop app built with Tauri
- macOS floating anchor + quick popover workflow
- One-click selected text translation (
Translate selection) - Provider management (add/update/select active provider)
- Connection test against
/models - Voice dictation path (
Record -> transcribe -> translate -> insert) - Auto-insert at cursor with manual paste fallback
- First-run onboarding for required permissions
- Local API key persistence for configured providers
- Tauri (Rust backend)
- HTML/CSS/JavaScript frontend
- Local settings + provider configuration persisted on disk
- Node.js 20+
- Rust toolchain (stable)
- Tauri system dependencies for your OS
cmake(required for local Whisper transcription)- macOS:
brew install cmake
- macOS:
npm install
npm run devnpm run build
npm run tauri buildFor day-to-day local installs on macOS, use:
bash scripts/build-install-local-macos.shThis script:
- Builds the frontend and Tauri app bundle
- Installs the app to
/Applications/WhisloAI.app - Re-signs the installed app
- Opens the installed app
If you see:
A public key has been found, but no private key. Make sure to set TAURI_SIGNING_PRIVATE_KEY
that error is about updater artifact signing, not local app execution. The script can still continue with local install.
To avoid macOS Accessibility/Automation permission desync across local rebuilds, do not rely on ad-hoc signing.
- Install a valid
Developer ID Applicationcertificate plus private key in your login keychain - Confirm identity is available:
security find-identity -v -p codesigning- Export your identity so local scripts use stable signing:
export WHISLOAI_CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)"- Verify installed app signature is not ad-hoc:
codesign -dvv /Applications/WhisloAI.app 2>&1 | rg "Signature=|Authority=|TeamIdentifier="Expected: Authority=Developer ID Application... and TeamIdentifier=<your team id>.
If permissions still look enabled in System Settings but checks fail inside the app, use a full local reset first:
npm run reset:local:blank -- --yesThis command:
- Closes WhisloAI
- Removes
/Applications/WhisloAI.app - Cleans local app data in
~/Libraryforcom.whisloai.desktop - Resets TCC entries for Accessibility, Automation (
AppleEvents), and Microphone
If you also want to remove keychain credentials:
WHISLOAI_RESET_KEYCHAIN=1 npm run reset:local:blank -- --yesManual fallback (TCC only):
tccutil reset Accessibility com.whisloai.desktop
tccutil reset AppleEvents com.whisloai.desktopThen re-enable WhisloAI in:
Privacy & Security > AccessibilityPrivacy & Security > Automation(System Events)
- Update version values:
package.jsonsrc-tauri/Cargo.tomlsrc-tauri/tauri.conf.json
- Commit and push your changes.
- Create and push a release tag:
git tag v0.1.1
git push origin v0.1.1- Configure updater signing secrets in GitHub repository settings:
TAURI_SIGNING_PRIVATE_KEY(content of your updater private key)TAURI_SIGNING_PRIVATE_KEY_PASSWORD(optional, only if your key has a password)
- GitHub Actions workflow
.github/workflows/release.ymlbuilds artifacts for macOS (Apple Silicon + Intel), signs updater assets, and attaches them to a GitHub Release. - Note: updater signing (
TAURI_SIGNING_PRIVATE_KEY) is different from macOS app codesigning (APPLE_CERTIFICATE,APPLE_SIGNING_IDENTITY,APPLE_TEAM_ID).
- Open a text field in any app
- Open the WhisloAI widget
- Choose
Translate selection(or use dictation) - Insert output back into your active text field
- Keep the widget open while writing
- Use quick actions to translate selected text or dictate
- Configure provider, languages, and writing modes from
Settings
- API keys are currently persisted locally in app configuration (base64-encoded, not encrypted) to keep setup simple during MVP
- You control provider selection and credentials
- Recommended before public deployment: add explicit telemetry and data-handling documentation
WhisloAI is an active MVP and moving toward a broader open source release.
This project is licensed under the PolyForm Noncommercial 1.0.0 license.
- Noncommercial use is allowed under the terms in LICENSE.
- Commercial use requires a separate commercial license from the maintainer.
Contributions are welcome.
Suggested flow:
- Open an issue with context and expected behavior
- Submit a focused PR with clear testing notes
- Keep changes scoped and avoid mixing refactors with feature work
- Built by @emanuel_build
