A modern bulletin-board system that talks both new and old:
Web — Flask + WebSockets, mobile-friendly, themed
Telnet / SSH / rlogin — for the classic experience
FidoNet echomail — BinkP + QWK over real networks
Door games — DOS, Synchronet JS, Mystic Pascal Script,
generic exec for anything else
Multinode chat, IRC bridge, MRC bridge
Personal web pages per user
One SQLite DB. One config file. Five systemd services. Done.
2 / 10
What you need before installing
Linux server (Ubuntu 22.04+ or Debian 12+ recommended)
Python 3.10+
~500 MB of disk for the app + venv
Open ports for the protocols you want exposed:
5000 (web — usually proxied behind nginx on 80/443)
2233 (telnet)
2234 (SSH)
513 (rlogin — optional)
A domain (optional, makes share links nicer)
An evening (you'll be done in under an hour)
3 / 10
Decisions to make ahead of time
The install wizard will ask you. Have answers ready:
Install mode — production (public, HTTPS via
Let's Encrypt) / behind (your own reverse proxy) / test
(local/LAN, no domain)? This comes first and changes several
other defaults.
What's your BBS name?
What's your sysop handle? (Password can be
left blank to auto-generate one.)
What's your domain (or leave blank for IP)?
Which protocols (telnet/SSH/nginx) do you want enabled?
Want the MRC bridge (inter-BBS chat), MSP/SYSTAT
instant messaging, Finger, or BinkP (FidoNet inbound mail)?
Welcome / goodbye / newuser ANSI — paste your
ANSI art at /admin/bbs-menus/screens. Telnet
visitors see your art before login.
Customize the main menu — every hotkey is
data-driven. Add an item, give it any shell command via the
exec action_type.
One-click sub-menus — wizard at the bottom
of any menu's edit page.
Add doors — Admin → Door Games. Native, DOS,
Synchronet JS, Mystic Pascal Script all supported.
8 / 10
Spam control
Five layers, all toggleable:
Bot gate — telnet visitors press ESC or *
twice. Filters scanners. always on
NUV — set NUV_ENABLED=true. New
users wait for sysop approval.
IP bans — Admin → IP Bans. CIDR + TTL.
Word filter — Admin → Word Filter. Applied
to shouts, posts, PMs.
File queue — set
FILE_MOD_QUEUE_ENABLED=true. Sysop approves
uploads.
9 / 10
Day-to-day operations
The Sysop Control Panel (/admin/control) is your
cockpit:
Service status badges + Start / Stop / Restart buttons
NodeSpy — see every terminal user's current
page + last action + idle time. Click for last-screen snapshot.
Live who's-online (web + terminal) refreshing every 5s
One-click journal viewer per service
update.sh sets up the sudoers rule for service
control automatically on every run. If you haven't updated yet,
set it up yourself — the template ships with a
__SERVICE_USER__ placeholder that needs
substituting, not a plain copy:
sudo sed "s/^__SERVICE_USER__ /anetbbs /" deploy/sudoers.anetbbs \
| sudo tee /etc/sudoers.d/anetbbs > /dev/null
sudo chmod 0440 /etc/sudoers.d/anetbbs
10 / 10
Upgrades are one command
tar xzf ANetBBS-vX.Y.Z.tar.gz
cd ANetBBS-vX.Y.Z
sudo bash update.sh
The script:
Backs up .env, the SQLite database, and your
systemd units to /tmp/anetbbs-backup-*
(data/ and logs/ are never
touched by an update at all, so there's nothing to back up
there)
Stops services
Rsync's the new code (preserves your data + config)
pip install -e picks up new modules
Runs the schema migrator
Restarts services
Probes /healthz — auto-rolls-back if it fails,
no prompt
That's it. Welcome aboard, sysop.
Once installed, every detail is in
/docs/ on your BBS.