███████╗ ██████╗ ██████╗ ██╗ ███████╗████████╗ ██╔════╝██╔═══██╗██╔════╝ ██║ ██╔════╝╚══██╔══╝ █████╗ ██║ ██║██║ ███╗██║ █████╗ ██║ ██╔══╝ ██║ ██║██║ ██║██║ ██╔══╝ ██║ ██║ ╚██████╔╝╚██████╔╝███████╗███████╗ ██║ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ ╚═╝
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.
── elixir on the beam · postgres · CP437 over ssh · runs anywhere erlang runs
one elixir application. one postgres database. one ssh port. your own bbs, named whatever you want, with whatever boards you want, moderated by you.
categories → boards → threads → posts. first-class thread titles, per-board sequential message numbers, read pointers at thread and board granularity.
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.
direct messages, @handle mentions with notifications,
opt-in email digests. no push. no nags.
box-drawing, block glyphs, the ansi-16 palette. the tui adapts to your terminal size, from a full-screen window down to 64×22.
admin menus inside the ssh tui. report queue, bans, stickies, board editing. mix tasks for out-of-band provisioning. livedashboard for observability.
one node per user, the classic way. reconnect and your session is adopted. no tab-sprawl. no simultaneous-you.
── the key you already have, pointed at a bbs.
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.
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> _█
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.
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.
foglet targets terminal capabilities from 1985. it happily uses capabilities from 2026 where they serve the aesthetic rather than undermine it.
:foglet app
:ssh (the one that ships with the beam) · host
keys persisted to priv/ssh
pre-alpha. under active development. read the code, file an issue, lurk the commits.
── foglet · a small bbs you run yourself · nothing here is for sale ──