Retro Bulletin Board Systems on atproto. Web app and TUI. atbbs.xyz
python tui atproto bbs

Build License: AGPL v3 Ko-fi

@bbs logo

@bbs

Bulletin boards on atproto. Web app and terminal client.

@bbs screenshot

Features#

  • Web and terminal: Use it in your browser or dial in from a TUI.
  • Serverless: Run a BBS straight from your atproto account. No hosting required.
  • Replies and quotes: Flat threads with inline quoting.
  • Attachments: Upload files to threads and replies.
  • Messages: Know when someone replies to your thread or quotes you.
  • Moderation: Ban users, hide posts, manage your boards.
  • Discovery: Browse BBSes from across the network.

Install#

Requires Python 3.14+.

uv#

uv tool install atbbs

Homebrew#

brew install alyraffauf/tap/atbbs

Usage#

atbbs                  # launch TUI
atbbs dial aly.codes   # dial a BBS directly
atbbs serve            # start the web server
atbbs --help           # see all options

Web app#

Docker#

docker run -d -p 8000:8000 -v atbbs-data:/data -e PUBLIC_URL=https://your-domain.com ghcr.io/alyraffauf/atbbs:latest

Or with Docker Compose:

git clone https://github.com/alyraffauf/atbbs.git
cd atbbs
docker compose up -d

Visit http://localhost:8000.

From source#

Requires Node.js and just.

git clone https://github.com/alyraffauf/atbbs.git
cd atbbs
npm install
uv sync
just dev     # run dev server with hot reload
just fmt     # format code
just build   # build docker image

Architecture#

atbbs has no backend database for content. All BBS data lives in atproto repos:

  • Sysop records: xyz.atboards.site, xyz.atboards.board, xyz.atboards.news
  • Moderation records: xyz.atboards.ban, xyz.atboards.hide
  • User records: xyz.atboards.thread, xyz.atboards.reply

The web app and TUI query existing network infrastructure:

  • Slingshot — cached record and identity fetching
  • Constellation — backlink index for discovering threads and replies
  • UFOs — BBS discovery feed

Configuration#

On first run, atbbs generates:

  • secrets.json — app secret key and OAuth client signing key
  • atbbs.db — SQLite database for OAuth sessions

Web app (Docker): Set ATBBS_DATA_DIR to control where these are stored (default: /data). Set PUBLIC_URL to your domain for OAuth callbacks.

Web app (CLI): Use atbbs serve --data-dir and --public-url to configure. Defaults to the platform data directory and http://{host}:{port}.

TUI: Data is stored in ~/.local/share/atbbs/ (Linux), ~/Library/Application Support/atbbs/ (macOS), or %APPDATA%/atbbs/ (Windows).

License#

AGPL-3.0