Windows you can drag
Doors and apps run in windows callers can move, resize and switch between, like a desktop. TERMinator draws its windows locally, so dragging has no lag. Everyone else gets a server drawn window manager in the spirit of DESQview.
Modern BBS, old soul, rewired.
Rainwire gives every caller the best screen their terminal can draw, from TERMinator and SyncTERM down to a basic telnet session on retro hardware. It's a single Go binary with built in intrusion detection and prevention, two factor login and sandboxed doors.
One BBS, every terminal
Most BBS screens are hand drawn .ANS files, and everyone gets the same bytes. Rainwire builds each screen from widgets (menus, forms, lists, dialogs) and draws it with a renderer for the caller's terminal. It finds out what your terminal can do when you connect: device attributes, SyncTERM's CTerm reply, a UTF-8 probe and TERMinator's TRACE query. Hand drawn ANSI art still works as an asset.




These are the same screens from the same server. Use the buttons above to switch looks. Click any screenshot to enlarge it.
| Tier | Typical client | Graphics | Mouse | Audio | Windows |
|---|---|---|---|---|---|
| 0 | Basic telnet, retro hardware | CP437, 16 colours | — | — | One full screen app |
| 1 | Modern terminal | 24-bit colour, Unicode | xterm SGR | — | Drawn by the server |
| 2 | SyncTERM | Sixel images, custom fonts | SGR | APC mixer | Drawn by the server |
| 3 | TERMinator | TRACE: GPU, WASM modules | Full | Native | Drawn by the client |
Doors and apps run in windows callers can move, resize and switch between, like a desktop. TERMinator draws its windows locally, so dragging has no lag. Everyone else gets a server drawn window manager in the spirit of DESQview.
Drop a file from your desktop into TERMinator and it uploads over SFTP, with no ZMODEM needed. Drag from the file browser into the message editor to attach a file.
The mouse and graphics are extras. Every action can be done from the keyboard at every tier, so retro callers never hit a dead end.
Security as a headline feature
Detection: Rainwire watches how every caller behaves. Failed logins, wrong two factor codes, bad SSH handshakes, connection floods and honeypot hits all add to a threat score for that address. Prevention: once the score passes your threshold, the address is banned automatically on every listener, and repeat offenders get longer bans each time. Banned and denied addresses are refused the moment they connect, before any SSH or telnet handshake, so they cost almost nothing.
This is an application layer intrusion prevention system (IPS) that understands BBS logins. Rainwire also ships the packet layer: a stateful nftables ruleset with SYN flood and per source rate limits, and a small privileged helper that turns every Rainwire ban into a kernel drop, so banned addresses never reach the server again.

root or admin are scored on sight.config.lua until you reset.


Each door runs as an unprivileged user in its own sandbox (bubblewrap or systemd on Linux), with CPU, memory and time limits. It sees its own folder and drop file, never the BBS database.
The server is pure Go. ZMODEM and BinkP are written fresh in Go from the public specs and fuzz tested, so there's no lrzsz or binkd. Uploaded archives are opened in the sandbox, which stops zip bombs.
The server runs as a dedicated non root user under a hardened systemd unit. Uploads are quarantined and scanned with ClamAV before they reach a public area.
Getting in
On most BBSes you need an account to get SSH access, and you need to connect to make an account. On Rainwire, anyone can connect. The real gate is the BBS login, and there's no shell behind it.
Connect with the username new and you go straight to signup.
Put your handle as the username in your terminal client and it fills in the login for you.
Save your SSH key under Options, and next time you're logged straight in (2FA still applies).
Clients like SyncTERM that send a saved password are logged in directly. A bad match lands on the normal form, which gives nothing away about whether the handle exists.
For sysops
-- Edit and save: the next caller sees it. No restart.
return {
title = "Main Menu",
items = {
{ key = "M", label = "Message bases",
access = "true" },
{ key = "F", label = "Fido echoes",
access = "level >= 50 and group(fido)" },
{ key = "Y", label = "Sysop",
access = "level >= 255 and mfa",
action = "menu:sysop" },
},
}
level >= 50 and group(fido) and not transport(telnet) replace lettered flags. Anything without a rule is sysop only.fido, cosysop or beta, as many per user as you like.{placeholders}, ready for rewording and translation.

Prefer the command line? The rainwire admin commands cover everyday sysop work on the server itself: listing users, changing levels and groups, resetting a lost two-factor device, lifting a ban, reading the audit log and taking a backup. They work whether the BBS is running or not.
$ rainwire admin users
$ rainwire admin level SomeUser 50
$ rainwire admin group SomeUser add fido
$ rainwire admin mfa reset SomeUser # lost phone
$ rainwire admin unban 203.0.113.9
$ rainwire admin audit 40
$ rainwire admin backup
Sysop Studio
Your own pages, your artwork and animated GIFs, the order callers see things in, menus and themes. All of it can be changed from the web panel, from the sysop menus inside the BBS, or by dropping plain files into your local/ folder. The three are the same files, so use whichever suits you. Every editor has a live preview drawn by the BBS's own renderer, at any tier and screen size, so you see it before your callers do. Upgrades never touch your changes.



Drag steps into the order you want and put your own pages between them. Show a step only to new callers, once a day or a week, to some levels, between two dates or at random. The security steps are locked, so you can't lock yourself out.
Everything the web panel does is in the BBS's own sysop menus too, by keyboard or mouse, with the same live preview. Upload art by ZMODEM, edit pages and the flow, and see the change straight away.
Saves are checked before they're used and a copy of the old file is kept. Uploads are checked by type, deleted files go to a trash folder, and a "Your changes" view shows and reverts anything you've changed.
Optional web interface
Most of the Sysop menu is also a web page on your own network: watch who's on, change settings, edit menus and themes, manage users, bulletins and bans. It's part of the same program, on by default for your own network, and one setting turns it off.

Linked boards
Rainwire BBSes can share message boards, with posts from every member system. It's off by default, and each sysop chooses which boards to carry. This network is a modern layer between Rainwire systems.
Every post is signed by the BBS it was written on, so it can't be forged or altered in transit. A post's ID is the hash of its content, so duplicates and loops drop out automatically.
Store and forward over mutual TLS 1.3. Link every server to every other or use hubs. Anyone can also run a private network with its own admin key.
Board moderators act across the network, but every sysop can still hide posts, block users or drop a peer on their own system. Passwords, emails and IPs never leave the home BBS.
Rainwire vs Mystic and Synchronet
Mystic and Synchronet are great, battle tested systems with decades of history. Here's where Rainwire does things differently.
| Mystic | Synchronet | Rainwire | |
|---|---|---|---|
| Source | Closed source | Open source (GPL) | All new, clean sheet design |
| Language | Free Pascal | C and C++ | Go, memory safe, no cgo |
| Screens | Display files with MCI codes | Display files with Ctrl-A codes | Widgets drawn for each of 4 terminal tiers. Old codes are converted on import |
| Menus and scripts | Menu editor, MPL scripts | JavaScript shells and modules | Lua tables in a sandbox, reloaded on the fly |
| Access rules | Lettered flags | Flag sets | Named groups and readable expressions, denied by default |
| Storage | JAM message bases | SMB message bases | One SQLite file, with JAM import |
| Intrusion protection | Various built in protections | Detection by threat score, automatic bans that grow with repeat offences, credential stuffing detection and bans grouped by IPv6 /64 | |
| Firewall | IP filter lists; packet filtering is left to your OS | Ships with a stateful nftables ruleset with SYN flood and per source rate limits. Every Rainwire ban becomes a kernel drop | |
| Honeypot | Not built in | Honeypot ports ban on first touch across every listener, then tarpit the scanner with a never ending banner | |
| Two factor login | Not built in | TOTP with any authenticator app, QR setup in the terminal, recovery codes, and asked after every login, SSH keys included | |
| Doors | Run as the BBS user | Each door in its own sandbox, with no access to the database | |
Beta testing
The beta is available for testing. It's a complete board you can run today: messages, mail, files, chat, doors, the web interface and intrusion protection. Ask for a copy below and you'll get the download link by email.
One package with the program, the stock menus and themes, an installer that runs without root, a quick start guide, and the optional nftables firewall. Upgrades keep your settings, data and customizations.
64-bit Linux: a PC or server (x86-64), or a Raspberry Pi 3, 4, 5 or Zero 2 W on 64-bit Raspberry Pi OS. Callers connect with SSH from TERMinator, SyncTERM or any terminal.
Run it, call in, try things, and tell us what breaks or what feels wrong. It's a beta, so expect rough edges and keep backups of anything you care about.