Repository navigation
Releases: GreyforgeLabs/reprieve
Release list
Reprieve 1.5.4
Added
- Removal and restoration animations are set independently with
parkFlightandrestoreFlight(off,subtleorangel). 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
flightsetting is still accepted. Both directions inherit it
until set on their own, andreprieve set flight VALUEstill sets both.
The default remainssubtle; existing settings behave as before.
Thanks to @keylimesoda for the change
(#11).
Full Changelog: v1.5.3...v1.5.4
Reprieve 1.5.3
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
ListNamesbus call instead
ofbusctl 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 onebusctlinstead of five. Super+Wno 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/binlink.- 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.qmlis
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.pycounts the processes and times the
Super+Wand media-pause helper paths with stubbed tools.
Full Changelog: v1.5.2...v1.5.3
Reprieve 1.5.2
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
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
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
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
passthroughand 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 onrestores the old fade-out).
Reprieve 1.4.0
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.
statusreportsflight.mode,flight.flownand the bar mark's position per screen.
Reprieve 1.3.0
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, soreprieve 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
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
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 --yesInstall:
omarchy plugin add https://github.com/GreyforgeLabs/reprieve.git --enableValidation: 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.