mpiorowski/late-sh

A cozy terminal clubhouse for computer people. Lofi, games, chat, artboard, and tech news, all via SSH.

Rust

1,476

923 commits

updated Sep 29, 2026

See the code

See what people are saying

SourceMessageScoreDate

Terminal Clubhouse Update! Now with POOL in your terminal, NetHack, DCSS, Brogue, and a new ZEN mode :) (r/commandline)

As always, first reminder of what we are ;) A clubhouse inside the terminal. A place to take a break, chill, chat with people around the globe, listen to music, play a game, and draw on a shared artboard. ssh late.sh Three biggest changes since my last post here: * fully playable POOL game, 8-ball,…

13

Sep 29, 2026

README

late.sh

A cozy command-line clubhouse for computer people. Chat, music, games, art, coding, and tech news. Connect with any SSH client!

ssh late.sh

late.sh is a terminal-first social app: real-time chat, music, games, news, profiles, and a shared always-on space you can enter from any SSH client.

Status

This repository is the main codebase for late.sh.

  • The project is open for source reading, local development, audits, and contributions.
  • The public hosted late.sh service remains the canonical deployment.
  • The code is source-available, not OSI open source, during the FSL protection period.

Read the details in LICENSE, the plain-English policy in LICENSING.md, and contribution rules in CONTRIBUTING.md.

What It Includes

  • SSH TUI with dashboard, chat, profile, news, and arcade screens
  • Real-time global chat and shared activity feed
  • Audio streaming via Icecast/Liquidsoap, played by the paired CLI or the public /listen page
  • Terminal games including 2048, Sudoku, Nonograms, Minesweeper, and Solitaire
  • Web frontend for landing, profiles, and the token-less /listen page
  • Companion CLI for local audio playback and synced visualizer data

Workspace

This is a Rust workspace with five crates:

CrateRole
late-cliCompanion CLI for local audio playback, paired controls, and visualizer sync
late-coreShared domain code, database layer, migrations, and infrastructure helpers
late-sshSSH server and terminal UI application
late-webWeb server, landing page, profiles/gallery, stream proxy, and the public /listen page
late-webviewHelper process hosting the official YouTube IFrame Player for the CLI

The stack is backed by PostgreSQL, Icecast, and Liquidsoap.

Quick Start

Try the live service:

ssh late.sh

The SSH login name is discarded rather than used as a public handle. On the first connection, a new account receives a random modifier-and-noun username; the username can still be changed later in Settings.

Run it yourself (requires Docker):

git clone https://github.com/mpiorowski/late-sh
cd late-sh
make start

Then connect to your local instance:

ssh localhost -p 2222

That's it. Postgres, Icecast, and Liquidsoap all come up automatically.

Companion CLI

Install the companion CLI for local audio playback and synced visualizer:

macOS / Linux / Termux:

curl -fsSL https://cli.late.sh/install.sh | bash

On Termux, the installer fetches the Android CLI build instead of the GNU/Linux one.

Windows PowerShell (x64):

irm https://cli.late.sh/install.ps1 | iex

mise (from the GitHub Release archives):

mise use -g github:mpiorowski/late-sh

Nix / NixOS:

nix run github:mpiorowski/late-sh#late

Or build it from source:

mise install        # optional — sets up the expected Rust toolchain
cargo build --release --bin late

Local Development

For development without Docker wrapping the Rust builds, you can run the infrastructure in Docker and the apps natively:

docker compose up -d postgres icecast liquidsoap
cargo run -p late-ssh
cargo run -p late-web

Local host development can use Cargo's normal defaults, including the standard repo-local target/ directory. The /app/target path is only for Docker/dev containers.

export CARGO_HOME=$HOME/.cargo

Use mise install to get the expected Rust toolchain, mold linker, and cargo-nextest.

To test newspaper scrolling in the Docker stack, run make seed-paper, then open /paper in the TUI. This replaces today's Reading and Outside sections with clearly marked sample text and enables the paper. Use make seed-paper PAPER_PARAGRAPHS=5 for a shorter edition (default: 100; range: 1–1000). Close and reopen /paper after reseeding; no restart is needed.

Verification

Run the local gate before opening a PR:

make check

This runs cargo fmt --check, then cargo clippy and cargo nextest across the whole workspace with --features otel. It is the full pre-merge sweep and the only place the otel (telemetry) build is exercised, since CI skips otel to stay fast; otel breakage is caught here or at the release build, never in prod. The local check starts a dedicated Compose Postgres project (late-check) on port 55433 and points DB-backed tests at it via TEST_DATABASE_URL. Override CHECK_INSTANCE or CHECK_PG_HOST_PORT if you need a parallel check database.

Contributing

Contributions are welcome, but read the project policy first:

This repository uses DCO sign-off for commits:

git commit -s

If you distribute a fork, do not present it as the official late.sh service or use the project branding as your own.

More Context

  • CONTEXT.md — architecture, invariants, and working context. Written for LLMs — feed this to your AI editor for best results.
  • CONTRIBUTING.md — workflow, test rules, module patterns, and AI-assisted development tips.
  • THEME.md — how to contribute a new built-in SSH theme via PR.
  • late-cli/README.md — CLI-specific usage and behavior.
cli
irc
ssh
terminal
tui

Significant stargazers

(top 24 of 25)

isabel

470 followers · starred May 2026

Julio Merino

215 followers · starred Jun 2026

Antoine Cotten

153 followers · starred Apr 2026

Yerkebulan Tulibergenov

45 followers · starred Apr 2026

mpiorowski/late-sh

A cozy terminal clubhouse for computer people. Lofi, games, chat, artboard, and tech news, all via SSH.

Rust

1,476

923 commits

updated Sep 29, 2026

See the code

See what people are saying

SourceMessageScoreDate

Terminal Clubhouse Update! Now with POOL in your terminal, NetHack, DCSS, Brogue, and a new ZEN mode :) (r/commandline)

As always, first reminder of what we are ;) A clubhouse inside the terminal. A place to take a break, chill, chat with people around the globe, listen to music, play a game, and draw on a shared artboard. ssh late.sh Three biggest changes since my last post here: * fully playable POOL game, 8-ball,…

13

Sep 29, 2026

README

late.sh

A cozy command-line clubhouse for computer people. Chat, music, games, art, coding, and tech news. Connect with any SSH client!

ssh late.sh

late.sh is a terminal-first social app: real-time chat, music, games, news, profiles, and a shared always-on space you can enter from any SSH client.

Status

This repository is the main codebase for late.sh.

  • The project is open for source reading, local development, audits, and contributions.
  • The public hosted late.sh service remains the canonical deployment.
  • The code is source-available, not OSI open source, during the FSL protection period.

Read the details in LICENSE, the plain-English policy in LICENSING.md, and contribution rules in CONTRIBUTING.md.

What It Includes

  • SSH TUI with dashboard, chat, profile, news, and arcade screens
  • Real-time global chat and shared activity feed
  • Audio streaming via Icecast/Liquidsoap, played by the paired CLI or the public /listen page
  • Terminal games including 2048, Sudoku, Nonograms, Minesweeper, and Solitaire
  • Web frontend for landing, profiles, and the token-less /listen page
  • Companion CLI for local audio playback and synced visualizer data

Workspace

This is a Rust workspace with five crates:

CrateRole
late-cliCompanion CLI for local audio playback, paired controls, and visualizer sync
late-coreShared domain code, database layer, migrations, and infrastructure helpers
late-sshSSH server and terminal UI application
late-webWeb server, landing page, profiles/gallery, stream proxy, and the public /listen page
late-webviewHelper process hosting the official YouTube IFrame Player for the CLI

The stack is backed by PostgreSQL, Icecast, and Liquidsoap.

Quick Start

Try the live service:

ssh late.sh

The SSH login name is discarded rather than used as a public handle. On the first connection, a new account receives a random modifier-and-noun username; the username can still be changed later in Settings.

Run it yourself (requires Docker):

git clone https://github.com/mpiorowski/late-sh
cd late-sh
make start

Then connect to your local instance:

ssh localhost -p 2222

That's it. Postgres, Icecast, and Liquidsoap all come up automatically.

Companion CLI

Install the companion CLI for local audio playback and synced visualizer:

macOS / Linux / Termux:

curl -fsSL https://cli.late.sh/install.sh | bash

On Termux, the installer fetches the Android CLI build instead of the GNU/Linux one.

Windows PowerShell (x64):

irm https://cli.late.sh/install.ps1 | iex

mise (from the GitHub Release archives):

mise use -g github:mpiorowski/late-sh

Nix / NixOS:

nix run github:mpiorowski/late-sh#late

Or build it from source:

mise install        # optional — sets up the expected Rust toolchain
cargo build --release --bin late

Local Development

For development without Docker wrapping the Rust builds, you can run the infrastructure in Docker and the apps natively:

docker compose up -d postgres icecast liquidsoap
cargo run -p late-ssh
cargo run -p late-web

Local host development can use Cargo's normal defaults, including the standard repo-local target/ directory. The /app/target path is only for Docker/dev containers.

export CARGO_HOME=$HOME/.cargo

Use mise install to get the expected Rust toolchain, mold linker, and cargo-nextest.

To test newspaper scrolling in the Docker stack, run make seed-paper, then open /paper in the TUI. This replaces today's Reading and Outside sections with clearly marked sample text and enables the paper. Use make seed-paper PAPER_PARAGRAPHS=5 for a shorter edition (default: 100; range: 1–1000). Close and reopen /paper after reseeding; no restart is needed.

Verification

Run the local gate before opening a PR:

make check

This runs cargo fmt --check, then cargo clippy and cargo nextest across the whole workspace with --features otel. It is the full pre-merge sweep and the only place the otel (telemetry) build is exercised, since CI skips otel to stay fast; otel breakage is caught here or at the release build, never in prod. The local check starts a dedicated Compose Postgres project (late-check) on port 55433 and points DB-backed tests at it via TEST_DATABASE_URL. Override CHECK_INSTANCE or CHECK_PG_HOST_PORT if you need a parallel check database.

Contributing

Contributions are welcome, but read the project policy first:

This repository uses DCO sign-off for commits:

git commit -s

If you distribute a fork, do not present it as the official late.sh service or use the project branding as your own.

More Context

  • CONTEXT.md — architecture, invariants, and working context. Written for LLMs — feed this to your AI editor for best results.
  • CONTRIBUTING.md — workflow, test rules, module patterns, and AI-assisted development tips.
  • THEME.md — how to contribute a new built-in SSH theme via PR.
  • late-cli/README.md — CLI-specific usage and behavior.
cli
irc
ssh
terminal
tui

Significant stargazers

(top 24 of 25)

isabel

470 followers · starred May 2026

Julio Merino

215 followers · starred Jun 2026

Antoine Cotten

153 followers · starred Apr 2026

Yerkebulan Tulibergenov

45 followers · starred Apr 2026

Languages

Rust

96.2%