Skip to content

Releases: GreyforgeLabs/reprieve

Reprieve 1.5.4

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 20 Oct 01:50

Added

  • Removal and restoration animations are set independently with
    parkFlight and restoreFlight (off, subtle or angel). Removal Off
    with restoration Angel parks with a plain cut and brings the window back
    with the angel; Reprieve captures the restoration snapshot silently, without
    a removal flight.
  • Timeline controls: F cycles Removal and R cycles Restoration;
    Shift reverses either cycle. The Animations card groups both.

Compatibility

  • The shared flight setting is still accepted. Both directions inherit it
    until set on their own, and reprieve set flight VALUE still sets both.
    The default remains subtle; existing settings behave as before.

Thanks to @keylimesoda for the change
(#11).

Full Changelog: v1.5.3...v1.5.4

Reprieve 1.5.3

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 14 Oct 21:57

Fixed

  • Parked windows cannot receive focus while on special:reprieve, preventing
    a dismissed bar panel from making them visible again after the last window
    is parked. Restoring moves the window out of that workspace before focusing it.
  • Existing installations need their managed bindings refreshed to add the rule;
    see the upgrade note in the README.
  • A window that closes while its park or restore flight is in the air is
    forgotten at once: its deferred move, pending expectations and flight are
    dropped, so an unrelated window that Hyprland maps at the same address is
    never hidden by the old cut.
  • Closing a parked window no longer flags it as stranded (the bar's alert dot)
    for a moment before the window list refreshes.
  • A window mapped at a reused address starts from a fresh snapshot instead of
    inheriting the previous window's floating or workspace state.
  • The recovery journal is written only after the journal read at startup has
    been merged. Enabling the timeout or parking during startup can no longer
    replace the file with a partial history.
  • Redo parks a window in the state it has now. A window restored onto another
    workspace (or moved, floated or made fullscreen after its restore) returns
    there on the next undo instead of to the place it was first parked from.
  • Redo after a Reopen no longer brings back the spent Reopen row with a
    "Parked" toast; the relaunched app is a new window.
  • A restore flight is skipped when the window comes back on a different
    monitor than the one its snapshot was taken on; the window appears with a
    plain cut where it lands.
  • "Restore here" while a scratchpad (special workspace) is open uses the
    monitor's regular workspace instead of workspace 1.

Performance

  • The media helper lists MPRIS players with one ListNames bus call instead
    of busctl list, which also reported activatable names and resolved every
    peer's credentials (about 5 ms against 29 ms locally). It queries playback
    status only for players that match the parked window and finds the window's
    processes by walking up from the PIDs named by those players, instead of
    reading the stat file of every process. With four players on the bus and
    none matching, a pause launches one busctl instead of five.
  • Super+W no longer resolves the plugin directory: the CLI starts two
    processes for a park instead of four. Commands that run a sibling helper
    still resolve it through the ~/.local/bin link.
  • An unchanged bar anchor is not re-published to the flight overlay on every
    bar relayout. Label and class sanitizing are about 1.7x faster in a local
    Node benchmark and each parked entry sanitizes its title once.

Code

  • The service and flight overlay share two small map-copy helpers
    (assoc/dissoc) instead of hand-written copy loops; Flight.qml is
    18 lines shorter. Hyprland event handling moved into a plain service
    function so the offline suite exercises it directly.

Tests

  • New regression tests for each fix above (model, service, media helper and
    CLI wrapper). tests/bench_helpers.py counts the processes and times the
    Super+W and media-pause helper paths with stubbed tools.

Full Changelog: v1.5.2...v1.5.3

Reprieve 1.5.2

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 30 Sep 05:59

Reprieve 1.5.2 fixes missing and incorrectly sized window flights, keeps the angel visible during lift, and makes redo use the configured animation. Rapid duplicate parks and early undo now settle previous flights safely, preventing deferred moves from hiding a restored window.

Newly granted timeout grace is persisted, unchanged settings succeed, rejected writes retain the accepted state, and recovery-notice layout avoids a binding loop. Status exposes renderer screens, active scenes, frame caches and fallback reasons; Doctor reports unavailable enabled effects.

Validation: the complete offline suite passes with both Python and native recovery journals. Live disposable-window checks cover actual park/restore captures, rapid operations, fullscreen restoration, timed expiry, expiry cancellation and enable-grace persistence. Media pause/resume and recovery across shell restarts were also checked. Visual qualification covers the primary attached screen; physical keyboard input and every monitor configuration are not certified. Qualification record.

The Control Panel watchdog conflict is fixed separately in upstream PR #1, pending maintainer acceptance. Reprieve does not bundle that patch; affected Control Panel versions can still overwrite Super+W. The README documents an interim workaround.

Update with omarchy plugin update tech.greyforge.reprieve. Restart the shell with omarchy restart shell to load the edited service and cached QML, then run reprieve doctor. The native journal remains optional (make native); Python is the default fallback. Existing preferences and timer policy are preserved.

Reprieve 1.5.1

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 28 Sep 06:56

Fixes the all-Reopen timeline: full-width rows with the REOPEN chip at the right edge, working Reopen restore via stable sequence, and single-Delete forget for Reopen entries. Parked windows keep two-step confirm and media cleanup. Offline suite passes (38 model tests) and omarchy plugin validate is clean.

Reprieve 1.5.0

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 28 Sep 06:14

Native recovery journal

Reprieve 1.5.0 adds an optional C implementation of the recovery journal. It handles reads, atomic writes, quarantine, and inspection. The plugin uses it when built, and continues to use the Python journal otherwise. Build it in the plugin directory with make native (C compiler, pkg-config, and json-c development headers required). Run make clean to return to the Python path.

The offline suite now covers both paths, and python3 tests/bench_journal.py reproduces the benchmark.

Benchmarks

Local measurement with a 64-entry journal. Each figure is the median of 60 fresh process launches; the C figures include the actual journal launcher.

Operation Python latency C latency Speedup Python CPU C CPU CPU reduction
Read 44.59 ms 3.02 ms 14.8× 43.87 ms 2.86 ms 15.3×
Write 45.24 ms 3.34 ms 13.5× 44.38 ms 3.13 ms 14.2×

These are measurements of the optional native build; results will vary by system. Source installs without make native continue to use Python.

See the changelog for details.

Reprieve 1.4.1

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 18 Sep 17:59

Fixed

  • Second Super+W no longer destroys the parked window. After a park, Hyprland focus routinely lingers on the just-hidden window (with a single window on the workspace it never leaves), so a second Super+W targeted Reprieve's own hidden window. The service answered passthrough and the keybind wrapper turned that into a real close. Pressing Super+W on an already-parked window is now a no-op; all flight modes were affected.
  • Slow shell no longer turns Super+W into a close. A timed-out park now exits quietly and leaves the window alone; only an explicit refusal or a fast transport failure (shell truly down) still degrades to a close, as documented.

Changed

  • New angel branding. The bar mark, the setup/timeline hero, the empty timeline state and the corner toast wear the guardian-wings mark (halo over swept wings, cyan to electric blue), with compact geometry at taskbar sizes and deeper art on light surfaces. Parked/attention state rides a status dot on the mark. The Greyforge hexagon remains as the foundry signature.
  • The bar widget stays put. It is now visible at all times so the safety net reads as present even when idle (reprieve bar hide-idle on restores the old fade-out).

Reprieve 1.4.0

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 17 Sep 16:09

Flights

Parking a window is no longer a cut. A snapshot of the window lifts off and glides into the Reprieve mark in the bar, which flares as it lands; restoring flies it back out and the live window takes over the instant it touches down.

New flight setting — reprieve set flight …, the timeline's Flight card (F / Shift+F) or the shell.json entry:

  • subtle (default) — the snapshot glides to the bar and back.
  • angel — a winged light swoops down from the mark, lifts the window and carries it home; restoring is the same trip in reverse: she rises out of the mark with it, sets it down, and flies back.
  • off — the plain cut, as before.

The effect is drawn on an overlay layer that exists only while a flight is in the air and never takes input. The service keeps ownership of the real move: the overlay calls back at the handover frame, and a watchdog performs the move anyway if the overlay never answers, so a park can never hang. A restore to another workspace switches there first and then flies. Snapshots are not persisted across shell restarts (the first restore after one is a cut).

Also

  • The timeline's preference cards are a 2×2 grid, each with a one-line description.
  • status reports flight.mode, flight.flown and the bar mark's position per screen.

Reprieve 1.3.0

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 16 Sep 07:28

Changed

  • The overlay, the toast and the bar widget carry the Greyforge Labs
    identity: the steel hexagon mark with cyan seams and a single amber core
    (brand/GreyforgeMark.qml, drawn on a Canvas so it follows the theme's
    foreground and background), a "GREYFORGE LABS" byline under the product
    name, a signature wordmark at the foot of every card, and a blueprint
    plate behind the timeline.
  • Timeline rows show the application icon on a steel plate, a
    PARKED / RECOVERED / REOPEN chip, a cyan selection rail, and the timeout
    countdown in amber. Keyboard hints are rendered as keycaps instead of a
    run-on sentence.
  • Restore All is an amber primary button above a preferences strip:
    Toasts (T), Pause audio on park (M), and the 1.2.0 park timeout as an
    Auto-close stepper (P / click / wheel for the next preset, Shift+P /
    right-click for the previous: Off, 15 s, 30 s, 1 min, 2 min). The strip
    writes through the service, so reprieve set … and the overlay agree; a
    CLI value off the preset list steps to the nearest preset. The
    setup card lays the five keybindings out as a keycap table and explains
    what parking means before asking for consent.
  • The bar widget's status glyph is now the Greyforge mark: the amber core
    grows and the plate flares when a window is parked, the core takes the
    theme's alert colour when attention is needed, and the overflow count
    rides the corner as a badge. Tray icons sit on small cyan-edged plates
    with an amber (parked) or cyan (recovered) marker.
  • The toast leads with the mark and an amber edge rail.
  • Screenshots in docs/screenshots/.

Reprieve 1.2.0

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 16 Sep 06:22

Optional parkTimeout auto-close for parked windows (off by default, 5–120s), per-window countdown in the timeline, timeout surfacing in doctor and bar status, plus audit hardening. Live acceptance matrix 40/40 on Omarchy 4. See CHANGELOG.md.

Reprieve 1.1.2

Choose a tag to compare

@GreyforgeLabs GreyforgeLabs released this 14 Sep 04:10

Fixes MPRIS player matching pausing the wrong player. Player PIDs were matched as substrings, so parking pid 86 could pause a bus named instance5868. PIDs must now match as whole numbers.

Update an existing installation:

omarchy plugin update tech.greyforge.reprieve --yes

Install:

omarchy plugin add https://github.com/GreyforgeLabs/reprieve.git --enable

Validation: offline suite passes (25 model, 9 journal, 16 binds, 8 media, plus script and plugin validation checks), including new regression cases for PID substring matches.