foglet · self-hostable terminal bbs · / PRE-ALPHA v0.0 · mit/apache-2.0 on release

a small bbs you run yourself

foglet is a self-hostable, terminal-native bulletin board system. you install it on your own machine. your users reach it over ssh. no web ui, no ads, no growth team. a place, not a product.

github.com/bmanturner/foglet-bbs →

── elixir on the beam · postgres · CP437 over ssh · runs anywhere erlang runs

§ 01

what you get when you run it

one elixir application. one postgres database. one ssh port. your own bbs, named whatever you want, with whatever boards you want, moderated by you.

message boards

categories → boards → threads → posts. first-class thread titles, per-board sequential message numbers, read pointers at thread and board granularity.

presence & chat

a global lobby plus per-board rooms. who's-online on the main menu. last-callers list. real-time because the beam makes it free.

mail & mentions

direct messages, @handle mentions with notifications, opt-in email digests. no push. no nags.

cp437 aesthetic

box-drawing, block glyphs, the ansi-16 palette. the tui adapts to your terminal size, from a full-screen window down to 64×22.

sysop tooling

admin menus inside the ssh tui. report queue, bans, stickies, board editing. mix tasks for out-of-band provisioning. livedashboard for observability.

a single session rule

one node per user, the classic way. reconnect and your session is adopted. no tab-sprawl. no simultaneous-you.

§ 02 · featured feature

ssh public-key authentication

your ssh-agent is the login form

── the key you already have, pointed at a bbs.

── the premise

users can register ssh public keys against their foglet account. once a key is on file, subsequent logins skip the password prompt. the key proves they're them; the bbs opens the door.

a single account can have several keys on file — laptop, workstation, the machine in the closet — each with its own label, so a lost device only costs you one line in a list.

── why it matters

passwords travel. keys don't. a stolen password grants access anywhere; a stolen key grants access from one compromised device. and most users already have a key in ~/.ssh/id_ed25519.pub.

it turns the bbs from "another credential to manage" into a thing your ssh-agent knocks on. which is how bbses should have always worked.

  ── the shape of it, roughly ──

  $ ssh bbs.foglet.io
  Authenticated using "publickey".

  ╔══════════════════════════════════════════════════════╗
  ║  welcome back, spider_jerusalem.                     ║
  ║  2 unread · last seen tuesday, 03:12 AM              ║
  ╚══════════════════════════════════════════════════════╝

  foglet> _

── how it works, in one paragraph

foglet owns the erlang :ssh daemon. an auth callback looks the incoming public key up against the keys on file for the handle being logged into. match → session starts. no match → the user falls back to their password.

── things keys are good for

no password over the wire on every dial-in. no password manager entry for a bbs. a session can be tied to the key it authenticated with, so a single lost laptop doesn't lock the rest of your accounts behind a rotation.

§ 03

what it is / what it isn't

foglet targets terminal capabilities from 1985. it happily uses capabilities from 2026 where they serve the aesthetic rather than undermine it.

── what it is

  • terminal-native, end to end
  • one instance, one sysop, one world
  • built on elixir / otp / postgres
  • ssh as the primary transport
  • opinionated defaults, configurable where it matters
  • a place for residents who want async over push

── what it isn't

  • a discord alternative
  • a federated system
  • a web forum with a terminal option
  • a mobile-first experience
  • a file-sharing service
  • a hosted saas product
§ 04

the stack, in one screen

runtime elixir on the beam · otp supervision tree · single :foglet app
framework phoenix — for channels, pubsub, presence, livedashboard (sysop-only)
database postgresql via ecto · uuid primary keys · citext handles
ephemeral state ets + phoenix presence · crdt-merged across nodes if you cluster
ssh server erlang :ssh (the one that ships with the beam) · host keys persisted to priv/ssh
auth argon2 passwords · ssh public keys · registration is open / invite / sysop-approved
tui rendering raxol · custom cp437-to-unicode translation layer
jobs oban · for email digests, scheduled cleanups, retention policies
deployment anywhere elixir runs · fly.io · a pi in a closet · a $5 vps · your own hardware
§ 05

the source

pre-alpha. under active development. read the code, file an issue, lurk the commits.

github.com/bmanturner/foglet-bbs →

── foglet · a small bbs you run yourself · nothing here is for sale ──

[↑↓]scroll · [G]et the source · [D]ocs · [K]nock foglet · pre-alpha · rev 0.0