write_to_clipboard took ownership of WriteRequest but immediately cloned both fields into locals, then cloned bytes again for the text path -- three heap allocations on a potentially large byte buffer. Destructure the owned request directly and move the fields. The text path still needs one clone (bytes goes into two MimeSources), but the extra upfront clones are gone. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> |
||
|---|---|---|
| .github/workflows | ||
| contrib/systemd | ||
| strata-daemon | ||
| strata@edu4rdshl.dev | ||
| .gitignore | ||
| AGENTS.md | ||
| ARCHITECTURE.md | ||
| CHANGELOG.md | ||
| Makefile | ||
| README.md | ||
Strata
A fast, stutter-free clipboard manager for GNOME Shell.
All heavy work (hashing, decoding, storage, search, thumbnails) lives in a Rust daemon. The GNOME Shell extension only renders UI and forwards events over D-Bus, so the compositor is never blocked, even with thousands of items.
Architecture
Strata is two components, and you need both for it to work:
| Component | Language | Role |
|---|---|---|
strata-daemon/ |
Rust + tokio + zbus | Storage (SQLite + FTS5), dedup, thumbnails, D-Bus service org.gnome.Strata |
strata@edu4rdshl.dev/ |
GJS (GNOME Shell extension) | Top-bar panel, search UI, paste-back, clipboard ingest |
The extension auto-connects to the daemon on enable. If the daemon is managed
by systemd (or another init system), the extension detects it and skips
spawning its own copy. If no daemon is running, the extension looks for
strata-daemon in $PATH and spawns it directly.
GNOME Shell (GJS) ──D-Bus──▶ strata-daemon ──▶ SQLite (~/.local/share/strata)
│
└──▶ thumbnails (~/.cache/strata)
Requirements
- GNOME Shell 50 (tested). May work on 45–49 but untested — if you try it and it works, please open an issue to let us know.
strata-daemonbinary in$PATH(see Install below)- Rust 1.74+ (build only)
glib-compile-schemas(fromglib2-devel/libglib2.0-dev-bin)- SQLite is bundled via
rusqlite, no system dep needed
Install
From source (local build)
git clone https://github.com/Edu4rdSHL/Strata.git
cd Strata
# Build and install the daemon binary to ~/.local/bin
make install-daemon
# Install the GNOME Shell extension
make install
Make sure ~/.local/bin is in your $PATH, then log out / log back in
(Wayland) or Alt+F2 → r (X11) and enable:
gnome-extensions enable strata@edu4rdshl.dev
Via systemd user service (distro packages / manual)
Distro packages install the daemon binary to /usr/bin/strata-daemon and
the systemd unit from contrib/systemd/strata-daemon.service to
/usr/lib/systemd/user/. Enable it once:
systemctl --user enable --now strata-daemon
Then install and enable the extension as above. The extension detects the running daemon and will not spawn a second copy.
Pack for extensions.gnome.org
make pack # produces strata@edu4rdshl.dev.shell-extension.zip (JS only)
Uninstall
gnome-extensions disable strata@edu4rdshl.dev
rm -rf ~/.local/share/gnome-shell/extensions/strata@edu4rdshl.dev
rm -rf ~/.local/share/strata ~/.cache/strata # also wipes history
Other desktops?
The daemon is desktop-agnostic. It speaks plain D-Bus and runs anywhere
the session bus does. Any client (KDE applet, CLI tool, your own script)
can drive it. See strata-daemon/README.md for
the wire protocol and a busctl example.
The shipped UI is a GNOME Shell extension. Ports to other desktops only need a new front-end against the same D-Bus interface.
Deeper reading
ARCHITECTURE.md: design goals, process model, storage schema, FTS5 details, concurrency, security boundary.strata-daemon/README.md: D-Bus interface reference and standalone usage.strata@edu4rdshl.dev/README.md: extension internals.
AI Policy Disclosure
Parts of this codebase and documentation were written with the assistance of AI tools. This is the policy we follow and will continue to follow: every line of code and every document produced with AI assistance is rigorously reviewed by a human before being published. No AI-generated output is committed without understanding, verification, and approval by the project author.
License
GPL-3.0-or-later.