Commits
kubo node (swarm :4001, gateway NoFetch) + anonymous tarball -> ipfs add
(blockstore, no --nocopy) -> pinned -> returns CID; refuses uploads with
<300GiB free; explicit ipfs-gc + ipfs-roots (pins are the stored GC roots).
dns: ipfs -> CNAME neoprism, starkstrom -> A 194.110.87.67.
BIOS/GPT disko on /dev/vda, static networkd, retiolum (inline
krebs.hosts.starkstrom); clan vars + nixos-facter; server tag,
internet host, deploy.forwardAgent.
The upstream QuickShell i3 plugin never removes a workspace model
object on rename: the rename event is looked up by the NEW name,
misses the cached object under the old name, and only logs a warning.
A renamed workspace therefore lingers as a stale pill until a full
refresh or shell restart; clicking that ghost re-creates the old name
as a real workspace (the pill click script runs
"workspace <name>, move workspace to output <out>").
Force I3.refreshWorkspaces() every 30s while the shell is running so
stale entries are pruned on their next model rebuild.
prism is decommissioned, so social.krebsco.de had no working entry
point while the hotdog container itself kept serving fine on neoprism.
DNS for social.krebsco.de still needs to be repointed to neoprism
before ACME can issue a cert.
Livestreams never played and VOD depends on companion keeping up with
YouTube's po_token and SABR changes, which it does not reliably enough to
be worth the moving parts.
Takes the residential exits with it: tinyproxy on styx and coaxmetal
existed only so neoprism could reach YouTube from a non-Hetzner address.
Leaves the generated companion key in vars/pass, matching how the
silverbullet and oauth2-proxy removals were handled.
Point at Lassulus/tincr fix/pmtu-blackhole-recovery (upstream main plus
the fix) until it lands in Mic92/tincr.
ignavia and coaxmetal sit behind the same NAT, which does not hairpin.
Once a relay hands each the other's reflexive address, every UDP probe
is answered with ICMP port unreachable, and tincr never recovers:
udp_timed_out measured from the probe send rather than the reply, so
the 10s keepalive kept pushing a 30s deadline out of reach and
udp_confirmed stayed pinned; with it pinned, discovery collapsed maxmtu
to 0 and nothing re-armed it, so every cycle re-converged to MTU 0.
Logged as "Fixing MTU of coaxmetal to 0" 201 times in 30 minutes with
the peer unusable, versus once for every healthy peer.
Also carries upstream PRs #13-#20 (riscv64, tincd-compat, default
package, systemd credential loading, multi-user.target).
Colours stay inside the terminal's ANSI palette (NNN_FCOLORS, NNN_COLORS,
bat's ansi theme, mdcat), including nnn's nerd icon table which hardcodes
xterm-256 codes, so retheming the terminal also retints a session running
on the far side of ssh.
The image previewer asks the terminal which graphics protocol it speaks
instead of letting chafa guess from inherited KITTY_* variables, which
claim kitty even where the data cannot reach a terminal and leave blank
placeholder cells behind. Frames are rendered into memory and written
with signals blocked, so preview-tui killing the previewer on a selection
change cannot truncate an escape sequence.
The kiosk account owns everything needed to test a game the way a player
meets it, and none of it is reachable from outside: sway holds seat0,
XDG_RUNTIME_DIR is 0700, the Xbox pad's evdev nodes are ACL'd to strom
(only the legacy js0 is world-readable, and SDL2 does not use it), and
/home/strom carries both the game state and the /home/strom/strom
checkout that strom-session resolves STROM_FLAKE from.
Follows the existing 2configs/{wine,review,ableton}.nix pattern.
Without an admin nobody can manage any session: sessions registered
through the keyless announce API carry no owner, so canManage was false
for every one of them and the dashboard suppressed its share and kill
controls entirely.
invidious plus invidious-companion, with every request to YouTube going
out through the residential exits on styx (primary) and coaxmetal
(backup). An nginx stream block fans 127.0.0.1:8118 into the two
tinyproxies; failover rather than round-robin, because YouTube binds
po_tokens and videoplayback URLs to the requesting address.
The companion key is generated once into a clan var and handed to
invidious as a systemd credential (the config script runs as the
DynamicUser, which cannot read /run/secrets) and to the container as an
EnvironmentFile.
default_user_preferences.local is forced on: upstream defaults it off,
which makes invidious hand the browser raw googlevideo URLs that are
minted for the exit's address, so they 403 for the client and leak the
exit IP. Playback paths additionally require a real session via
auth_request, since the bytes come off a residential line.
invidious is pinned one release ahead of our nixpkgs for the comments
parser fix; drop the override once the pin catches up.
Livestreams do not play: YouTube serves them SABR-only or with HLS
segments that 403 without a po_token, and invidious' HLS path bypasses
companion. Upstream gap, tracked in iv-org/invidious#3811 and
iv-org/invidious-companion#7.
YouTube throttles and blocks Hetzner ranges, so neoprism cannot talk to
it directly. tinyproxy listens on the retiolum address of each box and
only accepts neoprism, giving invidious a residential exit.
Bare `provider = "custom"` resolves its credential from a host-gated
candidate list and only forwards OPENAI_API_KEY when base_url points at
openai.com (upstream #28660 / GHSA-76xc-57q6-vm5m). For any other host it
substitutes the literal placeholder "no-key-required", so the llama
cluster answered 401. Use a named custom_providers entry with key_env,
which is not host-gated, and rename the env var to LLAMA_API_TOKEN.
The upstream QuickShell i3 plugin never removes a workspace model
object on rename: the rename event is looked up by the NEW name,
misses the cached object under the old name, and only logs a warning.
A renamed workspace therefore lingers as a stale pill until a full
refresh or shell restart; clicking that ghost re-creates the old name
as a real workspace (the pill click script runs
"workspace <name>, move workspace to output <out>").
Force I3.refreshWorkspaces() every 30s while the shell is running so
stale entries are pruned on their next model rebuild.
Livestreams never played and VOD depends on companion keeping up with
YouTube's po_token and SABR changes, which it does not reliably enough to
be worth the moving parts.
Takes the residential exits with it: tinyproxy on styx and coaxmetal
existed only so neoprism could reach YouTube from a non-Hetzner address.
Leaves the generated companion key in vars/pass, matching how the
silverbullet and oauth2-proxy removals were handled.
Point at Lassulus/tincr fix/pmtu-blackhole-recovery (upstream main plus
the fix) until it lands in Mic92/tincr.
ignavia and coaxmetal sit behind the same NAT, which does not hairpin.
Once a relay hands each the other's reflexive address, every UDP probe
is answered with ICMP port unreachable, and tincr never recovers:
udp_timed_out measured from the probe send rather than the reply, so
the 10s keepalive kept pushing a 30s deadline out of reach and
udp_confirmed stayed pinned; with it pinned, discovery collapsed maxmtu
to 0 and nothing re-armed it, so every cycle re-converged to MTU 0.
Logged as "Fixing MTU of coaxmetal to 0" 201 times in 30 minutes with
the peer unusable, versus once for every healthy peer.
Also carries upstream PRs #13-#20 (riscv64, tincd-compat, default
package, systemd credential loading, multi-user.target).
Colours stay inside the terminal's ANSI palette (NNN_FCOLORS, NNN_COLORS,
bat's ansi theme, mdcat), including nnn's nerd icon table which hardcodes
xterm-256 codes, so retheming the terminal also retints a session running
on the far side of ssh.
The image previewer asks the terminal which graphics protocol it speaks
instead of letting chafa guess from inherited KITTY_* variables, which
claim kitty even where the data cannot reach a terminal and leave blank
placeholder cells behind. Frames are rendered into memory and written
with signals blocked, so preview-tui killing the previewer on a selection
change cannot truncate an escape sequence.
The kiosk account owns everything needed to test a game the way a player
meets it, and none of it is reachable from outside: sway holds seat0,
XDG_RUNTIME_DIR is 0700, the Xbox pad's evdev nodes are ACL'd to strom
(only the legacy js0 is world-readable, and SDL2 does not use it), and
/home/strom carries both the game state and the /home/strom/strom
checkout that strom-session resolves STROM_FLAKE from.
Follows the existing 2configs/{wine,review,ableton}.nix pattern.
invidious plus invidious-companion, with every request to YouTube going
out through the residential exits on styx (primary) and coaxmetal
(backup). An nginx stream block fans 127.0.0.1:8118 into the two
tinyproxies; failover rather than round-robin, because YouTube binds
po_tokens and videoplayback URLs to the requesting address.
The companion key is generated once into a clan var and handed to
invidious as a systemd credential (the config script runs as the
DynamicUser, which cannot read /run/secrets) and to the container as an
EnvironmentFile.
default_user_preferences.local is forced on: upstream defaults it off,
which makes invidious hand the browser raw googlevideo URLs that are
minted for the exit's address, so they 403 for the client and leak the
exit IP. Playback paths additionally require a real session via
auth_request, since the bytes come off a residential line.
invidious is pinned one release ahead of our nixpkgs for the comments
parser fix; drop the override once the pin catches up.
Livestreams do not play: YouTube serves them SABR-only or with HLS
segments that 403 without a po_token, and invidious' HLS path bypasses
companion. Upstream gap, tracked in iv-org/invidious#3811 and
iv-org/invidious-companion#7.
Bare `provider = "custom"` resolves its credential from a host-gated
candidate list and only forwards OPENAI_API_KEY when base_url points at
openai.com (upstream #28660 / GHSA-76xc-57q6-vm5m). For any other host it
substitutes the literal placeholder "no-key-required", so the llama
cluster answered 401. Use a named custom_providers entry with key_env,
which is not host-gated, and rename the env var to LLAMA_API_TOKEN.