OpenRiot v7.9.43 — The Construct Remembers Where It Was Standing
“The construct knew what was open. It had always known. Firefox on the left. Thunar stacked above Text Editor on the right. Btop in the corner. Every window had a position scraped from the i3 tree and written to disk before the lights went out. But when the power came back, the construct launched everything into the right workspace and forgot where it was supposed to stand. Firefox filled the screen. Alacritty took whatever was left. The machine was awake but blind. We fixed the memory. We taught the construct to remember. When it closes its eyes and opens them again, every window is exactly where it was before the darkness. The Feds would call this ‘session persistence.’ We call it not being an amnesiac.” — The OpenRiot Crew, somewhere in the Sprawl, v7.9.43
Release Overview
Two themes. Two kinds of memory.
First: the construct’s visual memory. We taught the lock screen four new pieces of art — four new walls for the machine to wear when it’s guarding the gates. Forty-five, forty-seven, forty-eight, fifty-one. The lock screen shuffle got meaner. More variety. More ways to tell whoever’s standing at the keyboard that this machine has taste and you’re not getting past it.
Second: the construct’s spatial memory. When you reboot, every window comes back to the right workspace — Firefox on 1, Alacritty on 2, Thunar exactly where you left it. That’s been working since v7.9.39. But the windows forgot their positions. Firefox filled the screen instead of sitting on the left at 64% width. The vertical split on workspace 2 flattened into a 50/50 default. The construct had amnesia about layout.
We fixed it. The construct now saves the i3 layout tree for each workspace — every split, every ratio, every container — and replays it on startup before a single window launches. The Turing Police would call this ‘desktop state serialization with deterministic replay.’ We call it remembering where the windows go.
🎨 Four New Lock Screen Walls
Lock screen images 45, 47, 48, and 51 are now in the rotation.
Each one was converted to .webp and dropped into /Locked/.
The filterStealth function still strips stealth-marked images
when the construct is operating in normal mode. The shuffle has
more teeth now.
The walls themselves? Not your problem. The construct wears what it wants. Your job is to not be at the keyboard when they’re showing.
🗣️ Signal: Binary Pinned, Binary Copied
The gurk build script (scripts/gurk.sh) got a small but
meaningful upgrade. The binary now builds with a pinned commit
(GURK_COMMIT) so the construct doesn’t drift when upstream
pushes changes that break the OpenBSD SIGSEGV patch. The script
also gained a prompt: “Copy binary to source tree? [y/N].” Say
yes, and install/gurk lands in config/bin/ — where the
construct expects it — without manual copying.
The Turing Police would put gurk in a snap package with five runtime dependencies and a telemetry ping. We put it in a shell script that asks politely.
⌨️ Lock Screen: No More Finger Race
There was a time.Sleep() in the lock screen code. A small
one. A polite one. But small enough that fast typists — the
kind who unlock their machine in half a second — could race
past it and hit the password field before i3lock was ready.
The result: “wrong password” on a perfectly typed passphrase.
We removed the sleep. We removed the time and syscall
imports that came with it. The lock screen now takes input the
instant it’s ready. If you type fast, it listens fast.
The Turing Police would have blamed your typing speed. We blamed our code and deleted five lines.
💾 Clone: It Knows When It’s Finished
When you ran Full Backup, the construct would dutifully rsync everything, create skeleton directories, install boot blocks on the target drive, and then… show the last line of rsync output as the final message. “387,291 files transferred.” That’s not “done.” That’s a progress report pretending to be a conclusion.
Now the construct announces its final phase properly: “Finalizing Clone…” appears when it starts installing boot blocks. “Clone complete. /dev/sd3 is bootable.” appears when the drive is actually finished. The progress log tells a story with a beginning, a middle, and an end — not a burst of rsync stderr and a shrug.
🎯 Migration: The Cancel Button Now Means Cancel
Two related bugs in the Migrate TUI. First: when you hit Escape during a Full Backup, the construct said “Canceling clone…” and then… kept going. Rsync finished. Boot blocks installed. The cancel flag was set but the goroutine never checked it. The construct completed the clone and then wondered why you were staring at it.
Fixed. The cloneCancel flag now triggers an actual error
return. The UI shows “ERROR: cancelled” instead of pretending
the operation succeeded. If you cancel, the construct stops.
Second: the alignment of the error box was wrong. The emoji characters in titles like “🚫 Migration In Progress” take up two display columns but four bytes. The old code counted bytes. The new code counts display width. The box renders perfectly on every terminal.
🗜️ Softraid: The Partition Letter Problem
Encrypted external drives don’t always put their RAID partition
on sdXa. Sometimes it’s on d. Sometimes it’s on a letter
that doesn’t start with a. The old code hardcoded device+"a"
and failed on drives where the partition landed elsewhere.
Fixed. The construct now reads disklabel to find the actual
RAID partition letter, and feeds that to bioctl instead of
guessing. It also knows which softraid volume belongs to which
physical chunk — so when it detaches a volume, it detaches only
the right one. Never the root drive. Never the wrong drive.
The old code had a fallback path that scanned dmesg and tried to detach every softraid volume on the bus. We removed it. The construct now detaches surgically or not at all.
📐 Window Layout: The Memory Upgrade
This is the headline. The construct now saves the full i3 layout
tree for each workspace — every split, every container, every
percent — and writes it alongside the window snapshot during
shutdown. On startup, it replays the layout via i3-msg
append_layout before launching a single application. When the
windows appear, they fill the placeholders exactly where they
belong.
Two new commands make this testable:
openriot --save-layout— saves the current layout to diskopenriot --test-layout— reads the saved layout and prints what would be restored, without launching a single window
The existing --window-restore command (run on login) now uses
the saved layouts to restore tiled window positions. The construct
remembers where it was standing.
🧾 Files Changed
| File | Change |
|---|---|
Locked/45.webp |
NEW — Lock screen wallpaper |
Locked/47.webp |
NEW — Lock screen wallpaper |
Locked/48.webp |
NEW — Lock screen wallpaper |
Locked/51.webp |
NEW — Lock screen wallpaper |
config/bin/gurk |
UPDATED — gurk binary, pinned commit |
scripts/gurk.sh |
FIX — Added GURK_COMMIT pin; |
| added “Copy to source tree” prompt | |
source/lock/lock.go |
FIX — Removed typing delay that |
| could race past i3lock; removed | |
| unused time and syscall imports | |
source/disk/backend.go |
FIX — findRAIDPartition() finds |
| actual RAID partition letter; | |
FindRootDrive() returns root device; |
|
regex in parseBioctlOutput fixed |
|
to capture non-a partition letters |
|
source/disk/update.go |
FIX — mountCmd uses actual RAID |
partition instead of hardcoded a; |
|
detachSoftraidChunk no longer |
|
| blind-detaches every volume on bus; | |
| root guard prevents detaching | |
| internal softraid volumes | |
source/migrate/clone.go |
FIX — “Finalizing Clone…” message |
| before boot block install; “Clone | |
| complete. /dev/sdX is bootable.” | |
source/migrate/errors.go |
FIX — Padding calculations use |
| display width instead of byte count | |
| for emoji alignment | |
source/migrate/model.go |
FIX — Cancel during clone/dump |
| now shows ERROR screen instead of | |
| pretending the operation succeeded; | |
| cancel messages say “cancelled by | |
| user” instead of “Canceling…” | |
source/window/snapshot.go |
NEW — SaveLayout() now saves i3 |
layout tree per workspace; Restore |
|
Layout() applies layouts before |
|
launching apps; TestLayout() |
|
| validates without launching windows | |
source/commands/commands.go |
NEW — --save-layout and |
--test-layout CLI commands |
|
source/go.mod |
UPDATED — Added go-runewidth dep |
🗣️ Final Words
“The construct closed its eyes. It opened them. Firefox was on the left where it belonged. Thunar was on the right, stacked above Text Editor at exactly the split that was there before the power went out. The softraid volume on the backup drive attached cleanly, on the actual partition it was supposed to. The clone finished, announced itself, and offered the target drive by name. The cancel button meant what it said. The error boxes lined up their borders without a single misaligned emoji. The construct had learned to remember. Not just what was open, but where it was standing. The Turing Police would need a court order to restore their desktop state. We used a hundred lines of Go and a JSON tree.” — The OpenRiot Crew, after the construct woke up right, v7.9.43