Max Nardit
Beetroot

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:

  1. Bitmap first — screenshots (Snipping Tool), browser images, Telegram
  2. File-based images — reads the file path from CF_HDROP, validates the extension, and loads it via a new Rust command read_clipboard_image_file
  3. 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 canonicalizationstd::fs::canonicalize() resolves symlinks, junctions, and .. components
  • UNC blocking — rejects \\server\share paths
  • System directory rejection — reuses validation.rs::BLOCKED_DIRS to block C:\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.

Discussion

No comment section here — all discussions happen on X.

Max Nardit

Max Nardit

@mnardit

More articles

Beetroot v1.6.6 — The Office Fix

Excel and Word cells were captured as screenshots instead of values. Microsoft Store autostart was silently broken. Image thumbnails ate gigabytes of RAM. v1.6.6 fixes all three, plus a stack of security and reliability work after the big 1.6.5 AI Vision release.