TITLE=BBS Server ROUTE=/services/bbs LOCALE=en MODIFIED=1792691329 URL=https://wiki.teletypegames.org/services/bbs L=1 https://git.teletypegames.org/engines/rubbs L=2 https://git.teletypegames.org L=3 https://teletypegames.org/blog L=4 https://teletypegames.org L=5 https://teletypegames.org/howtos L=6 #50 L=7 #67 L=8 #21 L=9 https://git.teletypegames.org/bbs/impostor-bbs L=10 https://git.teletypegames.org/bbs/sermo-bbs L=11 https://bbsweb.teletypegames.org L=12 #73 q│ Teletype Games BBS is a Telnet, Synchronet-style bulletin board: messaging, q│ chat, news, guides and software in one retro hub. q│ q│ bLive at cteletypegames.org:2323 1Overview 1════════ A Ruby app on the 1brubbs0 gem, our in-house BBS framework — it provides the ANSI interface, menubar, stacked modal windows, Telnet server and xterm mouse support. The cbbs-server0 repo holds only the Teletype-specific parts: service wiring, window definitions, formatters. A call starts the old way: the modem dials and connects (cCONNECT c38400/ARQ/V42BIS0), and the logon matrix shows the TTG art with the caller number and the nodes in use. The caller gives a name (blank = Anonymous); a registered name asks for its password, any other name is a guest. Then the blogon sequence0: iWelcome back0, the caller number, your calls (first, last, time on line), and the scans of the old boards — new letters, new messages on each board since you last read it, polls waiting for your vote, new files this month — and the quote of the day, a member's motto. ENTER opens the full-screen shell with the Welcome window on top; it does not come back when the caller returns from a door. bFile > Log off0 (Alt-X) ends the call with the logoff screen: the call's length, a tagline, c+++0, cATH00, cNO CARRIER0. The statusbar shows the node, the clock and the time on line. 1Features 1════════ bContent • bLogin bulletin0 — the latest releases and upcoming events from teletypegames.org, the message count, the last callers and the last five oneliners. • bDev Log0 (File) — the public activity of every organisation on 2git.teletypegames.org: pushes with their commit messages, tags, releases and new repositories, newest first. Read anonymously from the Gitea API, so private repositories never show up. • bNews0 — the latest releases with their catalog links, upcoming events (c/api/v1/events0), and the wiki's cblog0 posts once there are any — the same source as 3teletypegames.org/blog. • bGame catalog0 — every entry of the 4Teletype Games API (all pages), sorted by platform; the bPlatform0 button cycles a platform filter. The card shows the version, the release date, status, license and downloads, the catalog link, the downloadable kinds, the release history and the external links. • bFile Areas0 (Content) — the catalog as the file areas of the old boards: one area per platform, a file per asset of each game's latest release (a web build as its c.html.zip0), the size from the FTP server's WARP folder, the release's download count, c*0 on the files of the last 30 days, and a bFILE_ID.DIZ0 box. bEnter0 or bDownload0 sends the file by ZMODEM. • bBulletins0 (File > Bulletins…, Help > New to BBSes?) — numbered: the logon bulletin, iAbout Teletype Games0 (this wiki's home page), iThe story so far (every release of every game, by month), iComing up0, the board rules, iNew to iBBSes?0 and the BBS network. • bTech HowTos0 (Content) — the how-tos of 5teletypegames.org/howtos, each read from its wiki page. • bFTP Browser0 (Content) — an FTP client on the 6FTP server, from its root (cAPPS0, cWARP0, cWIKI0): bEnter0 opens a folder, c..0 or bUp0 goes back. A file shows its size, date, cftp://0 address (and for WARP its chttps://teletypegames.org/file/…0 mirror), and the contents of a small text file. bEnter0 or bDownload0 sends it to your terminal by bZMODEM0: SyncTERM, NetRunner and Qodem start receiving by themselves, crz0 behind a plain telnet by hand, and 7BBS Web saves it as a browser download. Files over 16 MB get only their addresses, for an FTP client. • bWiki sections0 — iPlatform Guides0 (c/platforms0), iEngines0 (c/engines0) and the iDOS iCorner0 (c/dos0, opening with how the FTP server and DOSINST work). Read live from this wiki's JSON API (c/custom/sitemap.json0, c/custom/page.json0) without a token, so login-only pages never show up. bUsers > Language0 switches them to Hungarian. The whole wiki is on WIKI-BBS (see iThe BBS network0 below). • bTeam0 — the members of teletypegames.org with their mottos. • bDoors0 — programs the BBS hands the telnet line to, and takes it back from when they exit (8rubbs' cBBS::Door0). • bCommodore 640 and bCommodore Plus/40 — the machine at its cREADY.0 prompt (blue C64 screen, grey Plus/4 screen, 40 columns) with a small BASIC V2: c10 cPRINT CHR$(205.5+RND(1)); : GOTO 100 draws the maze, any key is RUN/STOP. The disk holds our games for that machine: cLOAD"$",80 then cLIST0 shows the directory (block counts from the real c.prg0 sizes), cLOAD"NAME",80 (wildcards work) loads a game, cLIST0 shows it and cRUN0 prints its card with the catalog link. The Plus/4 also knows cDIRECTORY0 and cDLOAD0; cSYS 647380 resets the C64; cEXIT0 returns to the BBS. • bChat of Ra0 — you are the worker sealed in the pyramid of iBlessing of Ra0, and the sun god answers from above. Free words go to the model as Ra; cRIDDLE0 asks a riddle of the pyramid, which the code checks (cHINT0, cSKIP0); solve three and Ra blesses you. cGAME0 tells where the game is. • bImpostor0 — the debrief terminal of iDefinitely not an Impostor (9impostor-bbs, the cimpostor0 gem), the same flow as the Impostor BBS on port 2324. When it ends, ENTER returns to the BBS. • bTTG Trivia0 — a door game of the old kind: ten questions about Teletype Games and the old days, 20 seconds each, A–D; a quick answer is worth more and three right in a row earn a streak bonus. Some questions are made from the catalog and the team, the rest come from clib/content/trivia.yml0; the best ten games are its hall of fame. • bSERMO0 is a dual machine running SERMO, from the Neumatronic universe (10sermo-bbs, pulled in as the csermo0 gem): type a command, or just talk to it; cEXIT0 returns to the BBS. What you say in words goes to its Lapis-ACP, a small local model (Qwen3.5 0.8B) with a persona from the 1977 canon; it is slow, short-spoken and sometimes wrong, on purpose and otherwise. • bTTG Master0 (the first menu, cF10, the button in the desktop's corner, the Welcome window, Help) — the sysop who answers callers' questions about the board: where things are, what is new, what is coming up. The code looks up the facts (a knowledge file of the menus, the latest releases, the events, the games), the model only words them, and the code checks that the wording kept the facts and invented no menu; if not, the caller gets the fact itself. bCommunity • bOneliners0 (Messages) — a wall of one-line messages, 64 characters at most; a name is needed, Anonymous cannot write. • bMulti-board messaging0 — General / Tech / Off-Topic / Sysop, one CSV per board under cdata/boards/0. New posts use a multi-line cTextArea0, max 1000 chars. A registered name sees the number of its unread messages next to each board. • bLive chat0 — broadcast hub, ~1 Hz polling, history replay on join. • bRegistered names0 — bUsers > Register…0 ties the name you logged in with to a password; from then on that name asks for it. A profile (signature / location / homepage / notes, and the favourite desktop art) belongs to a registered name. • bMail0 (Messages > Mail…, cF70) — private letters between registered names: Write, Reply, Delete. bFeedback to the Sysop…0 is a letter anyone with a name can write; every sysop reads it. A letter arriving during a call rings the bell. The Discord feed gets only that feedback came, never what it says. • bPage the Sysop0 — once a call: the bell, a line in the live chat and on Discord; with no sysop on line it offers to leave a letter. • bVoting Booth0 (Users) — the polls of clib/content/polls.yml0; one is filled from the catalog (your favourite Teletype Games title), one from the doors. Results as bars; a name votes and can change its vote. • bNodes0 — every caller gets the lowest free node; bUsers > Who is Online0 lists node, name, what the caller is doing (the top window, or the door) and the time on line. • bHall of Fame0, bUser Listing0, bYour Stats0 (Users) — top lists of the most downloaded games, callers, posters and Trivia scores; the registered names with their calls; your own numbers. • bLast callers0 — see iKeeping the bots out0 below. • bSysop console0 — stats and broadcast, for names in cBBS_SYSOPS0 that logged in with their password. • bDiscord feed0 — new board posts and sysop broadcasts go to the cBBS_DISCORD_WEBHOOK0 webhook, with mentions disabled. bTechnical • bxterm mouse0 — clickable menus, buttons and list items, wheel-scroll lists. • bDesktop art0 — drop c.ans0 / c.ansi0 / c.asc0 / c.nfo0 / c.txt0 files where cBBS_DESKTOP_ART0 points. CP437 art is auto-decoded and SAUCE metadata stripped. A directory means a random file per session. • bANSI Gallery0 (Content) — the art of that folder with its SAUCE record (title, artist, group, date) and a preview. bEnter0 or bView0 shows a piece on the full screen, scrolled with the arrows and PgUp/PgDn when it is taller than the screen; bDesktop0 puts it on the desktop for the call; bFavourite keeps it for every call of a registered name. Besides the older pieces there are seven of ours in CP437 with SAUCE: a synthwave sunset, the pyramid of Ra (80×40), the C64 boot screen, a space scene for the Impostor, the DOS tools' floppy, the TTG logo in flames, and the TTG logo itself (80×40, converted to 16-colour half blocks). • bIdle disconnect0 at 10 minutes. • bPersistent state0 — boards, last-callers log, profiles, accounts, mail, read marks, ballots and Trivia scores are CSV files under cdata/0, a Docker volume, so they survive restarts. 2Keeping the bots out 2──────────────────── Port 2323 is open to the internet, so telnet password-guessing bots call every few seconds and type croot0, cadmin0 and the like as their name. Until 2026-10-20 all of them landed in the last-callers list. Now: • a call shows up as online, and is logged as a last caller, only if the terminal reported its window size (telnet NAWS) — real clients and bbsweb do, the bots do not; • a call is logged when it ends, and only if it lasted at least 10 seconds; • a name must start with a letter or digit and contain only letters, digits, space, c.0, c_0 and c-0; anything else (cGET / HTTP/1.10) becomes Anonymous. 2The BBS network 2─────────────── t┌──────────────┬────────────────────────┬────────────────────────────────────┐ t│h System t│h Address t│h What it is t│ t├──────────────┼────────────────────────┼────────────────────────────────────┤ t│0 Teletype BBS t│0 cteletypegames.org:23230 t│0 this board t│ t├──────────────┼────────────────────────┼────────────────────────────────────┤ t│0 Impostor BBS t│0 cteletypegames.org:23240 t│0 the post-game terminal of t│ t│0 t│0 t│0 iDefinitely not an Impostor0 t│ t├──────────────┼────────────────────────┼────────────────────────────────────┤ t│0 WIKI-BBS t│0 cteletypegames.org:23250 t│0 the whole wiki in a two-pane t│ t│0 t│0 t│0 browser t│ t└──────────────┴────────────────────────┴────────────────────────────────────┘ All three are also in the browser at 11bbsweb.teletypegames.org; bFile > BBS bNetwork0 lists them. 1Menus & keys 1════════════ t┌────────────┬───────────────────────────────────────────────────────────────┐ t│h Menu t│h Items t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bTTG Master0 t│0 Ask a question… · What is new? · What is coming up? · Where t│ t│0 t│0 do I start? · How do I download files? · Which doors are t│ t│0 t│0 there? t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bFile0 t│0 Welcome · Bulletins… · News · Dev Log · System Info · BBS t│ t│0 t│0 Network · Log off t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bMessages0 t│0 Boards… · New Post… · Mail… · Oneliners · Live Chat · t│ t│0 t│0 Feedback to the Sysop… · Page the Sysop t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bContent0 t│0 File Areas · FTP Browser · Game Catalog · Platform Guides · t│ t│0 t│0 Engines · DOS Corner · Tech HowTos · ANSI Gallery t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bUsers0 t│0 Who is Online · Last Callers · User Listing · Your Stats · t│ t│0 t│0 Hall of Fame · Voting Booth · Team · Profile… · Register… · t│ t│0 t│0 Language EN/HU t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bDoors0 t│0 SERMO · Commodore 64 · Commodore Plus/4 · Impostor · Chat of t│ t│0 t│0 Ra · TTG Trivia t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bSysop0 t│0 Console (logged-in sysops only) t│ t├────────────┼───────────────────────────────────────────────────────────────┤ t│0 bHelp0 t│0 Ask the TTG Master · New to BBSes? · About · Keys t│ t└────────────┴───────────────────────────────────────────────────────────────┘ t┌─────────────────────┬──────────────────────────────────────────────────────┐ t│h Key t│h Action t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cAlt+letter0 t│0 Open the matching top menu t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF100 t│0 Open the leftmost menu t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF10 t│0 Ask the TTG Master t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF20 t│0 Message Boards t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF30 t│0 Quick post t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF40 t│0 Chat t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF70 t│0 Mail t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cAlt-X0 t│0 Log off t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cTab0 / cShift-Tab0 t│0 Move focus inside a window t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cEnter0 t│0 Activate the focused button / submit t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF50 / cAlt-Enter0 t│0 Full screen and back, for the windows with much to t│ t│0 t│0 read; also the c[↑]0 / c[↕]0 gadget or a double click on t│ t│0 t│0 the title bar t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cF60 / cShift-F60 t│0 Bring the next / previous window to the front; a t│ t│0 t│0 click on a window does it too t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cAlt-10 … cAlt-90 t│0 Bring the window with that number (on the right of t│ t│0 t│0 its top frame) to the front t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cCtrl-F50 t│0 Move the window with the arrows, size it with t│ t│0 t│0 Shift+arrows (Tab switches), Enter ends (F6 too t│ t│0 t│0 while it is the only window); with the mouse, drag t│ t│0 t│0 the title bar or the c┘0 corner t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 letter / cAlt+letter0 t│0 Press the window's button with that hotkey (Alt in a t│ t│0 t│0 text field) t│ t├─────────────────────┼──────────────────────────────────────────────────────┤ t│0 cEsc0 t│0 Close the top window or menu t│ t└─────────────────────┴──────────────────────────────────────────────────────┘ 1Configuration 1═════════════ Copy cenv-example0 to c.env0: t┌────────────────────────┬─────────────────────────┬─────────────────────────┐ t│h Variable t│h Default t│h Description t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_PORT0 t│0 c23230 t│0 TCP port. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_SYSOPS0 t│0 empty t│0 Comma-separated sysop t│ t│0 t│0 t│0 names. Their accounts t│ t│0 t│0 t│0 are created only with t│ t│0 t│0 t│0 cbin/account0. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_DISCORD_WEBHOOK0 t│0 empty t│0 Discord webhook for new t│ t│0 t│0 t│0 posts and sysop t│ t│0 t│0 t│0 broadcasts; empty = t│ t│0 t│0 t│0 off. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cACCOUNTS_PATH0 t│0 cdata/accounts.csv0 t│0 Registered names, t│ t│0 t│0 t│0 salted PBKDF2-SHA256 t│ t│0 t│0 t│0 hashes, file mode 600. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBOARDS_PATH0 t│0 cdata/boards0 t│0 Per-board CSV files. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cMESSAGES_PATH0 t│0 cdata/messages.dat0 t│0 Legacy single-board t│ t│0 t│0 t│0 file; migrated into t│ t│0 t│0 t│0 General on first run. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cLAST_CALLERS_PATH0 t│0 cdata/last_callers.csv0 t│0 Finished calls. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cPROFILE_PATH0 t│0 cdata/profiles.csv0 t│0 User profiles. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cONELINERS_PATH0 t│0 cdata/oneliners.csv0 t│0 The oneliners wall. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cIMPOSTOR_SESSIONS_PATH0 t│0 cdata/impostor_sessions.0 t│0 What callers left in t│ t│0 t│0 ccsv0 t│0 the Impostor door. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cMAIL_PATH0 t│0 cdata/mail.csv0 t│0 Private mail and t│ t│0 t│0 t│0 feedback, file mode t│ t│0 t│0 t│0 600. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cLAST_READ_PATH0 t│0 cdata/last_read.csv0 t│0 How far each registered t│ t│0 t│0 t│0 name has read each t│ t│0 t│0 t│0 board. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cVOTES_PATH0 t│0 cdata/votes.csv0 t│0 The Voting Booth's t│ t│0 t│0 t│0 ballots. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cTRIVIA_SCORES_PATH0 t│0 cdata/trivia_scores.csv0 t│0 TTG Trivia games. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_LOGON_ART0 t│0 clib/content/logon.ans0 t│0 The art of the logon t│ t│0 t│0 t│0 matrix. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_FTP_HOST0 t│0 cftp.teletypegames.org0 t│0 The FTP server of the t│ t│0 t│0 t│0 FTP Browser. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_FTP_DOWNLOAD_MAX0 t│0 c167772160 t│0 The largest file in t│ t│0 t│0 t│0 bytes the FTP Browser t│ t│0 t│0 t│0 sends by ZMODEM. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_DESKTOP_ART0 t│0 cdata/art/teletype.ansi0 t│0 One ANSI file, or a t│ t│0 t│0 t│0 directory (random per t│ t│0 t│0 t│0 session); its folder is t│ t│0 t│0 t│0 the ANSI Gallery. A t│ t│0 t│0 t│0 registered caller's t│ t│0 t│0 t│0 favourite wins. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cSERMO_LLM_URL0 t│0 set by compose t│0 SERMO's model, t│ t│0 t│0 t│0 chttp://llm:80800; empty t│ t│0 t│0 t│0 = canned replies only. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cSERMO_LLM_MODEL0 t│0 set by compose t│0 The model's name in the t│ t│0 t│0 t│0 12model service, t│ t│0 t│0 t│0 cqwen3.5-0.8b0. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cSERMO_LLM_API_KEY0 t│0 empty t│0 SERMO's key to the t│ t│0 t│0 t│0 12model service; without t│ t│0 t│0 t│0 it SERMO answers with t│ t│0 t│0 t│0 canned replies. t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 cBBS_LLM_URL0 / c_MODEL0 / t│0 SERMO's t│0 The model of Ra and the t│ t│0 c_API_KEY0 t│0 t│0 TTG Master; unset or t│ t│0 t│0 t│0 empty falls back to the t│ t│0 t│0 t│0 cSERMO_LLM_*0 value. t│ t└────────────────────────┴─────────────────────────┴─────────────────────────┘ 2Sysop accounts 2────────────── A name in cBBS_SYSOPS0 cannot be registered over telnet, so nobody can claim it first. Create the account, or reset any password, from the server shell: p docker exec -it teletype-bbs bin/account Tasi 1Running 1═══════ p docker compose up --build # or, with Ruby 3.x: bundle install && ruby bb» p s.rb p telnet localhost 2323 Compose starts one container, cteletype-bbs0. The model behind SERMO, Qwen3.5 0.8B, runs in the server's shared 12model service, reached as chttp://llm:80800 on the cinterstack0 network; until it answers, SERMO uses canned replies. cdocker-compose.dev.yaml0 keeps the model next to the BBS instead: a cteletype-bbs-acp0 container with llama.cpp's cllama-server0, no key. 2Doors 2───── A door is one line in the Application definition in cbbs.rb0; the Doors menu lists the declared doors by itself: p door :sermo, Sermo::OS, label: '&SERMO' p door :c64, Commodore.os(Commodore::C64, games: games_service, files: fi» p le_library), p label: '&Commodore 64' p door :plus4, Commodore.os(Commodore::PLUS4, games: games_service, files: » p file_library), p label: 'Commodore &Plus/4' p door :impostor, Impostor.flow(sessions: impostor_sessions), label: '&Imposto» p r' p door :trivia, Trivia.door(games: games_service, site: site_service, scores» p : trivia_scores), p label: '&TTG Trivia' A door is a cBBS::FakeOS0 definition (SERMO, the Commodores), a cBBS::Flow (Impostor) or a callable. The csermo0 and cimpostor0 gems are pinned to a revision in cGemfile.lock0; the entrypoint updates only rubbs on start. After a change in sermo-bbs or impostor-bbs, raise it with cbundle lock --update sermo0 (or cimpostor0) and redeploy. 2Characters 2────────── Ra and the TTG Master run on Qwen3.5 0.8B in the 12model service, through 8rubbs' cBBS::AI0. A model this small is good at a short reply in a voice and bad at facts, so the code keeps the facts: Ra's riddles and the game's address come from the code, cdeflect0 rules answer what the model gets wrong however it is asked (code, poems, "are you a bot"), and the Master's wording is checked against the facts before it is shown. Personas are tuned by measuring, not by single replies: cbin/persona-eval cra|master 30 asks the eval questions (clib/characters/eval/0) several times and counts the slips: out of character, markdown, too long, and for the Master a miss (a wrong menu path or a lost fact). On 2026-10-21: Ra 1 slip in 32–48 replies, the Master 0. p docker exec teletype-bbs bundle exec bin/persona-eval master 3 1Project structure 1═════════════════ p bbs.rb entry point — service wiring, login flow, Appli» p cation definition p bin/account create an account / reset a password p lib/ p domain/ p repository/ nodes, boards, wiki, catalog, site (events, mem» p bers, how-tos), p accounts, last callers, profiles, oneliners, FT» p P, Gitea, p mail, read marks, votes; http_json (GET + 5-min» p cache) p service/ online, board, wiki, games, site, account, chat» p , p last callers, profile, oneliner, FTP browser, d» p ev log, p art, discord_notifier, mail, voting, file areas p model/ value objects (MessageModel, GameModel, …) p doors/commodore.rb the C64 and Plus/4 doors; commodore/basic.rb is» p their BASIC p doors/ra.rb Chat of Ra p doors/trivia.rb TTG Trivia p content/ polls, Trivia questions, taglines, bulletins, t» p he logon art p characters/ Ra and the TTG Master: personas, riddles, knowl» p edge, eval questions p bbs/ui/formatters.rb bulletin, news, game card, team, network, DOS i» p ntro, users, sysop, p oneliners, FTP browser, dev log, gallery p bbs/ui/classic_formatters.rb logon/logoff, nodes, mail, voting, file area» p s, history, hall of fame p data/ p boards/.csv per-board messages (auto-created) p last_callers.csv finished calls p profiles.csv user profiles p accounts.csv registered names p oneliners.csv the oneliners wall p impostor_sessions.csv what callers left in the Impostor door p mail.csv, last_read.csv, p votes.csv, trivia_scores.csv p art/ desktop art, the ANSI Gallery 2Repository 2────────── https://git.teletypegames.org/bbs/bbs-server