BARELY BOOTING_
PAGEBROWSER
$ bb / projects / cathode

CATHODE

> A text-mode web browser for DOS. Sort of.

Cathode start page in DOSBox-X. Green title bar reads 'Cathode - Start Page' with 'Cathode v0.6-dev' on the right. URL line shows 'about:home'. Big block-letter CATHODE logo in green. Subtitle 'A text-mode web browser for DOS. Sort of.' Then 'Powered by NetISA'. 'Quick Links' section header. Status bar at bottom: 'Ln 1/37' on the left, 'Links:7' middle, 'F1:Help F5:Rel ^F:Find F12:Quit' on the right.
Green-on-black phosphor by default. Powered by NetISA.

Renders HTML, Markdown, and text/gemini to the text-mode buffer. Fetches over the NetISA card’s TLS path. Follows links, keeps bookmarks, finds in page, lays out tables, displays forms. v0.7 closes the v0.6 deferral lists: tables grow `colspan`, `rowspan`, `align`, `valign`, and centred `<caption>`; forms grow captured `<button>` inner-text labels, POST method capture, visible `<fieldset>` + `<legend>` grouping, and click-to-toggle checkbox / radio state. VESA 132x60 mode, the 2032-entry WHATWG entity table, persistent visit history, and the five color presets all carry over from v0.5/v0.6. The build is 101 KB on an 8088 floor; the source ships in the NetISA repo at cathode/. MIT.

What it does

  • HTML tokenizer and flow renderer with line wrapping at the terminal width.
  • Markdown decoder (CommonMark subset) and text/gemini decoder.
  • Table layout with single-pass column-width fit and CP437 box-drawing borders. Cell text wraps; nested tables collapse to a stub.
  • Form widgets: text input, button, single-select dropdown. GET submission builds action?key=value and re-fetches.
  • 2032 named HTML entities, indexed by binary search over a sorted const table.
  • Five terminal sizes: CGA 80x25, EGA 80x43, VGA 80x50, VESA 132x60, VESA 132x43.
  • URL bar with history. Bookmarks persist across runs.
  • In-page find with Ctrl+F.
  • UTF-8 input collapsed to CP437 for display.
  • Five color themes: green, amber, white, blue, mono.
  • Stub pages: about:home, about:portal, about:help, about:blank.
  • Shortcuts: Tab next link, F5 reload, F12 exit, Ctrl+F find.

In the wild

Cathode about:portal screenshot. Title bar 'Best of the Text Web'. Page heading 'Best of the Text Web'. Intro text: 'Sites that render well in a 80-column text browser. Curated by hand; expect dead links over time.' Section header 'News' followed by green-bullet links: 'lite.cnn.com - CNN's text-only mirror', 'text.npr.org - NPR text-only news', 'Hacker News - text-friendly tech discussion', 'lobste.rs - focused tech discussion'. Next section 'Reference' is starting. Status bar shows 'Ln 1/42' and 'Links:12'.
about:portal is the curated text-web entry point: lite.cnn.com, text.npr.org, Hacker News, lobste.rs, low-tech-magazine, Gemini Antenna, the weather service text feeds. New in v0.4.
Cathode rendering NPR text page. Title bar 'NPR : National Public Radio'. Top of page has a 'Text-Only Version' / 'Go To Full Site' link row. Then 'NPR : National Public Radio' heading. Date line 'Monday, April 13, 2026'. Three news headlines visible as green bullet links: 'Eric Swalwell will resign from Congress as he faces backlash over assault allegations', '5 things to know about Peter Magyar, Hungary's new prime minister', 'Trump vows to sink Iranian ships approaching a U.S. blockade of Strait of'. Status bar shows 'Ln 1/65' and 'Links:28'.
NPR text edition rendered through Cathode. 28 links on the first viewport, all reachable via Tab.
Cathode rendering the OpenBSD manual page server. Title bar 'ls(1) - OpenBSD manual pages'. Heading 'OpenBSD manual page server' in green. Two paragraphs of Manual Page Search Parameters list. Below: long grid of architecture link names: amd64, alpha, armv7, arm64, hppa, i386, landisk, loongson, luna88k, macppc, mips64, octeon, powerpc64, riscv64, sparc64, amiga, arc, armish, arm32, atari, aviion, beagle, cats, hppa64, hp300, ia64, mac68k, mvme68k, mvme88k, mvmeppc, palm, pc532, pegasos, pmax, powerpc, sgi, socppc, solbourne, sparc, sun3, vax, wgrisc, x68k, zaurus. Then OpenBSD version links from 7.8 down to 2.6. Status bar shows 'Ln 1/273' and 'Links:64'.
OpenBSD man server. 64 links in the first viewport, scroll bar visible on the right. Dense technical pages survive 80-column text mode.
Cathode v0.6 rendering a Wikipedia-style infobox table. Title bar 'TABLE3: Wikipedia-style infobox'. Heading 'Infobox: 8088 microprocessor'. A two-column table with CP437 box-drawing borders shows Field/Value rows: Designer/Intel, Year introduced/1979, Process/3 micrometer NMOS, Max clock/10 MHz, Transistor count/29,000, Address bus/20 bits 1 MB addressable, Data bus/8 bits external 16 bits internal.
FEAT_TABLES v0.6: single-pass column-width fit, CP437 borders, cell-text wrap.
Cathode v0.7 rendering TABLE7.HTM with the new table features. Title bar 'CATHODE 0.7.0' on the left, 'TABLE7.HTM' on the right. Page heading 'v0.7 Tables'. Caption line 'Periodic snapshot of vintage CPUs' above the table. Header row 'Intel x86 line' spans the full table width (colspan). Sub-header row 'Year | CPU | MHz'. Data rows: '1978 | 8086 | 5', '8088 | 4.77' (the 1978 cell rowspans two rows, vertically centered), '1982 | 80286 | 6', '1985 | 80386DX | 16', '1989 | i486DX | 25', '1993 | Pentium | 60' with the MHz column right-aligned. Footer text 'Caption above the border. Headers spanned with colspan. Year cell spans two rows with vertical centering. MHz column right-aligned.'
FEAT_TABLES v0.7: colspan, rowspan, align, valign, and a centred <caption> above the border. Two-pass render paints structure first, then content with rowspan-aware vertical alignment.
Cathode v0.6 rendering a search form. Title bar 'FORM1: simple search form'. Heading 'Search'. Query field with text input '[dos browser_]'. Region row showing 'United States United Kingdom Germany [us-en v]' select dropdown. '[ Search ]' submit button. Below a horizontal rule, 'Hidden fields and reset' section with a Name text input and '[ Go ]' / '[ Reset ]' buttons.
FEAT_FORMS v0.6: text inputs, buttons, single-select dropdowns. GET submission builds action?key=value and re-fetches. v0.7 layers on captured <button> inner text, POST method capture, a framed <fieldset> + <legend>, and [ ] / ( ) checkbox + radio widgets that toggle in place on click.
Cathode v0.6 in VESA 132x60 text mode. The wider terminal fits the entire start page in one viewport: CATHODE block logo, tagline, Powered by NetISA line, Quick Links section with 4 entries (Best of the Text Web, Keyboard Shortcuts, Feature Test Page, barelybooting.com), Demo Sites section with 3 cached fixtures (NPR, OpenBSD man page, Example Domain), and the URL-bar prompt. Status bar shows 7 links and the F-key shortcut row.
VESA 132x60 mode under DOSBox-X svga_s3. The whole start page fits in one viewport with room to spare. New in v0.6 (NEXT-STEPS item 8 closed).

Two binaries: CATHODE.EXE for the stub backend (any DOS, no card needed), CATHODE_HW.EXE for the real INT 63h backend (requires a NetISA card).

CATHODE for Windows

Cathode for Windows 0.2.0 rendering the start page. Title bar 'Cathode for Windows 0.2.0' on the left, 'about:home' on the right. Page heading 'CATHODE'. Tagline 'v0.7.0 - text-mode web browser for DOS and Windows. Renders HTML, Markdown, and text/gemini. Powered by NetISA on DOS; cathode_win.dll + Win32 host on Windows.' 'Quick Links' section with four bullet links: about:portal - Best of the Text Web, about:help - Keyboard shortcuts, barelybooting.com - Project home, GitHub repo - Source + releases. 'What is new in v0.7' bullets: Tables: colspan, rowspan, align, valign, caption; Forms: button labels, POST capture, fieldset + legend; Checkbox [ ] and radio ( ) with click-to-toggle. Footer 'F1 Help, F5 Reload, Ctrl+F Find, F12 Quit.' followed by a References list resolving the four link labels to their URLs.
cathode_host.exe driving the v0.2.0 parsing pipeline. Same gumbo + SAX layout walker as the DOS build, same 80-column reflow, with a Win32 monospace edit control as the surface and WinINet behind the URL bar.

v0.2.0 ships the same parsing pipeline as a Win32 DLL with a Win9x-compatible C ABI, plus a minimal native GUI host (now with WinINet HTTP/HTTPS fetch) and a Delphi binding. cathode_win.dll exposes thirteen __stdcall exports under stable ordinals, full HTML5 via the vendored gumbo-parser, and a SAX-style layout walker that reflows to 80-column text and extracts the link table. cathode_host.exe is a classic Win32 shell (no MFC, no comctl6, no Delphi runtime) that loads the DLL and presents the rendered output in a read-only monospace edit control; the URL bar accepts http:// and https:// URLs in addition to local file paths. WINVER targeted at 0x0410 (Windows 98); the 32-bit DLL runs under WOW64 on 64-bit Windows, so the same code path that runs on a Win98 SE 86Box VM also runs as a native app on Windows 11.

The DLL is the parser; the host is responsible for fetching. The shipped cathode_host.exe (v0.2) reads from local files OR fetches over HTTP/HTTPS via WinINet (Win98 SE+ ships it; Win95 OSR2 needs IE 3+). Bespoke hosts can route through whatever transport their domain needs. The Delphi binding is a `.pas` unit declaring every export as external 'cathode_win.dll' index N; ordinals are pinned in cathode_win.def so cross-version Delphi apps survive Cathode releases without recompile.

Build: MinGW-w64 i686 GCC from MSYS2. Static-linked libgcc, no libgcc_s_dw2-1.dll dependency. Smoke test runs three phases (DOM walk, 5000-nested-div destroy under a real thread stack, layout render + link table) against the just-built DLL. A Win98 SE 86Box smoke run is wired in docs/86box/cathode-win98-runbook.md and unblocks when a Win98 SE install ISO lands; the rig itself (86Box, ROMs, S3 ViRGE driver, NE2000 networking, transfer-VHD pipeline, MinGW toolchain) is already in place.

Out of scope

No JavaScript. No CSS. No images. The browser does not pretend to be modern.

Hardware

Floor8088 + 256K + CGA
DOS3.3+
NetworkNetISA TLS path
ToolchainOpenWatcom V2
StandardC89/C90
LicenseMIT

The 8088 floor is real: -0 -fpi -ms. EGA and VGA give a wider terminal (80x43, 80x50). CGA 80x25 works too.

Download

Both releases ship from the NetISA monorepo. The full source lives at github.com/BarelyBooting/netisa under cathode/ and cathode_win/ respectively. Build instructions, INT 63h API definition, and CommonMark / Gemini decoder rationale all included.

Links