- clipboardItem: convert _init() to constructor()/super() and give the class
an explicit GTypeName (no-restricted-syntax, no-shadow).
- clipboardItem: replace new URL() with GLib.Uri.parse().get_host(). GJS has
no global URL, so the old call always threw and the URL hostname subtitle
never rendered; this makes it work.
- Use optional catch bindings (catch {}); logError guards with
instanceof GLib.Error instead of a try/catch.
- prefs: drop an unused GLib import.
- panel: block-body promise executors, and a no-await-in-loop disable on the
batched renders (the per-batch yield is intentional).
- Drop the remaining restate-the-code comments.
|
||
|---|---|---|
| .. | ||
| schemas | ||
| ui | ||
| dbus.js | ||
| extension.js | ||
| light.css | ||
| metadata.json | ||
| prefs.js | ||
| README.md | ||
| stylesheet.css | ||
Strata GNOME Shell extension
The GJS front-end for Strata. Renders the panel UI and forwards
clipboard events to strata-daemon over D-Bus.
The extension requires
strata-daemonto be installed and available in$PATH. See the main README for install instructions. The extension is pure JavaScript - no binary is bundled.Compatibility: Only tested on GNOME Shell 50. The
metadata.jsondeclares support for 45–50 since the APIs used (Meta.Selection,St,Gio,Adw) have been stable across that range, but older versions are untested. If you try one and it works, open an issue to let us know.
File layout
strata@edu4rdshl.dev/
├── extension.js Lifecycle, daemon lookup/supervisor, clipboard ingest
├── prefs.js Preferences window
├── dbus.js Generated D-Bus proxy + interface XML
├── stylesheet.css Panel styles
├── metadata.json GNOME Shell metadata (tested on Shell 50; declares 45–50)
├── schemas/ GSettings schema (max history, size caps, shortcut)
└── ui/
├── panel.js Popup panel: pagination, search, scroll-to-load
└── clipboardItem.js Per-item row (text preview or lazy thumbnail)
How it works
- On enable,
extension.jschecks if the D-Bus name is already owned (daemon running via systemd). If not, it looks forstrata-daemonin$PATHand spawns it, auto-respawning on crash with exponential backoff. Meta.Selectionnotifies us of every clipboard change. We read the raw bytes (allowlisted mimes only, password-manager hint skipped) and ship them to the daemon viaSubmitItem(s, ay).- The daemon dedups, stores, indexes, and emits
ItemAdded. ui/panel.jspaginates history withGetHistory, debounces search withSearchHistoryAsync, and writes back viaSt.Clipboard.set_textorMeta.SelectionSourceMemory(neverspawn, neverlaunch_uri).
Settings
Open with gnome-extensions prefs strata@edu4rdshl.dev:
History
- Max history (50–2000 items)
- Items per page (20–200, rows fetched on open and on each scroll-to-bottom)
- Maximum text size (1–100 MB, larger items are not stored)
- Maximum image size (1–100 MB, larger items are not stored)
Appearance
- Theme (Automatic / Light / Dark; Automatic follows the system light/dark preference)
- Panel width (pixels)
- Panel max height (pixels, list scrolls past this)
- Move activated item to top
- Panel position (top-left, top-center, top-right)
Keyboard
- Open Strata shortcut
Privacy
- App exclusions (apps whose clipboard is never recorded)
All four history/size limits are pushed to the daemon over D-Bus (SetConfig) as soon
as you change them. No restart needed.
Develop
# Build daemon + install extension + recompile schemas
make -C .. install-daemon && make -C .. install
# Live-reload logs
journalctl --user -f /usr/bin/gnome-shell | grep -i strata
If you only change JS, you can re-make install and restart the Shell
(Wayland: log out / in; X11: Alt+F2, r).
License
GPL-3.0-or-later.