Beetroot v1.6.3 — Copied Overlay, Explorer Images, GPT-5.4
System-wide 'Copied' overlay confirms every clipboard capture. Fixed images copied from Explorer. OpenAI models upgraded to GPT-5.4. Security hardening.
Three user-facing changes and one under-the-hood hardening in this release.
At a glance:
- System-wide "Copied" overlay — a frosted-glass pill appears near your cursor when you copy something
- Explorer image capture — copying image files in Explorer now works
- OpenAI GPT-5.4 — default models upgraded, existing users auto-migrated
- Security hardening — path traversal protection for the new image file reader
The "Copied" overlay
This was a feature request from a user who wanted confirmation that Beetroot captured their clipboard — especially when the main window is hidden.
Now, every time you copy something, a small pill appears near your cursor for one second:
- Shows the content type ("Text", "Image", etc.) in your language
- Adapts to the active theme and accent color
- Click-through — it won't steal focus or interfere with your work
- Toggle in Settings > General (enabled by default)
Implementation: the overlay is a separate Tauri WebView window with WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT styles. It uses a generation-based timer guard (AtomicU64) to avoid timer conflicts when copies happen in quick succession. Theme colors are read from CSS custom properties and injected via eval() with proper serde_json escaping. The overlay HTML is self-contained (134 lines) with luminance-based adaptive borders.
Explorer image capture
If you selected a PNG or JPG in Windows Explorer and pressed Ctrl+C, Beetroot wouldn't capture it. The reason: Explorer puts file paths on the clipboard via CF_HDROP (the drag-and-drop format), not as a bitmap. The clipboard plugin checked for files before images, and with files: false it skipped both, falling through to text — which gave you the file path as a text clip instead of the image.
The fix replaces the plugin's listenToClipboard with a custom handler that checks in the right order:
- Bitmap first — screenshots (Snipping Tool), browser images, Telegram
- File-based images — reads the file path from
CF_HDROP, validates the extension, and loads it via a new Rust commandread_clipboard_image_file - Text fallback — everything else
The new read_clipboard_image_file IPC command reads arbitrary image files from disk with extension validation (PNG, JPG, JPEG, GIF, BMP, WEBP, TIFF, ICO, SVG) and a 50 MB size limit.
OpenAI GPT-5.4
OpenAI released GPT-5.4, and the default models in Beetroot are now gpt-5.4-nano (fast, cheap) and gpt-5.4-mini (smarter). GPT-5.4 mini is reportedly 2x faster with improved coding and reasoning.
Existing users with gpt-5-nano or gpt-5-mini are auto-migrated on launch via OPENAI_MODEL_MIGRATION map. If you manually set a different OpenAI model, it won't be touched.
Security hardening
The new read_clipboard_image_file command reads files from arbitrary paths (since Explorer can copy files from anywhere). To prevent path traversal if the WebView is compromised:
- Path canonicalization —
std::fs::canonicalize()resolves symlinks, junctions, and..components - UNC blocking — rejects
\\server\sharepaths - System directory rejection — reuses
validation.rs::BLOCKED_DIRSto blockC:\Windows,C:\Program Files, etc. - 8 Rust unit tests covering all security boundaries
How to update
Beetroot will offer to update automatically. Or download v1.6.3 from GitHub.