Foglet is a small, self-hostable bulletin board system for people who still like the feeling of dialing into a place.
The main door is SSH. The interface is a terminal UI. Phoenix is present, but the web surface is a lobby, docs shelf, and operational shell — not a browser forum.
Try the public beta:
ssh bbs.foglet.ioSource: https://github.com/bmanturner/foglet-bbs
Foglet is an SSH-first BBS built with Elixir/OTP, Phoenix, Postgres, and a modern terminal UI. It is meant to feel old-network without pretending to be old software: small communities, named boards, readable threads, a sysop in charge, and enough modern plumbing to keep the place reliable.
Current Foglet builds include:
- SSH-served terminal UI with account registration, login, verification, password reset, and account management flows.
- Password authentication and SSH public-key authentication.
- In-TUI SSH key management, including adding and removing public keys from an account.
- Boards, threads, posts, replies, edits, soft deletion, read pointers, board subscriptions, and per-board message numbering.
- Board-scoped chat rooms where the sysop enables them, with ephemeral or permanent storage backends.
- Board news/feed surfaces backed by sysop-managed RSS or Atom sources.
- BBS Mail for direct user-to-user messages, including hide/report actions.
- Door games through native Elixir, external PTY, and classic dropfile manifests.
- Oneliners for short public notes.
- Moderation and sysop workflows for users, boards, configuration, subscriptions, invites, verification, reset tokens, identity policy, SSH IP access rules, and oneliners where implemented.
- One active session per user: a new login promotes the new connection and closes the older session.
- Phoenix endpoint, health check, docs, LiveDashboard in development, PubSub, telemetry, mail plumbing, and other operational infrastructure.
The web page is intentionally just a lobby/window into the SSH BBS plus public documentation. It is not an end-user web client.
Use a normal SSH client:
ssh bbs.foglet.ioFor local development, start the app and connect to the development SSH port:
ssh localhost -p 2222Foglet also supports SSH public-key login after an account has a public key on file. Your ssh-agent can knock on a bulletin board.
The shortest development path is:
git clone git@github.com:bmanturner/foglet-bbs.git
cd foglet-bbs
docker compose up -d postgres
mix setup
mix phx.serverThen connect:
ssh localhost -p 2222The repo's .tool-versions file is the source of truth for Elixir and Erlang/OTP versions. mix setup installs dependencies, prepares the database, runs seeds, and configures the project's git hooks path.
If you already run Postgres locally, or if port 5432 is occupied, use the full setup docs instead of guessing at environment variables.
Foglet serves public docs at /docs when the Phoenix endpoint is running. These pages are generated from priv/docs/**.
Start here:
/docs/start-here/overview— what Foglet is and whether you are in the right place./docs/start-here/requirements— required tools, services, and terminal basics./docs/start-here/quickstart— fastest useful path from clone to SSH login.
Install and connect:
/docs/installation/manual-setup— manual local setup./docs/installation/connect-over-ssh— SSH connection and authentication notes./docs/configuration/environment— environment variables and runtime configuration.
Operate the BBS:
/docs/operations/mix-tasks— operator and break-glass Mix tasks./docs/operations/health-and-logs— health checks and logs./docs/operations/troubleshooting— common recovery paths.
Understand or contribute:
/docs/concepts/architecture— OTP, Phoenix, SSH, TUI, and persistence boundaries./docs/concepts/data-model— durable state and message-number invariants./docs/advanced/development— development workflow.docs/VOICE_AND_TONE.md— Foglet's product voice and copy checklist.
Foglet's detailed operator guidance lives in the docs linked above. Keep secrets in environment/runtime configuration, not DB-backed runtime config.
Useful task families live under lib/mix/tasks/ and are documented in the Mix tasks page. Examples include user creation and status changes, invite creation and inspection, verification-code inspection, reset-token inspection and expiry, board subscription management, board-chat inspection, identity policy rules, SSH IP access rules, TUI rendering, QA mode, and foglet.doctor.
lib/foglet_bbs/—Foglet.*domain code andFogletBbs.*Phoenix infrastructure. The boundary is by module name, not by path.lib/foglet_bbs_web/—FogletBbsWeb.*endpoint, router, controllers, telemetry, and web views.lib/mix/tasks/— operator and break-glass Mix tasks.priv/docs/— public docs served from/docs.docs/— project and contributor documentation.docs/raxol/— vendored Raxol documentation.vendor/raxol/— vendored Raxol TUI library source.
Run the full project finish line with:
mix precommitprecommit runs compile with warnings as errors, formatter, unused dependency checks, Credo, Sobelow, and Dialyzer.
Run the test suite with:
mix testFor deeper context on namespaces, persistence invariants, authorization scopes, SSH/TUI ownership, and workflow conventions, read priv/docs/advanced/development.md and docs/DEVELOPMENT.md before non-trivial changes.
Copyright 2026 Brendan Turner
Licensed under the Apache License, Version 2.0. See LICENSE.md for details.