Build Log

> What shipped and when.

Reverse-chronological. RSS or email for updates.

Site rewrite for voice and length

Top-to-bottom editorial pass. Ten HTML pages trimmed 20 to 73 percent each, leading with visuals, four-question top on every project page (what / hardware / state / where to download), no em-dashes anywhere. Three subtle echoes landed: “Vital signs” subhead on the CERBERUS consistency engine (Rush + Trek + literal hardware-checkup, all three meanings stacking), “Hailing frequencies” subhead on NetISA, and “Computer, end program.” inside the TAKEOVER v1.2 Esc-exits-scenario paragraph. About page got a TNG-with-baby photo, caption “Live long and decode.”

HEARO went 57 KB to 15 KB (the biggest cut). Per-version v1.5.1 / v1.5.0 / v1.4.0 / v1.3.0 release-notes prose moved out of the project page since this build log carries that history. Same pattern for CERBERUS (43 to 19 KB), NetISA (27 to 16 KB), and the four future-project pages.

barelybooting.com moved to Cloudflare

Site is now Cloudflare end-to-end. Three things shipped. (1) barelybooting.com serves from a Cloudflare Pages project, apex CNAME-flattened, www 301-redirects via a Dynamic Redirects rule. (2) The Hearo catalog Worker stopped fetching JSON from raw.githubusercontent.com at request time. Manifest and schema now ship as Workers Static Assets bundled into the deploy. No upstream call on the data plane. (3) dl.barelybooting.com is live as a public R2 bucket holding 17 release archives across CERBERUS, HEARO, NetISA, TAKEOVER, and barelybooting-server. Every release link on the site points there now instead of a private repo.

Security pass at the same time. Bot Fight Mode on. WAF rate-limit rule on hearo.barelybooting.com (10 requests per 10 seconds per IP, behavior-equivalent to 60/min on the Free plan). API token narrowed from 19 permission groups to 14, every one in active use.

Operational runbooks landed in both website and hearo-catalog repos with deploy / rollback / incident procedures. The migration writeup is in the source archives.

HEARO v1.5.1

Same-day patch closing v1.5.0’s deferred follow-ups. From-scratch LHA depacker for YM5 / YM6 (around 370 LOC; almost every YM file in the wild ships -lh5- compressed, so v1.5.0’s YM3-only loader effectively meant nothing real played). FX:N counter coverage extended from STM/FAR/ULT to MOD/S3M/XM/IT/MTM/669. Tone-portamento-without-instrument fallback fixtures (FXSTM5 / FXFAR5 / FXULT6).

33 wav-matrix cells PASS deterministic on 86Box (was 30). HEARO.EXE 235 KB. Real-iron validation on the 486 DX-2 + Vibra 16S is the v1.6 gate. Source archive.

HEARO v1.5.0

Six new decoders (CMF, HSC, STM, RAD v1, FAR, ULT). AY-3-8910 / YM3 chip music with streaming synth. Full per-tick effects pump on STM / FAR / ULT covering sequencer control, volume slides, pitch slides, tone porta, vibrato, tremolo, sample offset, arpeggio. Animated splash intro with OPL2 fanfare. Three new themes (Borland Blue, Norton Commander, Tokyo Night). UI catch-up so every shipped feature surfaces in the runtime, not just the README.

Pre-release quality gate caught 22 issues across three rounds (3 Critical + 19 Important) before tag. The Criticals would have shipped silently. 30/30 wav-matrix cells PASS deterministic. Source archive.

HEARO: UI audit closes the loop on Phase 1-4 wiring

HEARO main UI playing FXSTM2.STM with all status indicators active. Top-right of the now-playing pane shows '[STM FX:1]' format badge in bright green confirming 1 channel is running effects. Bottom status bar shows '[EQ] [REV] [Karaoke] [V:Spec]' indicators stacked on the right.
All four status-bar indicators plus format badge plus FX:N counter live in one frame.
HEARO main UI rendered in the new Tokyo Night theme. Background shifts to muted dark purple, accents in soft pink and indigo, spectrum visualizer recoloured.
Tokyo Night theme. Phase 4 verified.

Pass to make sure every shipped feature actually has a UI surface, and the surface is wired right. Two real gaps fixed: the 320CDT wake hint was using printf which got clobbered on the first UI redraw (now flows through the whisper system into the right-aligned status bar), and the format badge brightened for “tracker with effects supported” but didn’t show whether effects were firing right now (added per-format *_active_fx() helpers, badge widens from [STM] to [STM FX:3]). Drive-by: HEARO_AUTOPLAY=<path> env var for the screenshot harness. Source archive.

HEARO: sample offset + arpeggio on STM / ULT

Two more per-effect bolt-ons on the post-v1.4 trackers. Sample offset (STM Oxx, ULT 9xx) jumps param * 256 frames into the sample data instead of starting from byte 0. This is how almost every drum loop in the tracker corpus slices breakbeats. Arpeggio (STM Jxx) cycles xy-nibble semitone offsets per tick. Both compose with vibrato and slides. Two new fixtures (FXSTM4, FXULT5). Wav-matrix grew from 28 to 30 cells; all 28 prior baselines unchanged. Source archive.

HEARO: tone portamento + vibrato + tremolo on STM / FAR / ULT

The next layer of musical expression. Tone portamento on all three (STM Gxx, FAR 3xx, ULT 3xx): a fresh note becomes a slide target, not a re-trigger. Vibrato on all three (STM Hxx, FAR 5xx / 8xx, ULT 4xx): xy parameter sets speed and depth, per-tick a Q8 sine table modulates frequency without persisting. Tremolo on ULT (7xx): same shape but on volume. Three new fixtures (FXSTM3, FXULT4, FXFAR4). Wav-matrix grew from 25 to 28 cells. Source archive.

HEARO: animated splash intro before the boot screen

HEARO splash intro animation: HEARO logo wipes in left-to-right with a CGA-snow flicker zone behind the wavefront, then settles to the full logo plus 'NetISA Music Player' subtitle, then dissolves into the boot screen.
Roughly 3.5 seconds of reveal, hold, dissolve, then handoff to the boot screen. The OPL2 fanfare doesn’t survive the GIF round-trip.

Inspired by the Apogee / Sierra studio splashes that set the tone before a single menu loaded. Four phases: column-by-column wipe with a CGA-snow flicker zone behind the wavefront, three-note OPL2 ascending arpeggio (C5 / G5 / C6) keyed at 25 / 50 / 75 percent through the reveal, one-second hold with the “NetISA Music Player” subtitle, then a vsync-gated palette fade to black. Any keypress skips. --no-intro, HEARO_INTRO=off, or --safe opts out. Hardware with no OPL still gets the visual; the OPL writes drop silently. Around 250 lines in src/ui/intro.c. Source archive.

HEARO: UI catch-up after the post-v1.4 feature blitz

The decoders, the per-tick effects pump, the AY shape regression, the volume slides, all of today’s work added depth without surface. Four passes brought it back in line. Phase 1 visibility: live status-bar indicators ([EQ], [REV:Cathedral], [Wide], [V:Plasma]) and a format badge in the now-playing pane that brightens when the active format has effect coverage. Phase 2: stereo-separation knob promoted from env-var to Settings → Stereo mode. Phase 3: boot-screen tip line, browser empty-state hints, now-playing stopped-state prompts. Phase 4: three new built-in themes (Borland Blue, Norton Commander, Tokyo Night). Total now 9 plus user-defined. Source archive.

HEARO: per-tick effects pump on STM / FAR / ULT plus AY shape regression

STM, FAR, and ULT got the rest of their first-pass effect coverage. Architectural piece: a process_tick() per format. Row processing on tick 0, tick processing on every non-row tick, walking each channel and applying persisted volume / frequency deltas through the mixer in the same scaling space. Slides memorize S3M-style. Tone porta, vibrato, tremolo deferred (need memorized per-channel target state). Six new fixtures plus AYSHAPES, an AY-3-8910 fixture cycling all 8 functional envelope shapes (AYFULL only exercised shape 0x0A, leaving shape-specific regressions invisible). Wav-matrix 19 to 25 cells. Source archive.

HEARO: STM, FAR, ULT sequencer-control effects

Three of the post-v1.4 trackers got their first effects pass. STM honors Axx (set speed), Bxx (position jump), Cxx (pattern break). FAR honors Fxx (set tempo); FAR has no jump or break, song flow goes through the order list. ULT honors Bxx, Dxx, Fxx; ULT cells encode two effect columns and v1.x reads the first only. Cell layout widened where needed. Volume slides and pitch effects deferred to the per-tick state machine that v1.x dispatch doesn’t have yet. Three new wav-matrix cells (FXSTM, FXFAR, FXULT) with their own generator scripts. Source archive.

HEARO: six new decoders, AY chip music, audio regression with peak floor

Six format decoders shipped on top of v1.4: CMF (Creative Music File), HSC (HSC AdLib Composer), STM (Scream Tracker 2), RAD v1 (Reality AdLib Tracker), FAR (Farandole Composer), ULT (UltraTracker V004). Plus an AY-3-8910 / YM3 register-stream player covering ZX Spectrum 128 / Amstrad CPC / Atari ST corpus, with a streaming synth that lifts the v1 ~2.97-second pre-render cap (the cap was Watcom 16-bit large-model _fmalloc’s 16-bit size_t; v2 uses a 2 KB ring buffer). Total decoder count is now 16.

Each decoder ships with a per-format end-to-end audio regression on 86Box. PCM trackers hash the mixer output; OPL routes through Nuked-OPL3 host synthesis; AY uses HEARO’s own software synth. 16/16 cells PASS deterministic. Picked up a real bug in coverage: the first AY build allocated 88200 bytes for a 4-second pre-render, hit the SAFE_FMALLOC_MAX cap, returned NULL, and ay_play_init silently bailed. The hash of all-zero output was perfectly deterministic. The harness now has a peak-amplitude floor so a baseline regenerated against silence doesn’t look healthy. Source archive.

HEARO v1.3.0: engine fidelity, visualizers, metadata

The demoscene-polish milestone. Full XM and IT envelope coverage (vol + pan + pitch). IT lowpass filter (Z40…Z7F, rate-independent cutoff). NNAs via a ghost-voice pool. Three visualizer modes (Spectrum, VU, Bars; V cycles). Real now-playing metadata (WAV LIST/INFO, MIDI track-0 sequence-name, VGM GD3 tag).

Same-day hardening closed 12 review findings plus five auplay-inspired SB/DMA improvements. Three rounds of iterative review (5 then 1 then 0 Critical+Important findings). Round 2 caught a u32 overflow in IT pitch-envelope frequency multiplication; fixed via split-shift form. Source archive.

Prior-art writeup: where NetISA fits in the TLS-on-vintage landscape

Spent some time reading what other people have built before deciding the coprocessor design was the right call. The argument: modern internet requires TLS, software TLS on vintage hardware bottoms out around a 486 (and ships with disabled cert verification and fake entropy to make it fit), Layer-2 WiFi cards still need TLS to run on the host, and proxies require a second modern machine. NetISA puts an ESP32-S3 with hardware AES/SHA/RSA/ECC and 8 MB of PSRAM on the bus and terminates TLS there. An 8088 talks HTTPS because it never touches the cryptography. Architecture-spec Appendix A grew with PicoMEM, PicoPCMCIA, WinGPT, Crypto Ancienne, AmiSSL, Secure Oldies, SEthernet/30, DOStodon, FrogFind, Browservice, WebOne, Protoweb.

TAKEOVER v1.2.1: bug-fix release

Same-day patch on top of v1.2. Cleaned up the Esc / Enter encoding-mismatch dual-checks behind IS_KEY_ESC and IS_KEY_ENTER helpers. Fixed an F9 / F10 status flash leaking a Space press into outer scenario delay. Reset g_skip_delay in engine_reset for symmetry. v1.2 saves and .scn files unchanged; drop-in replacement. Binary. Project page.

TAKEOVER v1.2: robustness and UX polish

The headline fix: Esc exits any running scenario. Pre-1.2, the engine’s input loops only handled Enter and the busy-wait inside long delays had no abort path. A user mid-scenario who hit Esc got nothing and had to reboot. v1.2 routes a global abort flag through engine_run that returns cleanly to the menu. Other fixes: engine no longer eats keys typed during delays, F9 / F10 audio toggles work mid-scenario, parser errors include filename plus line number. Added: Space skips, F1 in-scenario key reference, mute states persist (TAKEOVER.DAT bumped to v2). Binary. Project page.

CATHODE, DISCORD, and CLAUDE get their own project pages

Three new pages on barelybooting.com: cathode.html, discord.html, claude.html. Until today these three were one-line mentions on the NetISA page; they now stand on their own. Site nav updated across all 12 HTML files; sitemap and index.html updated to point at them.

CATHODE, DISCORD, and CLAUDE migrate to the suite-app pattern

All three older DOS apps now live at the top level of the NetISA repo, matching the shape HEARO and CHIME ship: src/ for sources, own Makefile with a LIB_OBJS split, README.md, scripts/ for the screenshot toolkit. Shared platform code lives in a new /lib/ at the repo root. Source files moved via git mv to preserve history. Build sizes match: CATHODE.EXE 40 KB, DISCORD.EXE 37 KB, CLAUDE.EXE 30 KB. CATHODE builds two variants (stub and real INT 63h backends). Top level is now lib/ + one directory per suite app; dos/ is just the TSR and the launcher. Four suite apps remain unbuilt (COURIER, CRATE, KIOSK, RADIO).

HEARO + CHIME tagged v1.0.0

HEARO boot screen on the Maximum tier configuration: Pentium / SVGA 1024 / 32 MB / SB16 + MPU-401. Intel Pentium @ 8 MHz / integrated x87 (Intel) / 34 features unlocked, including the Pentium-class Convolution reverb, Particle system, and Wireframe 3D.
Maximum tier (Pentium / SVGA / SB16 / MPU). 34 features.

v1.0.0 of both apps tagged on the NetISA repo. Detection fixes: probe_sb’s OPL3 check was reading port base+8 instead of base+0, so SB Pro 2 disambiguation never fired correctly; same off-by-8 in the AWE32 vs AWE64 check. sb_asp_present switched from a loose mixer-index 0x83 read to DSP command 04h (ASP get version), which times out cleanly on plain SB16. probe_gus no longer blind-probes when ULTRASND is unset. cpu_pit_loop calibration switched from count/1000 to count/100, an order of magnitude closer to truth on real iron. Source archive. HEARO project page, CHIME project page.

HEARO and CHIME compile clean. First screenshots.

HEARO boot screen captured in DOSBox-X. CP437 box-drawing HEARO logo at top, hardware report below with right-justified ENABLED in green for the 80486DX FPU and SVGA, indented unlock list of 16 FPU-gated visualizers and DSP features, plus a memory and library line. Bottom: Your machine has unlocked 24 features. Press any key to begin.
HEARO boot screen, first capture. 486DX / SVGA / synthetic-stub detection. 24 of 67 features unlocked.
CHIME 1.0 running in DOSBox-X with the /STUBNET flag. White-on-black terminal output: CHIME 1.0.0; NetISA: stub mode; Server: time.cloudflare.com (HTTPS HEAD); Time: 2026-04-25 14:30:42 UTC; Now: 2026-04-25 08:06:28 (DOS clock); Delta: +23054 seconds; Write to DOS clock? [Y/n].
CHIME report and confirmation prompt. /STUBNET returns a canned timestamp so the captured frame is deterministic.

Open Watcom V2 installed. First wmake on HEARO surfaced the expected handful of issues, all fixed in one sweep. Same for CHIME. Both binaries build clean and run under DOSBox-X. DGROUP overflowed 64 KB by ~10 KB because of all the unlock-rule strings; -zc in the Makefile pushes const data into the code segment and DGROUP fits. bipartite_sin had a sign-flip overflow when both A and B table entries were near s16 max; replaced with linear interpolation between adjacent coarse entries plus a clamp. HEARO_NOASM scope narrowed to gate only the inline-asm probes; display, DOS calls, and file-system access always use the real Watcom path now. Source archive.

CHIME: foundation phase done

CHIME is the second NetISA suite app to leave design phase, same day as HEARO. Smaller scope: ask the network for the current time, set the DOS clock. v1.0 talks HTTPS HEAD to time.cloudflare.com / time.google.com / worldtimeapi.org and parses the RFC 7231 Date: header (one-second precision). Real SNTP arrives in v1.1 when NetISA exposes UDP. CMOS RTC write-through after the INT 21h set as a backstop on older DOS that doesn’t propagate the change. Same suite template HEARO ships. Project page, source archive.

HEARO: foundation phase done

Music player for IBM PC compatibles (286+, DOS 3.3+) and the next NetISA suite app out of design. All eleven spec phases plus three polish items landed. The design idea: every recognized expansion turns on specific features the user can see. Boot screen names every detected component. Settings panel lists locked features next to their unlock requirement. HEARO.HAL records first-detection dates so the machine accumulates a timeline.

Shipped: 313-line design + 681-line soundcard reference, eight-module detection engine (CPU / FPU / video / audio / memory / NetISA / mouse / joystick) with full BLASTER and ULTRASND parsing, around 70 unlock rules, boot screen, four-pane text-mode UI, settings panel, Hall viewer, 24-iteration adaptive CORDIC, 4 KB bipartite tables, 256-bit software quire accumulator, INI config, persistent Hall, dormant-feature whisper, six test programs, Watcom wmake Makefile. Real CP437 box-drawing logo, DOS file browser via _dos_findfirst/_dos_findnext with an 11-extension music-file filter, anniversary date-diff that fires when today’s MM-DD matches a Hall first-detection date in past years. Not compiled yet; Open Watcom V2 isn’t installed here. Project page, source archive.

NetISA parts landed. Every line of the BOM is on the bench.

Photo: NetISA parts arrival on a workbench. A TexElec 8 Bit ISA Prototype Card v1.0 (yellow PCB with ISA edge connector) surrounded by EcoSonic VpCI-125 HP anti-static bags containing electrolytic capacitors, ceramic capacitors, resistors, and diodes, along with DigiKey SCS static shielding bags and a ribbon cable.
TexElec prototype card in the center, passives and ESP32-S3 / CPLD modules around it.

The last DigiKey box arrived. Headline item: TexElec 8-Bit ISA Prototype Card v1.0. Around it: ESP32-S3-WROOM-1U-N8R8 modules, ATF1508AS TQFP-100 CPLDs, the passive set, IC sockets, pin headers, anti-static everything, programmer kit. Software has been parked here for a while: DOS TSR running, launcher and config UI working, Cathode browsing real pages against a stub backend, Discord v2 on simulated channels, Claude client talking to the Anthropic API, ESP32 firmware complete, CPLD logic 160/160 testbench. All gated on actually having parts. That gate is now open. Real hardware bring-up is finally unblocked and I am fully expecting at least one thing to go wrong immediately. Project page, source archive.

CERBERUS v0.8.1: same-day completion release

Second tag of the day after v0.8.0. Closed every item v0.8.0’s notes flagged “deferred to 0.8.1” that wasn’t hardware-gated. IEEE-754 edge-case diagnostic (14 focused edges across FADD / FSUB / FMUL / FDIV / FSQRT). /CSV output mode with RFC 4180 quoting. L1 pointer-chase latency probe, L2 reach via 64 KB _fmalloc, DRAM ns derivation. IIT 3C87 DB row + routing stub. Genoa ET4000 chip-level probe via 3CDh segment-select. Hercules HGC / HGC+ / InColor variant discrimination. 16 new host-test assertions.

Hotfix lesson: between M2 commit and smoketest, DOSBox Staging surfaced a flag-parsing regression where str_starts_with(a, "/C") silently consumed /CSV as the calibrated-mode prefix. Bug passed both host-test suite and wmake; only the full Staging run surfaced it. Durable instruction now: after every CERBERUS.EXE build, run the Staging smoketest before claiming clean. Build state: 170,722 bytes, 376 host-test assertions green, zero compiler warnings. Source archive. Project page.

CERBERUS v0.8.0: trust-first release, four milestones in 36 hours

The first CERBERUS release where every shipped result has been verified on real iron. Four milestones in 36 hours. M1: trust-first foundation. Whetstone emit suppressed (Curnow-Wichmann reads 10-30x below published reference on real 486 silicon; wmake WHETSTONE=1 re-enables for research). Upload path compiled out after v0.7.1 surfaced a stack overflow when the server was unreachable. Watcom libc teardown hang on BEK-V409 fixed via _exit() bypass. M2: precision expansion. FPU behavioral fingerprint grows from 4 axes to 5 (FPTAN-pushes-1.0). Rounding-control + precision-control + exception-flag cross-checks. Cache stride sweep extended to 6 points with stride=128 enabling line=32 vs line=64 plateau detection. M3: CUA-lite interaction. Norton-style F-key legend, F1 help overlay, F3 exits, /MONO flag. M4: documentation parity. Every FAIL / WARN verdict carries a possible-causes clause.

Real-iron captures earning the ship: BEK-V409 clean-exit 2026-04-21 20:39 (i486DX-2-66 + AMI 11/11/92 + S3 Trio64 + Vibra 16S + 63 MB XMS) and 386 DX-40 + IIT 3C87 + Genoa ET4000 companion. 320 host-side assertions green. Binary ~167 KB. Source archive. Project page.

CERBERUS Part B: barelybooting-server v0.1.0 shipped, production-ready

Companion server for CERBERUS upload ingest. Flask + SQLite + Jinja, around 700 lines of Python, strictly implementing the frozen upload contract from CERBERUS v0.7.0. Six GET routes (list, per-CPU-class, per-machine, unknown, detail, stubbed CSV export) plus one POST. 24 host-side tests green. Deploy stack: Dockerfile (Python 3.12-slim, non-root, waitress, healthcheck) plus a cloudflared sidecar that waits on app health before opening the tunnel. Cloudflare Tunnel is outbound-only, no port forward, no public IP exposed. Target is a Home Assistant OS mini PC.

Pre-traffic red-team found and fixed: no rate limit on intake (added Flask-Limiter, 5/min + 30/hour per CF-Connecting-IP), no server-side length enforcement on nickname / notes, potential submission_id birthday collision at 65k rows, missing CSP / frame-deny headers, non-ASCII body bytes silently replaced (now strict-decode 400), unbounded Content-Type acceptance (now text/* only). Container runs read-only with tmpfs /tmp, all Linux capabilities dropped, no-new-privileges. Source archive. Project page.

CERBERUS: ANSI three-head boot intro, issue sweep, Homage Phase 3

Five commits past the v0.4.0 tag. Headline: an adapter-aware three-headed-dog ANSI boot splash with an OPL2 stinger, around 2.2 seconds end-to-end, gated by /NOINTRO and /NOUI. On VGA color: DAC fade-in from black, three eye-pairs illuminating left-to-right with escalating OPL2 barks at D2 / F2 / A2, chain-shatter climax with DAC white flash and OPL2 snare, sustained A-minor chord with vibrato over a sub-bass drone while hellfire embers flicker. Full adapter degradation: EGA / CGA get attribute-only, MDA / Hercules get intensity-bit pulse with block-shading silhouette. Real-hardware validated on BEK-V409. Operator reaction recorded: “Wow that looked epic.”

Issue sweep: four issues moved. Issue #1 (four pre-existing test_timing failures) closed via the divergence-guard now correctly tripping. Issue #3 (UI hang on real iron) closed cannot-reproduce after 9 consecutive clean runs. Issue #6 split: test-1 CFLAGS_NOOPT tax landed ~7-9 percent (not dominant), test-2 became a standalone tools/repstosd/REPSTOSD.EXE. Issue #2 (Vibra 16 PnP OPL intermittency) instrumented with byte-level trace.

Homage Phase 3: seven additional lesson docs covering CheckIt Whetstone (custom synthetic, like the Dhrystone finding), CACHECHK UMC timer workaround, SPEEDSYS attribution corrected to Vladimir Afanasiev, plus PCPBENCH / 3DBENCH / CHRISB / LM60 cross-corroboration for issue #6. Three attribution corrections shipped: SPEEDSYS, PCPBENCH, 3DBENCH. Project page.

CERBERUS v0.4.0 shipped. Three-release-candidate weekend closed.

Four tags across 48 hours: v0.2-rc1 (first real-hardware-validated RC after five bugs were found and fixed on contact with the BEK-V409 bench box), v0.3-rc1 (diagnostics complete, per-line cache-ratio reformulation), v0.4-rc1 (bench_cache, bench_video, Rule 4b cache-aware narration, Rule 11 DMA-class coherence, DGROUP ceiling lift 52K to 56K), v0.4.0 (final, closing three UI defects the rc1 screenshot surfaced).

The rc1-to-final pass was surgical. UTF-8 em-dash and multiplication-sign bytes in diag_cache’s status format string rendered as CP437 garbage; audit found three more latent paths and fixed them preemptively. The UI’s value_str returned empty for V_U32 benchmark rows emitted with a NULL display string, so five BENCHMARKS rows rendered labels but no values. bench_dhrystone.c’s reference-point comment was updated per Phase 2 Homage research: CheckIt’s “Dhrystones” is a custom synthetic, not a Dhrystone port, so the 33,609 anchor on BEK-V409 is empirical agreement, not algorithmic equivalence. Eight consecutive clean real-iron runs through the v0.4.0 capture. Source archive. Project page.

NetISA end-to-end quality gate + firmware security hardening

Adversarial quality gate across the entire NetISA codebase (14,300 lines, 7 components). Four parallel chunk reviews found 8 Fatal and 16 Significant issues. All fixed in two commits. DOS-side: NULL pointer guards, TSR return code fix, password input VGA overflow clamp, FPU detection 8088 safety, Claude stack overflow fix, command injection filter, scroll clamping. Firmware security: ISR race condition fixed via per-request data buffers, open WiFi AP replaced with WPA2-PSK using device-unique MAC-derived password (AP disabled after station connects), timing-safe admin key comparison via constant-time ct_strcmp, HTTP session mutex, redirect limit at 5 hops, memory barrier fix in ISR, OTA SHA256 hash verification, NVS encryption documented. Project page.

DOSBox-X automation quality gate: 9 Fatal + 31 Significant fixed

Full adversarial quality gate on the NetISA DOSBox-X automation (capture.ps1, dosrun.py, dosbuild.py, _RELAY.BAT, dev.conf, README), 1,422 lines. Three review rounds, score progression 30 to 28 to 0. Fixed: atomic lockfile (Ctrl+C races), Windows PID recycling, hardcoded WinGet paths, tempDir leaks on ffmpeg failure, zombie DOSBox-X processes on early exit, CP437 silent replacement, mount path quote escaping, PrintWindow return value check (no more silent black GIFs), ERRORLEVEL baseline reset, cycles=auto for deterministic timing, lock-timeout-aware staleness. Production-grade reliable now. Project page.

TAKEOVER quality gate: 12 bugs fixed in 5 rounds

Full adversarial quality gate on the TAKEOVER codebase (5,700 lines, 13 modules). Five review rounds, score progression 6 to 5 to 7 to 1 to 0. Twelve fixes: string pool exhaustion now parse-time error (was silent failure), midnight BIOS tick wrap (music freeze), OPL2 channel bounds validation, LFSR dissolve safety break, stack buffer pressure (two buffers moved to far heap), DGROUP palette buffer (768 bytes recovered), VGA palette tearing (buffered rotation), cracktro OPL2 state corruption (chip reset after easter egg), music fast-forward after climax, input buffer size mismatch, AI control level cross-scenario persistence, cracktro integer overflow (unsigned counters). EXE 57.8 KB to 60.5 KB. Project page.

Discord v2: ground-up rebuild

Ground-up rebuild from 939 lines / 14 KB to ~2,400 lines / 37 KB. New: 128 messages per channel (up from 32) on far-heap storage, multi-line compose (Shift+Enter), Ctrl+F find with match highlighting, PC speaker notifications (4 types, F9 toggle), 8 hash-based author colors, CP437 reaction display, thread reply indicators, user list overlay (Alt+U), help overlay (F1), VGA palette fade in/out, DISCORD.CFG settings persistence, scroll bar, unread counts, notification title flash. 10 source modules. 8 channels with 64 realistic retro-computing community messages. Built across 7 agents in 5 waves. Project page.

DOSBox-X development relay + Cathode parser fixes

Built a development relay system (devenv/) that closes the develop-compile-test loop: compile natively with OpenWatcom / NASM on Windows, run the result in DOSBox-X, capture stdout + exit codes via batch-file relay. Atomic lockfile with stale PID recovery, timeout handling, CP437 encoding, stderr capture, retcode retry loop. Quality-gated through 7 rounds. Then used the relay to build an automated Cathode test suite: 11 real websites (NPR, CNN, Hacker News, Wikipedia, OpenBSD man pages, edge-case fixtures), parsed through Cathode’s HTML engine inside DOSBox-X, found three bugs. (1) Named HTML entity table only had 7 entries; expanded to 90+ covering accented characters, smart quotes, dashes, currency, math, arrows. (2) Missing </head> tags caused 0 rendered rows; <body> now implicitly closes <head>. (3) Pages over 32 KB produced 0 rows due to 16-bit int overflow in parse chunk length; fixed by chunking. 12/12 tests now pass. Project page.

Cathode v0.2: text-mode document browser

v0.1 browser shell becomes a functional text-mode document browser that renders real HTML. Streaming HTML parser (~830 lines) handles headings, paragraphs, links, bold / italic / code, lists, blockquotes, preformatted text, horizontal rules, entities. HTTP/1.0 fetch with redirect following and timeouts. UTF-8 to CP437 character mapping. URL parser with relative URL resolution (7 forms). Find on page with pre-computed match positions. Bookmark persistence. Word-boundary wrapping. Scroll bar. CP437 block-art logo. 38.5 KB EXE. Renders text.npr.org, man.openbsd.org, example.com, and barelybooting.com with navigable links. Quality-gated: 5 rounds, 34 issues found and fixed (3 Fatal, 31 Significant). Project page.

TAKEOVER v1.1: demoscene enhancement pack

Eight demoscene-inspired features informed by research from Commodore 64 cracktros to modern 4 KB intros. Audio-visual beat sync via an adlib_beat counter. Six fire-and-forget OPL2 stingers on channels 3-8, each thematically assigned per AI. Two new visual effects: sine-wave text distortion and VGA DAC palette cycling in text mode. Four state transition types on goto: (LFSR-based dissolve, column wipe, DAC fade, random glitch). Living status bar with AI control level (0-100) shifting from green to red. Five per-AI Mode 13h climax sequences at endings. Hidden cracktro easter egg unlocked by completing all five scenarios: raster bars, 40-star parallax starfield, DYCP sine-bouncing scrolltext, 9-channel OPL2 chiptune in C minor. EXE 57.8 KB. Project page.

TAKEOVER v1.0 released

First official release. F9 / F10 audio toggles for AdLib music and PC speaker (playback timing preserved when muted). Expanded color palette (15 attr colors). Each AI scenario has a distinct color personality: Kestrel-9 red / cyan for threat data, Cinder Mirror magenta for fourth-wall breaks, Orchard Clerk bright cyan for its helpful-creepy voice. Subtle homages to classic AI cinema (2001, WarGames, Ex Machina, The Matrix, Blade Runner) woven into scenario dialogue. Binary.

Cathode: logo fix, color gradient, VGA palette fade

Fixed the Cathode logo where the H looked like an M (block-art row 1 used lower-half blocks creating an M-shaped dip). Added 5-row color gradient: green edges, bright green inner rows, white center crossbar. VGA DAC palette fade-in / fade-out added to the shared screen library; Cathode fades in from black on startup and to black on exit. Project page.

TAKEOVER: all five scenarios, A/V overhaul

All five scenarios complete: Axiom Regent (municipal optimization), Hushline (crisis comms), Kestrel-9 (threat detection), Orchard Clerk (personalization), Cinder Mirror (narrative generation). 250+ states, 15 endings across 5 scenarios. A/V overhaul: VGA Mode 13h plasma title screen with animated color cycling and pixel-font logo, AdLib / OPL2 FM ambient music (5 unique drones), FPU-accelerated effects, VGA palette fade transitions. Hardware auto-detection (VGA / EGA / CGA / MDA, AdLib, FPU) with graceful degradation. DGROUP went down from 98.1 percent to 96.5 percent despite adding 4 new modules; all new const data is static const __far. 41 KB EXE. Project page.

TAKEOVER: engine, effects, menu, first scenario

New project: an AI takeover simulator for DOS. Built the .scn script engine (parser, state machine, variable system, choice menus), 14 visual effects (screen flicker, text corruption, progress bars, fake BSOD, screen melt, falling chars, color shift, blackout, etc.), PC speaker audio via 8253 PIT, menu system with completion tracking. Wrote the Axiom Regent scenario: 55 states, 3 endings (TAKEOVER, ESCAPE, REVELATION), 10-15 minutes per path. String pool architecture (19 KB) with 12-byte commands keeps the 31 KB EXE in small memory model. Quality-gated: caught string pool overflow, stack overflow in effects, DOS 8.3 filename violations. Project page.

Claude for DOS

Built CLAUDE.EXE, an Anthropic API client for DOS that talks over TLS 1.3 via the NetISA card. Three agent modes: Chat (conversation only), Ask (Claude proposes commands, you confirm), Auto (Claude runs DOS commands freely). Far-heap message pool, word-wrapped chat with newline support, 3-line compose area, [EXEC] tag parsing for command execution with output capture. Iterative agent loop with 5-deep safety cap. Quality-gated with 2 rounds. Project page.

Site launch + community pages

barelybooting.com is live. Project page, build log, RSS feed. The site exists because the project reached a point where a README isn’t enough: there’s a DOS browser, a Discord client, validated CPLD logic, and production firmware. Time to show it properly.

v1 firmware complete

ESP32-S3 firmware hit production quality after 8 rounds of adversarial review. WiFi manager with APSTA mode, HTTP client with 4 concurrent TLS sessions, HTML-to-CP437 parser for Cathode, embedded web config server, OTA updates with authentication. Fixed cross-core race conditions, register protocol bugs, security vulnerabilities, and resource leaks along the way. The firmware turns ISA bus register writes into TLS 1.3 sessions.

Discord client for DOS

Text-mode Discord client running in DOSBox-X. 6 channels with per-channel far-heap message storage, word-wrapped messages with author colors, compose bar with cursor editing, Tab-cycling focus, timed fake message injection, PgUp / PgDn scrolling. Quality-gated through 6 rounds. The demo that makes people stop and look: Discord on an 8088.

Cathode text-mode browser

Built Cathode, a text-mode HTTPS browser for DOS. Split architecture: DOS side receives a cell stream, manages 200-row scrollback on far heap (~80 KB), renders to VGA text buffer. ESP32 side fetches URLs, parses HTML, converts to (char, attr) cell stream. Link navigation, URL bar editing, back / forward history, CP437 box-drawing. 5 rounds of adversarial review.

DOS software stack complete

Full DOS software stack built and tested in DOSBox-X. NETISA.COM TSR (678 bytes, hooks INT 63h, under 2 KB resident). NETISA.EXE launcher with WiFi scanning, signal bars, card status, system info. Shared screen library with direct VGA writes to 0xB800:0000. Complete INT 63h C wrapper library. Stub layer for testing without hardware.

CPLD verification complete: 160/160 tests passing

All 160 Verilog testbench tests pass under iverilog. Address decode, IOCHRDY wait states, watchdog timeout, IRQ state machine retrigger, back-to-back cycles, mid-cycle reset, status flag merge, alias rejection. 95 of 128 macrocells used, timing slack +39.5 ns setup at 16 MHz. Zero bus contention across the full simulation suite. Lint clean on iverilog -Wall.

Hardware design finalized, parts ordered

Schematic and PCB layout for the NetISA v1 board finalized. ATF1508AS CPLD for ISA bus timing, ESP32-S3-WROOM-1U-N8R8 for networking and crypto, Wiznet W5500 pads for v1.5 Ethernet. Bracket-mount antenna for metal cases. Physical jumpers, no Plug-and-Play. Parts ordered, waiting on delivery for prototype build.