fix: let a user's own tmux work inside a persistent session, and size terminal text on its own (#159) - #170
Merged
Conversation
… terminal text on its own (#159) Persistent sessions wrap the remote shell in `tmux -L voltius`, and tmux exports `$TMUX` into that shell. A tmux client given no `-L`/`-S` takes its socket from `$TMUX`, so the user's own `tmux ls` listed Voltius's private sessions instead of theirs and `tmux attach` refused to nest outright. The wrapper also owned `C-b`, so even a forced nest lost every prefix key. The pane command now unsets the multiplexer environment (`TMUX`/`TMUX_PANE`, `STY`/`WINDOW` for screen), and the wrapper gives up its prefix with `prefix None` — set both in the config file, for a cold server, and with a `set -g` push, for a server an earlier session left running. The prefix is version-gated to tmux 2.1+, the first release that accepts `None` as a key; older tmux keeps `C-b` but still gets the clean environment. Terminal font size only existed inside a theme, so changing it meant cloning a theme or scaling the whole UI. It is now a setting of its own in Appearance, overriding the active theme, and on mobile a two-finger pinch on the terminal drives the same value. It stays device-scoped: a size that reads well on a phone does not read well on a desktop, so it is not synced.
This was referenced Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #159.
Why tmux looked broken
Persistent sessions (on by default) wrap the remote shell in
tmux -L voltius new-session -A -s voltius_<uuid>. tmux exports$TMUXinto that shell, and a tmux client given no-L/-Stakes its socket from$TMUX. So inside a Voltius session:tmux lslisted Voltius's private sessions (voltius_35917e3f…) instead of the user's own;tmux attach -t <their session>refused with "sessions should be nested with care, unset $TMUX to force";C-b, so even a forced nest lost every prefix key.The reporter's screenshots show exactly this: Termius, which does not wrap, lists their real
noa/nb2/gsuid/ai-shellsessions.What changed
persistent_exec_commandnow:unset TMUX TMUX_PANE(screen:unset STY WINDOW) to the pane command, so the shell inside starts with a clean multiplexer environment. Nothing in Voltius reads those back — every control path names the socket and session explicitly;prefix None, written into the config file (cold server) and pushed withset -g(a server an earlier session left running, which never re-reads-f). Version-gated to tmux 2.1+, the first release that acceptsNoneas a key name; older tmux keepsC-bbut still gets the clean environment.The wrapper stays invisible: status line off, no prefix, and the user's own tmux behaves as it does over plain ssh.
Terminal font size
The same report asks for a terminal font size independent of the overall UI scale.
terminalFontSizeexisted only as a theme field, editable only in the Theme Creator, so changing it meant cloning a theme or scaling the whole interface.getActiveThemefolds the override in, so xterm, the CodeMirror editor,--t-terminal-font-sizeand the theme chip all agree.uiPreferencessync wire.StepperCard, used by both settings.Verification
cargo test --lib shell_integration: 20/20, including the dropbear payload-length cap.vitest run: 500 files / 3878 tests pass;tsc --noEmitclean.dashandbash, and the tmux version gate was table-tested (3.4,3.5a,2.1,2.9a→prefix None;2.0,1.8, empty → left alone).Live run
Both halves were driven in the headless dev build, not just compiled.
The wrapper was run against a real tmux 3.7c (installed on the throwaway
ssh-host-1), with the payload rendered exactly aspersistent_exec_commandemits it. Inside the wrapper's pane:The user's own
tmux lsnow lists their session and not ours, persistence still works on the private socket, andtmux attach -t minefrom inside the pane attached — status line drawn,tmux list-clients -t minereports 1 client — where it used to refuse with "sessions should be nested with care".In the app: Settings → Appearance shows the new card; stepping it 14 → 20px moved
--t-terminal-font-sizeto20pxand persistedterminalFontSize: 20. With a live local shell open, 12px vs 26px visibly resizes the terminal text (grid refits to 67×21) while the settings modal, sidebar and tab bar stay pixel-identical. Reset returns to the theme's 14px and clears the override; the UI-scale card still steps 100% → 105% → reset after the shared-stepper refactor.The mobile pinch is covered by unit tests only — no touch device was driven.