cad/ holds the left/right side adapters that mount the GeeekPi 9" 3U
touchscreen (a 10" mini-rack part) into a standard 19" rack: OpenSCAD
source, STLs, Anycubic Mega Pro gcode, and SendCutSend DXFs for the
sheet-metal version. Geometry is physically tested in a 19" rack.
notes/PLAN-v2.md is the reviewed plan for the Rust rewrite.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
With X ignoring the touch panel nothing ever moves the pointer, so it sits
at screen centre forever. --i3 installs unclutter-xfixes and autostarts it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No keyboard needed after a reboot, and a second connected display can no
longer capture the window.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A separate tmux window running any TUI, reached with a vertical swipe from
any carousel screen; swiping up returns to the exact window/zoom you left.
The aux window is excluded from the horizontal carousel and horizontal
swipes on it are inert. Bound only when SOCKTOP_AUX_CMD is set.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SOCKTOP_GROUPS splits hosts into ';'-separated groups, each its own tmux
window with an optional @layout. The carousel walks group overview -> each
pane zoomed -> next group overview. SOCKTOP_HOSTS still works as one group.
install.sh --autologin writes a lightdm.conf.d drop-in; uninstall removes it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Wall displays must never blank. --noblank applies two layers: an Xorg
ServerFlags snippet with all four timeouts at 0 (covers the DM greeter, and
survives reboots) and an xset line in the i3 autostart (a session or DM can
re-enable the screensaver after X starts). Either alone is insufficient.
Documents the trap that cost time here: `sudo xset ...` targets root's X
connection and silently does nothing, so a `sudo bash noblank.sh` wrapper looks
like it worked while blanking stays fully armed.
Also fixes a latent bug: `[ "$relogin" = yes ] && echo ...` as the final
statement made install.sh exit non-zero under `set -e` -- and skip the closing
instructions -- whenever a relogin was not required.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The documented restart was `pkill -x lisgd && socktop-gestures &`. pkill exits
non-zero when it matches nothing, so `&&` short-circuits and the daemon
silently does not start when none was running -- you swipe, get nothing, and
reasonably blame the config change you just made. socktop-gestures exec'd lisgd
with no guard, so nothing downstream caught it.
Rather than only fixing the one-liner, move the invariant into the tool: it now
exits non-zero if a daemon is already running, and --replace stops the old one
first (waiting for it to actually exit). This is the failure the README itself
flags as gotcha 3, so a false success there is expensive.
Verified against a live daemon: refusal, --help, bad-option exit codes, and a
clean pid handover under --replace with the carousel still working.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tiled socktop dashboard where a right-to-left swipe zooms into each host
full-screen and left-to-right walks back out.
The carousel is tmux pane zoom rather than separate socktop instances, so
there is one process per host: half the processes, no reconnect delay when
swiping back, and constant polling load on the monitored hosts.
Gestures come from lisgd because libinput emits gesture events only for
touchpads, never touchscreens, which rules out libinput-gestures entirely.
Documents the four gotchas found while building this: panels reporting 2-3
contacts for a one-finger swipe, X needing to ignore the panel so the
terminal and socktop stop competing for the same touches, tmux mouse mode
being incompatible with swipes, and lisgd not grabbing the device
exclusively so two instances double-fire.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>