{"id":50009074,"url":"https://github.com/pepperonas/inspector-rust","last_synced_at":"2026-05-30T02:02:04.730Z","repository":{"id":353548010,"uuid":"1219282782","full_name":"pepperonas/inspector-rust","owner":"pepperonas","description":"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.","archived":false,"fork":false,"pushed_at":"2026-05-25T00:06:11.000Z","size":27084,"stargazers_count":2,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-25T01:35:30.778Z","etag":null,"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"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pepperonas.png","metadata":{"files":{"readme":"README.de.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-23T18:06:26.000Z","updated_at":"2026-05-25T00:06:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pepperonas/inspector-rust","commit_stats":null,"previous_names":["pepperonas/clipsnap","pepperonas/inspector-rust"],"tags_count":75,"template":false,"template_full_name":null,"purl":"pkg:github/pepperonas/inspector-rust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pepperonas%2Finspector-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pepperonas%2Finspector-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pepperonas%2Finspector-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pepperonas%2Finspector-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pepperonas","download_url":"https://codeload.github.com/pepperonas/inspector-rust/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pepperonas%2Finspector-rust/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33677261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["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"],"created_at":"2026-05-19T21:01:28.454Z","updated_at":"2026-05-30T02:02:04.716Z","avatar_url":"https://github.com/pepperonas.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"right\"\u003e\n\n[🇬🇧 English](./README.md) · **🇩🇪 Deutsch**\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/ir-w1024.png?v=4\" alt=\"Inspector Rust — keyboard-first Clipboard-Toolkit\" width=\"600\" /\u003e\n\n  # Inspector Rust 🕵️‍♂️\n\n  \u003e **Keyboard-first Clipboard-Hyper-Toolkit — nativ auf macOS, Windows 11, Linux. Kein Electron, keine Cloud, keine Telemetrie.**\n\n  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.**\n\n  ### ✨ Was es kann (in kurz)\n\n  - 📋 **Clipboard-History** — Text, RTF, HTML, PNG, Datei-Listen; 1 000 Einträge per SHA-256 dedupliziert; Fuzzy-Suche while-you-type.\n  - 🧮 **Inline-Rechner** (`2+2`, `sqrt(144)`, Hex/Bit-Ops) und **Farb-Konverter** (`#hex` / `rgb()` / `hsl()` in jede Richtung).\n  - 🎯 **Text-Expander — 3 Modi**: In-Popup-Suche · System-Hotkey (AX/UIA-In-Place-Replace + Electron-Fallback) · Direct hotkey → snippet slots (funktioniert auch in Terminals).\n  - 🔍 **Bildschirm-Region-OCR** (`Ctrl+Shift+O`) — Apple Vision (macOS) / WinRT (Windows) / Tesseract (Linux). PDF-grade Texterkennung ins Clipboard.\n  - 📸 **Region-Screenshot** (`Ctrl+Shift+S`) + **CleanShot-X-Style Vorschau-HUD** + **Annotations-Editor** (Pfeil / Text / Rect / Highlight / Blur). Dateinamen enthalten den Quell-App-Namen.\n  - 🎨 **Color Picker** (`Ctrl+Shift+C`) — `NSColorSampler`-Lupe / GDI-Overlay / Hex direkt ins Clipboard.\n  - 📁 **Finder-Selection-Actions** (`Ctrl+Shift+F`, macOS) — Multi-File-Batch-Resize / Optim / Open auf was auch immer du im Finder selektiert hast.\n  - 🖼️ **Image-Tools** — Recolor (Logo-Einfärbung), ML-Cut-Out (U²-Net ONNX, 4,5 MB embedded), Lanczos3-Resize mit Preset-Autocomplete.\n  - 💸 **Bruno (Brutto/Netto)** — deutscher Einkommensteuer-Rechner 2025 als Suchfeld-Befehl. Smart Defaults + Per-User-Override in Settings.\n  - 🚀 **App-Launcher** (Spotlight-like, macOS) — App-Name antippen, echtes Icon in der Zeile, Enter startet. Aktiviert bereits laufende Instanz statt Duplikat zu spawnen.\n  - 🟢 **Wakelock-LED** — pulsierende rote LED + `wake` Label im Popup-Footer wenn `wakelock=1` aktiv. Event-driven, kein Polling.\n  - ⚙️ **Power-Commands** — `tr` / `tren` / `trde` (übersetzen), `rz` / `optim` (Image), `kill` / `lock` / `reboot` / `shutdown` / `mute` / `freeze` (System), `wakelock=1/0` (Wachhalten), `rmvvls` (Text).\n  - 📓 **Snippets** (25 gebündelte AI-Prompts) · **Notes** (persistente Lesezeichen) · **Backup** (Single-File-JSON-Export).\n  - 🔒 **Local-first** — null Netzwerk-Calls, null Account, Daten nur unter `~/Library/Application Support/InspectorRust/history.db`. Encryption-Keys verlassen nie deine Maschine.\n  - 🎮 **Versteckte Games** — drei Easter-Egg-Trigger-Wörter. Du findest sie schon.\n\n  ### 🧰 Tech-Stack\n\n  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.\n\n  \u003c!-- ── Lines of Code — XXL dynamischer Badge ─────────────────── --\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/pepperonas/inspector-rust\" title=\"Lines of code — live Zählung via aschey.tech/tokei\"\u003e\n      \u003cimg src=\"https://aschey.tech/tokei/github/pepperonas/inspector-rust?category=code\u0026style=for-the-badge\" height=\"60\" alt=\"Lines of code (live)\" /\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003c!-- ── Status / release ─────────────────────────────────────── --\u003e\n  [![Version](https://img.shields.io/badge/version-0.38.0-blue?style=flat-square)](https://github.com/pepperonas/inspector-rust/releases)\n  [![License: MIT](https://img.shields.io/badge/license-MIT-green?style=flat-square)](./LICENSE)\n  [![CI](https://img.shields.io/github/actions/workflow/status/pepperonas/inspector-rust/ci.yml?branch=main\u0026style=flat-square\u0026label=CI)](https://github.com/pepperonas/inspector-rust/actions/workflows/ci.yml)\n  [![Release](https://img.shields.io/github/actions/workflow/status/pepperonas/inspector-rust/release.yml?branch=main\u0026style=flat-square\u0026label=release)](https://github.com/pepperonas/inspector-rust/actions/workflows/release.yml)\n  [![Latest Release](https://img.shields.io/github/v/release/pepperonas/inspector-rust?style=flat-square\u0026label=download)](https://github.com/pepperonas/inspector-rust/releases/latest)\n  [![Last commit](https://img.shields.io/github/last-commit/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/commits/main)\n  [![Issues](https://img.shields.io/github/issues/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/issues)\n  [![Stars](https://img.shields.io/github/stars/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/stargazers)\n  [![Maintenance](https://img.shields.io/badge/maintained-yes-brightgreen?style=flat-square)](https://github.com/pepperonas/inspector-rust/commits/main)\n  [![Tests](https://img.shields.io/badge/tests-253%20Rust%20%2B%20401%20TS-success?style=flat-square)](https://github.com/pepperonas/inspector-rust/actions/workflows/ci.yml)\n  [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square)](./CONTRIBUTING.md)\n  [![Code Style](https://img.shields.io/badge/code%20style-clippy%20%2B%20eslint-orange?style=flat-square)](./scripts/check.sh)\n\n  \u003c!-- ── Platforms ────────────────────────────────────────────── --\u003e\n  [![Windows 11](https://img.shields.io/badge/Windows-11-0078D4?style=flat-square\u0026logo=windows11\u0026logoColor=white)](./win)\n  [![macOS](https://img.shields.io/badge/macOS-10.15+-000000?style=flat-square\u0026logo=apple\u0026logoColor=white)](./macos)\n  [![Apple Silicon](https://img.shields.io/badge/arm64-Apple%20Silicon-555555?style=flat-square\u0026logo=apple\u0026logoColor=white)](./macos)\n  [![x86_64](https://img.shields.io/badge/x86__64-supported-555555?style=flat-square)](#)\n  [![Linux](https://img.shields.io/badge/Linux-Ubuntu%20%7C%20Debian-brightgreen?style=flat-square\u0026logo=linux\u0026logoColor=white)](./linux/README.md)\n\n  \u003c!-- ── Stack ────────────────────────────────────────────────── --\u003e\n  [![Tauri 2](https://img.shields.io/badge/Tauri-2-FFC131?style=flat-square\u0026logo=tauri\u0026logoColor=white)](https://tauri.app)\n  [![Rust](https://img.shields.io/badge/Rust-stable-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://rustup.rs)\n  [![React 19](https://img.shields.io/badge/React-19-61DAFB?style=flat-square\u0026logo=react\u0026logoColor=black)](https://react.dev)\n  [![TypeScript 5](https://img.shields.io/badge/TypeScript-5-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org)\n  [![Vite 7](https://img.shields.io/badge/Vite-7-646CFF?style=flat-square\u0026logo=vite\u0026logoColor=white)](https://vitejs.dev)\n  [![Tailwind CSS v4](https://img.shields.io/badge/Tailwind-v4-38BDF8?style=flat-square\u0026logo=tailwindcss\u0026logoColor=white)](https://tailwindcss.com)\n  [![pnpm](https://img.shields.io/badge/pnpm-10-F69220?style=flat-square\u0026logo=pnpm\u0026logoColor=white)](https://pnpm.io)\n  [![Node 20](https://img.shields.io/badge/Node-20+-339933?style=flat-square\u0026logo=node.js\u0026logoColor=white)](https://nodejs.org)\n  [![SQLite](https://img.shields.io/badge/SQLite-bundled-003B57?style=flat-square\u0026logo=sqlite\u0026logoColor=white)](https://sqlite.org)\n  [![ONNX Runtime](https://img.shields.io/badge/ONNX%20Runtime-bundled-005CED?style=flat-square\u0026logo=onnx\u0026logoColor=white)](https://onnxruntime.ai)\n  [![Apple Vision](https://img.shields.io/badge/Apple%20Vision-Live%20Text-000000?style=flat-square\u0026logo=apple\u0026logoColor=white)](#)\n  [![U2Net](https://img.shields.io/badge/U%C2%B2--Net-cutout-orange?style=flat-square)](https://github.com/xuebinqin/U-2-Net)\n\n  \u003c!-- ── Security \u0026 ergonomics ───────────────────────────────── --\u003e\n  [![AES-256-GCM](https://img.shields.io/badge/encryption-AES--256--GCM-darkgreen?style=flat-square\u0026logo=letsencrypt\u0026logoColor=white)](./docs/encryption.md)\n  [![Keychain-backed](https://img.shields.io/badge/keys-OS%20keychain-555555?style=flat-square)](./docs/encryption.md)\n  [![Local-first](https://img.shields.io/badge/local--first-yes-brightgreen?style=flat-square)](#)\n  [![No telemetry](https://img.shields.io/badge/telemetry-none-brightgreen?style=flat-square)](#)\n  [![Offline](https://img.shields.io/badge/network-not%20required-brightgreen?style=flat-square)](#)\n  [![Power user](https://img.shields.io/badge/audience-power%20users-blueviolet?style=flat-square)](#)\n  [![Keyboard-first](https://img.shields.io/badge/UX-keyboard--first-blueviolet?style=flat-square)](#)\n\n  \u003c!-- ── Quality ─────────────────────────────────────────────── --\u003e\n  [![ESLint](https://img.shields.io/badge/ESLint-flat%20config-4B32C3?style=flat-square\u0026logo=eslint\u0026logoColor=white)](https://eslint.org)\n  [![Vitest](https://img.shields.io/badge/Vitest-3-6E9F18?style=flat-square\u0026logo=vitest\u0026logoColor=white)](https://vitest.dev)\n  [![cargo test](https://img.shields.io/badge/cargo%20test-216%20passing-success?style=flat-square\u0026logo=rust\u0026logoColor=white)](#)\n  [![vitest](https://img.shields.io/badge/vitest-224%20passing-success?style=flat-square\u0026logo=vitest\u0026logoColor=white)](#)\n  [![cargo clippy](https://img.shields.io/badge/cargo%20clippy-D%20warnings-success?style=flat-square\u0026logo=rust\u0026logoColor=white)](#)\n  [![tsc strict](https://img.shields.io/badge/tsc-strict-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white)](#)\n  [![Prettier](https://img.shields.io/badge/code%20style-Prettier-F7B93E?style=flat-square\u0026logo=prettier\u0026logoColor=black)](https://prettier.io)\n\n  \u003c!-- ── Community ───────────────────────────────────────────── --\u003e\n  [![Issues](https://img.shields.io/github/issues/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/issues)\n  [![Closed issues](https://img.shields.io/github/issues-closed/pepperonas/inspector-rust?style=flat-square\u0026color=success)](https://github.com/pepperonas/inspector-rust/issues?q=is%3Aissue+is%3Aclosed)\n  [![PRs](https://img.shields.io/github/issues-pr/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/pulls)\n  [![Stars](https://img.shields.io/github/stars/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/stargazers)\n  [![Forks](https://img.shields.io/github/forks/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/network/members)\n  [![Watchers](https://img.shields.io/github/watchers/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/watchers)\n  [![Contributors](https://img.shields.io/github/contributors/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/graphs/contributors)\n  [![Last commit](https://img.shields.io/github/last-commit/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/commits/main)\n  [![Commit activity](https://img.shields.io/github/commit-activity/m/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust/commits/main)\n  [![Repo size](https://img.shields.io/github/repo-size/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust)\n  [![Code size](https://img.shields.io/github/languages/code-size/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust)\n  [![Top language](https://img.shields.io/github/languages/top/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust)\n  [![Languages](https://img.shields.io/github/languages/count/pepperonas/inspector-rust?style=flat-square)](https://github.com/pepperonas/inspector-rust)\n  [![Made with love](https://img.shields.io/badge/made%20with-%E2%99%A5-red?style=flat-square)](#)\n\n  \u003c!-- ── Architecture \u0026 build ────────────────────────────────── --\u003e\n  [![Monorepo](https://img.shields.io/badge/repo-pnpm%20workspace-F69220?style=flat-square\u0026logo=pnpm\u0026logoColor=white)](./pnpm-workspace.yaml)\n  [![Workspace crates](https://img.shields.io/badge/cargo%20workspace-3%20crates-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](./Cargo.toml)\n  [![Single binary](https://img.shields.io/badge/distribution-single%20binary-blue?style=flat-square)](#)\n  [![Native](https://img.shields.io/badge/no-Electron-success?style=flat-square)](#)\n  [![Memory](https://img.shields.io/badge/memory-%3C50%20MB-blue?style=flat-square)](#)\n  [![Cold start](https://img.shields.io/badge/cold%20start-%3C200%20ms-blue?style=flat-square)](#)\n  [![MSI size](https://img.shields.io/badge/MSI-~5%20MB-blue?style=flat-square\u0026logo=windows\u0026logoColor=white)](#)\n  [![DMG size](https://img.shields.io/badge/DMG-~5%20MB-blue?style=flat-square\u0026logo=apple\u0026logoColor=white)](#)\n  [![exe size](https://img.shields.io/badge/.exe-~14%20MB-blue?style=flat-square\u0026logo=windows\u0026logoColor=white)](#)\n\n  \u003c!-- ── Features (numerical) ────────────────────────────────── --\u003e\n  [![IPC commands](https://img.shields.io/badge/IPC%20commands-73-blueviolet?style=flat-square)](./core/rust-lib/src/commands.rs)\n  [![Tauri events](https://img.shields.io/badge/events-11-blueviolet?style=flat-square)](#)\n  [![Rust modules](https://img.shields.io/badge/Rust%20modules-24-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](./core/rust-lib/src)\n  [![Snippets](https://img.shields.io/badge/AI%20prompts-25%20bundled-blueviolet?style=flat-square)](./docs/ai-prompts.md)\n  [![Tabs](https://img.shields.io/badge/popup%20tabs-4-blueviolet?style=flat-square)](#)\n  [![DB tables](https://img.shields.io/badge/SQLite%20tables-4-003B57?style=flat-square\u0026logo=sqlite\u0026logoColor=white)](./docs/encryption.md)\n  [![Global shortcuts](https://img.shields.io/badge/global%20hotkeys-4-blueviolet?style=flat-square)](#)\n  [![Snippet expansion modes](https://img.shields.io/badge/expansion%20modes-3-blueviolet?style=flat-square)](./docs/text-expander.md)\n  [![Image formats](https://img.shields.io/badge/image%20formats-5-blueviolet?style=flat-square)](#)\n\n  \u003c!-- ── Standards / conventions ─────────────────────────────── --\u003e\n  [![SemVer](https://img.shields.io/badge/semver-2.0-blue?style=flat-square)](https://semver.org)\n  [![Keep a Changelog](https://img.shields.io/badge/changelog-Keep%20a%20Changelog-orange?style=flat-square)](https://keepachangelog.com)\n  [![Conventional Commits](https://img.shields.io/badge/commits-conventional-orange?style=flat-square)](https://www.conventionalcommits.org)\n  [![ARIA](https://img.shields.io/badge/a11y-keyboard%20first-blueviolet?style=flat-square)](#)\n  [![ADRs in CHANGELOG](https://img.shields.io/badge/ADRs-in%20CHANGELOG-orange?style=flat-square)](./CHANGELOG.md)\n\n  \u003c!-- ── Permissions / OS surfaces ───────────────────────────── --\u003e\n  [![macOS TCC: Accessibility](https://img.shields.io/badge/macOS%20TCC-Accessibility-000000?style=flat-square\u0026logo=apple\u0026logoColor=white)](./docs/text-expander.md)\n  [![macOS TCC: Screen Recording](https://img.shields.io/badge/macOS%20TCC-Screen%20Recording-000000?style=flat-square\u0026logo=apple\u0026logoColor=white)](#)\n  [![Autostart](https://img.shields.io/badge/autostart-LaunchAgent%20%2F%20RegRun-blue?style=flat-square)](./CHANGELOG.md)\n  [![Tray icon](https://img.shields.io/badge/UI-tray%20resident-blue?style=flat-square)](#)\n\n  \u003c!-- ── Tech (extended) ─────────────────────────────────────── --\u003e\n  [![rusqlite](https://img.shields.io/badge/rusqlite-bundled-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/rusqlite)\n  [![enigo](https://img.shields.io/badge/enigo-paste%20sim-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/enigo)\n  [![clipboard-rs](https://img.shields.io/badge/clipboard--rs-event%20driven-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/clipboard-rs)\n  [![ort](https://img.shields.io/badge/ort-ONNX%20Runtime-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/ort)\n  [![ring](https://img.shields.io/badge/ring-AES--256--GCM-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/ring)\n  [![objc2](https://img.shields.io/badge/objc2-Vision%20FFI-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](https://crates.io/crates/objc2)\n  [![Fuse.js](https://img.shields.io/badge/fuse.js-fuzzy%20search-005571?style=flat-square)](https://www.fusejs.io)\n  [![lucide-react](https://img.shields.io/badge/icons-lucide--react-F56565?style=flat-square)](https://lucide.dev)\n  [![react-virtual](https://img.shields.io/badge/list-react--virtual-FF4154?style=flat-square\u0026logo=react\u0026logoColor=white)](https://tanstack.com/virtual)\n\n  \u003c!-- ── Vibes ───────────────────────────────────────────────── --\u003e\n  [![Inspired by Alfred](https://img.shields.io/badge/inspired%20by-Alfred-blueviolet?style=flat-square)](#)\n  [![Mouse-free](https://img.shields.io/badge/mouse-not%20required-brightgreen?style=flat-square)](#)\n  [![Self-hosted](https://img.shields.io/badge/data-on%20your%20disk-brightgreen?style=flat-square)](#)\n  [![Free forever](https://img.shields.io/badge/free-forever-brightgreen?style=flat-square)](./LICENSE)\n  [![Made in Germany](https://img.shields.io/badge/made%20in-Germany-FFCE00?style=flat-square)](#)\n\n  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.\n\u003c/div\u003e\n\n---\n\n## Download\n\n**Aktueller Release:** [![Latest Release](https://img.shields.io/github/v/release/pepperonas/inspector-rust?style=flat-square\u0026label=latest\u0026color=green)](https://github.com/pepperonas/inspector-rust/releases/latest) — siehe [CHANGELOG](./CHANGELOG.md) für die Neuerungen.\n\n| Plattform | Datei | Hinweise |\n|-----------|-------|----------|\n| **Windows 11 / 10** | [`InspectorRust_\u003cver\u003e_x64_en-US.msi`](https://github.com/pepperonas/inspector-rust/releases/latest) | MSI-Installer — fügt Startmenü-Eintrag \u0026 Uninstaller hinzu |\n| **Windows 11 / 10** | [`inspector-rust.exe`](https://github.com/pepperonas/inspector-rust/releases/latest) | Standalone-Exe — keine Installation nötig |\n| **macOS 10.15+ (Apple Silicon)** | [`InspectorRust_\u003cver\u003e_aarch64.dmg`](https://github.com/pepperonas/inspector-rust/releases/latest) | DMG für arm64-Macs |\n| **macOS Intel** | — | Aus Source bauen: [`macos/README.md`](./macos/README.md) |\n| **Linux (Ubuntu/Debian)** | Aus Source bauen — siehe [`linux/README.md`](./linux/README.md) | `.deb` + AppImage via `pnpm build:linux` |\n\n\u003e **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 \u0026 Sicherheit → \"Trotzdem öffnen\"**. Dann **zwei** TCC-Permissions erteilen:\n\u003e - **Bedienungshilfen** — nötig für Paste (`enigo` synthetisiert Cmd+V) und den system-weiten Text-Expander (Cmd+Shift+← / Cmd+C / Cmd+V-Zyklus).\n\u003e - **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.\n\u003e\n\u003e Komplettes Setup in [`macos/README.md`](./macos/README.md).\n\n---\n\n## Plattform-Support\n\n| Plattform  | Status              | Verzeichnis           |\n|------------|---------------------|-----------------------|\n| Windows 11 | ✅ implementiert     | [`win/`](./win)         |\n| macOS      | ✅ implementiert     | [`macos/`](./macos)     |\n| Linux      | ✅ implementiert     | [`linux/`](./linux)     |\n\nDie 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).\n\n## Workflow\n\nInspector 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.\n\nDrei weitere globale Shortcuts feuern von überall — Inspector Rusts Fenster muss nicht offen oder fokussiert sein:\n\n- **`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.\n- **`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+)*.\n- **`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.\n\nLiteral 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.\n\nAlles 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.\n\n## Features \u0026 Shortcuts auf einen Blick\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/ir-w1024.png?v=4\" alt=\"Inspector Rust — Keyboard-first Clipboard-Toolkit\" width=\"600\" /\u003e\n\u003c/div\u003e\n\n### 🔥🔥🔥 Globale Hotkeys — fire and forget, von überall 🔥🔥🔥\n\n| Shortcut | Aktion | Benötigt (macOS) |\n|----------|--------|------------------|\n| `Ctrl+Shift+V` | Popup auf dem aktiven Monitor öffnen | — |\n| `Ctrl+Shift+O` | Bildschirm-Region-**OCR** → Text auf Clipboard + History | Bildschirmaufnahme |\n| `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)* |\n| `Ctrl+Shift+C` *(v0.17.0+)* | **Eyedropper** → Hex (`#RRGGBB`) auf Clipboard + History | — |\n| `Ctrl+Shift+F` *(v0.30.0+)* | **Finder-Selektion** → Popup mit gerade selektierten Dateien + Actions (Resize, Optim, …) | Automation → Finder |\n| `Alt+1` *(Default, konfigurierbar, opt-in)* | Snippet-Abbreviation in-place expandieren | Bedienungshilfen |\n| *(user-konfigurierbar)* | **Direct hotkey → snippet** — bestimmten Snippet-Body pasten | Bedienungshilfen |\n\nLiteral 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).\n\n### Popup-Shortcuts — wenn das Popup offen ist\n\n| Shortcut | Aktion |\n|----------|--------|\n| `↑` `↓` | In der Liste navigieren |\n| `Shift+↑` `Shift+↓` *(v0.22.0+)* | System-Lautstärke erhöhen / senken (±6 % pro Druck) |\n| `Enter` | Ausgewählten Eintrag pasten (respektiert das Plain-Text-Setting) |\n| `Shift+Enter` | Mit Originalformatierung pasten (überschreibt das Plain-Text-Setting einmalig) |\n| `Esc` | Popup schließen |\n| `⌘B` / `Ctrl+B` | **Hintergrund freistellen** beim ausgewählten Image-Eintrag (ML — U²-Net) |\n| `⌘S` / `Ctrl+S` | **Bild in Downloads speichern** (PNG unverändert) |\n\n### Komplette Feature-Matrix\n\n| Feature | Wo triggern | Doku |\n|---------|-------------|------|\n| Clipboard-History (Text/RTF/HTML/PNG/Files, 1 000 Einträge, dedupliziert) | `Ctrl+Shift+V` → suchen | core |\n| Fuzzy-Suche (`fuse.js`, Threshold 0.4) | Im Suchfeld tippen | core |\n| **Inline-Taschenrechner** | Ausdruck im Suchfeld tippen (`2+2`, `sqrt(9)`, `sin(pi/2)`, `0xff \u003c\u003c 4`, …) | core |\n| **Farb-Konverter** | `#RRGGBB` / `rgb(…)` / `hsl(…)` im Suchfeld tippen → Swatch + alle Formate | [colors.md](./docs/colors.md) |\n| **HSV-Color-Picker-Modal** | History-Tab → *Color Picker*-Button → Hue-Slider + Swatch + Hex/RGB/HSL-Tabs | [colors.md](./docs/colors.md) |\n| **Screen-Eyedropper** (Modal) | *Color Picker*-Modal → *Pick from screen* (macOS `NSColorSampler`-Lupe / Windows GDI-Overlay) | [colors.md](./docs/colors.md) |\n| **Eyedropper — globaler Hotkey** *(v0.17.0+)* | `Ctrl+Shift+C` oder Tray *Pick Color* → Hex direkt aufs Clipboard, kein Popup | [colors.md](./docs/colors.md) |\n| Snippet-Search-as-you-type | Snippet-Abbreviation im Popup-Suchfeld tippen | [text-expander.md](./docs/text-expander.md) |\n| Abbreviation-Expander (system-weit) | Abbreviation in irgendein Textfeld tippen → `Alt+1` (Default) | [text-expander.md](./docs/text-expander.md) |\n| Direct hotkey → snippet *(v0.13.0+)* | User-bound globaler Hotkey | [text-expander.md](./docs/text-expander.md) |\n| 25 gebündelte AI-Prompt-Snippets (`ai*`) | Snippets-Tab; Search / Abbreviation / Direct-Slot | [ai-prompts.md](./docs/ai-prompts.md) |\n| Snippets CRUD + JSON-Import | Snippets-Tab → Formular / Import-Button | [snippets-import.md](./docs/snippets-import.md) |\n| Notes — kategorisierte persistente Bookmarks | Notes-Tab (Tray: *Manage Notes*) | [notes.md](./docs/notes.md) |\n| Clip als Note speichern | Hover über History-Zeile → Bookmark-Icon | [notes.md](./docs/notes.md) |\n| **Bildschirm-Region-OCR** *(v0.9.0+; Windows seit v0.19.2)* | `Ctrl+Shift+O` oder Tray *OCR Region* | core |\n| **Bildschirm-Region-Screenshot** *(v0.15.0+; Windows seit v0.19.2)* | `Ctrl+Shift+S` oder Tray *Screenshot Region* | core |\n| **Screenshot → als Datei speichern** *(v0.19.2+)* | `Ctrl+Shift+S` → **`S`** während Overlay drücken (grüner Rahmen) → nativer Speichern-Dialog | core |\n| **Bild-Recolor** (Logo-Tinten, Chromaticity-gated) | Preview-Pane bei Image-Eintrag → Swatch / Hex | core |\n| **ML-Hintergrund-Cutout** (U²-Net-ONNX, ~4,5 MB embedded) | Preview-Pane → *Cut out background* oder `⌘B` | core |\n| Bild in Downloads speichern | Preview-Pane oder `⌘S` (PNG unverändert) | core |\n| Backup — Single-File-JSON-Export/Import (History + Snippets + Notes, per-Sektion ankreuzbar) | Settings → Backup \u0026 restore | [backup.md](./docs/backup.md) |\n| Plain-Text-only Paste *(Default an, v0.4.0+)* | Settings → Paste (Shift+Enter überschreibt einmal) | core |\n| Autostart bei Login *(v0.14.0+)* | Settings → Startup *oder* Tray-Checkmark | core |\n| Clipboard-Capture pausieren | Tray → *Pause Capture* | core |\n| History löschen (mit Bestätigung) | Tray → *Clear History…* | core |\n| **AES-256-GCM at-rest** (alle Bodies) *(v0.6.0+)* | Automatisch; Key im OS-Keychain | [encryption.md](./docs/encryption.md) |\n| Per-Monitor-Popup-Placement | Automatisch (öffnet auf Monitor mit Cursor) | core |\n| Multi-Tab-UI | Popup oben-rechts Tabs: History · Snippets · Notes · Settings | core |\n| Permissions-UX (TCC-Banner + 1-s-Polling + `tccutil reset`-Recovery) | Settings → Permissions-Sektion *(macOS)* | core |\n| Keyboard-Shortcuts-Cheat-Sheet | Settings → *Keyboard shortcuts* (OS-adaptive Glyphen) | core |\n| About-Dialog | Settings → About | core |\n| **Theme — Hell / Dunkel / System** *(v0.20.0+)* | Settings → Appearance | Drei-Wege-Toggle; Hell/Dunkel überschreiben das OS, System folgt ihm |\n| **Power-Command — `tren \u003ctext\u003e`** *(v0.18.0+)* | Suchfeld | Englisch → Deutsch übersetzen (öffnet Google Translate im Browser) |\n| **Power-Command — `trde \u003ctext\u003e`** *(v0.18.0+)* | Suchfeld | Deutsch → Englisch übersetzen (Google Translate) |\n| **Power-Command — `tr \u003ctext\u003e`** *(v0.18.0+)* | Suchfeld | Text → Deutsch übersetzen (auto-detect Quellsprache) |\n| **Power-Command — `rz \u003cW\u003ex\u003cH\u003e`** *(v0.18.0+)* | Suchfeld | Clipboard-Bild via Lanczos3 skalieren (z.B. `rz 1200x800`) |\n| **Power-Command — `optim`** *(v0.18.0+)* | Suchfeld | Clipboard-PNG optimieren → `~/Downloads/inspector-rust-optim-\u003cts\u003e.png` (lossless oxipng) |\n| **Power-Command — `rmvvls \u003ctext\u003e`** *(v0.18.0+)* | Suchfeld | Vokale entfernen (aeiou + AEIOU + ä/ö/ü) → Clipboard |\n| **System-Command — `kill [-9] [pattern]`** *(v0.19.0+)* | Suchfeld — Live-Prozess-Picker | Laufende Prozesse filtern, Enter → Bestätigung → SIGTERM (oder SIGKILL mit `-9`) |\n| **System-Command — `reboot`** *(v0.19.0+)* | Suchfeld | System neu starten (macOS — Confirm zuerst, kein sudo) |\n| **System-Command — `shutdown`** *(v0.19.0+)* | Suchfeld | System herunterfahren (macOS — Confirm zuerst, kein sudo) |\n| **System-Command — `lock`** *(v0.19.0+)* | Suchfeld | Bildschirm sperren (macOS — sofort, kein Confirm) |\n| **System-Command — `mute`** *(v0.23.0+)* | Suchfeld | System-Stummschaltung an/aus toggeln (macOS) |\n| **System-Command — `freeze`** *(v0.28.0+)* | Suchfeld | Tastatur + Maus blocken — entsperren mit konfiguriertem Chord (Default `i + r`) — natives CGEventTap, kein rdev |\n| **`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) |\n| **Finder-Selection-Actions** *(v0.30.0+, macOS)* | `Ctrl+Shift+F` | Popup listet die im Finder selektierten Dateien; `rz 1200x800` tippen skaliert alle Bilder (schreibt `\u003cname\u003e-1200x800.\u003cext\u003e` neben Quelle), `optim` läuft oxipng auf jedes PNG. Enter auf einer Zeile öffnet die Datei |\n| **Resize-Preset-Autocomplete** *(v0.31.0+)* | `rz` oder `rz \u003cpartial\u003e` tippen | Beschriftete Preset-Zeilen (Full HD, HD, XGA, SVGA, …); Enter führt aus, Tab / → füllt ins Suchfeld vor dem Ausführen |\n| **`bruno \u003c€\u003e[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 |\n| **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 |\n| **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 `\u003cApp\u003e-\u003cts\u003e-edited.png` |\n| **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 |\n| Power-Command-Autocomplete | Teil-Keyword tippen (`tre`, `rm`, `reb`, `bru`, …) → Vorschlag als `hint`-Zeile | core |\n\n## Features\n\n### Clipboard-Core\n- **Globaler Hotkey** `Ctrl+Shift+V` öffnet das Popup zentriert auf dem Monitor mit dem Cursor.\n- **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.\n- **Fuzzy-Suche** (`fuse.js`, Threshold 0.4) rankt Matches während du tippst. Virtualisierte Liste, per-Content-Type Preview-Panel.\n- **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.\n- **SQLite-Store** unter `%APPDATA%\\InspectorRust\\history.db` / `~/Library/Application Support/InspectorRust/history.db`. SHA-256-dedupliziert, Cap bei 1 000 Einträgen.\n- **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).\n- **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.\n\n### Text-Expander (Snippets, v0.2 — system-weit v0.2.7, Hotkey-Überholung v0.12.0, Direct Slots v0.13.0)\n- **Expansion im Popup** — tippe eine Abbreviation ins Suchfeld; matching Snippets erscheinen über Clipboard-Einträgen; Enter pasted den Body.\n- **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.\n  - *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).\n- **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.\n- **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.)\n- **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/`).\n- 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).\n- Volle Referenz: [`docs/text-expander.md`](./docs/text-expander.md).\n\n### 25 gebündelte AI-Prompt-Snippets (v0.5.0, überarbeitet v0.12.0)\nFirst-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).\n\n### Inline-Taschenrechner (v0.2.5)\nTippe einen Mathe-Ausdruck ins Suchfeld, das Ergebnis erscheint als oberster Listen-Eintrag — Alfred-Style. Enter zum Pasten.\n\n- 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`.\n- Aktiviert nur bei Ausdrücken mit mindestens einem Operator/Function/Konstante — pure Zahlen und Text triggern nicht. Force-Evaluation einer Literale mit `=`-Prefix (`=pi`).\n- Sicherer Recursive-Descent-Parser in [`calc.ts`](./core/frontend/src/lib/calc.ts), kein `eval`. 27 Tests.\n\n### Farb-Tools (v0.4.0 → v0.5.2)\n- **Inline-Hex-Preview** — tippe `#3366FF` (auch `3366ff`, `#abc`, `#abcdef12`) → Swatch + Hex + RGB-Zeile oben → Enter pasted Großbuchstaben `#RRGGBB`.\n- **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).\n- **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).\n- 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).\n\n### Bildschirm-Region-OCR (v0.9.0, macOS)\nDrü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).\n\n- **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.\n- **Engine** — Visions `VNRecognizeTextRequest` mit accuracy=Accurate + Sprach-Korrektur; selbe Engine, die Apple Live Text antreibt. Kein Model-Bundling, kein Netzwerk.\n- **Sprachen** — was auch immer dein macOS-Vision-Install unterstützt (Latein + CJK + Arabisch + Kyrillisch auf macOS 13+).\n- **Windows** *(v0.19.2+)* — implementiert via WinRT `Windows.Media.Ocr` + `Windows.Graphics.Imaging`. Nutzt die bereits auf deinem Windows-System installierten Sprachpakete (Einstellungen → Zeit \u0026 Sprache → Sprache) — keine Extras nötig.\n- Module: [`region_picker.rs`](./core/rust-lib/src/region_picker.rs), [`ocr.rs`](./core/rust-lib/src/ocr.rs).\n\n### Image-Tools — Recolor + ML-Cutout + Save (v0.7.0 → v0.10.x)\nAuf ausgewählten Image-Einträgen zeigt das Preview-Panel drei Aktionen:\n\n- **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.\n- **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/\u003cname\u003e-cutout-\u003cts\u003e.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).\n- **Save to Downloads** (v0.10.1) — drop den ausgewählten Image-Eintrag auf die Platte als `~/Downloads/inspector-rust-image-\u003cts\u003e.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.\n- **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.\n- 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).\n\n### Notes (v0.2.6)\nPersistente, kategorisierte Clipboard-Items in einer separaten SQLite-Tabelle — **nicht** unterworfen dem 1 000-Einträge-Pruning.\n\n- **Bookmark aus History** — Hover über jede Zeile → Bookmark-Icon → Eintrag landet in Notes/`Uncategorized`. Entkoppelt vom Source-Clip; überlebt Pruning.\n- **Notes-Tab** — drei Panes: Kategorien-Sidebar (mit Counts; virtuelle `All` / `Uncategorized`), Liste, Detail/Edit. Frei-formige Kategorien (`\u003cdatalist\u003e`-Autocomplete). Editierbare Bodies für Text/HTML/RTF; Image-/Files-Notes sind read-only. Per-Row-Delete + Clear All mit Bestätigung.\n- **+ New Note** für from-Scratch-Einträge. Tray-Shortcut: **Manage Notes** öffnet das Popup direkt hier.\n- Referenz: [`docs/notes.md`](./docs/notes.md).\n\n### Backup — Single-File-JSON-Export/Import (v0.2.6+)\nSettings-Tab → *Backup \u0026 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).\n\n### Plain-Text-Paste (Default an, v0.4.0)\nHTML- / 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.\n\n### Permissions-UX (v0.11.0)\nInspector 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:\n\n- 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.\n- 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.\n- 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.\n- 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.\n\n### Discoverability (v0.10.7)\n- **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.\n- **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).\n- **About-Dialog** — Settings → About öffnet ein Modal mit Version, License, Jahr, Zielgruppe und einer tabellarischen Tech-Stack-Übersicht.\n\n### Screenshot-Vorschau-HUD + Editor (v0.32.0)\n- **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).\n- **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.\n- **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.\n- **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.\n\n### Finder-Selection-Actions (v0.30.0, macOS)\n- **`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.\n- **Multi-File-`rz`** — `rz 1200x800` im Finder-Mode skaliert jedes selektierte Bild, schreibt `\u003cname\u003e-1200x800.\u003cext\u003e` neben Quelle (Format bleibt). Originale unangetastet.\n- **Multi-File-`optim`** — gleiche Form: oxipng auf jedes selektierte PNG, schreibt `\u003cstem\u003e-optim.png` neben Quelle. Non-PNG-Selektionen werden übersprungen (oxipng-only).\n- **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.\n\n### Bruno — Brutto/Netto-Rechner (v0.33.0)\n- **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).\n- **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).\n- **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.\n- **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.\n\n### `freeze` (v0.28.0)\n- 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.\n\n### `wakelock` (v0.29.0)\n- **`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).\n\n### System-Tray + Multi-Monitor\n- **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.\n- **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.\n- **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).\n\n## Repository-Layout\n\n```\ninspector-rust/\n├── core/\n│   ├── frontend/            # React 19 + TS + Tailwind v4 (plattformübergreifend)\n│   │   └── src/\n│   │       ├── components/  # SearchBar, HistoryList/Item, PreviewPanel, SnippetsPanel, NotesPanel, …\n│   │       ├── hooks/       # useClipboardHistory, useFuzzySearch, useSnippets, useNotes, useKeyboardNav\n│   │       └── lib/         # ipc.ts, types.ts, calc.ts (Alfred-Style-Evaluator), format.ts\n│   └── rust-lib/            # Geteilte Rust-App-Logik\n│       ├── build.rs         # Linkt das macOS Vision-Framework für OCR\n│       ├── models/\n│       │   └── u2netp.onnx  # U²-Net Cutout-Model (~4,5 MB, Apache-2.0)\n│       └── src/\n│           ├── lib.rs                # Tauri-Builder, Plugin-/Tray-Setup, invoke_handler\n│           ├── commands.rs           # alle #[tauri::command]-Wrapper\n│           ├── models.rs             # ContentType / ClipEntry / NewClip + Caps\n│           ├── db.rs                 # entries-Table, Hash-Dedup, Prune\n│           ├── crypto.rs             # AES-256-GCM At-Rest-Encryption + OS-Keychain-Key\n│           ├── snippets.rs           # snippets-Table, JSON-Upsert, Exakt-Abbreviation-Lookup\n│           ├── seed.rs               # Default-AI-Prompt-Snippets — First-Launch-Seeder + `Restore defaults`-IPC\n│           ├── seed/\n│           │   └── ai_prompts.json   # 25 gebündelte AI-Prompts (~35 KB) — zur Compile-Zeit via include_str! eingelesen\n│           ├── notes.rs              # notes-Table, Kategorien, save_from_clip\n│           ├── backup.rs             # Full-App-Export/Import (versioniertes JSON)\n│           ├── settings.rs           # Key/Value-Store (Expander-Hotkey + Zukunfts-Prefs)\n│           ├── ui_state.rs           # suppress_hide-Flag für Native-Modal-Interaktion\n│           ├── expander.rs           # Trigger-basierter Text-Expander (AX/UIA primary, Clipboard-Fallback)\n│           ├── text_field/           # FieldAccess-Trait + macOS-AX + Windows-UIA-Implementierungen\n│           ├── paste.rs              # write_to_clipboard + enigo-Paste-Shortcut\n│           ├── hotkey.rs             # Global Ctrl+Shift+V + Ctrl+Shift+O + Ctrl+Shift+S + Ctrl+Shift+C + Expander-Hotkey + Direct Slots\n│           ├── clipboard_watcher.rs  # Event-getriebene Capture, RTF-Stripping (Image \u003e Files-Priorität)\n│           ├── recolor.rs            # Image-Tint (Lerp Target ↔ Weiß nach Per-Pixel-Luminanz)\n│           ├── cutout.rs             # Legacy Chroma-Key-Cutout (als Fast-Path-Option behalten)\n│           ├── cutout_ml.rs          # U²-Net-basierter Subject-Cutout via `ort` (ONNX Runtime)\n│           ├── image_ops.rs          # `rz` Resize (Lanczos3) + `optim` PNG-Optimierung (oxipng)\n│           ├── system_commands.rs    # `kill` / `reboot` / `shutdown` / `lock` (sysinfo + osascript)\n│           ├── screen_picker.rs      # Farb-Eyedropper (NSColorSampler / GDI-Overlay)\n│           ├── region_picker.rs      # screencapture-i (macOS) / GDI-Overlay (Windows) — OCR + Screenshot\n│           ├── ocr.rs                # Apple Vision (macOS) / Windows.Media.Ocr (Windows)-Wrapper\n│           └── screen_recording.rs   # macOS-Bildschirmaufnahme-TCC-Permission-API — gated OCR + Screenshot\n├── win/                     # Windows-spezifische Bundle-Shell\n│   ├── README.md            # Windows-Install- \u0026 Build-Details\n│   ├── package.json         # Tauri-CLI-Entry\n│   └── src-tauri/           # main.rs, Cargo.toml, tauri.conf.json, capabilities/, icons/\n├── macos/                   # macOS-spezifische Bundle-Shell\n│   ├── README.md            # macOS-Install, Gatekeeper, Accessibility, Troubleshooting\n│   ├── package.json\n│   └── src-tauri/           # entitlements.plist, tauri.conf.json (dmg+app), capabilities/\n├── .github/\n│   └── workflows/\n│       ├── ci.yml           # Rust- + Frontend-Tests bei jedem Push/PR\n│       └── release.yml      # Baut Bundles und published GitHub-Release bei v*-Tags\n├── docs/\n│   ├── spec.md              # Originale Produkt-Spezifikation\n│   ├── snippets-import.md   # JSON-Snippet-Import — Schema, Semantik, Beispiele\n│   ├── notes.md             # Notes-Feature — Kategorien, Edit-Semantik, IPC-Surface\n│   ├── backup.md            # Full-App-Export/Import — Schema, Merge-Semantik, jq-Rezepte\n│   ├── text-expander.md     # System-weiter Expander — Workflow, Hotkey-Format, Per-OS-Caveats\n│   ├── colors.md            # Inline-Hex-Preview + Custom-HSV-Picker + System-Eyedropper\n│   ├── ai-prompts.md        # 25 gebündelte Default-AI-Prompt-Snippets\n│   ├── encryption.md        # AES-256-GCM At-Rest-Encryption — Threat-Model, Key-Storage, Migration\n│   ├── RELEASING.md         # Release-Procedure\n│   ├── ir-w1024.png         # Brand-Artwork — README-Hero + Inline-Image (1024×1024, ~1,9 MB)\n│   └── examples/\n│       └── snippets/        # 5 thematische JSON-Beispiele + eigene README\n├── scripts/\n│   ├── check.sh             # cargo clippy + tsc + eslint\n│   └── install-macos.sh     # Idempotenter Build + Re-Sign + Install (erhält TCC-Grants über Rebuilds hinweg)\n├── Cargo.toml               # Rust-Workspace (Members: core/rust-lib, win/src-tauri, macos/src-tauri)\n├── pnpm-workspace.yaml      # pnpm-Workspace (core/frontend, win, macos)\n└── package.json             # Root-Scripts: dev:{win,macos}, build:{win,macos}, lint, typecheck, format, test, check\n```\n\n## Quick Start\n\n### Prerequisites\n\n| Tool | Version | Hinweise |\n|------|---------|----------|\n| [Rust](https://rustup.rs/) | stable | MSVC-Toolchain auf Windows; `rustup component add clippy` ausführen |\n| [Node.js](https://nodejs.org/) | 20+ | |\n| [pnpm](https://pnpm.io/) | 10+ | `npm install -g pnpm` |\n\nPlattformspezifische Prerequisites:\n- **Windows** → [`win/README.md`](./win/README.md) (WiX, MSVC-Build-Tools, WebView2)\n- **macOS** → [`macos/README.md`](./macos/README.md) (Xcode CLT, Gatekeeper, Accessibility-Permission)\n\n### Install \u0026 run\n\n```bash\npnpm install          # installiert den ganzen Workspace (CI nutzt --frozen-lockfile)\n\n# Windows\npnpm dev:win          # tauri dev — Live-Reload\npnpm build:win        # → target/release/bundle/msi/InspectorRust_x.x.x_x64_en-US.msi\n\n# macOS\npnpm dev:macos                      # tauri dev — Live-Reload\npnpm build:macos                    # → target/release/bundle/{macos/InspectorRust.app, dmg/InspectorRust_x.x.x_\u003carch\u003e.dmg}\nbash scripts/install-macos.sh       # build + re-sign + install nach /Applications + launch\nbash scripts/install-macos.sh --reset  # …auch tccutil-reset stale Accessibility-Grants (nach First-Run nutzen)\n```\n\n\u003e 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).\n\n\u003e Jede Plattform muss auf ihrem nativen Host gebaut werden (Windows für MSI, macOS für DMG/`.app`). Cross-Compilation wird nicht unterstützt.\n\n### Snippet-Import\n\nIn 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.\n\n**Ready-to-import-Samples** in [`docs/examples/snippets/`](./docs/examples/snippets/):\n\n| Datei | Snippets | Thema |\n|-------|----------|-------|\n| [`getting-started.json`](./docs/examples/snippets/getting-started.json) | 3 | Adresse, E-Mail, deutsche Signatur — First-Import-Test |\n| [`signatures.json`](./docs/examples/snippets/signatures.json) | 4 | E-Mail-Signaturen (DE/EN, kurz, OOO-Template) |\n| [`dev.json`](./docs/examples/snippets/dev.json) | 8 | Shebang, MIT-Header, fn-Skeletons, gitignore, Commit-Msg |\n| [`markdown.json`](./docs/examples/snippets/markdown.json) | 5 | Headings, Table, `\u003cdetails\u003e`, PR-Body |\n| [`wrapped-form.json`](./docs/examples/snippets/wrapped-form.json) | 2 | Demonstriert `{ \"snippets\": [...] }`-Shape |\n\nSiehe [`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.\n\n### Notes \u0026 Backup\n\nNotes haben ihren eigenen Tab; die Kategorien-Sidebar hat **+ New Note** und **Clear All**. Backup lebt jetzt im **Settings**-Tab.\n\n- **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.\n- **Full-Backup exportieren:** Settings-Tab → **Backup \u0026 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-\u003ctimestamp\u003e.json`); ungeticked Sektionen werden als leere Arrays geschrieben, sodass du Snippets teilen kannst ohne deine Zwischenablage zu leaken.\n- **Backup importieren:** Settings-Tab → **Backup \u0026 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.\n\nVolle Feature-Referenz: [`docs/notes.md`](./docs/notes.md). Backup-Datei-Schema und Merge-Semantik: [`docs/backup.md`](./docs/backup.md).\n\n### Tests\n\n```bash\npnpm test               # Frontend-Unit-Tests (vitest + happy-dom) — 86 Tests\ncargo 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)\n```\n\nDie gleichen Commands laufen in [GitHub-Actions-CI](./.github/workflows/ci.yml) bei jedem Push und PR.\n\n### Statische Analyse\n\n```bash\npnpm check            # cargo clippy (Workspace) + tsc --noEmit + eslint\n```\n\n## Bekannte Einschränkungen\n\n| Einschränkung | Detail |\n|---------------|--------|\n| **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). |\n| **Keine Sensitive-App-Detection** | Inspector Rust erfasst alles ohne Filterung. |\n| **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. |\n| **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. |\n| **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. |\n| **macOS Accessibility** | Paste-Simulation (`enigo`) und der system-weite Text-Expander brauchen Accessibility-Zugriff. Erteile es einmal in Systemeinstellungen → Datenschutz \u0026 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). |\n| **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). |\n| **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. |\n| **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. |\n| **Windows-OCR-Sprachpakete** | Die Windows-OCR-Engine (`Windows.Media.Ocr`) nutzt die in Einstellungen → Zeit \u0026 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. |\n| **Linux: Wayland-Shortcuts \u0026 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). |\n\n## Beiträge\n\nBeiträ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.\n\n## Releasing\n\nPush 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).\n\n## Changelog\n\nSiehe [`CHANGELOG.md`](./CHANGELOG.md) — jeder Release ist dokumentiert mit dem, was hinzugefügt, gefixt wurde, und etwaige bekannte Issues zu der Zeit.\n\n## Entwickler\n\n- **Martin Pfeffer** — Autor \u0026 Maintainer\n- Kudos 2 Daniel\n\n## License\n\n[MIT](./LICENSE) — © 2026 Martin Pfeffer\n\nA private open-source side project — built on weekends and evenings, made with ❤️.\n\nBrewed and shipped from Berlin 🍻\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpepperonas%2Finspector-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpepperonas%2Finspector-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpepperonas%2Finspector-rust/lists"}