From d3f1eca6c39be44c684cd0729d4f1b58391a7805 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Wed, 27 May 2026 00:43:04 -0500 Subject: [PATCH] (new-post): Rethinking the GNOME clipboard issues --- _imgs/2026-05-26/strata.jpg | Bin 0 -> 30911 bytes ...6-rethinking-the-gnome-clipboard-issues.md | 133 ++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 _imgs/2026-05-26/strata.jpg create mode 100644 _posts/2026-05-26-rethinking-the-gnome-clipboard-issues.md diff --git a/_imgs/2026-05-26/strata.jpg b/_imgs/2026-05-26/strata.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eef4e0837c38eb8539a92abb50bbbe02225af942 GIT binary patch literal 30911 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 R!*KQIzpwv$2}B+Y{0Ao strata-daemon --> SQLite (~/.local/share/strata) + | + +--> thumbnails (~/.cache/strata) +``` + +The cost of this split is one IPC hop per operation. In practice that is cheap, because the session bus is shared-memory fast on the same machine, and as you'll see the extension almost never waits on a reply in any path that matters. What you buy for that hop is the entire premise of the project: the expensive work runs in a separate process, on a thread pool, and the compositor cannot feel it no matter how long it takes. + +The extension also supervises the daemon. On enable it spawns the binary and watches it, respawning with exponential backoff if it dies, and giving up only after a rapid crash loop. If a daemon is already running (for example, one you started as a systemd user service), the extension detects it and reuses it instead of spawning a second copy. + +## Never block the ingest path + +The hottest path in a clipboard manager is the moment you copy something. Get this wrong and every single copy costs you a hitch. The rule in Strata is simple: the extension fires and forgets. + +When the selection owner changes, the extension checks the MIME type against a strict allowlist, reads the bytes, and calls `SubmitItemAsync(mime, rawBytes)`. Then it returns. It does not `await` the result. The copy is recorded as far as the extension is concerned the moment the call is dispatched, and the compositor goes back to its frame. + +A couple of details make that call cheap. The bytes go over D-Bus as a raw byte array (`ay`), so there is no encoding step in JavaScript and no decode step in Rust. And a 50 ms debounce sits in front of it, because a surprising number of applications write the clipboard several times for a single copy, and there is no reason to record each of those. + +On the other side of the bus, the daemon does the actual work, but it does it where it belongs. Every database operation runs inside `spawn_blocking`, off the async reactor: + +```rust +let conn = self.conn.clone(); +tokio::task::spawn_blocking(move || { + let guard = conn.lock(); // poison-recovering wrapper + db::upsert_item(&guard, ...) // hash, dedup, thumbnail, prune +}).await? +``` + +Inside that closure the daemon hashes the payload with blake3 for deduplication, performs an atomic upsert keyed on the content hash (a unique index means copying the same thing twice just updates the timestamp instead of creating a duplicate row), decodes and thumbnails the content if it's an image, and prunes the history back to its limit. None of that runs on the D-Bus reactor, and obviously none of it runs on the compositor. The reactor stays responsive while disk and CPU work happen on the blocking pool, and the desktop never knew a thing happened. + +## Lazy loading, so history size stops mattering + +This is the part I cared about most, because "smooth until the history grows" was the exact failure I was trying to kill. Strata has two independent lazy layers, and between them the size of your history stops being something the UI has to pay for. + +The first is paginated metadata. The panel asks for history with `GetHistory(offset, limit)`, and what comes back is metadata only: the id, the MIME type, a short text preview truncated to about 200 characters in SQL, a timestamp, and a flag saying whether the item has a thumbnail. It does not return the full content. A page of large text items costs a few kilobytes of JSON instead of megabytes. On the Rust side these come straight off a `created_at DESC` index with `LIMIT` and `OFFSET`, so a page stays an O(log n) lookup no matter how big the table is. The panel loads one page when you open it and another only when you scroll within 200 px of the bottom. The full table never lives in JavaScript. + +The schema is built around that access pattern: + +```sql +CREATE TABLE clipboard_history ( + id TEXT PRIMARY KEY, + mime_type TEXT NOT NULL, + content_text TEXT, -- text payloads + content_blob BLOB, -- binary payloads + thumbnail_blob BLOB, -- pre-decoded PNG, ~200 px + content_hash TEXT NOT NULL, -- blake3 of the raw bytes + created_at INTEGER NOT NULL +); +CREATE INDEX idx_created_at ON clipboard_history (created_at DESC); +CREATE UNIQUE INDEX idx_hash ON clipboard_history (content_hash); +``` + +Search is the second path, and it does not walk the list. There is an FTS5 full-text index over the text content, so `SearchHistory(query)` is an index lookup, not a scan. It returns the matching set, and the panel pages through that snapshot exactly the same way it pages through the recent view. The tokenizer ignores diacritics and matches on prefixes, so searching `cafe` finds `café` and typing half a word finds the whole thing. Because the FTS5 table uses external content, the text itself is stored once in the base table and the index holds only the inverted data. + +## Previews and thumbnails for fast rendering + +Images are where a clipboard list usually falls apart, because decoding a full-resolution screenshot to draw a small preview is exactly the kind of work that has no business running on the compositor thread. Strata never does it there. + +The daemon decodes and resizes each image to a roughly 200 px PNG once, at ingest, on the blocking pool, and stores that thumbnail in the database. The UI never decodes a full-resolution image, ever. By the time the panel needs to draw an image row, the expensive part already happened, in another process, at copy time. + +And even the thumbnail is not handed over until it's needed. `GetHistory` does not return image bytes. Each image row renders immediately with a placeholder icon, and then the UI does one of two things: if `~/.cache/strata/thumbnails/.png` already exists it loads straight from disk, and if it doesn't it calls `GetThumbnail(id)` once, writes the PNG to that cache file, and loads it from there. A given thumbnail is fetched at most once per session; after that, reopening the panel reads it from the page cache. The practical effect is that scrolling past a thousand image rows costs zero D-Bus traffic for everything outside the viewport. You only pay for what's on screen. + +The rendering itself is paced too. Rows are added to the list in chunks of 20 through `GLib.idle_add`, so even a full page is built across several idle ticks instead of in one blocking burst, and a frame always has room to land in between. The search box has a 150 ms debounce, and there's an epoch counter so that if you keep typing, results from an older query that arrive late are simply dropped instead of painting and then getting replaced. + +## Paste-back without blocking either + +Putting an item back on the clipboard is the one moment Strata needs the full content, and it fetches it lazily, only then. The panel calls `GetItemContent(id)`, which returns the MIME type and the raw bytes as `(s, ay)`. Raw bytes again, so there is no base64 to decode on the compositor thread. + +From there it splits by type. Text goes through `St.Clipboard.set_text`. Binary content, including images, is wrapped in a memory-backed selection source and made the clipboard owner: + +```js +const source = Meta.SelectionSourceMemory.new(mimeType, GLib.Bytes.new(bytes)); +global.display.get_selection().set_owner( + Meta.SelectionType.SELECTION_CLIPBOARD, + source); +``` + +There's a security property that falls out of this design for free. No code path in Strata ever executes clipboard content. Nothing spawns a process, nothing opens a URI, and clipboard text is never fed through Pango markup. Items are rendered with plain labels and pasted back as opaque bytes. A hostile payload sitting in your history has nothing to grab, because the code that handles it does not interpret it. + +## Installing it + +If you want to try it, the [Install section in the README](https://github.com/Edu4rdSHL/Strata#install) has the up-to-date instructions and I'll keep them current there rather than here. The short version is that there are two pieces, the daemon and the extension, and you need both. On Arch there are AUR packages for each (stable and `-git` channels); on anything else you build from source with `make install-daemon` and `make install`, or run the daemon as a systemd user service. After that, enable the extension and log back in. The README spells out each path. + +## Where this leaves us + +The result is a clipboard manager that feels the same with fifty items as it does with several thousand, which is the whole thing I wanted. That isn't because the work is faster than what other does (which can be), but mainly because the work that is genuinely slow (hashing, image decoding, search, and moving full payloads around) never runs on the thread that draws the screen, and the UI only ever pulls the handful of kilobytes it needs to show what's currently visible. The history can grow as large as you let it and the panel does not care. + +One more thing worth mentioning if you're not on GNOME: the daemon is desktop-agnostic. It speaks plain D-Bus and has a built-in `wl-clipboard-rs` monitor, so it runs standalone on wlroots compositors like Sway and Hyprland with a different front-end against the same interface. The GNOME Shell extension is just the front-end I happened to need. + +If you want the details, the [ARCHITECTURE.md](https://github.com/Edu4rdSHL/Strata/blob/main/ARCHITECTURE.md) in the repo covers the storage schema, the FTS5 query construction, the concurrency model, and the security boundary in more depth than a blog post should. The code is GPL-3.0-or-later. If you try it and something stutters, I'd genuinely like to know, because that's not allowed in this project (really). + +Happy Ctrl+c/Ctrl+v!