https://github.com/pepperonas/inspector-rust
Keyboard-first clipboard hyper-toolkit for power users: history, snippets, text expander, screen OCR, region screenshot, inline calculator, color picker, image recolor + ML background cutout. macOS + Windows. Native (Tauri 2 + Rust + React), local, AES-256 encrypted at rest, MIT.
https://github.com/pepperonas/inspector-rust
clipboard clipboard-history clipboard-manager color-picker desktop-app developer-tools encryption macos native ocr productivity react rust screenshot snippets tauri tauri2 text-expander typescript windows
Last synced: 5 days ago
JSON representation
Keyboard-first clipboard hyper-toolkit for power users: history, snippets, text expander, screen OCR, region screenshot, inline calculator, color picker, image recolor + ML background cutout. macOS + Windows. Native (Tauri 2 + Rust + React), local, AES-256 encrypted at rest, MIT.
- Host: GitHub
- URL: https://github.com/pepperonas/inspector-rust
- Owner: pepperonas
- License: mit
- Created: 2026-04-23T18:06:26.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-05-25T00:06:11.000Z (10 days ago)
- Last Synced: 2026-05-25T01:35:30.778Z (10 days ago)
- Topics: clipboard, clipboard-history, clipboard-manager, color-picker, desktop-app, developer-tools, encryption, macos, native, ocr, productivity, react, rust, screenshot, snippets, tauri, tauri2, text-expander, typescript, windows
- Language: Rust
- Size: 25.8 MB
- Stars: 2
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.de.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
[đŹđ§ English](./README.md) · **đ©đȘ Deutsch**
# Inspector Rust đ”ïžââïž
> **Keyboard-first Clipboard-Hyper-Toolkit â nativ auf macOS, Windows 11, Linux. Kein Electron, keine Cloud, keine Telemetrie.**
DrĂŒck **`Ctrl+Shift+V`** irgendwo â rahmenloses Popup ĂŒber dem aktiven Monitor â fuzzy-Suche durch 1 000 deduplizierte Clipboard-EintrĂ€ge â Enter pastet zurĂŒck in die zuvor fokussierte App. Ganzer Loop unter 200 ms, unter 50 MB RAM, AES-256-GCM-verschlĂŒsselt at-rest mit Keys im OS-Keychain. **Gebaut fĂŒr die Art Mensch, die schon MuskelgedĂ€chtnis fĂŒr drei Clipboard-Manager hat und von allen genervt ist.**
### âš Was es kann (in kurz)
- đ **Clipboard-History** â Text, RTF, HTML, PNG, Datei-Listen; 1 000 EintrĂ€ge per SHA-256 dedupliziert; Fuzzy-Suche while-you-type.
- đ§ź **Inline-Rechner** (`2+2`, `sqrt(144)`, Hex/Bit-Ops) und **Farb-Konverter** (`#hex` / `rgb()` / `hsl()` in jede Richtung).
- đŻ **Text-Expander â 3 Modi**: In-Popup-Suche · System-Hotkey (AX/UIA-In-Place-Replace + Electron-Fallback) · Direct hotkey â snippet slots (funktioniert auch in Terminals).
- đ **Bildschirm-Region-OCR** (`Ctrl+Shift+O`) â Apple Vision (macOS) / WinRT (Windows) / Tesseract (Linux). PDF-grade Texterkennung ins Clipboard.
- đž **Region-Screenshot** (`Ctrl+Shift+S`) + **CleanShot-X-Style Vorschau-HUD** + **Annotations-Editor** (Pfeil / Text / Rect / Highlight / Blur). Dateinamen enthalten den Quell-App-Namen.
- đš **Color Picker** (`Ctrl+Shift+C`) â `NSColorSampler`-Lupe / GDI-Overlay / Hex direkt ins Clipboard.
- đ **Finder-Selection-Actions** (`Ctrl+Shift+F`, macOS) â Multi-File-Batch-Resize / Optim / Open auf was auch immer du im Finder selektiert hast.
- đŒïž **Image-Tools** â Recolor (Logo-EinfĂ€rbung), ML-Cut-Out (UÂČ-Net ONNX, 4,5 MB embedded), Lanczos3-Resize mit Preset-Autocomplete.
- đž **Bruno (Brutto/Netto)** â deutscher Einkommensteuer-Rechner 2025 als Suchfeld-Befehl. Smart Defaults + Per-User-Override in Settings.
- đ **App-Launcher** (Spotlight-like, macOS) â App-Name antippen, echtes Icon in der Zeile, Enter startet. Aktiviert bereits laufende Instanz statt Duplikat zu spawnen.
- đą **Wakelock-LED** â pulsierende rote LED + `wake` Label im Popup-Footer wenn `wakelock=1` aktiv. Event-driven, kein Polling.
- âïž **Power-Commands** â `tr` / `tren` / `trde` (ĂŒbersetzen), `rz` / `optim` (Image), `kill` / `lock` / `reboot` / `shutdown` / `mute` / `freeze` (System), `wakelock=1/0` (Wachhalten), `rmvvls` (Text).
- đ **Snippets** (25 gebĂŒndelte AI-Prompts) · **Notes** (persistente Lesezeichen) · **Backup** (Single-File-JSON-Export).
- đ **Local-first** â null Netzwerk-Calls, null Account, Daten nur unter `~/Library/Application Support/InspectorRust/history.db`. Encryption-Keys verlassen nie deine Maschine.
- đź **Versteckte Games** â drei Easter-Egg-Trigger-Wörter. Du findest sie schon.
### đ§° Tech-Stack
Tauri 2 (WebView2 / WKWebView) · Rust-Workspace (`core/rust-lib` geteilt, 2-Zeilen-Per-OS-Bundle-Shells) · React 19 + TypeScript 5 + Tailwind v4 + Vite 7 · gepackt als **~5 MB MSI** / **~5 MB DMG**. **253 Rust + 401 Frontend-Tests.** MIT-lizenziert.
[](https://github.com/pepperonas/inspector-rust/releases)
[](./LICENSE)
[](https://github.com/pepperonas/inspector-rust/actions/workflows/ci.yml)
[](https://github.com/pepperonas/inspector-rust/actions/workflows/release.yml)
[](https://github.com/pepperonas/inspector-rust/releases/latest)
[](https://github.com/pepperonas/inspector-rust/commits/main)
[](https://github.com/pepperonas/inspector-rust/issues)
[](https://github.com/pepperonas/inspector-rust/stargazers)
[](https://github.com/pepperonas/inspector-rust/commits/main)
[](https://github.com/pepperonas/inspector-rust/actions/workflows/ci.yml)
[](./CONTRIBUTING.md)
[](./scripts/check.sh)
[](./win)
[](./macos)
[](./macos)
[](#)
[](./linux/README.md)
[](https://tauri.app)
[](https://rustup.rs)
[](https://react.dev)
[](https://www.typescriptlang.org)
[](https://vitejs.dev)
[](https://tailwindcss.com)
[](https://pnpm.io)
[](https://nodejs.org)
[](https://sqlite.org)
[](https://onnxruntime.ai)
[](#)
[](https://github.com/xuebinqin/U-2-Net)
[](./docs/encryption.md)
[](./docs/encryption.md)
[](#)
[](#)
[](#)
[](#)
[](#)
[](https://eslint.org)
[](https://vitest.dev)
[](#)
[](#)
[](#)
[](#)
[](https://prettier.io)
[](https://github.com/pepperonas/inspector-rust/issues)
[](https://github.com/pepperonas/inspector-rust/issues?q=is%3Aissue+is%3Aclosed)
[](https://github.com/pepperonas/inspector-rust/pulls)
[](https://github.com/pepperonas/inspector-rust/stargazers)
[](https://github.com/pepperonas/inspector-rust/network/members)
[](https://github.com/pepperonas/inspector-rust/watchers)
[](https://github.com/pepperonas/inspector-rust/graphs/contributors)
[](https://github.com/pepperonas/inspector-rust/commits/main)
[](https://github.com/pepperonas/inspector-rust/commits/main)
[](https://github.com/pepperonas/inspector-rust)
[](https://github.com/pepperonas/inspector-rust)
[](https://github.com/pepperonas/inspector-rust)
[](https://github.com/pepperonas/inspector-rust)
[](#)
[](./pnpm-workspace.yaml)
[](./Cargo.toml)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#)
[](./core/rust-lib/src/commands.rs)
[](#)
[](./core/rust-lib/src)
[](./docs/ai-prompts.md)
[](#)
[](./docs/encryption.md)
[](#)
[](./docs/text-expander.md)
[](#)
[](https://semver.org)
[](https://keepachangelog.com)
[](https://www.conventionalcommits.org)
[](#)
[](./CHANGELOG.md)
[](./docs/text-expander.md)
[](#)
[](./CHANGELOG.md)
[](#)
[](https://crates.io/crates/rusqlite)
[](https://crates.io/crates/enigo)
[](https://crates.io/crates/clipboard-rs)
[](https://crates.io/crates/ort)
[](https://crates.io/crates/ring)
[](https://crates.io/crates/objc2)
[](https://www.fusejs.io)
[](https://lucide.dev)
[](https://tanstack.com/virtual)
[](#)
[](#)
[](#)
[](./LICENSE)
[](#)
DrĂŒck `Ctrl+Shift+V` â suchen â einfĂŒgen. Inspiriert von Alfreds Clipboard-Viewer auf macOS, eingedampft auf ein Tool, das du auf jeder Maschine behalten kannst.
---
## Download
**Aktueller Release:** [](https://github.com/pepperonas/inspector-rust/releases/latest) â siehe [CHANGELOG](./CHANGELOG.md) fĂŒr die Neuerungen.
| Plattform | Datei | Hinweise |
|-----------|-------|----------|
| **Windows 11 / 10** | [`InspectorRust__x64_en-US.msi`](https://github.com/pepperonas/inspector-rust/releases/latest) | MSI-Installer â fĂŒgt StartmenĂŒ-Eintrag & Uninstaller hinzu |
| **Windows 11 / 10** | [`inspector-rust.exe`](https://github.com/pepperonas/inspector-rust/releases/latest) | Standalone-Exe â keine Installation nötig |
| **macOS 10.15+ (Apple Silicon)** | [`InspectorRust__aarch64.dmg`](https://github.com/pepperonas/inspector-rust/releases/latest) | DMG fĂŒr arm64-Macs |
| **macOS Intel** | â | Aus Source bauen: [`macos/README.md`](./macos/README.md) |
| **Linux (Ubuntu/Debian)** | Aus Source bauen â siehe [`linux/README.md`](./linux/README.md) | `.deb` + AppImage via `pnpm build:linux` |
> **macOS-Gatekeeper-Hinweis.** Local-Build-Releases sind **nicht Apple-signiert**. Beim ersten Start weigert sich macOS, die App zu öffnen â Rechtsklick â **Ăffnen** â bestĂ€tigen, oder **Systemeinstellungen â Datenschutz & Sicherheit â "Trotzdem öffnen"**. Dann **zwei** TCC-Permissions erteilen:
> - **Bedienungshilfen** â nötig fĂŒr Paste (`enigo` synthetisiert Cmd+V) und den system-weiten Text-Expander (Cmd+Shift+â / Cmd+C / Cmd+V-Zyklus).
> - **Bildschirmaufnahme** â nötig fĂŒr den OCR-Shortcut (`screencapture -i` wird Inspector Rust zugeordnet und macOS verweigert es ohne diese Berechtigung). Der Settings-Tab zeigt beide als zusammenklappbare amber Banner mit Ein-Klick-Sprung zum richtigen Privacy-Pane.
>
> Komplettes Setup in [`macos/README.md`](./macos/README.md).
---
## Plattform-Support
| Plattform | Status | Verzeichnis |
|------------|---------------------|-----------------------|
| Windows 11 | â
implementiert | [`win/`](./win) |
| macOS | â
implementiert | [`macos/`](./macos) |
| Linux | â
implementiert | [`linux/`](./linux) |
Die gesamte App-Logik lebt in [`core/`](./core) â ein einzelnes Frontend (`core/frontend`) und eine einzelne Rust-Library (`core/rust-lib`), die plattformĂŒbergreifend geteilt werden. Jedes OS hat seine eigene dĂŒnne Bundle-Shell mit plattformspezifischen Details (Installer-Config, Icons, Capabilities). Um eine neue Plattform hinzuzufĂŒgen, siehe [`CONTRIBUTING.md`](./CONTRIBUTING.md#adding-a-new-platform-shell-linux-etc).
## Workflow
Inspector Rust ist fĂŒr *einen* Workflow gebaut: **`Ctrl+Shift+V` â tippen â Enter**. Der Hotkey öffnet ein rahmenloses Popup ĂŒber dem aktiven Monitor; was du tippst, wird fuzzy durchsucht ĂŒber Clipboard-History, Snippets, Calc-Ergebnisse und Farbwerte; Enter fĂŒgt den Top-Match in die zuvor fokussierte App ein. Keine Maus, keine MenĂŒ-BĂ€ume, keine Per-App-Integrationen.
Drei weitere globale Shortcuts feuern von ĂŒberall â Inspector Rusts Fenster muss nicht offen oder fokussiert sein:
- **`Ctrl+Shift+O`** â Bildschirm-Region-**OCR**. Marquee ziehen, Apple Vision erkennt den Text in der Region, der Text landet auf deiner Zwischenablage + oben in der History.
- **`Ctrl+Shift+S`** *(v0.15.0+)* â Bildschirm-Region-**Screenshot**. Gleiche Marquee, kein OCR-Schritt: das aufgenommene PNG geht direkt auf die Zwischenablage und in die History. Ideal fĂŒr Diagramme, Buttons, Fotos oder Regionen ohne erkennbaren Text. **Als Datei speichern:** WĂ€hrend das Overlay offen ist **`S`** drĂŒcken â der Auswahlrahmen wird grĂŒn und nach dem Zeichnen erscheint ein nativer Speichern-Dialog statt des Clipboard-Schreibens *(v0.19.2+)*.
- **`Ctrl+Shift+C`** *(v0.17.0+)* â **Eyedropper**. Cursor wird zur NSColorSampler-Lupe (macOS) / GDI-Overlay (Windows); ein Klick auf ein Pixel und der Hex-Code (`#RRGGBB`) landet auf der Zwischenablage + History. Kein Popup, kein Modal â fire-and-forget.
Literal Control auf jedem OS â dieselbe Taste auf Windows und macOS. OCR + Screenshot benötigen auf macOS das **Bildschirmaufnahme**-TCC-Grant; auf Windows sind keine extra Berechtigungen nötig.
Alles andere (Snippets-Verwaltung, Notes, Settings, Image-Tools) lebt im selben Popup hinter Tabs oben rechts â es gibt kein separates Fenster zum Alt-Tabben. **Settings â Keyboard shortcuts** trĂ€gt das komplette Cheat-Sheet.
## Features & Shortcuts auf einen Blick
### đ„đ„đ„ Globale Hotkeys â fire and forget, von ĂŒberall đ„đ„đ„
| Shortcut | Aktion | Benötigt (macOS) |
|----------|--------|------------------|
| `Ctrl+Shift+V` | Popup auf dem aktiven Monitor öffnen | â |
| `Ctrl+Shift+O` | Bildschirm-Region-**OCR** â Text auf Clipboard + History | Bildschirmaufnahme |
| `Ctrl+Shift+S` *(v0.15.0+)* | Bildschirm-Region-**Screenshot** â PNG auf Clipboard + History (kein OCR); **`S`** wĂ€hrend Overlay â als Datei speichern (grĂŒner Rahmen) *(v0.19.2+)* | Bildschirmaufnahme *(macOS)* |
| `Ctrl+Shift+C` *(v0.17.0+)* | **Eyedropper** â Hex (`#RRGGBB`) auf Clipboard + History | â |
| `Ctrl+Shift+F` *(v0.30.0+)* | **Finder-Selektion** â Popup mit gerade selektierten Dateien + Actions (Resize, Optim, âŠ) | Automation â Finder |
| `Alt+1` *(Default, konfigurierbar, opt-in)* | Snippet-Abbreviation in-place expandieren | Bedienungshilfen |
| *(user-konfigurierbar)* | **Direct hotkey â snippet** â bestimmten Snippet-Body pasten | Bedienungshilfen |
Literal Control auf jedem OS. Dieselbe Taste auf Windows und macOS. Der Expander-Hotkey ist opt-in (aus, bis du ihn in Settings â Text expander konfigurierst).
### Popup-Shortcuts â wenn das Popup offen ist
| Shortcut | Aktion |
|----------|--------|
| `â` `â` | In der Liste navigieren |
| `Shift+â` `Shift+â` *(v0.22.0+)* | System-LautstĂ€rke erhöhen / senken (±6 % pro Druck) |
| `Enter` | AusgewÀhlten Eintrag pasten (respektiert das Plain-Text-Setting) |
| `Shift+Enter` | Mit Originalformatierung pasten (ĂŒberschreibt das Plain-Text-Setting einmalig) |
| `Esc` | Popup schlieĂen |
| `âB` / `Ctrl+B` | **Hintergrund freistellen** beim ausgewĂ€hlten Image-Eintrag (ML â UÂČ-Net) |
| `âS` / `Ctrl+S` | **Bild in Downloads speichern** (PNG unverĂ€ndert) |
### Komplette Feature-Matrix
| Feature | Wo triggern | Doku |
|---------|-------------|------|
| Clipboard-History (Text/RTF/HTML/PNG/Files, 1 000 EintrĂ€ge, dedupliziert) | `Ctrl+Shift+V` â suchen | core |
| Fuzzy-Suche (`fuse.js`, Threshold 0.4) | Im Suchfeld tippen | core |
| **Inline-Taschenrechner** | Ausdruck im Suchfeld tippen (`2+2`, `sqrt(9)`, `sin(pi/2)`, `0xff << 4`, âŠ) | core |
| **Farb-Konverter** | `#RRGGBB` / `rgb(âŠ)` / `hsl(âŠ)` im Suchfeld tippen â Swatch + alle Formate | [colors.md](./docs/colors.md) |
| **HSV-Color-Picker-Modal** | History-Tab â *Color Picker*-Button â Hue-Slider + Swatch + Hex/RGB/HSL-Tabs | [colors.md](./docs/colors.md) |
| **Screen-Eyedropper** (Modal) | *Color Picker*-Modal â *Pick from screen* (macOS `NSColorSampler`-Lupe / Windows GDI-Overlay) | [colors.md](./docs/colors.md) |
| **Eyedropper â globaler Hotkey** *(v0.17.0+)* | `Ctrl+Shift+C` oder Tray *Pick Color* â Hex direkt aufs Clipboard, kein Popup | [colors.md](./docs/colors.md) |
| Snippet-Search-as-you-type | Snippet-Abbreviation im Popup-Suchfeld tippen | [text-expander.md](./docs/text-expander.md) |
| Abbreviation-Expander (system-weit) | Abbreviation in irgendein Textfeld tippen â `Alt+1` (Default) | [text-expander.md](./docs/text-expander.md) |
| Direct hotkey â snippet *(v0.13.0+)* | User-bound globaler Hotkey | [text-expander.md](./docs/text-expander.md) |
| 25 gebĂŒndelte AI-Prompt-Snippets (`ai*`) | Snippets-Tab; Search / Abbreviation / Direct-Slot | [ai-prompts.md](./docs/ai-prompts.md) |
| Snippets CRUD + JSON-Import | Snippets-Tab â Formular / Import-Button | [snippets-import.md](./docs/snippets-import.md) |
| Notes â kategorisierte persistente Bookmarks | Notes-Tab (Tray: *Manage Notes*) | [notes.md](./docs/notes.md) |
| Clip als Note speichern | Hover ĂŒber History-Zeile â Bookmark-Icon | [notes.md](./docs/notes.md) |
| **Bildschirm-Region-OCR** *(v0.9.0+; Windows seit v0.19.2)* | `Ctrl+Shift+O` oder Tray *OCR Region* | core |
| **Bildschirm-Region-Screenshot** *(v0.15.0+; Windows seit v0.19.2)* | `Ctrl+Shift+S` oder Tray *Screenshot Region* | core |
| **Screenshot â als Datei speichern** *(v0.19.2+)* | `Ctrl+Shift+S` â **`S`** wĂ€hrend Overlay drĂŒcken (grĂŒner Rahmen) â nativer Speichern-Dialog | core |
| **Bild-Recolor** (Logo-Tinten, Chromaticity-gated) | Preview-Pane bei Image-Eintrag â Swatch / Hex | core |
| **ML-Hintergrund-Cutout** (UÂČ-Net-ONNX, ~4,5 MB embedded) | Preview-Pane â *Cut out background* oder `âB` | core |
| Bild in Downloads speichern | Preview-Pane oder `âS` (PNG unverĂ€ndert) | core |
| Backup â Single-File-JSON-Export/Import (History + Snippets + Notes, per-Sektion ankreuzbar) | Settings â Backup & restore | [backup.md](./docs/backup.md) |
| Plain-Text-only Paste *(Default an, v0.4.0+)* | Settings â Paste (Shift+Enter ĂŒberschreibt einmal) | core |
| Autostart bei Login *(v0.14.0+)* | Settings â Startup *oder* Tray-Checkmark | core |
| Clipboard-Capture pausieren | Tray â *Pause Capture* | core |
| History löschen (mit BestĂ€tigung) | Tray â *Clear HistoryâŠ* | core |
| **AES-256-GCM at-rest** (alle Bodies) *(v0.6.0+)* | Automatisch; Key im OS-Keychain | [encryption.md](./docs/encryption.md) |
| Per-Monitor-Popup-Placement | Automatisch (öffnet auf Monitor mit Cursor) | core |
| Multi-Tab-UI | Popup oben-rechts Tabs: History · Snippets · Notes · Settings | core |
| Permissions-UX (TCC-Banner + 1-s-Polling + `tccutil reset`-Recovery) | Settings â Permissions-Sektion *(macOS)* | core |
| Keyboard-Shortcuts-Cheat-Sheet | Settings â *Keyboard shortcuts* (OS-adaptive Glyphen) | core |
| About-Dialog | Settings â About | core |
| **Theme â Hell / Dunkel / System** *(v0.20.0+)* | Settings â Appearance | Drei-Wege-Toggle; Hell/Dunkel ĂŒberschreiben das OS, System folgt ihm |
| **Power-Command â `tren `** *(v0.18.0+)* | Suchfeld | Englisch â Deutsch ĂŒbersetzen (öffnet Google Translate im Browser) |
| **Power-Command â `trde `** *(v0.18.0+)* | Suchfeld | Deutsch â Englisch ĂŒbersetzen (Google Translate) |
| **Power-Command â `tr `** *(v0.18.0+)* | Suchfeld | Text â Deutsch ĂŒbersetzen (auto-detect Quellsprache) |
| **Power-Command â `rz x`** *(v0.18.0+)* | Suchfeld | Clipboard-Bild via Lanczos3 skalieren (z.B. `rz 1200x800`) |
| **Power-Command â `optim`** *(v0.18.0+)* | Suchfeld | Clipboard-PNG optimieren â `~/Downloads/inspector-rust-optim-.png` (lossless oxipng) |
| **Power-Command â `rmvvls `** *(v0.18.0+)* | Suchfeld | Vokale entfernen (aeiou + AEIOU + Ă€/ö/ĂŒ) â Clipboard |
| **System-Command â `kill [-9] [pattern]`** *(v0.19.0+)* | Suchfeld â Live-Prozess-Picker | Laufende Prozesse filtern, Enter â BestĂ€tigung â SIGTERM (oder SIGKILL mit `-9`) |
| **System-Command â `reboot`** *(v0.19.0+)* | Suchfeld | System neu starten (macOS â Confirm zuerst, kein sudo) |
| **System-Command â `shutdown`** *(v0.19.0+)* | Suchfeld | System herunterfahren (macOS â Confirm zuerst, kein sudo) |
| **System-Command â `lock`** *(v0.19.0+)* | Suchfeld | Bildschirm sperren (macOS â sofort, kein Confirm) |
| **System-Command â `mute`** *(v0.23.0+)* | Suchfeld | System-Stummschaltung an/aus toggeln (macOS) |
| **System-Command â `freeze`** *(v0.28.0+)* | Suchfeld | Tastatur + Maus blocken â entsperren mit konfiguriertem Chord (Default `i + r`) â natives CGEventTap, kein rdev |
| **`wakelock=1` / `wakelock=0`** *(v0.29.0+)* | Suchfeld | Computer wachhalten â Cursor wackelt alle 60 s um 1 px; trickst Teams/Slack "Abwesend" + Bildschirmschoner-Timer aus (macOS / Windows / Linux X11) |
| **Finder-Selection-Actions** *(v0.30.0+, macOS)* | `Ctrl+Shift+F` | Popup listet die im Finder selektierten Dateien; `rz 1200x800` tippen skaliert alle Bilder (schreibt `-1200x800.` neben Quelle), `optim` lÀuft oxipng auf jedes PNG. Enter auf einer Zeile öffnet die Datei |
| **Resize-Preset-Autocomplete** *(v0.31.0+)* | `rz` oder `rz ` tippen | Beschriftete Preset-Zeilen (Full HD, HD, XGA, SVGA, âŠ); Enter fĂŒhrt aus, Tab / â fĂŒllt ins Suchfeld vor dem AusfĂŒhren |
| **`bruno <âŹ>[m|j]`** *(v0.33.0+)* | Suchfeld â `bruno 60000` (jĂ€hrlich) oder `bruno 5000m` (monatlich) | Deutscher BruttoâNetto-Rechner (Steuerjahr 2025); Preview-Panel zeigt volle Aufteilung (KV/PV/RV/AV/ESt/Soli/Kirche/Abgabenquote/Grenzsteuersatz); Enter kopiert Netto-Betrag ins Clipboard. Persönliche Defaults (Steuerklasse, Bundesland, Kinder, Kirche, KV-Zusatz) in Settings â Bruno |
| **Screenshot-Vorschau-HUD** *(v0.32.0+)* | Nach `Ctrl+Shift+S` | CleanShot-X-Style schwebende Karte mit X / Pin / Copy / Save / Edit / Cloud Buttons ĂŒber dem PNG. Pin behĂ€lt die Vorschau ĂŒber den nĂ€chsten Screenshot |
| **Annotations-Editor** *(v0.32.0+)* | Vorschau-HUD â Stift-Button | Neues Fenster mit 5 Tools: Pfeil / Text / Rect / Highlight / Blur (Mosaik-Pixelung). 4 Farb-Presets, 2â16 px Stroke, âZ/ââ§Z undo/redo, âS speichern, Esc abbrechen. Save backt zu `--edited.png` |
| **App-Name in Screenshot-Dateinamen** *(v0.32.0+)* | Automatisch | `osascript`-gefangener Frontmost-App-Name im gespeicherten Dateinamen: `Safari-20260524-153012.png`. Bearbeitete Varianten bekommen `-edited`-Suffix |
| Power-Command-Autocomplete | Teil-Keyword tippen (`tre`, `rm`, `reb`, `bru`, âŠ) â Vorschlag als `hint`-Zeile | core |
## Features
### Clipboard-Core
- **Globaler Hotkey** `Ctrl+Shift+V` öffnet das Popup zentriert auf dem Monitor mit dem Cursor.
- **Erfasst** Text, RTF, HTML, Bilder (PNG, †5 MB), und Datei-Listen via OS-nativen Clipboard-Events (kein Polling). Image-vor-Files-PrioritÀt auf macOS, sodass Finder-Image-Copies als Bitmaps landen, nicht als Pfade.
- **Fuzzy-Suche** (`fuse.js`, Threshold 0.4) rankt Matches wÀhrend du tippst. Virtualisierte Liste, per-Content-Type Preview-Panel.
- **Auto-Paste** â Enter pasted via `enigo`-simuliertem `Ctrl+V` / `Cmd+V` in die zuvor fokussierte App. Shift+Enter ĂŒberschreibt das Plain-Text-Setting und pasted mit Originalformatierung.
- **SQLite-Store** unter `%APPDATA%\InspectorRust\history.db` / `~/Library/Application Support/InspectorRust/history.db`. SHA-256-dedupliziert, Cap bei 1 000 EintrÀgen.
- **AES-256-GCM at-rest** seit v0.6.0 â Text-/HTML-/RTF-/Image-Bodies, Snippet-Bodies, Note-Bodies. SchlĂŒssel im OS-Keychain (Keychain / Credential Manager / Secret Service), 0600-Keyfile-Fallback. Volle Referenz: [`docs/encryption.md`](./docs/encryption.md).
- **Time-Chip** (v0.10.3) â der relative Time-Hint auf jeder Zeile (`just now`, `1h ago`) wird zu einem winzigen klickbaren Button: Hover zeigt sowohl `Captured` als auch `Last used` als absolute Timestamps in einem Tooltip; Klick schaltet den Chip selbst zwischen relativer und absoluter Anzeige um.
### Text-Expander (Snippets, v0.2 â system-weit v0.2.7, Hotkey-Ăberholung v0.12.0, Direct Slots v0.13.0)
- **Expansion im Popup** â tippe eine Abbreviation ins Suchfeld; matching Snippets erscheinen ĂŒber Clipboard-EintrĂ€gen; Enter pasted den Body.
- **Abbreviation-Expander** â tippe die Abbreviation in *irgendein* Textfeld, drĂŒcke den konfigurierten Hotkey (Default `Alt+1`, opt-in via Settings; Ein-Klick-Presets `Alt+1` / `Alt+2` / `Alt+3`, oder beliebige Kombination aufnehmen), Inspector Rust ersetzt sie in-place. Drei Pfade: AX/UIA in-place-Ersatz (native Apps â keine Clipboard-BerĂŒhrung, kein Flicker, verifiziert durch erneutes Lesen des Werts); AX-select-then-paste-over-selection fĂŒr Electron / Chromium / Mac-Catalyst-Apps, die `AXValue` read-only freigeben (WhatsApp, Slack, Discord, VS Code â v0.12.0); und ein Clipboard+Keystroke-Fallback fĂŒr alles andere. Der Diagnose-Button in Settings sagt, welcher Pfad benutzt wurde.
- *Warum `Alt+1` und nicht `Alt+Backquote`?* Der alte Default war auf deutschen ISO-MacBooks unerreichbar (die physische `^`-Taste meldet sich als `IntlBackslash`). Ziffernreihe-Tasten sind layout-stabil ĂŒberall. Ein un-customised alter Install wird einmal beim Upgrade auf `Alt+1` migriert (ĂŒberschreibt keinen Wert, den du absichtlich neu gewĂ€hlt hast).
- **Direct hotkey â snippet slots (v0.13.0)** â binde einen Hotkey direkt an ein Snippet (Settings â *Direct hotkey â snippet*); DrĂŒcken pasted den Body am Cursor mit **keiner getippten Abbreviation**. Liest nichts vom fokussierten Feld â schreibt nur den Body auf die Zwischenablage, synthetisiert Paste, stellt die Zwischenablage wieder her â funktioniert daher in **jeder** App, **inklusive Terminals** (iTerm2, Terminal.app, âŠ), wo der Abbreviation-Expander die Input-Zeile nicht sehen kann. Kollisionen mit Popup-/OCR-/Abbreviation-Hotkeys werden abgelehnt.
- **Laut bei Permission-Fail (macOS, v0.12.0)** â wenn Accessibility nicht erteilt ist, no-opt der Hotkey nicht lĂ€nger still: Inspector Rust öffnet sein Popup, wechselt auf Settings und zeigt ein amber Banner mit `Force re-grant` â `Restart now`. (Selbes Pattern wie OCR-/Paste-Banner. Direct Slots nutzen dasselbe Gate + Banner.)
- **Snippets-Tab** zum Erstellen/Editieren/Löschen mit zweispaltigem Formular. **JSON-Import** via Snippets â Import (`docs/snippets-import.md`, thematische Samples in `docs/examples/snippets/`).
- Caveat: der **Abbreviation**-Expander kann auf einer Terminal-Befehlszeile nicht funktionieren (keine AX-exponierte Input-Zeile, kein GUI-"vorheriges Wort markieren" auf einem Shell-Prompt â benutze in Terminals einen *Direct hotkey â snippet*-Slot oder das Popup). Image-/Files-Snippets werden nicht expandiert (nur Text).
- Volle Referenz: [`docs/text-expander.md`](./docs/text-expander.md).
### 25 gebĂŒndelte AI-Prompt-Snippets (v0.5.0, ĂŒberarbeitet v0.12.0)
First-Launch seedet deine Snippet-Tabelle mit `ai*`-prefixed Prompts ĂŒber Programmierung, Web, IT-Security, Business, Daten und API-Design (`aiplan`, `aireview`, `airefactor`, `airegex`, `aisql`, `aitest`, `aimigration`, `aithumb`, `aithreat`, `aipentest`, `aibrief`, `aiml`, `aiapi`, âŠ). Jeder Prompt ist die **strukturierte Anweisungs-HĂ€lfte only** â keine `[REQUIREMENT]`-artigen Fill-in-Slots (entfernt in v0.12.0). Du hĂ€ngst ihn an deinen eigenen Prompt / Code / Kontext an und das LLM nimmt das Thema von dort auf. Idempotent (gelöschte Prompts bleiben gelöscht), wiederherstellbar von der Snippets-Sidebar â existierende Installs klicken *Restore defaults*, um den v0.12.0-Stil aufzugreifen. Komplette Liste: [`docs/ai-prompts.md`](./docs/ai-prompts.md).
### Inline-Taschenrechner (v0.2.5)
Tippe einen Mathe-Ausdruck ins Suchfeld, das Ergebnis erscheint als oberster Listen-Eintrag â Alfred-Style. Enter zum Pasten.
- Operatoren `+ - * / % ^`, unĂ€r `+/-`, Klammern. Zahlen: int/dezimal/wissenschaftlich/`1_000`-gruppiert. Konstanten: `pi`/`Ï`, `tau`, `e`. Funktionen: `sqrt`, `cbrt`, `abs`, `sign`, `floor`/`ceil`/`round`, `ln`/`log`/`log2`, `exp`, Trig + Hyperbolisch + Invers, `min`/`max`/`pow`/`mod`.
- Aktiviert nur bei AusdrĂŒcken mit mindestens einem Operator/Function/Konstante â pure Zahlen und Text triggern nicht. Force-Evaluation einer Literale mit `=`-Prefix (`=pi`).
- Sicherer Recursive-Descent-Parser in [`calc.ts`](./core/frontend/src/lib/calc.ts), kein `eval`. 27 Tests.
### Farb-Tools (v0.4.0 â v0.5.2)
- **Inline-Hex-Preview** â tippe `#3366FF` (auch `3366ff`, `#abc`, `#abcdef12`) â Swatch + Hex + RGB-Zeile oben â Enter pasted GroĂbuchstaben `#RRGGBB`.
- **HSV-Picker-Modal** â Hue-Slider, groĂes Swatch, Output-Tabs fĂŒr Hex / RGB / HSL, Zwei-Klick-Auswahl (kein stiller Default), Copy via Tauri-Clipboard-Plugin (umgeht WKWebView-Restriktionen).
- **Pixel vom Bildschirm picken** â sample irgendein Pixel auf dem Desktop. macOS: Apples `NSColorSampler`-Lupe. Windows: Fullscreen-Overlay + `GetPixel`. Modul: [`screen_picker.rs`](./core/rust-lib/src/screen_picker.rs).
- Frontend in [`colors.ts`](./core/frontend/src/lib/colors.ts) + [`ColorPickerModal.tsx`](./core/frontend/src/components/ColorPickerModal.tsx). 32 Tests. Referenz: [`docs/colors.md`](./docs/colors.md).
### Bildschirm-Region-OCR (v0.9.0, macOS)
DrĂŒck `Ctrl+Shift+O` (oder nutze den Tray-Eintrag **OCR Region**) â Marquee ĂŒber jeden Text auf dem Bildschirm ziehen â Inspector Rust lĂ€uft Apple Vision ĂŒber die Auswahl und schreibt den erkannten Text direkt auf deine Zwischenablage. Der Text landet oben in der History; das Source-PNG wird als separater Image-Eintrag direkt darunter aufbewahrt, sodass du eine andere Region nochmal OCR'en kannst ohne den Screenshot neu zu machen, und Enter auf dem auto-selected Top-Eintrag pasted den **Text**, nicht den Screenshot (Ordering gefixt in v0.14.2). Der Hotkey ist **literal Control** auch auf macOS (v0.14.1+ â frĂŒhere Builds nutzten `ââ§O`, was mit IDE-Bindings kollidierte).
- **Region-Picker** â nutzt `screencapture -i` (dasselbe Binary wie Cmd+Shift+4), sodass die Marquee-UX die polierte ist, die User schon kennen. Esc cancelt sauber.
- **Engine** â Visions `VNRecognizeTextRequest` mit accuracy=Accurate + Sprach-Korrektur; selbe Engine, die Apple Live Text antreibt. Kein Model-Bundling, kein Netzwerk.
- **Sprachen** â was auch immer dein macOS-Vision-Install unterstĂŒtzt (Latein + CJK + Arabisch + Kyrillisch auf macOS 13+).
- **Windows** *(v0.19.2+)* â implementiert via WinRT `Windows.Media.Ocr` + `Windows.Graphics.Imaging`. Nutzt die bereits auf deinem Windows-System installierten Sprachpakete (Einstellungen â Zeit & Sprache â Sprache) â keine Extras nötig.
- Module: [`region_picker.rs`](./core/rust-lib/src/region_picker.rs), [`ocr.rs`](./core/rust-lib/src/ocr.rs).
### Image-Tools â Recolor + ML-Cutout + Save (v0.7.0 â v0.10.x)
Auf ausgewÀhlten Image-EintrÀgen zeigt das Preview-Panel drei Aktionen:
- **Recolor** (v0.7.0) â fĂŒr ĂŒberwiegend graustufige PNGs (Logos / Icons / Silhouetten), 9 Preset-Swatches + Custom-Hex fĂ€rben das Bild. RGB-Lerp von Target â WeiĂ pro Pixel-Luminanz, Alpha bleibt erhalten. GesĂ€ttigte Fotos werden automatisch aus der Toolbar versteckt (Chromaticity-Gate). FĂŒgt die getintete Version als neuen History-Eintrag hinzu; das Original bleibt.
- **Cut out background** (v0.10.0) â lĂ€sst das **UÂČ-Net (U2Netp) ONNX-Model** (~4,5 MB embedded) ĂŒber das Bild laufen, um das Foreground-Subject zu detektieren; Output ist ein transparentes PNG, gespeichert nach `~/Downloads/-cutout-.png`. Shortcut `Cmd/Ctrl+B`. Funktioniert mit echten Fotos (Flugzeug am Himmel, Person vor unruhigem Hintergrund, âŠ) â selbe Architektur wie Pythons `rembg`, nur ohne Python. Inference lĂ€uft via `ort` (ONNX Runtime, statisch ins Binary gelinkt).
- **Save to Downloads** (v0.10.1) â drop den ausgewĂ€hlten Image-Eintrag auf die Platte als `~/Downloads/inspector-rust-image-.png` unverĂ€ndert. Shortcut `Cmd/Ctrl+S`. Companion zum Recolor: wĂ€hle den frisch-getinteten History-Eintrag, drĂŒck `Cmd+S`, deine Datei liegt in Downloads.
- **Inputs:** PNG, JPEG, WebP, GIF, BMP â fĂŒr Clipboard-Image-EintrĂ€ge *und* Single-File-Files-EintrĂ€ge (eine aus Finder kopierte JPG funktioniert also auch). Output ist immer RGBA-PNG.
- Module: [`recolor.rs`](./core/rust-lib/src/recolor.rs), [`cutout_ml.rs`](./core/rust-lib/src/cutout_ml.rs). Der Legacy-Chroma-Key-Cutout in [`cutout.rs`](./core/rust-lib/src/cutout.rs) wird als Fast-Path-Option behalten, aber per Default nicht benutzt. 16-MP-Cap auf Inputs. GebĂŒndeltes Model: [`core/rust-lib/models/u2netp.onnx`](./core/rust-lib/models/u2netp.onnx) (Apache-2.0).
### Notes (v0.2.6)
Persistente, kategorisierte Clipboard-Items in einer separaten SQLite-Tabelle â **nicht** unterworfen dem 1 000-EintrĂ€ge-Pruning.
- **Bookmark aus History** â Hover ĂŒber jede Zeile â Bookmark-Icon â Eintrag landet in Notes/`Uncategorized`. Entkoppelt vom Source-Clip; ĂŒberlebt Pruning.
- **Notes-Tab** â drei Panes: Kategorien-Sidebar (mit Counts; virtuelle `All` / `Uncategorized`), Liste, Detail/Edit. Frei-formige Kategorien (``-Autocomplete). Editierbare Bodies fĂŒr Text/HTML/RTF; Image-/Files-Notes sind read-only. Per-Row-Delete + Clear All mit BestĂ€tigung.
- **+ New Note** fĂŒr from-Scratch-EintrĂ€ge. Tray-Shortcut: **Manage Notes** öffnet das Popup direkt hier.
- Referenz: [`docs/notes.md`](./docs/notes.md).
### Backup â Single-File-JSON-Export/Import (v0.2.6+)
Settings-Tab â *Backup & restore* â History / Snippets / Notes einzeln ankreuzen â Export in eine JSON-Datei. Import merged zurĂŒck: Snippets upsert nach Abbreviation, History upsert nach SHA-256, Notes appended. Versioniertes Schema â neuere Backups werden abgelehnt statt still zu kappen. Referenz: [`docs/backup.md`](./docs/backup.md).
### Plain-Text-Paste (Default an, v0.4.0)
HTML- / RTF-Clipboard-EintrĂ€ge werden zur Paste-Zeit auf ihren Text-Preview gestrippt, sodass Copy-aus-Word / -Browser / -Mail nicht lĂ€nger Styling in andere Apps leakt. Toggle in Settings â Paste. Shift+Enter im Popup ĂŒberschreibt fĂŒr einen Paste.
### Permissions-UX (v0.11.0)
Inspector Rust braucht **zwei** unabhĂ€ngige macOS-TCC-Grants â Accessibility (Paste + Text-Expander) und Bildschirmaufnahme (OCR + Screenshot-Region). Der Settings-Tab zeigt jeden als zusammenklappbares amber Banner, das:
- Laut bleibt (Border + Warn-Icon + primĂ€rer `Open System Settings`-Button), wenn fehlend, aber per Default zu einer einzelnen Zeile kollabiert, damit die Page nicht zugemĂŒllt ist.
- Pre-checked, bevor der relevante native Call invoked wird. OCR returnt eine `screen.permission_denied`-Sentinel statt still zu failen, wenn Bildschirmaufnahme verweigert ist; ein Tauri-Event öffnet das Popup + flippt ein In-App-Toast-Banner, das auf den richtigen Pane zeigt.
- Pollt das Grant einmal pro Sekunde, solange nicht erteilt, sodass das Badge ~1 s nach dem Toggle in den System Settings auf grĂŒn flippt â kein Panel-Reload nötig.
- Jedes Banner hat einen `tccutil reset`-Recovery-Button fĂŒr den "Toggle ist an, aber der laufende Prozess sieht immer noch denied"-Stale-cdhash-State.
### Discoverability (v0.10.7)
- **Footer-Hints** â `ââ§O OCR` + `ââ§S Shot` + `ââ§C Color` neben dem `â Paste · ââ Navigate · Esc Close`-Strip gerendert, sodass User alle globalen Shortcuts jedes Mal sehen, wenn sie das Popup öffnen.
- **Settings â Keyboard shortcuts** â Drei-Gruppen-Cheat-Sheet (Global / Popup-Nav / Image-Actions), das jeden Shortcut der App abdeckt. Modifier-Glyphs (`â` vs `Ctrl`, `â§` vs `Shift`, `â„` vs `Alt`) passen sich ans laufende OS an via dem `IS_MAC`-Helper in [`core/frontend/src/lib/platform.ts`](./core/frontend/src/lib/platform.ts).
- **About-Dialog** â Settings â About öffnet ein Modal mit Version, License, Jahr, Zielgruppe und einer tabellarischen Tech-Stack-Ăbersicht.
### Screenshot-Vorschau-HUD + Editor (v0.32.0)
- **CleanShot-X-Style-HUD** â nach `Ctrl+Shift+S` schwebt der PNG als Hintergrund einer kleinen dunklen Karte mit sechs Controls darĂŒber: **X** (oben-links, verwerfen), **Pin** (oben-rechts, Vorschau ĂŒber nĂ€chsten Screenshot halten), **Copy** + **Save** (mittlere Pillen), **Stift** (Editor öffnen), **Cloud** (Placeholder â kommt noch).
- **App-Name im Dateinamen** â `osascript` liest die Frontmost-App *bevor* der Region-Picker startet; gespeicherte Datei wird `Safari-20260524-153012.png`. Alphabetische Sortierung im Finder gruppiert nach App. Bearbeitete Varianten bekommen `-edited` Suffix.
- **Annotations-Editor** â Stift öffnet ein separates Tauri-Fenster mit fĂŒnf Tools: **Pfeil / Text / Rect / Highlight / Blur** (Mosaik-Pixelung, sampled aus der Quelle, also Undo non-destruktiv). 4 Farb-Presets, 2â16 px Stroke. Hotkeys: `âZ`/`ââ§Z` undo/redo, `âS` speichern, `Esc` abbrechen, Tool-Switches per Einzel-Taste (`A`/`T`/`R`/`H`/`B`). Canvas ist in nativer Pixel-Auflösung des Screenshots, das gespeicherte PNG also full-resolution.
- **Pin-Verhalten** â solange gepinnt, schreibt der nĂ€chste Screenshot zwar weiterhin in Clipboard + History, ersetzt aber nicht die sichtbare Vorschau. NĂŒtzlich fĂŒr Batch-Capture-and-Annotate-Workflows.
### Finder-Selection-Actions (v0.30.0, macOS)
- **`Ctrl+Shift+F`** â `osascript` liest die Finder-Selection (mit TCC-AutomationâFinder-Grant, beim ersten Mal angefragt). Popup öffnet sich mit den selektierten Dateien an der Spitze, jede mit `finder`-Chip.
- **Multi-File-`rz`** â `rz 1200x800` im Finder-Mode skaliert jedes selektierte Bild, schreibt `-1200x800.` neben Quelle (Format bleibt). Originale unangetastet.
- **Multi-File-`optim`** â gleiche Form: oxipng auf jedes selektierte PNG, schreibt `-optim.png` neben Quelle. Non-PNG-Selektionen werden ĂŒbersprungen (oxipng-only).
- **Permission via Settings** â die macOS-Permission-Karte hat drei Zeilen (Bedienungshilfen · Bildschirmaufnahme · Automation â Finder); "Set up permissions" cyclet alle drei mit einem Klick via `tccutil reset` + Re-Prompt.
### Bruno â Brutto/Netto-Rechner (v0.33.0)
- **Befehl** â `bruno 60000` (jĂ€hrlich) oder `bruno 5000m` (monatlich) im Suchfeld. Ergebnis-Zeile zeigt Netto/Monat + Netto/Jahr inline; Preview-Panel zeigt volle Aufteilung (KV / PV / RV / AV + ESt / Soli / Kirche + Abgabenquote + Grenzsteuersatz).
- **Smart Defaults** â Steuerklasse I, NRW, 0 Kinder, kein Kirchen-Mitglied, TK-Niveau 2,45 % KV-Zusatz. Persönliche Werte via **Settings â Bruno** (in SQLite-Settings persistiert; `bruno-defaults-changed`-Event aktualisiert das Popup ohne Restart).
- **Steuerjahr 2025** â §32a EStG (vereinfacht), Grundfreibetrag 12.096 âŹ, Beitragsbemessungsgrenzen KV 66.150 ⏠/ RV 96.600 âŹ. Portiert aus der [Steuerschleuder](https://steuerschleuder.celox.io/)-Web-App des Maintainers.
- **Pure-TS-Compute** â kein IPC-Roundtrip pro Tastendruck. Zahlenformat-toleranter Parser (`bruno 60.000` = `bruno 60,000` = `bruno 60000`). 32 Unit-Tests pinnen Compute + Parser. â ïž Vereinfacht â kein Faktorverfahren, keine individuellen FreibetrĂ€ge. Keine Steuerberatung.
### `freeze` (v0.28.0)
- Natives macOS-`CGEventTap` (raw FFI auf `ApplicationServices` + `CoreFoundation`) blockt alle Tastatur- + Maus-Eingaben bis der konfigurierte Unlock-Chord (Default `i + r`) gedrĂŒckt wird. Installiert auf dem Main-Run-Loop via `CFRunLoopGetMain()` â Worker-Thread-Varianten haben Events auf Sonoma+ stillschweigend nicht gedroppt.
### `wakelock` (v0.29.0)
- **`wakelock=1`** (oder `wakelock1`) zum Aktivieren, **`wakelock=0`** zum Deaktivieren. Der Cursor springt alle 60 s 1 px nach rechts und sofort zurĂŒck â trickst macOS-Bildschirmschoner-/Display-Sleep-Timer aus, Teams- / Slack- / Discord-"Abwesend"-Detection, App-Level-Idle-UX. Worker nutzt Raw-FFI pro Plattform: macOS `CGEventCreateMouseEvent`, Windows `GetCursorPos` + `SetCursorPos`, Linux X11 `XQueryPointer` + `XWarpPointer` (gecachter `Display`). Wayland: no-op (Protokoll verbietet globale Cursor-Synth).
### System-Tray + Multi-Monitor
- **Tray-MenĂŒ:** Open · Manage Snippets · Manage Notes · **OCR Region (Ctrl+Shift+O)** · **Screenshot Region (Ctrl+Shift+S)** *(v0.15.0+)* · **Pick Color (Ctrl+Shift+C)** *(v0.17.0+)* · Pause Capture · â/â Start with Windows / Start at Login (Checkmark spiegelt State seit v0.14.0) · Clear History · Quit.
- **Autostart bei Login** (v0.14.0) â Toggle in Settings â Startup oder vom Tray-MenĂŒ. macOS schreibt `~/Library/LaunchAgents/InspectorRust.plist`; Windows nutzt den Run-Key-Registry-Eintrag. App startet hidden im Tray, sodass sie bereit ist, wenn der Popup-Hotkey trifft.
- **Multi-Monitor-Placement:** Popup öffnet auf dem Monitor mit dem Cursor, horizontal zentriert, ~â
von oben, geclamped auf die Bounds des aktiven Monitors (wichtig bei Mixed-DPI-Setups).
## Repository-Layout
```
inspector-rust/
âââ core/
â âââ frontend/ # React 19 + TS + Tailwind v4 (plattformĂŒbergreifend)
â â âââ src/
â â âââ components/ # SearchBar, HistoryList/Item, PreviewPanel, SnippetsPanel, NotesPanel, âŠ
â â âââ hooks/ # useClipboardHistory, useFuzzySearch, useSnippets, useNotes, useKeyboardNav
â â âââ lib/ # ipc.ts, types.ts, calc.ts (Alfred-Style-Evaluator), format.ts
â âââ rust-lib/ # Geteilte Rust-App-Logik
â âââ build.rs # Linkt das macOS Vision-Framework fĂŒr OCR
â âââ models/
â â âââ u2netp.onnx # UÂČ-Net Cutout-Model (~4,5 MB, Apache-2.0)
â âââ src/
â âââ lib.rs # Tauri-Builder, Plugin-/Tray-Setup, invoke_handler
â âââ commands.rs # alle #[tauri::command]-Wrapper
â âââ models.rs # ContentType / ClipEntry / NewClip + Caps
â âââ db.rs # entries-Table, Hash-Dedup, Prune
â âââ crypto.rs # AES-256-GCM At-Rest-Encryption + OS-Keychain-Key
â âââ snippets.rs # snippets-Table, JSON-Upsert, Exakt-Abbreviation-Lookup
â âââ seed.rs # Default-AI-Prompt-Snippets â First-Launch-Seeder + `Restore defaults`-IPC
â âââ seed/
â â âââ ai_prompts.json # 25 gebĂŒndelte AI-Prompts (~35 KB) â zur Compile-Zeit via include_str! eingelesen
â âââ notes.rs # notes-Table, Kategorien, save_from_clip
â âââ backup.rs # Full-App-Export/Import (versioniertes JSON)
â âââ settings.rs # Key/Value-Store (Expander-Hotkey + Zukunfts-Prefs)
â âââ ui_state.rs # suppress_hide-Flag fĂŒr Native-Modal-Interaktion
â âââ expander.rs # Trigger-basierter Text-Expander (AX/UIA primary, Clipboard-Fallback)
â âââ text_field/ # FieldAccess-Trait + macOS-AX + Windows-UIA-Implementierungen
â âââ paste.rs # write_to_clipboard + enigo-Paste-Shortcut
â âââ hotkey.rs # Global Ctrl+Shift+V + Ctrl+Shift+O + Ctrl+Shift+S + Ctrl+Shift+C + Expander-Hotkey + Direct Slots
â âââ clipboard_watcher.rs # Event-getriebene Capture, RTF-Stripping (Image > Files-PrioritĂ€t)
â âââ recolor.rs # Image-Tint (Lerp Target â WeiĂ nach Per-Pixel-Luminanz)
â âââ cutout.rs # Legacy Chroma-Key-Cutout (als Fast-Path-Option behalten)
â âââ cutout_ml.rs # UÂČ-Net-basierter Subject-Cutout via `ort` (ONNX Runtime)
â âââ image_ops.rs # `rz` Resize (Lanczos3) + `optim` PNG-Optimierung (oxipng)
â âââ system_commands.rs # `kill` / `reboot` / `shutdown` / `lock` (sysinfo + osascript)
â âââ screen_picker.rs # Farb-Eyedropper (NSColorSampler / GDI-Overlay)
â âââ region_picker.rs # screencapture-i (macOS) / GDI-Overlay (Windows) â OCR + Screenshot
â âââ ocr.rs # Apple Vision (macOS) / Windows.Media.Ocr (Windows)-Wrapper
â âââ screen_recording.rs # macOS-Bildschirmaufnahme-TCC-Permission-API â gated OCR + Screenshot
âââ win/ # Windows-spezifische Bundle-Shell
â âââ README.md # Windows-Install- & Build-Details
â âââ package.json # Tauri-CLI-Entry
â âââ src-tauri/ # main.rs, Cargo.toml, tauri.conf.json, capabilities/, icons/
âââ macos/ # macOS-spezifische Bundle-Shell
â âââ README.md # macOS-Install, Gatekeeper, Accessibility, Troubleshooting
â âââ package.json
â âââ src-tauri/ # entitlements.plist, tauri.conf.json (dmg+app), capabilities/
âââ .github/
â âââ workflows/
â âââ ci.yml # Rust- + Frontend-Tests bei jedem Push/PR
â âââ release.yml # Baut Bundles und published GitHub-Release bei v*-Tags
âââ docs/
â âââ spec.md # Originale Produkt-Spezifikation
â âââ snippets-import.md # JSON-Snippet-Import â Schema, Semantik, Beispiele
â âââ notes.md # Notes-Feature â Kategorien, Edit-Semantik, IPC-Surface
â âââ backup.md # Full-App-Export/Import â Schema, Merge-Semantik, jq-Rezepte
â âââ text-expander.md # System-weiter Expander â Workflow, Hotkey-Format, Per-OS-Caveats
â âââ colors.md # Inline-Hex-Preview + Custom-HSV-Picker + System-Eyedropper
â âââ ai-prompts.md # 25 gebĂŒndelte Default-AI-Prompt-Snippets
â âââ encryption.md # AES-256-GCM At-Rest-Encryption â Threat-Model, Key-Storage, Migration
â âââ RELEASING.md # Release-Procedure
â âââ ir-w1024.png # Brand-Artwork â README-Hero + Inline-Image (1024Ă1024, ~1,9 MB)
â âââ examples/
â âââ snippets/ # 5 thematische JSON-Beispiele + eigene README
âââ scripts/
â âââ check.sh # cargo clippy + tsc + eslint
â âââ install-macos.sh # Idempotenter Build + Re-Sign + Install (erhĂ€lt TCC-Grants ĂŒber Rebuilds hinweg)
âââ Cargo.toml # Rust-Workspace (Members: core/rust-lib, win/src-tauri, macos/src-tauri)
âââ pnpm-workspace.yaml # pnpm-Workspace (core/frontend, win, macos)
âââ package.json # Root-Scripts: dev:{win,macos}, build:{win,macos}, lint, typecheck, format, test, check
```
## Quick Start
### Prerequisites
| Tool | Version | Hinweise |
|------|---------|----------|
| [Rust](https://rustup.rs/) | stable | MSVC-Toolchain auf Windows; `rustup component add clippy` ausfĂŒhren |
| [Node.js](https://nodejs.org/) | 20+ | |
| [pnpm](https://pnpm.io/) | 10+ | `npm install -g pnpm` |
Plattformspezifische Prerequisites:
- **Windows** â [`win/README.md`](./win/README.md) (WiX, MSVC-Build-Tools, WebView2)
- **macOS** â [`macos/README.md`](./macos/README.md) (Xcode CLT, Gatekeeper, Accessibility-Permission)
### Install & run
```bash
pnpm install # installiert den ganzen Workspace (CI nutzt --frozen-lockfile)
# Windows
pnpm dev:win # tauri dev â Live-Reload
pnpm build:win # â target/release/bundle/msi/InspectorRust_x.x.x_x64_en-US.msi
# macOS
pnpm dev:macos # tauri dev â Live-Reload
pnpm build:macos # â target/release/bundle/{macos/InspectorRust.app, dmg/InspectorRust_x.x.x_.dmg}
bash scripts/install-macos.sh # build + re-sign + install nach /Applications + launch
bash scripts/install-macos.sh --reset # âŠauch tccutil-reset stale Accessibility-Grants (nach First-Run nutzen)
```
> Warum der `install-macos.sh`-Helper? Ohne Apple-Developer-ID kriegt jedes frische `pnpm build:macos` einen neuen zufĂ€lligen Signing-Identifier, was macOS-TCC dazu bringt, jedes Rebuild als neue App zu behandeln und erneut nach Accessibility zu fragen. Das Script erzwingt einen stabilen ad-hoc Bundle-Identifier, sodass das Grant ĂŒber Rebuilds hinweg ĂŒberlebt. Voller Hintergrund: [`macos/README.md` â Accessibility-Permission](./macos/README.md#why-the-dialog-re-appears-after-every-rebuild-and-how-to-stop-that).
> Jede Plattform muss auf ihrem nativen Host gebaut werden (Windows fĂŒr MSI, macOS fĂŒr DMG/`.app`). Cross-Compilation wird nicht unterstĂŒtzt.
### Snippet-Import
In Inspector Rust: Popup öffnen (`Ctrl+Shift+V`) â **Snippets**-Tab â **Import** â eine `.json`-Datei auswĂ€hlen. Der native File-Picker öffnet (NSOpenPanel auf macOS, OpenFileDialog auf Windows); existierende Abbreviations werden in-place upsert, sodass Re-Import derselben Datei idempotent ist.
**Ready-to-import-Samples** in [`docs/examples/snippets/`](./docs/examples/snippets/):
| Datei | Snippets | Thema |
|-------|----------|-------|
| [`getting-started.json`](./docs/examples/snippets/getting-started.json) | 3 | Adresse, E-Mail, deutsche Signatur â First-Import-Test |
| [`signatures.json`](./docs/examples/snippets/signatures.json) | 4 | E-Mail-Signaturen (DE/EN, kurz, OOO-Template) |
| [`dev.json`](./docs/examples/snippets/dev.json) | 8 | Shebang, MIT-Header, fn-Skeletons, gitignore, Commit-Msg |
| [`markdown.json`](./docs/examples/snippets/markdown.json) | 5 | Headings, Table, ``, PR-Body |
| [`wrapped-form.json`](./docs/examples/snippets/wrapped-form.json) | 2 | Demonstriert `{ "snippets": [...] }`-Shape |
Siehe [`docs/snippets-import.md`](./docs/snippets-import.md) fĂŒr das volle Schema, die Field-Semantik, das sqlite3+jq-Export-Rezept und Tips/Anti-Patterns.
### Notes & Backup
Notes haben ihren eigenen Tab; die Kategorien-Sidebar hat **+ New Note** und **Clear All**. Backup lebt jetzt im **Settings**-Tab.
- **Clipboard-Eintrag als Note speichern:** Hover ĂŒber jede History-Zeile â Bookmark-Icon klicken â Eintrag landet im `Uncategorized`-Bucket des Notes-Tabs. Verschiebe ihn durch Editieren der Note in eine Kategorie.
- **Full-Backup exportieren:** Settings-Tab â **Backup & restore** â was exportieren ankreuzen (Clipboard-History / Snippets / Notes â alle Default an) â **ExportâŠ** â Pfad wĂ€hlen. Inspector Rust schreibt eine einzelne JSON-Datei (Default-Name `inspector-rust-backup-.json`); ungeticked Sektionen werden als leere Arrays geschrieben, sodass du Snippets teilen kannst ohne deine Zwischenablage zu leaken.
- **Backup importieren:** Settings-Tab â **Backup & restore** â **ImportâŠ** â die JSON-Datei wĂ€hlen. Snippets und History mergen nach ihren natĂŒrlichen Keys (Abbreviation / SHA-256-Hash); Notes werden appended. Notes- / Snippets- / History-Tabs aktualisieren sich automatisch.
Volle Feature-Referenz: [`docs/notes.md`](./docs/notes.md). Backup-Datei-Schema und Merge-Semantik: [`docs/backup.md`](./docs/backup.md).
### Tests
```bash
pnpm test # Frontend-Unit-Tests (vitest + happy-dom) â 86 Tests
cargo test --workspace # Rust-Unit-Tests â 110 Tests (db, snippets, notes, backup, settings, expander, text_field, seed, hotkey-Parser, clipboard_watcher, models, recolor, cutout, cutout_ml)
```
Die gleichen Commands laufen in [GitHub-Actions-CI](./.github/workflows/ci.yml) bei jedem Push und PR.
### Statische Analyse
```bash
pnpm check # cargo clippy (Workspace) + tsc --noEmit + eslint
```
## Bekannte EinschrÀnkungen
| EinschrÀnkung | Detail |
|---------------|--------|
| **Scope der At-Rest-Encryption** | Sensitive Inhalte (Clipboard-Text/-HTML/-RTF/-Bilder, Snippet-Bodies, Note-Bodies) sind AES-256-GCM-verschlĂŒsselt at-rest mit einem per-Install zufĂ€lligen 256-Bit-Key (v0.6.0+). Key lebt im OS-Keychain; fĂ€llt zurĂŒck auf eine 0600-Keyfile im Data-Dir, wenn der Keychain nicht verfĂŒgbar ist. **Nicht verschlĂŒsselt:** Timestamps, Content-Type-Tags, Dedup-Hashes, Snippet-Abbreviations, Note-Titles/-Kategorien â keines davon verrĂ€t Clipboard-Inhalt. Volle Referenz: [`docs/encryption.md`](./docs/encryption.md). |
| **Keine Sensitive-App-Detection** | Inspector Rust erfasst alles ohne Filterung. |
| **Kein Cloud-Sync** | Kein automatischer Sync oder Multi-Device-Support â aber der [Backup](./docs/backup.md)-Export/Import gibt dir eine portable JSON-Datei, die du manuell zwischen Maschinen bewegen kannst. |
| **File-Paste-Fallback** | Das Setzen von File-List-Clipboard-Payloads aus Rust wird nicht universell unterstĂŒtzt; Inspector Rust fĂ€llt zurĂŒck darauf, die Newline-joined Liste der Pfade als Text zu pasten. |
| **Expander in Terminals: nimm einen Direct Slot** | Der *Abbreviation*-Expander macht nichts auf einer Terminal-Befehlszeile (Terminal.app, iTerm2, kitty, âŠ) â Terminals exponieren die Input-Zeile nicht via Accessibility, und ein Shell-Prompt hat kein GUI-"vorheriges Wort markieren". Nimm dort einen **Direct hotkey â snippet**-Slot (v0.13.0 â pasted ohne irgendwas zu lesen, funktioniert ĂŒberall) oder das Popup (`Ctrl+Shift+V` â suchen â Enter). Electron- / Chromium- / Mac-Catalyst-Apps (WhatsApp, Slack, VS Code, âŠ) *werden* vom Abbreviation-Expander seit v0.12.0 unterstĂŒtzt, via einen AX-select-then-paste-Pfad. |
| **macOS Accessibility** | Paste-Simulation (`enigo`) und der system-weite Text-Expander brauchen Accessibility-Zugriff. Erteile es einmal in Systemeinstellungen â Datenschutz & Sicherheit â Bedienungshilfen. Falls fehlend, zeigt Inspector Rust ein amber Banner mit einem `Open Settings`-Button beim nĂ€chsten Paste-Versuch â und seit v0.12.0 auch beim DrĂŒcken des Expander-Hotkeys â statt still zu failen oder den System-Dialog erneut zu feuern (v0.5.1 / v0.12.0). |
| **macOS Bildschirmaufnahme** | OCR (`Ctrl+Shift+O`) **und** Screenshot-Region (`Ctrl+Shift+S`, v0.15.0+) brauchen beide Bildschirmaufnahme-Zugriff â `screencapture -i` wird Inspector Rust zugeordnet und macOS verweigert es ohne das Grant. Pre-checked via `CGPreflightScreenCaptureAccess`; fehlende Permission öffnet das Popup + zeigt ein amber Banner, das auf den richtigen Privacy-Pane zeigt (v0.11.0). |
| **macOS unsigned Build** | Release-Builds sind nicht notarized. macOS warnt eventuell "unidentified developer" â Rechtsklick auf die App und **Open** wĂ€hlen, um Gatekeeper beim ersten Launch zu umgehen. |
| **macOS Rebuild â Re-Grant** | `cdhash` Ă€ndert sich bei jedem source-affecting Rebuild, was vorherige TCC-Grants invalidiert. `scripts/install-macos.sh` skipt das Re-Signing, wenn der Source-Hash unverĂ€ndert ist, sodass casual Rebuilds ĂŒberleben; echte Source-Ănderungen brauchen weiterhin Re-Granting. |
| **Windows-OCR-Sprachpakete** | Die Windows-OCR-Engine (`Windows.Media.Ocr`) nutzt die in Einstellungen â Zeit & Sprache â Sprache installierten Sprachpakete. Ist fĂŒr den auf dem Bildschirm dargestellten Text kein Paket installiert, schlĂ€gt die Engine mit einer beschreibenden Fehlermeldung fehl. Das fehlende Paket in den Windows-Einstellungen hinzufĂŒgen und erneut versuchen. |
| **Linux: Wayland-Shortcuts & Tools** | Globale Tauri-Shortcuts erhalten unter GNOME/Wayland oft keine Tastenevents â Inspector Rust registriert beim ersten Start automatisch GNOME/Cinnamon-`gsettings`-Custom-Keybindings (CLI-Flags `--toggle-popup` / `--ocr` / `--screenshot` / `--pick-color`). Region-Capture braucht `grim`+`slurp` (Wayland) bzw. `scrot` (X11), OCR braucht `tesseract` + Sprachpakete. Eyedropper und der In-Place-AX-Expander sind unter Linux noch nicht verfĂŒgbar (Clipboard-Paste-Fallback). Details: [`linux/README.md`](./linux/README.md). |
## BeitrÀge
BeitrĂ€ge sind willkommen â siehe [`CONTRIBUTING.md`](./CONTRIBUTING.md) fĂŒr den Dev-Workflow, Code-Style und wie man IPC-Commands oder neue Plattform-Shells hinzufĂŒgt.
## Releasing
Push ein `v*`-Tag, um den [Release-Workflow](https://github.com/pepperonas/inspector-rust/actions/workflows/release.yml) zu triggern, der die Windows-, macOS- und Linux-Bundles baut und an einen GitHub-Release attached. Volle Procedure (Version-Bumps, Pre-Flight-Checks, Troubleshooting) in [`docs/RELEASING.md`](./docs/RELEASING.md).
## Changelog
Siehe [`CHANGELOG.md`](./CHANGELOG.md) â jeder Release ist dokumentiert mit dem, was hinzugefĂŒgt, gefixt wurde, und etwaige bekannte Issues zu der Zeit.
## Entwickler
- **Martin Pfeffer** â Autor & Maintainer
- Kudos 2 Daniel
## License
[MIT](./LICENSE) â © 2026 Martin Pfeffer
A private open-source side project â built on weekends and evenings, made with â€ïž.
Brewed and shipped from Berlin đ»