···11+---
22+atroot: true
33+template:
44+slug: ssh
55+title: tail CI logs over SSH
66+subtitle: never leave your terminal to check on CI!
77+image: https://assets.tangled.network/blog/pty/astral-projection.webp
88+date: 2026-05-28
99+authors:
1010+ - name: Akshay
1111+ email: akshay@tangled.org
1212+ handle: oppi.li
1313+---
1414+1515+If you push to a new branch on a remote, if CI was
1616+triggered, Tangled now helpfully supplies an `ssh` command
1717+for you:
1818+1919+```bash
2020+λ jj git push -c @-
2121+ -- snip --
2222+remote: → Browse CI logs in your terminal:
2323+remote: ssh -t -p 3333 tangled.org did:plc:j5hmlfdrwkvtxm7cjmu7j2is 796ecc5b0ce5381ed5b5021e7cc28b4b05e03c92
2424+```
2525+2626+Paste that command in a new shell, and you are dropped into
2727+a fullblown TUI, served over SSH:
2828+2929+<video src="https://assets.tangled.network/blog/pty/Screen%20Recording%202026-05-27%20at%2011.43.11-cropped-half.webm" controls>
3030+</video>
3131+3232+Try it for yourself:
3333+3434+```
3535+ssh -t -p 3333 tangled.org did:plc:j5hmlfdrwkvtxm7cjmu7j2is 796ecc5b0ce5381ed5b5021e7cc28b4b05e03c92
3636+```
3737+3838+That SSH commmand runs a "screen based" program on the
3939+remote machine. In this case, the program is a TUI built
4040+using
4141+[bubbletea](https://github.com/charmbracelet/bubbletea) and
4242+[wish](https://github.com/charmbracelet/wish).
4343+4444+SSH powered interfaces are wonderful for several reasons:
4545+4646+- They require zero installation
4747+- They work great for interactive bits like menus
4848+- They have all the upsides of running a TUI: you can
4949+ persist them over tmux, theme them with terminal colors
5050+ etc.
5151+5252+But they are doubly wonderful when streaming CI logs, the
5353+screen-program is totally unaware of ANSI escape codes, but
5454+they are handled correctly by virtue of writing to a PTY.
5555+Both ends (the commands running in the CI job and the PTY)
5656+are speaking the same language.