Skip to content

Releases: Edu4rdSHL/Strata

v0.11.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 02 Jul 20:39

The daemon is unchanged from 0.10.0; all changes are in the GNOME Shell extension.

Changed

  • Light and dark styling follows the GNOME Shell style variant via
    stylesheet-dark.css and stylesheet-light.css, loaded automatically by the
    Shell, instead of loading light.css into the theme context by hand. The
    manual theme setting and its preferences row are gone; the panel matches the
    shell.
  • Signal connections use connectObject/disconnectObject.

Fixed

  • disable() stops the daemon synchronously with SIGTERM instead of deferring
    the kill to a timeout.
  • The daemon-restart timeout is cleared before a new one is scheduled.
  • Removed the try/catch around send_signal, which does not throw.

Performance

  • The thumbnail cache is cleared asynchronously in batches instead of a
    synchronous enumerate and delete on the compositor thread.
  • The thumbnail path cache is pruned on delete and clear-all.
  • Each row computes its type (image, URL, color) once.

v0.10.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 26 Jun 01:39

The daemon is unchanged from 0.9.0; all changes are in the GNOME Shell extension.

Fixed

  • URL items now show their hostname as a subtitle. The old code used the WHATWG
    URL API, which GJS does not provide, so it always threw and the subtitle
    never appeared. It now uses GLib.Uri.
  • The packaged extension was missing dbus.js. The extension imports it, but
    make pack did not bundle it, so installing from the packaged zip would
    fail to load. It is now included.

Changed

  • ClipboardItem uses a constructor() with an explicit GTypeName instead of
    _init().
  • The error-logging helper lives in a single util.js module shared by the
    extension, panel, and item widget.

Internal

  • Adopted the GJS ESLint style guide: an eslint.config.js flat config, an
    npm run lint script, and a GitHub Actions workflow that lints on push and
    pull requests. The extension passes with no warnings.

v0.9.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 25 Jun 23:37

The daemon is unchanged from 0.8.0; all changes are in the GNOME Shell extension.

Changed

  • App exclusion is enforced before a copy is sent to the daemon, instead of
    storing the item and deleting it afterward. Excluded content no longer
    reaches the database, and the focused app is checked at copy time.
  • The D-Bus client follows the GJS guide: signals are handled through the proxy
    (connectSignal) and D-Bus errors are stripped of their GDBus.Error prefix
    before logging.
  • shell-version declares GNOME Shell 50 only, the version the extension is
    tested on. Installs on older releases are no longer offered.
  • The daemon-missing notification points to the project page for install
    instructions.

Fixed

  • The initial history load retries on the next daemon connection if the first
    fetch fails, instead of leaving the panel empty until it is reopened.
  • The D-Bus proxy callback is ignored when the extension was disabled (or
    re-enabled) while the proxy was still being created.
  • disable() disconnects the panel indicator signal and drops pending idle
    callbacks, so nothing runs against a torn-down extension.

Internal

  • Extension logging goes through one helper per file. Removed dead fields,
    stale comments, and leftover narration flagged by the EGO review guidelines
    and the shexli static analyzer.

v0.8.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 27 May 02:35

What's Changed

Changed

  • Upgraded daemon dependencies: zbus 4→5, rusqlite 0.31→0.40, dirs 5→6.

Fixed

  • Single-instance daemon. The bus name is now requested with DoNotQueue instead of ReplaceExisting | AllowReplacement. If the name is already owned, the daemon exits cleanly instead of running without owning it (zbus 5 returns InQueue as Ok) or stealing the name and leaving the previous instance running as an orphan (zbus does not terminate a replaced owner).
  • Real SQLite errors are no longer swallowed as "not found". upsert_item's dedup lookup and get_thumbnail / get_raw_item now distinguish a missing row (Ok(None)) from a genuine error (propagated), via optional().
  • Daemon supervisor: a guard prevents spawning two daemons when an in-flight name-owner check overlaps a backoff retry, and the exit handler ignores foreign/stale subprocess exits so restart accounting can't be corrupted.
  • Panel: clearing history (or a HistoryCleared signal) now invalidates the active search snapshot so scrolling can't render stale rows; the scroll-into-view idle is guarded against a destroyed panel.

Internal

  • clippy pedantic/nursery cleanup across the daemon, with #[allow] + rationale for the intentional lints (the single-writer lock hold, zbus interface async).

This release is the dependency-upgrade + hardening pass, backed by a full re-review of the daemon (concurrency, zbus 5 / rusqlite 0.40 correctness, single-instance semantics) and a confirming pass over the extension.

See CHANGELOG.md for full details.

v0.7.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 27 May 00:20

What's Changed

⚠️ BREAKING (D-Bus): the service was renamed from org.gnome.Strata to dev.edu4rdshl.Strata. The org.gnome.* namespace is reserved for official GNOME software; Strata is third-party, so it now uses the reverse-DNS of its own domain. Bus name, object path (/dev/edu4rdshl/Strata), and interface (dev.edu4rdshl.Strata.Manager) all changed. The daemon and extension are updated together — only external busctl scripts or non-GNOME front-ends that hard-coded the old name need updating. The GSettings schema (org.gnome.shell.extensions.strata) is unchanged.

Fixed

  • Theme stylesheet reload no longer recurses. load_stylesheet itself emits the St theme context's changed signal, so reloading light.css on every changed fed back into itself and hit "too much recursion" — flooding the journal and spinning the CPU on screen unlock. The changed subscription is removed and light.css is loaded once. Dark/light switching is unaffected (it's the panel's class toggle); a GNOME Shell theme switch no longer auto-re-applies the sheet (recoverable by re-enabling).

Changed

  • D-Bus service renamed to dev.edu4rdshl.Strata (see breaking note above).
  • Refreshed daemon dependencies (gif/half/log patch updates).

See CHANGELOG.md for full details.

v0.6.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 26 May 22:31

What's Changed

Added

  • Lazy, full-history search. Search now covers the entire stored history (up to max-history) instead of an arbitrary 500-result cap, and renders a page at a time as you scroll instead of building every match at once. Results are snapshotted once and paged from memory, so scrolling never re-queries.

Fixed

  • Non-PNG/JPEG images were silently dropped. GIF, WebP, BMP, TIFF and ICO are now decoded and stored (the daemon previously only had PNG/JPEG decoders). AVIF and SVG are no longer accepted, rather than accepted-then-dropped.
  • Search no longer blinks (paints an empty list) between keystrokes — the first page renders in the same frame as the clear.
  • Search render races fixed: a fast new query can no longer be blocked by a superseded render, render a previous query's stale results, or leave a pruned item behind as a phantom row on scroll.
  • ItemAdded preview length now matches the history/search queries (200 chars), so a just-copied row and the same row after a reload show identical text.
  • Deterministic ordering for items sharing a millisecond timestamp (created_at DESC, rowid DESC), so pruning can't evict the wrong one.
  • Lowering max history now prunes stored items immediately instead of waiting for the next copy.
  • Extension lifecycle leaks closed: the excluded-apps settings handler and the daemon force-kill timer are released on disable; the exclusion-path delete is null-guarded.
  • The daemon requests its bus name with AllowReplacement for a clean hand-off on reload; the Wayland monitor clears stale offers on clipboard clear.

Changed

  • Image rows show a generic "Image" label instead of singling out PNG.

See CHANGELOG.md for full details.

v0.5.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 26 May 20:14

What's Changed

Added

  • Light/dark theme support. A new Theme preference (Automatic / Light / Dark) controls the panel palette. Automatic follows the system org.gnome.desktop.interface color-scheme; the dark theme is unchanged. Light styling lives in light.css, scoped under a .strata-theme-light class toggled on the panel root box and loaded into the St theme context by the extension. St has no CSS variables, so this specificity-based scoped override switches the palette with no runtime stylesheet generation; switching is a single class toggle off the ingest/render hot paths.

Fixed

  • The keyboard shortcut now hides the panel when it is already open. The binding lacked Shell.ActionMode.POPUP, so while the panel's modal grab was active the second press was swallowed and toggle() never ran.
  • The search placeholder ("Search...") is now legible in the light theme; it previously inherited a light-on-dark Shell color.

Packaging

  • make pack now bundles light.css via --extra-source; only stylesheet.css is auto-included by gnome-extensions pack, so packaged installs now ship the light theme.

See CHANGELOG.md for full details.

v0.4.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 26 May 18:10

What's Changed

Performance

  • GetHistory / SearchHistory now truncate content_text to a preview (substr, ~200 chars) in SQL instead of returning the full payload. A page of large text items previously serialized up to megabytes of JSON over D-Bus and parsed it on the GJS main loop, only to render a ~140-char snippet. Full content is still served on demand by GetItemContent for paste-back.

Documentation

  • Corrected the monitor.rs comments that wrongly claimed Mutter implements ext-data-control-v1 on GNOME 47+. Mutter exposes neither data-control protocol, so on GNOME the built-in Wayland monitor never binds and ingest comes from the extension via Meta.Selection + SubmitItem; the monitor only runs on wlroots. Also reconciled ARCHITECTURE.md with the code (supervisor backoff, SIGTERM timeout, prune, tokio runtime, load-more threshold, preview truncation).

See CHANGELOG.md for full details.

v0.3.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 25 May 09:10

What's Changed

Fixed

  • _notifyDaemonMissing now uses the correct ESM MessageTray import; the missing-binary desktop notification was previously silently swallowed by a catch block.
  • clearItems() no longer double-destroys widgets.
  • Daemon now fails fast with a clear error message when the XDG data directory cannot be determined.

Performance

  • prune() now uses a single ORDER BY subquery + DELETE WHERE id IN (...), eliminating a redundant second query.
  • get_raw_item no longer fetches thumbnail_blob (~40 KB) on paste-back paths that don't need it.
  • Hover hit-testing replaced: O(n) per-widget bounds-check loop on every mouse-move is now O(tree-depth) via event.get_source() + parent walk.
  • SetFocusedApp D-Bus call removed -- the daemon never read the value. Eliminates one IPC round-trip on every window focus change.
  • GetItemContent now returns raw bytes (ay) instead of a base64-encoded string. Eliminates base64 encode in the daemon and decode on the compositor thread on every paste. The base64 crate has been removed entirely.
  • Unnecessary clones of WriteRequest fields eliminated in write_to_clipboard.
  • Unused base64 return value removed from make_thumbnail.

Refactoring

  • Stale thumbnail_blob schema migration removed (column was already in CREATE TABLE from day one).

See CHANGELOG.md for full details.

v0.2.0

Choose a tag to compare

@Edu4rdSHL Edu4rdSHL released this 25 May 08:02

What's changed

Fixed

  • MIME priority: plain text now preferred over rich text. When an application (code editor, web browser, etc.) advertises both a plain-text and a rich-text (text/html, text/rtf) variant on the clipboard, Strata now captures the plain-text variant. Previously, copying code from editors like VS Code would store syntax-highlighted HTML markup instead of the actual source text. Rich-text types are still captured when no plain-text alternative is offered.

See CHANGELOG.md for the full history.