title: "September 2026"
September 2026
BlueBubbles read receipts — 23 September
Investigation, repair, verification, and deployment log.
systemd re-visitied
Context is trying to figure out why sabnzbd-categories is failing at systemd...
So i asked claude last time and got most of it but writing it myself always helps....
What am I trying to understand here?
a) why booting takes so long
b) how does after/depends-on/requires/after/before works in the dependency tree of systemd
Output of systemd-analyze critical-chain
right so....
systemd-modules-load.servicesstarts at 835ms and takes 88mssytemd-sysctl-.servicestarts at 927ms and takes 22ms
this makes sense as 835ms + 88ms = 923ms, which i guess... is ~= 927ms
so apparently the above is for boot ^
according to codex the approx oder from power in is:
- firmware / bootloader / rgub
- kernel
- systemd
- tuigreet (login)
- USWM
- hyprland
- graphical-session.target
for the user its systemd-analyze --user critical-chain
hmmm i guess this is the critical chain not actually hyprland? as hyprland does NOT take 222ms
well this is MUCH more reasonable
but still doesn't tell me exactly where that 3s comes from? anyway i digress....
systemd rules
right so under systemd [Unit]
wants/requiresis should the unit actually be run?- so
A wants Bmeans A ... needs B to run, but can be started concurrently (along for the ride) A wants Bis more like if A started, start B, A wont fail if B failesA wants=B After=Bmeans needs B and should run after B has startedwantedbyis the reverse ofwants, i.e.network-manager wantedBy=tailscale, as tailsacle will need networkmanagewr
ahhhhh so
A requires=BmeansA wants=Bbut unlikewantsif B fails A also fails
right table from codex explaining... for the "starting" relationships, i.e. when units should be switched on or not
according to codex, a for
A Requires=B. on start byBmeansAdoes not start, but later on ifBcrashesAwill NOT stop
not 100% sure about bindsTo and partOf honestly
then for ordering
kitty breaking escape keys
How weird... in a broken tmux state where escape is being malformed?
the 2nd is escaped esacpe code (from a working kitty window) - but the first is malforming them?
nix paths
god this is a long time coming...
claude can seemingly cook up all the nix paths required to debug but i never know how it works - why does nix eval take so long? where do these store paths come from?
the most obvious one is with systemd units already built... just do systemctl status sabnzbd-categories.service or systemctl cat and the path will be in ExecStart=/nix/store/.....
god.... this nightmare again...
nix eval.. evaluates, but apparently the format to evaluate from this repo is in the form of a module NOT a flake. I.e. accoridng to (nixos modules)[https://nixos.wiki/wiki/NixOS_modules]
thus, we can do nix eval to get the networking resolved options for pi-box
so my understanding is the let in... nixosConfigurations produces the output nixosConfigurations
`the # is short form for nix eval --json "/home/joelyboy/dev-setup#nixosConfigurations...."
claude separates these into two categories, nix "evaluations" which doesnt build anything it just "computes" it
claude then talkes about "build" where we actuall build something
ahhh so this helps...
in nix repl, we run :lf . to load this flake here at dev-setup
then can simply type nixosConfigurations and the interprester will give us the list:
although the more "correct" way would be builtins.attrNames nixosConfigurations.
From this we can use builtins.attrNames nixosConfigurations.pi-box.options to figure out there is nixflix
thus. grabbing all in a json in a single expression becomes:
nix eval --json .#nixosConfigurations.pi-box.options.nixflix
Vimium
So annoyingly vimium synchronises to a file somewhere in /home/jollof/.config/BraveSoftware/Brave-Browser/Default/Extensions/... but its a binary file? so is not just a plain old list of configuratrions.
I did find this but it requires home manager (which I don't want to use)
Then there is surfingkeys, which DOES have a plain text option for blocked sites but you have to enable developer mode in brave and then user scripts for the extension, which i don't think is configurable via nixos
See chromium policies, for details on the chrome policy to block vimium on those pages
Now i (could) try tridactl but i did get it to work with a nice hack from codex?
Agent sidebars
Interactive architecture map and remote setup
So apparently someone has built what ive been wondering about a) tmux combined with remote session b) status indicator for coding (claude-code, codex, opencode) whether they're waiting idle etc
I did try tmux-agent-sidebar before but wasn't overly impressed with the UI
quick recap on TTYs....
If i open a new terminal and type tty then i get /dev/pts/10
This means kitty is bound to that pseudo-terminal device? whatever that means...
And can see it belongs to the tty group:
Then, can do the same thing for tmux and get its tty
To view all of these options like
pane_tty, dotmux display-message -a
quite cool to view the process tree and see the tmux attach and the associated pts with it, from ps -ef --forest
So a comparison table so far of what I'm looking for:
- unified view of local + remote sessions in tmux
- ability to preview remote session in the switcher (like choose tree)
- see which coding LLM sessions are running, waiting, which ones were last active
So far:
My additional thoughts on each one
Tmax
Really nice piece of work, but im not a fan of how the local tmux emulates remote sessions.
I already had to hack the code to make it accept an SSH key (not password), and discovered a bug where splitting panes doesn't respect the current dir
also a bit of a 🟥 that it clobbers the claude settings.json file
Tmmx
Not an agent sidebar, instead a remote connection manager. Works by nesting remote sessions inside local ones.
Made by one guy, 1 star, basically what I hacked together myself.
Annoyingly, it does not integrate with tmux-agent-sidebar with nested sessions...
tmux-agent-sidebar
Seems good so far , stable which is the most important thing. although the UI is hard to read...
Feels like having a loading/waiting/idle status per LLM session would be simplest
Bit of a 🟥 that last release was 3 months ago given how fast this space moves, and plenty of PRs sitting un-merged... but it DOES seem the most trusty workhorse at the moment...
annoyingly, it will only load agents in the flat tmux server - doing nested tmux sessions with remotes it doesnt pick them up.. not a fault but means it wont work with my end goal of sidebar for all agents in all remotes
claude squad
only tried briefly. makes its own tmux sessions and has its own TUI... doesn't match my workflow as I want something to integrate not replace my workflow
agenmux
very intersting new project, very new (and very janky)
I tried to use tmux zoom pane in the sidebar pane and it crashed it... not the best start. ok maybe i overlooked this one.
i think this is the future but it doesnt have timestamps which is the most annoying thing right now...
tmux-agent-status
yeah i just could not get this to work cleanly. granted i got codex to do the heavy lifting of setting it up but I couldnt expand panes within remote sessions, the loading prefix for statuses didnt update (although i wasnt logged in).
makes sense as its all shell script with not that much activity
sesh / tmux-sessionx / tap: local-only, so ❌ on unified, but could be useful for inspiration on the picker
verdict on agent sidebars
ok so what im convering on is:
- tmax is a bit janky... i think its control and hack of keys is quiestionable.
- HOWEVER- tmax can se the built in c-a
for searching is EXCELLENT - re-making my own searcher is a bit of a faff
- tmax also binds c-a L which is also excellent
- bug just happened with tmax! pretty annoying, splits didnt work and not in the same path...
what is a happier middle ground (I think) is:
- let someone else handle the agent statuses? like running/idle etc?
- whats hard is c-a L? to track remote sessions?
- could have a c-a E - which is like c-a L but for remotes? i.e. go to last remote?
- trying to remember the combination of the last local session and last remote session is just too much of a faff...
opensessions
this looks very promising but the fact there's been 1 release 3 months ago on alpha and no commits since then is a bit a 🟥
Seems like there's either janky maintained personal projects or ones that dont fit my workflow 😥
agent-deck
hmmm - gave it a try, it has a pretty heavy handed TUI.
I had problems straight away with it not connecting to tmux... granted I probably didn't configure it properly but I also don't NEED a TUI to spin up agents? I just need a manager to track my agents and let me switch between them
pasting issues
Stil getting these random issues with pasting just doesnt work, even though the entry at the top of cliphist via super-v does work?
so (hopefully) this is fixed now with the addition of wl-clip-persist. have added clipdebug to zsh incase we need to debug it in the future where clipboard fails again
nvim command searching
something i forgot, can do : to bring up the command view in nvim now i have the binding for c-f to bring up the search pane for historic commands. as i always forget the weird q: binding thats' already built in
image trimming
So the purpose of this is to try and bring down the size of the container to save on space when I want to spin up a test?
But a few points to clarify which I seem to be getting confused with
- doing
pacman -S gduinsideDockerfileis NOT the same as doing it in a container- both install files on disk: the first in an image layer, the second in the container's writable layer
- running the installer or scanning files can increase RAM usage, including caches that can remain afterwards and be reclaimed when needed
- docker image layers stay on disk; files are loaded into RAM as programs use them, not all at container startup
however, trimming down the absolutely necessary neovim dependencies and keybindings to allow me to keep the container RAM small simpy because it won't be spamming language servers
nvim tabs
right so been meaning to do this for a while...
I was initially hesitant to an approach like this? given that i have harpoon but never actually use it (dead plugin), but this could be good?
ok tabby is actually quite good - the naming of tabs like DiffviewFilePanel is excellent - having a way to search for a tab <space>Tp is lovely
So a sumamry of changes to keys:
<space>Tpsearch for tabs<space>Tfor tab menu4gtgo to tab 4g<tab>go to previously used tab
and as a refresher:
mAmarks A (capital is across all files)'Agoes to mark AdmAdeletes mark A
and mini surround 🤣, covering all the stops here
- the first step is
safor adding chars?sdfor deletion,srreplace and highlighsh
ok so followups... a
- if i have
and have selected the space text and wanted to delete the <>, why doesnt sd< work, sd just deletes the work straight away? - how does the selection work? with sa? is it more implicit plugin hell? im just supposed ot know?
nix ssh config
annoyingly, ssh config configurations is only available via home-manager, so having to rawdog it (or get claude to do it)
future work for agent status
TODO: Right now the switcher is a bit of a hack reading through temp files to get the last change on agents..., exposed by tmux-agent-sidebar but not in the metadata...
in the future would be nice ot just have this "available", either via a PR or different package. annoyingly, agenmux doesnt poll if sidebar is closed so unsure if thats the right model as it doesnt use hooks
tmux selection
So up until now ive been doing c-a + [ + k + V to get the last line... so there IS a better way!
ctrl-a tabto go intoextraktowhich has different modes an fzf- extrakto also has
tabto insert to enter to copy if we want to use it stragith away nice - tmux-finger has
ctrl-a Fto copy specific work via key, orctral-a Jto jump to position by vim key
unsure about that one tmux finger? seems specific to files, git etc not very generic
- copycat has
ctrl-a ctrl-ffor files,ctrl-a ctrl-ufor urls - and goes back up the buffer unlike the fzf plugin - another binding for me is the extrakto
ctrl-a ctrl-lto go straight into line mode
pi-box → streaming-server migration
So pi-box is underpowered, so moving the big harddrive to streaming-server (beelink bit more powerful) and all the configs with it.
This is the rough list of migration steps:
- nix configurations copied across,
iambpoints to stremaing-server, set mac-mini destination to streaming-server (98e14ce) - go to the sparkyfitness admin dashboard on pi-box and click "backup now" in the admin section
- copy to backup tar file from the pi-box to the
/mnt/big-hdd(currently mounted on pi-box) - turn off pi and plug in big HDD to streaming server box
- rebuild the streaming-server box with
task os:build - copy the backup from the big HDD box (mounted with the new config) to downloads
- use the manual restore from db in admin from sparkyfitness
And for the manual steps:
- change bitwarden entries for jellyfin/seer etc from pi-box to streaming-server
- invite the rooms and login:
- prompt mac to restart and re-add itself as a user:
todo:
- matrix pwd to store?
- next time... can copy iamb?
- nixflix?
- remove everything from pi-box
Nix evaluations again...
right back here agin, so it turns out? this mess of eval / inspect etc...

