Cross-platform desktop translator — built with Tauri, React, and Rust
Features • Screenshots • Installation • Architecture • Roadmap
A fast, accessible translation app that lives in your system tray. Select text in any app, press Ctrl+T, and get an instant translation — no API key required.
Select → Ctrl+T → Translate — works on Linux, Windows, and macOS.
- Select & Translate — select text in any application, press
Ctrl+T, Transify copies the text and translates it - Global Shortcut —
Ctrl+Tworks system-wide; on Wayland it uses direct input listening (rdev) - Screenshot OCR Translation (coming soon) — capture a screen region, extract text, and translate it
- Instant Translation — type or paste text, translation appears after 300ms debounce
- Auto Language Detection — Google Translate detects source language automatically
- Editable Shortcuts — customize every shortcut from Settings (Ctrl+T, Ctrl+S, Ctrl+Shift+C, etc.)
- Theming — Light, Dark, and System themes, plus High Contrast Mode (WCAG AA)
- Translation History — all translations saved locally with timestamps
- Auto-copy Result — optional toggle to copy translated text to clipboard
- Fully Keyboard Navigable — every feature works without a mouse
- Screen Reader Friendly — ARIA labels, focus states, proper landmarks
Screenshots coming soon. Transify has a clean, minimal interface with input panel, language selector, output panel, and action toolbar.
┌──────────────────────────────────┐
│ Transify │
├──────────────────────────────────┤
│ Source Text │
│ ┌────────────────────────────┐ │
│ │ Hello world │ │
│ │ │ │
│ └────────────────────────────┘ │
├─────────────┬────────────────────┤
│ Auto ▼ │ Arabic ▼ ⟲ │
├─────────────┴────────────────────┤
│ Translated Text │
│ ┌────────────────────────────┐ │
│ │ مرحباً بالعالم │ │
│ └────────────────────────────┘ │
├──────────────────────────────────┤
│ 📷 Capture [Translate] Copy │
└──────────────────────────────────┘
| Platform | Format | Download |
|---|---|---|
| Linux | AppImage | Transify-0.1.0-x86_64.AppImage |
| Linux | .deb (Debian/Ubuntu) | Transify_0.1.0_amd64.deb |
| Linux | .rpm (Fedora/RHEL) | Transify-0.1.0-1.x86_64.rpm |
chmod +x Transify-0.1.0-x86_64.AppImage
./Transify-0.1.0-x86_64.AppImagesudo dpkg -i Transify_0.1.0_amd64.deb
transifysudo rpm -i Transify-0.1.0-1.x86_64.rpm
transifyPrerequisites: Rust, Node.js 18+, Tauri system deps
git clone https://github.com/MahmoudKSultan/transify.git
cd transify
npm install
npx tauri buildArtifacts are in src-tauri/target/release/bundle/.
- Launch Transify
- Type or paste text — translation appears automatically
- Use Ctrl+T from any app to translate clipboard content
- Use Ctrl+S to swap languages
- Use Ctrl+Shift+C to clear input
The global shortcut lets you translate text from any application:
- Select text in your browser, editor, or terminal
- Press Ctrl+T — Transify copies the text and opens to show the translation
- Done — the translated text appears in the output panel
Note on Wayland: If you're on GNOME Wayland, run
sudo usermod -a -G input $USER && rebootfor the global shortcut to work system-wide.
This feature is in development. Track progress on the
feature/screenshot-translationbranch.
┌─────────────────────────────────────────────────────────┐
│ UI Layer (React) │
│ ┌──────────┐ ┌───────┐ ┌─────────┐ ┌──────────┐ │
│ │ Translator│ │History│ │Settings │ │ Screenshot│ │
│ │ Panel │ │ Panel │ │ Panel │ │ OCR │ │
│ └─────┬────┘ └───┬───┘ └────┬────┘ └─────┬────┘ │
│ └───────────┴───────────┴──────────────┘ │
│ │ │
│ ┌─────────▼──────────┐ │
│ │ Zustand Store │ │
│ └─────────┬──────────┘ │
│ │ │
│ ┌─────────▼──────────┐ │
│ │ Tauri IPC (invoke)│ │
│ └─────────┬──────────┘ │
├────────────────────────┼────────────────────────────────┤
│ ┌─────────▼──────────┐ │
│ │ Rust Backend │ │
│ │ (Tauri Commands) │ │
│ └─────────┬──────────┘ │
├────────────────────────┼────────────────────────────────┤
│ ┌──────────┐ ┌───────▼────┐ ┌──────────────────┐ │
│ │Google │ │ OCR │ │ Screen Capture │ │
│ │Translate │ │ Provider │ │ (future) │ │
│ │ API │ │ (Tesseract)│ │ │ │
│ └──────────┘ └────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
transify/
├── src/ # React frontend
│ ├── app/ # Root App component
│ ├── features/
│ │ ├── translator/ # Core translation feature
│ │ │ ├── components/ # Translator, InputPanel, OutputPanel, etc.
│ │ │ ├── hooks/ # useKeyboardShortcuts, useGlobalShortcut, etc.
│ │ │ ├── store/ # Zustand state
│ │ │ ├── services/ # Translation API calls
│ │ │ └── types/ # TS types & constants
│ │ └── screenshot-translation/ # (coming soon)
│ ├── widgets/ # Panel components
│ ├── shared/ # UI primitives, utils, constants
│ └── main.tsx
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── domain/ # Domain models & entities
│ │ ├── application/ # Use cases & interfaces
│ │ ├── infrastructure/ # Google Translate, clipboard
│ │ └── presentation/ # Tauri commands, key listener
│ ├── icons/ # App icons (all platforms)
│ └── tauri.conf.json
├── app-icon.svg # Source icon
└── test-highlight-to-translate.sh # QA test suite (37 tests)
| Layer | Technology |
|---|---|
| Desktop Shell | Tauri v2 |
| Frontend | React 18, TypeScript, TailwindCSS, Zustand |
| Backend | Rust, arboard (clipboard), rdev (key listener) |
| Translation | Google Translate (free, no API key) |
| OCR | Tesseract (planned) |
| UI Components | Radix UI, Lucide icons |
| Action | Default | Customizable |
|---|---|---|
| Translate clipboard | Ctrl+T |
✓ |
| Swap languages | Ctrl+S |
✓ |
| Clear input | Ctrl+Shift+C |
✓ |
| Focus input | Ctrl+L |
✓ |
| Enter to translate | Enter |
— |
| Capture & translate (OCR) | Ctrl+Shift+O |
✓ (planned) |
- Text translation with Google Translate
- Global shortcut (Ctrl+T) for instant translate
- Accessibility-first UI (WCAG AA)
- Customizable keyboard shortcuts
- Translation history
- Light/dark/high-contrast themes
- Screenshot OCR translation — capture region → OCR → translate
- Multi-language OCR (Arabic, French, German, etc.)
- Floating mini-translator overlay
- OCR history with image previews
- Text-to-speech (pronunciation)
- Offline translation mode
- AI summarization & tone rewriting
- Plugin system (DeepL, OpenAI, LibreTranslate)
# Frontend only (hot reload)
npm run dev # → http://localhost:5180
# Full Tauri app
npx tauri dev # Hot reload frontend + Rust
# Build production
npx tauri build
# Run QA tests
bash test-highlight-to-translate.shThe dev server runs on port 5180 to avoid conflicts.
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -am 'Add my feature' - Push:
git push origin feature/my-feature - Open a Pull Request
Please run bash test-highlight-to-translate.sh before submitting.
MIT — see LICENSE.
Built with ❤️ using Tauri, React, and Rust