No description
Find a file
Eduard Tolosa e7b0392d92 fix: daemon image decoding, preview alignment, ordering and lifecycle
Audit fixes for the daemon:

- Decode gif/webp/bmp/tiff/ico (enable the pure-Rust image features). These
  mimes were accepted by pick_mime but the image crate only had png/jpeg, so
  thumbnail decode failed and the item was silently dropped. Drop avif (needs
  heavy C deps) and svg (not a raster format the image crate decodes) from the
  allowlist so unsupported types are never selected.
- ItemAdded signal preview now uses db::PREVIEW_CHARS (200), matching the
  history/search queries, so a just-copied row and the same row after a reload
  carry identical text.
- Add a deterministic ", rowid DESC" tiebreaker to the three created_at DESC
  orderings (history, search, prune) so items sharing a millisecond have a
  stable order and prune can't evict the wrong one at the boundary.
- SetConfig now prunes immediately (and emits ItemDeleted) when max_history is
  lowered, instead of waiting for the next copy.
- Request the bus name with AllowReplacement (plus ReplaceExisting) so a
  reload's new instance can cleanly take the name; fix the misleading comment.
- Wayland monitor clears its pending-offers map on Selection{None} so it can't
  grow across copy-then-clear cycles (wlroots path).
- Document that SubmitItem is a trusted-caller method (the password-manager
  hint is enforced client-side; forwarding it is a future contract change).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 17:29:29 -05:00
.github/workflows Initial commit 2026-05-25 03:02:34 -05:00
contrib/systemd Initial commit 2026-05-25 03:02:34 -05:00
strata-daemon fix: daemon image decoding, preview alignment, ordering and lifecycle 2026-05-26 17:29:29 -05:00
strata@edu4rdshl.dev feat: lazy full-history search, rendered blink-free 2026-05-26 17:29:18 -05:00
.gitignore Initial commit 2026-05-25 03:02:34 -05:00
AGENTS.md feat: light/dark theme support 2026-05-26 14:49:08 -05:00
ARCHITECTURE.md feat: light/dark theme support 2026-05-26 14:49:08 -05:00
CHANGELOG.md chore: bump versions to 0.5.0 2026-05-26 14:50:08 -05:00
Makefile feat: light/dark theme support 2026-05-26 14:49:08 -05:00
README.md Initial commit 2026-05-25 03:02:34 -05:00

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 4549 but untested — if you try it and it works, please open an issue to let us know.
  • strata-daemon binary in $PATH (see Install below)
  • Rust 1.74+ (build only)
  • glib-compile-schemas (from glib2-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+F2r (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

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.