8e70875631770c15db8af9662524bd5a74257482
Re-skin the mobile toolbar to Google Workspace dark vocabulary (#202124 bar, #303134 surface, #3c4043 hairlines, Roboto 12/500) keeping #D35400 as the sethmux accent. Adds .mono / .hi / .grn button variants with hover/active wash transitions. Adds a compose bar (toggled by 'Type' button) — a real <input> with autocorrect=on and enterkeyhint=send. Enter/Send/↵ flushes the assembled string to stdin in one shot, plus \\r. Other toolbar taps while composing flush typed text first to preserve order, but keep the compose bar open. Sidesteps xterm.js's per-keystroke input model that drops Gboard/iOS bulk-replacement events. relayout() now measures bar.offsetHeight instead of hard-coding calc(100vh - 88px) so the third row reflows the terminal correctly. Records the design rationale and what was rejected in DECISIONS.md.
sethmux
Mobile-first web terminal powered by ttyd + tmux. One persistent session, multiple tabs, accessible from any browser. Kitty-compatible keybindings.
Features
- Single persistent tmux session — shared across all connected clients, live-synced across devices
- Kitty keybindings —
Ctrl+Shift+T/W/Left/Rightetc. via tmux extended-keys (CSI u) - Mobile touch toolbar — two-row on-screen buttons for all common actions
- AI CLI optimized — 200K scrollback, pane capture/logging, pre-built session layout
- Push notifications —
sethmux-notify "Build done!"sends browser notifications - PWA installable — add to home screen for app-like experience
- Dark theme — Sethian dark + orange (#D35400) accent
Keybindings
Kitty-compatible (Ctrl+Shift+key)
| Key | Action |
|---|---|
Ctrl+Shift+T |
New tab |
Ctrl+Shift+W |
Close tab |
Ctrl+Shift+Right/Left |
Next / previous tab |
Ctrl+Shift+1-9 |
Go to tab N |
Ctrl+Shift+. / , |
Move tab forward / backward |
Ctrl+Shift+Enter |
New split (horizontal) |
Ctrl+Shift+] / [ |
Next / previous pane |
Ctrl+Shift+L |
Cycle layouts |
Ctrl+Shift+Up/Down |
Scroll up / down |
Ctrl+Shift+PageUp/PageDown |
Scroll page |
Ctrl+Shift+Home/End |
Scroll to top / bottom |
Ctrl+Shift+H |
Show scrollback in pager |
Ctrl+Shift+C |
Enter copy mode (vi-style) |
Ctrl+Shift+V |
Paste |
Ctrl+Shift+Delete |
Clear terminal + scrollback |
F11 |
Toggle fullscreen (zoom pane) |
Dvorak extras (prefix Ctrl-A)
| Key | Action |
|---|---|
Ctrl-A v / s |
Split vertical / horizontal |
Ctrl-A S |
Capture pane to ~/logs/ |
Ctrl-A L |
Toggle live logging to ~/logs/ |
Ctrl-A z |
Zoom pane |
Alt shortcuts (no prefix)
| Key | Action |
|---|---|
Alt-T |
New tab |
Alt-W |
Close tab |
Alt-1 to Alt-5 |
Go to tab N |
Alt-Left/Right |
Previous / next tab |
Mobile Toolbar
Two rows, appears on screens < 900px:
Row 1: +Tab Next Prev | ^C ^D Clr | Esc Tab ▲ ▼
Row 2: Sel Paste Zoom Save | V.Spl H.Spl Pane Kill
Session Layout
On startup, four named windows are created:
| Window | Purpose |
|---|---|
| code | Main working terminal |
| git | Git operations |
| run | Running services / builds |
| logs | Tailing logs, monitoring |
Push Notifications
sethmux-notify "Deploy complete!"
echo "done" | sethmux-notify
make build && sethmux-notify "OK" || sethmux-notify "FAIL"
Architecture
Browser -> Caddy (HTTPS + Auth) -> ttyd (port 7683) -> tmux session "sethmux"
-> notify-server (port 7684) -> /api/notifications
Quick Start
# Dependencies
apt install -y tmux
curl -sL https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.x86_64 -o /usr/local/bin/ttyd
chmod +x /usr/local/bin/ttyd
# Deploy
sudo mkdir -p /opt/sethmux
sudo cp static/* /opt/sethmux/
sudo cp sethmux-start.sh /opt/sethmux/
sudo cp notify-server.py /opt/sethmux/
sudo cp sethmux-notify /usr/local/bin/
sudo cp config/tmux.conf ~/.tmux.conf
sudo cp systemd/*.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now sethmux sethmux-notify
Reverse Proxy (Caddy)
mux.example.com {
# your auth here
handle /toolbar.js { root * /opt/sethmux; file_server }
handle /manifest.json { root * /opt/sethmux; file_server }
handle /icon-*.png { root * /opt/sethmux; file_server }
handle /api/* { uri strip_prefix /api; reverse_proxy localhost:7684 }
handle { reverse_proxy localhost:7683 }
}
License
MIT
Description
Languages
HTML
94.7%
JavaScript
4.6%
Shell
0.5%
Python
0.2%