···11+[](https://github.com/alyraffauf/atboards/actions/workflows/docker.yml) [](https://www.gnu.org/licenses/agpl-3.0) [](https://ko-fi.com/alyraffauf)
22+33+<div align="center">
44+ <h1>atboards</h1>
55+ <h3>Decentralized bulletin boards on atproto.</h3>
66+ <p>Anyone can run a BBS from their own account, no server required. Users own their posts, and communities can migrate freely.</p>
77+</div>
88+99+## Features
1010+1111+- **Web app and TUI**: Browse, post, and manage BBSes from your browser or terminal.
1212+- **Built on atproto**: All data lives in user repos as `xyz.atboards` records. No central database.
1313+- **No server needed to run a BBS**: A sysop just publishes records to their own PDS.
1414+- **OAuth login**: Sign in with your Bluesky handle or any atproto account.
1515+- **Discover BBSes**: The home screen shows BBSes from across the network.
1616+- **Flat replies**: Threads with chronological replies, plain text.
1717+- **Sysop tools**: Create and edit your BBS, manage boards, post news.
1818+- **Self-hostable**: One Docker command to run the web app.
1919+2020+## Quick start
2121+2222+### TUI (recommended)
2323+2424+Requires Python 3.14+ and [uv](https://docs.astral.sh/uv/).
2525+2626+```bash
2727+uv tool install atboards
2828+atb
2929+```
3030+3131+Or from source:
3232+3333+```bash
3434+git clone https://github.com/alyraffauf/atboards.git
3535+cd atboards
3636+uv sync
3737+uv run atb
3838+```
3939+4040+### Web app (Docker)
4141+4242+```bash
4343+docker run -d -p 8000:8000 -v atboards-data:/data -e PUBLIC_URL=https://your-domain.com ghcr.io/alyraffauf/atboards:latest
4444+```
4545+4646+Or with Docker Compose:
4747+4848+```bash
4949+git clone https://github.com/alyraffauf/atboards.git
5050+cd atboards
5151+docker compose up -d
5252+```
5353+5454+Visit `http://localhost:8000`.
5555+5656+### Web app (from source)
5757+5858+```bash
5959+git clone https://github.com/alyraffauf/atboards.git
6060+cd atboards
6161+uv sync
6262+just dev
6363+```
6464+6565+## Architecture
6666+6767+atboards has no backend database for content. All BBS data lives in atproto repos:
6868+6969+- **Sysop records**: `xyz.atboards.site`, `xyz.atboards.board`, `xyz.atboards.news`
7070+- **User records**: `xyz.atboards.thread`, `xyz.atboards.reply`
7171+7272+The web app and TUI query existing network infrastructure:
7373+7474+- [Slingshot](https://slingshot.microcosm.blue/) — cached record and identity fetching
7575+- [Constellation](https://constellation.microcosm.blue/) — backlink index for discovering threads and replies
7676+- [UFOs](https://ufos.microcosm.blue/) — BBS discovery feed
7777+7878+## Configuration
7979+8080+On first run, atboards generates:
8181+8282+- `secrets.json` — app secret key and OAuth client signing key
8383+- `atboards.db` — SQLite database for OAuth sessions
8484+8585+**Web app**: Set `ATBOARDS_DATA_DIR` to control where these are stored (default: current directory, `/data` in Docker). Set `PUBLIC_URL` to your domain for OAuth callbacks.
8686+8787+**TUI**: Data is stored in `~/.local/share/atboards/` (Linux), `~/Library/Application Support/atboards/` (macOS), or `%APPDATA%/atboards/` (Windows).
8888+8989+## License
9090+9191+[AGPL-3.0](LICENSE.md)