The hacker's reading room of the BBS network: every RFC, the documents the Internet is made of, from RFC 1 of 1969 to the newest, the Internet Experiment Notes before them, and the Jargon File. Search them by number, series, words of the title or anywhere in the text, follow what obsoletes what, see the errata, and read them as they were published, or reflowed for a Commodore 64.
Live at
teletypegames.org:2334, in the browser on bbsweb, and through TTG Gate BBS
A Ruby app on the rubbs gem, like Scriptorium BBS and Starbase BBS.
It has two faces on one port:
A call starts with rubbs' BBS::Terminal question (RETURN takes the guess, 1 picks the modern face, 2 the C64), then the TTG logo. Through TTG Gate BBS neither comes twice.
| What | Source | |
|---|---|---|
| The index: every RFC's title, authors, date, pages, status, stream, keywords, abstract, what it obsoletes and updates, the STD, BCP and FYI series, the numbers never issued | the RFC Editor's rfc-index.xml, about 14 MB, read again every day | |
| The texts | the RFC Editor's rsync module rfcs-text-only, mirrored every day (about 540 MB); an RFC not there yet is fetched when it is first read |
|
| The errata | errata.json, with the index every day | |
| The IENs (1977-1982) | the RFC Editor's ien/ folder: its ien-index.txt and the texts (134 of 209; the rest are scans) |
|
| The Jargon File 4.4.7 | shipped with the board (config/jargon/jarg447.txt) |
public domain |
About 9,850 RFCs. The index is streamed into SQLite with a full-text index of the titles, authors, keywords and abstracts; an import takes about fifteen seconds and swaps the new database in, so callers keep reading meanwhile. The mirror's texts (data/rfc/rfcN.txt, the IENs as ienN.txt) go into a second, contentless full-text index (about 135 MB) of every word of every RFC; a day's sync indexes only what changed. The IENs are under negative numbers in the same index (IEN 137 is -137).
The RFCs are the work of the IETF and their authors; copyright the IETF Trust and the persons identified as authors. Every record credits "RFC N, IETF" and links to the RFC Editor, also as a QR code (rubbs' BBS::QR).
The library:
Search: a number (854, rfc 2119), a series (std 7, bcp 14), or words of the title, the authors, the keywords and the abstract as word prefixes (telnet window). status:standard (proposed, draft, bcp, info, experimental, historic) and year:1983 narrow it. A number that was never issued says so; ien 137 finds an IEN.
Search the text (F9, 6 on the C64): every word anywhere in every RFC and IEN, best matches first, each with the first line that has the word.
An RFC's record shows its authors, date, pages, status and series, a red line when a newer RFC replaced it ("Obsoleted by: RFC 9293"), the RFCs it obsoletes and updates and the ones that update it, and the abstract. Links lists those RFCs, to open any of them. Errata shows what the RFC Editor's errata say: the text as published and as it should read, the verified ones first.
In the reader the RFCs a text names are coloured; Contents (Alt-O, t on the C64) lists its headings to jump to, References (Alt-R, f) the RFCs it names.
On a modern terminal:
| Key | Action |
|---|---|
| F2 | Classics |
| F3 | Search |
| F4 | Shelves |
| F7 | Most read |
| F8 | Newest |
| Enter | Read the RFC |
| F9 | Search the text of every RFC |
| Alt-L / Alt-E / Alt-Q | Its links / its errata / its QR code |
| Alt-O / Alt-R | In the reader: the contents / the RFCs it names |
| PgUp/PgDn, Home/End | Move in the reader; the line under it says "RFC 793 · page 3/91 · line 140/5247" |
| F10 | The menu |
| Alt-X | Log off |
On a Commodore 64 the main menu is 1 Classics, 2 Telnet, 3 April 1st, 4 all shelves, 5 search, 6 search the text, J the Jargon File, 7 most read, A about, Q log off. Under a record: R read, L links, E errata, C QR code. In the reader RETURN turns the page, B goes back one, T the contents, F the RFCs it names, Q back to the record.
The Jargon File 4.4.7 (29 Dec 2003), the lexicon of hacker slang, is in the public domain and comes with the board: 2,308 entries and the 17 other parts (the introduction, Hacker Folklore with The Story of Mel and the AI koans, the portrait of J. Random Hacker, the bibliography). The Jargon menu (J on the C64) has the word of the day (the same for everyone on a day), the lexicon A-Z, a search (the very headword first), a random entry, and the chapters and folklore to read. An entry's links are coloured; Links (Alt-L, L) lists the entries it links to. Every entry says "Jargon File 4.4.7 (public domain)".
How the C64 reflow works: prose is joined and wrapped again (a list item keeps a hanging indent); a figure, a table or an address keeps its lines, a line too long breaking at the gaps between its columns; a box drawing wider than the screen comes in panels ("(columns 39-72)"); dot leaders get short; the running head and foot of each page are left out, and a paragraph broken by a page is joined again. Accented letters and the characters the C64 lacks become ASCII.
| Variable | Default | |
|---|---|---|
HACKERCAVE_BBS_SITE |
https://www.rfc-editor.org |
where the index and the texts come from |
HACKERCAVE_BBS_INDEX_TTL |
1 |
days before the index is imported again |
HACKERCAVE_BBS_SHELVES |
config/shelves.yml |
the board's own shelves |
HACKERCAVE_BBS_DB |
data/hackercave.sqlite3 |
the reads (the Most read list) |
HACKERCAVE_BBS_INDEX_DB |
data/index.sqlite3 |
the index (a cache, rebuilt from the download) |
HACKERCAVE_BBS_TEXTS |
data/rfc |
the texts, as published (the mirror) |
HACKERCAVE_BBS_MIRROR |
on |
off: no mirror, no text search |
HACKERCAVE_BBS_MIRROR_TTL |
1 |
days between two syncs |
HACKERCAVE_BBS_FULLTEXT_DB |
data/fulltext.sqlite3 |
the full-text index of the texts |
HACKERCAVE_BBS_JARGON_DB |
data/jargon.sqlite3 |
the Jargon File, built from config/jargon |
The board has no secrets.
A push to master deploys it from Woodpecker (RuboCop, the tests, compose check, ci-deploy hackercave-bbs); the container is hackercave-bbs, in /srv/stacks/hackercave-bbs, and data/ stays between deploys (about 700 MB with the mirror). Ruby takes about 65 MB; the container has 256 MB, as the cgroup counts the page cache of the daily sync too.
The code follows the house layering: lib/domain (RfcModel, EntryModel, ShelfModel, DocumentModel; IndexParser and IndexBuilder for rfc-index.xml, the index, RFC Editor, texts, shelves and reads repositories; LibraryService, ReadingService, ReflowService; the composition root HackerCaveBBS) knows nothing of telnet, and lib/ui holds UI::Modern and UI::Petscii. Also: ImportService (index, errata, IENs), MirrorService (rsync + FulltextRepository), JargonService (JargonParser, JargonRepository). The plan, with the decisions taken, is docs/HACKERCAVE_BBS.md in the TTG workspace.