ANSI screens
ANSI screens are raw CP437 + ANSI escape code art shown at lifecycle
events: pre-login welcome, post-logoff goodbye, after registration,
or on demand from any menu item.
Where they live
Admin → BBS Menus → ANSI screens (/admin/bbs-menus/screens).
Each screen has:
| field | meaning |
|---|---|
slot |
unique key — welcome, goodbye, newuser, custom name |
title |
sysop reference only |
body |
raw ANSI bytes |
pause_after |
wait for Enter before continuing |
is_active |
toggle without deleting |
Built-in slots used by the BBS lifecycle
| slot | when shown |
|---|---|
welcome |
telnet visitors, before the login menu. SSH/rlogin auto-login skips it. |
goodbye |
every protocol on logoff |
newuser |
shown right after a successful new-user registration |
Custom slots
Create any slot name and reference it from a menu item:
action_type = ansiaction_args = my_slot_name
So you can make a "view the rules" item, a per-game intro splash,
a sysop-of-the-day plug, etc.
Editing
The editor has a live preview pane that handles SGR colors + clear
screen + cursor home, so you see roughly what the user will see.
You can paste:
- The text content of an existing
.ansfile - Raw escape codes typed as
\x1b[1;36metc. - Output from
ansiedit, Pablo, Moebius, ACiDDraw
SAUCE
When you import an .ans file into the ANSI Editor (/ansi/),
the import wizard auto-detects the SAUCE trailer (the 128-byte
metadata block at end), strips it cleanly so you don't get garbage
rows, and shows the title/author/group as a flash message.
Display codes (Synchronet @CODE@ and Mystic |XX)
ANetBBS substitutes a useful subset of Synchronet's at-codes
(https://wiki.synchro.net/custom:atcodes) and Mystic's named
display codes (https://wiki.mysticbbs.com/doku.php?id=displaycodes)
in any ANSI screen rendered through the BBS shell — pre-login
welcome, post-logoff goodbye, post-registration newuser, and any
custom slot referenced by a menu item with action_type = ansi.
The same codes also work inside Synchronet door files served via
console.printfile(...), which uses the same BBS_* env vars that
door_runner.py exports to the door process.
| Synchronet code | Resolves to |
|---|---|
@USER@ / @ALIAS@ / @HANDLE@ |
login username |
@NAME@ / @REAL@ |
display name (or username) |
@FIRST@ |
first word of display name |
@EMAIL@ |
user email |
@LOCATION@ |
user-set location |
@BBS@ |
BBS_NAME config |
@SYSOP@ |
SYSOP_NAME config |
@NODE@ |
active node slot number |
@SECURITY@ |
100 (admin) / 50 (user) |
@CALLS@ |
the user's login_count |
@TIME@ |
local HH:MM |
@DATE@ |
local YYYY-MM-DD |
@DAY@ |
weekday, e.g. Tuesday |
@VER@ / @VERSION@ |
ANetBBS build version |
@TIMELEFT@ |
minutes left in this session |
| Mystic code | Resolves to |
|---|---|
\|UN |
login username |
\|UA |
alias / handle |
\|UR |
real name (display_name) |
\|BN |
BBS name |
\|SN |
sysop name |
\|DT |
date YYYY-MM-DD |
\|TM |
time HH:MM |
\|VL |
ANetBBS build version |
\|ND |
active node slot number |
\|LF |
CRLF |
Color pipe-codes like |07 (Synchronet/Mystic light-grey) continue
to be handled by the existing pipe-to-ANSI translator and are
unaffected by the named-code substitution above.
Unknown codes pass through visibly so you can spot what's missing
and ask for it to be wired up.