Viewing revision r1 of Development — saved 2026-05-13 16:08 UTC .
“Initial seed content”
Jump to current version Full history

Developing for ANetBBS

Want to write a door, a web feature, a theme, or hook into messaging?
You're in the right place.

The seven door types

ANetBBS runs door games via seven distinct backends:

  1. DOS doors (DOSBox-staging) — TradeWars, LORD-DOS, Usurper
  2. Native Linux doors — any executable, stdio piped
  3. Synchronet .js doors — real jsexec if installed, otherwise
    our built-in Node + Synchronet API shim (~270 functions)
  4. Mystic Pascal .mps/.mpx — bundled Mystic 1.12 A48 runtime
  5. Mystic Python .py — fake mystic_bbs module
  6. rlogin out-dial — DoorParty / A-Net Online / Synchronet xtrn
  7. Built-in web games — Flask-routed mini-games

See docs/17-development.md for the
deep-dive: drop file formats, token substitution table, working code
examples for each type.

Extending the web app

The web side is Flask + SQLAlchemy + SocketIO. Adding a new
feature is roughly:

  1. Create a blueprint in anetbbs/web/myfeature.py
  2. Register it in anetbbs/web_app.py
  3. Add templates in anetbbs/templates/myfeature/
  4. (Optional) Add a nav-bar link in templates/base.html
  5. (Optional) Add a model class to anetbbs/models.py + run
    flask db migrate

The whole pipeline is ~50 lines of code for a working feature blueprint.

Database

anetbbs/models.py is the single source of truth for SQLAlchemy
models. Flask-Migrate (alembic) handles schema changes — add a column,
run flask db migrate -m "...", the service auto-runs flask db upgrade on next start.

Themes

Themes are DB rows with CSS variable values, edited visually at
/admin/theme-builder/. Add a new built-in theme by tweaking colors
in the builder, then add the resulting values to the theme seed block
in anetbbs/seed_data.py.

Real-time features

Flask-SocketIO is wired up in web_app.py. The Web Terminal and MRC
client are both reference implementations of a feature that spawns a
background eventlet greenthread, pumps bytes between a backend socket
and the browser, and handles reconnect.

Echomail / FidoNet networks

Pollers live in anetbbs/echomail/{binkp,qwk,tic}.py. Adding a new
network type is one new module + one new EchomailNetwork.protocol
discriminator.

Where to ask questions

If you ship something cool, PR it back and we'll bundle it with the
next alpha.

Reference

The authoritative deep-dive is at docs/17-development.md.
This wiki page is the lightweight community-editable companion.