CATHODE
> A text-mode web browser for DOS. Sort of.
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=valueand 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:
Tabnext link,F5reload,F12exit,Ctrl+Ffind.
In the wild
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.
colspan, rowspan, align, valign, and a centred <caption> above the border. Two-pass render paints structure first, then content with rowspan-aware vertical alignment.
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.
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_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
The 8088 floor is real: -0 -fpi -ms. EGA and VGA give a wider terminal (80x43, 80x50). CGA 80x25 works too.
Download
- CATHODE DOS v0.7.0:
CATHODE.EXE(101 KB) + README + CHANGELOG + LICENSE. The v0.6 release stays available at cathode-v0.6.0. - CATHODE for Windows v0.2.0:
cathode_win.dll+cathode_host.exe+ import library + public header + .def + Delphi.pasbinding + README + CHANGELOG + LICENSE.
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
- CATHODE DOS v0.7.0 GitHub Release
- CATHODE for Windows v0.2.0 GitHub Release
- NetISA source repository (Cathode lives in
cathode/andcathode_win/) - NetISA project page
- Build log