Robert Goodall

Engineering the systems behind the systems.

Now playing

not playing right now

« Portfolio

Nosterm active

A terminal-style Nostr chat client — an IRC-like SPA that talks directly to relays over WebSocket, with an optional self-hosted home relay.

role
author & maintainer
client
SvelteKit + TypeScript
relay
Go (khatru, NIP-29)
transport
Nostr over WebSocket
status
MVP complete

Overview

Nosterm is a browser-based Nostr chat client that looks and behaves like a classic IRC command-line terminal. It connects directly to Nostr relays over WebSockets — no application backend — and is driven primarily through IRC-style slash commands. Nostr is a client-side protocol, so the browser talks to relays itself; there’s nothing to phone home to.

It aims to be the premier Nostr Relay Chat (NRC) client, built around a simple belief: private communication is a right, not a feature. Anonymity, encryption, and censorship resistance are the baseline, not opt-in extras.

Architecture

The client is a client-only SvelteKit SPA with strictly separated layers, so the UI and command parser never touch protocol objects directly:

UI ──▶ command layer ──▶ chat service (NDK) ──▶ stores ──▶ UI

Data flows one way. Remote Nostr events are mapped into application models and rendered as text only — never HTML — so remote content can’t forge trusted system messages or inject styles.

Home relay

Nosterm runs a hybrid model: the client connects to public relays for general Nostr content while pointing at your own home relay for private communities. That relay, nostermd, is a minimal NIP-29 managed-group relay in pure Go (built on khatru, BoltDB storage, static binary on distroless). It adds a Nosterm capability handshake — a features array in its NIP-11 document — so the client can feature-gate its UI and fall back gracefully on plain relays.

Principles

  • Small footprint — a static SPA and a single lightweight relay binary, cheap to self-host, no telemetry, no lock-in.
  • Deploy anywhere — one runtime-configured image that drops onto overlay networks (Tor, I2P, Yggdrasil, and friends).
  • Privacy by default — make the private path the easy path.