A cozy terminal clubhouse for computer people. Lofi, games, chat, artboard, and tech news, all via SSH.
See the codeA 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.
This repository is the main codebase for late.sh.
late.sh service remains the canonical deployment.Read the details in LICENSE, the plain-English policy in LICENSING.md, and contribution rules in CONTRIBUTING.md.
/listen page/listen pageThis is a Rust workspace with five crates:
| Crate | Role |
|---|---|
late-cli | Companion CLI for local audio playback, paired controls, and visualizer sync |
late-core | Shared domain code, database layer, migrations, and infrastructure helpers |
late-ssh | SSH server and terminal UI application |
late-web | Web server, landing page, profiles/gallery, stream proxy, and the public /listen page |
late-webview | Helper process hosting the official YouTube IFrame Player for the CLI |
The stack is backed by PostgreSQL, Icecast, and Liquidsoap.
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.
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
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.
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.
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.
(top 24 of 25)
470 followers · starred May 2026
215 followers · starred Jun 2026
153 followers · starred Apr 2026
45 followers · starred Apr 2026
Rust
96.2%
A cozy terminal clubhouse for computer people. Lofi, games, chat, artboard, and tech news, all via SSH.
See the codeA 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.
This repository is the main codebase for late.sh.
late.sh service remains the canonical deployment.Read the details in LICENSE, the plain-English policy in LICENSING.md, and contribution rules in CONTRIBUTING.md.
/listen page/listen pageThis is a Rust workspace with five crates:
| Crate | Role |
|---|---|
late-cli | Companion CLI for local audio playback, paired controls, and visualizer sync |
late-core | Shared domain code, database layer, migrations, and infrastructure helpers |
late-ssh | SSH server and terminal UI application |
late-web | Web server, landing page, profiles/gallery, stream proxy, and the public /listen page |
late-webview | Helper process hosting the official YouTube IFrame Player for the CLI |
The stack is backed by PostgreSQL, Icecast, and Liquidsoap.
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.
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
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.
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.
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.
(top 24 of 25)
470 followers · starred May 2026
215 followers · starred Jun 2026
153 followers · starred Apr 2026
45 followers · starred Apr 2026
Rust
96.2%