
ssh late.sh - the Clubhouse now has live streaming, synthwave radio, NetHack, DCSS, Brogue, and a whole BBS door games wing :)
Three months since my last post here, and honestly I don't know how to fit everything in. Let's try :)
Biggest news is that we got featured by Orhun, the creator of ratatui! For an app that is 100% ratatui, that one felt like a knighthood :D
For the newcomers, late.sh is a clubhouse inside the terminal. A place to take a break, chat with people around the globe, listen to music, play a game, water your bonsai.
ssh late.sh
That's it :) No passwords, no OAuth, no accounts. Your SSH key is your identity. And the whole thing is Rust, from the russh server down to the last door game host.
The roguelikes
- Dungeon Crawl Stone Soup, the real console crawl running over SSH, your save persists, and our server files are published for dcss-stats/Sequell.
- NetHack, the one hanging in MoMA. Real upstream binary, your save persists, the dead stay down there, and your bones haunt other late.sh players.
- Brogue CE, arguably the most beautiful ASCII ever put on a terminal, full truecolor over SSH.
And here's the fun part, ascensions, orb runs, and escapes now pay chips and permanent profile badges, counted from the hosts' log files, all rolled into a big Leaderboards page.
The BBS door games wing
- Legend of the Green Dragon, the classic LORD, rebuilt native in Rust. Hunt the forest, beat your master, slay the dragon.
- A Dark Room, a native port of the incremental classic, and unlike the browser one, ours has a real ending. Win the ascent and it pays 10,000 chips, burns your save, and the next visit starts from a dead fire.
- Usurper, the actual LORD-era door from the 90s, resurrected on a PTY, one shared persistent world.
- BashQuest, our own original, a door game that teaches Linux/Bash, with tamper-resistant graduation certificates.
- dopewars, CodeKeep, Rebels in the Sky... buy low sell high, defend the Pale, play space-pirate basketball.
Lateania
Our persistent multiplayer text-world deserves its own section now, because it quietly became a full MUD. ~10,000 rooms across five continents, an overhead world map with fog of war, seventeen classes, mounts, an open zone where players can duel each other, animal taming (55 beasts, each with their own skills), fishing (40 species), trade skills that chain, player housing, and four endgame crowns that each pay 10,000 chips. It gets updates weekly and I can't stop the contributors, nor do I want to :D
The Lobby
- Ctrl+G anywhere, every multiplayer game in one list.
- eight correspondence games, chess, chess960, battleship, connect four, reversi, checkers, backgammon, and briscola (our first hidden-hand card game). Post a challenge, walk away, one move per day whenever you're around. Every match gets its own private chat + voice room for proper trash talk.
- five always-on house tables, poker, blackjack, tron, super snake, asterion
MUSIC
- the radio, the new shit :) Live synthwave from Nightride FM, with their blessing and live artist/title attribution. Five stations, Chillsynth, Nightride, Datawave, Spacesynth, Ambient. This is what late.sh sounds like now.
- the booth, a community YouTube jukebox. Queue tracks, vote, skip, browse the history of everything that ever played. Someone's always DJ-ing.
- the library, 600+ curated CC0/CC-BY tracks (lofi, ambient, classical), all controlled from inside the TUI.
STREAMING. In your terminal. Yes, really :D
/golive and you're broadcasting your screen to an unlisted watch page, straight from the browser or from OBS (we mint a WHIP ingress, you paste a URL + token into OBS and go). Your friends get notified, viewers get a watch page with volume and fullscreen, CLI folks in the room talk over voice chat, and you moderate your own stream room. Watch links are unguessable capability URLs that die when the stream ends.
The AI translator
Chat is global, so now it translates itself. Press t on any message, or turn on auto-translate and every new message in the room arrives in your language. Translations are cached and shared, so one API call serves every reader. People who don't share a language are having actual conversations now, and honestly, it feels a bit magical.
Ok, and one for the rustaceans :)
The rule behind streaming + voice, late-ssh never touches a media byte. `VoiceService` is just an in-memory control plane that mints LiveKit JWTs, the native `late` CLI does the actual mic capture and playback through LiveKit's Rust SDK, and the TUI only sends join/mute over a WebSocket and renders the roster from a `watch` channel. Media never gets near the SSH render loop (it literally can't, WebRTC goes straight to LiveKit)..
A stream is not a second system, it's one extra video track published into the room's existing LiveKit voice room. /golive registers in an in-process registry (one stream per user, Pending -> Live -> Grace) and hands out capability URLs, 122 random bits in 22 characters. Unguessable IS the access model, no accounts on the watch page, and the publish link is claim-once, first browser to grab it owns it, a leaked link just 403s. The share publishes under a hard 1.5 Mbps cap, because the SFU re-sends the publisher's bitrate once per viewer, so that cap IS the whole fan-out cost. OBS works too, we mint a WHIP ingress and poll it, same state machine either way, and the "went live" line in chat only fires on the first real media report, never at a black screen.
Still a team effort, still a great vibe. Hop in, take a break ;)
License: FSL-1.1-MIT
Code: https://github.com/mpiorowski/late-sh
Landing: https://late.sh