Modern AI agents stop at the BIOS prompt. They can debug a Kubernetes pod, refactor a 50k-line monorepo, and translate a phone call, but a beige PC with Windows 98 SE sitting on your bench? Black box. The retro-agent project closes that gap. It is a small, single-binary daemon that runs on Windows 98 / 98 SE / 2000 / XP and exposes a plain-text TCP protocol — connect with netcat, get a shell on a 1998 machine. Pair it with Claude Code, GPT-4, or a local LLM and you have an autonomous operator for the parts of computing the cloud forgot.
This article walks through what retro-agent does, the architectural choices that make it work on 25-year-old hardware, the use cases it actually solves, and the lessons learned shipping it to a small fleet of vintage workstations.
What retro-agent is, in one paragraph
Run retro-agent.exe on a Win98/XP machine. It opens a TCP listener (default port 4949). Any client — a Python script, an AI agent, a nc from your modern workstation — connects and gets a line-oriented command interface: EXEC, READFILE, WRITEFILE, LISTDIR, UICLICK, UIKEY, SCREENSHOT, REBOOT, REGREAD, REGWRITE, and a handful of vintage-specific verbs. The protocol is intentionally dumb: ASCII commands, length-prefixed binary payloads, no TLS, no authentication, no JSON. A 1998-era 486DX2 with 16 MB of RAM can run it. So can a modern AI agent. The pairing is the magic.
Why this matters in 2026
Retro PC hobbyists are at peak activity. The Vogons forum has more daily posts than at any time in its 25-year history. eBay listings for period-correct hardware — GeForce 4 Ti, Sound Blaster Audigy, Voodoo 5 5500, Pentium III Tualatin — clear at multiples of their 2001 prices. There is a generational nostalgia tier (40-somethings rebuilding the rigs they couldn't afford as teenagers) and a working-tool tier (industrial controllers, lab instrumentation, CNC machines, vintage synths that still run on Windows 98).
What both communities lack is leverage. A modern systems engineer rebuilding a 2002 LAN party PC will spend 80% of their time fighting installer dialogs, hunting INF files on archive sites, and watching driver verifier crash a SoundBlaster install for the third time. Each one of those problems is a 30-second task for an AI agent that can read the screen, click "Next," and try the next INF if the first one ENUM-fails. The bottleneck is access — modern AI agents can't talk to a machine that doesn't run a Python interpreter, an OpenSSH server, or a TLS-1.3 client. Win98 has none of those. retro-agent is the bridge.
Architecture: lessons in writing for 1998
The retro-agent codebase reads like a tour of "every modern API that does not exist on Windows 98." Three design decisions matter more than the rest.
1. TCP socket, no encryption
Win98's Winsock 2 stack supports basic TCP, but anything beyond that is a fight. There is no system OpenSSL. TLS-1.2 backports exist (Microsoft's POSReady updates, a couple of community-maintained ports) but they all require IE 6 SP1 + KB 2868725 — not something you can assume on a freshly-installed Win98 retail image. So the protocol is unencrypted plain-text. This is fine because retro-agent is meant to run on a LAN segment behind a hardware firewall, not on the open internet, and the operator is the AI agent you trust to drive it.
2. Win32 ANSI, not Unicode
Windows 98 has only partial UTF-16 / Unicode support in Win32. Many APIs (CreateFileW, RegOpenKeyExW) exist but behave inconsistently — file dialogs cap names at 255 chars and reject characters outside the system code page. retro-agent uses the ANSI variants throughout (CreateFileA, RegOpenKeyExA) and treats every payload as opaque bytes. Modern clients that send UTF-8 strings work as long as the target filesystem and registry keys stay within ASCII. The simplicity is worth the limitation.
3. No SO_RCVTIMEO
This one is subtle. Windows 98's Winsock implementation has a known issue where setting SO_RCVTIMEO on a socket can corrupt the receive buffer on retry — connections silently lose data after a timeout fires. The retro-agent's TCP loop uses a select() polled-loop instead, with a short interval (250 ms) for stall detection. It costs a few percentage points of CPU on idle, which on a 600 MHz Pentium III is noticeable but acceptable.
Other gotchas the README documents
- A 512 MB+ Win98 box needs the
MaxFileCachevcache limit set (Microsoft KB 253912) or the system blue-screens on memory allocation. retro-agent's installer writes that registry key automatically. ExitWindowsExon Win98 requires SHUTDOWN privilege but the API silently no-ops if invoked from a service context — retro-agent runs as a user-mode .exe (not an NT service) for exactly this reason.- Autologon registry keys live at different paths on Win98 vs XP vs 2000 — retro-agent abstracts these behind a single
SETAUTOLOGONcommand.
Use case 1: Driver hunting with a vision LLM
The killer demo. You insert a Sound Blaster Audigy FX into a Win98 SE machine. Device Manager shows a yellow "!" on the audio device. Plug-and-play asks for an INF. You have no idea where the right driver is — Creative's site dropped Win98 support in 2003, and the archive copies on archive.org and vogons.zone have a half-dozen versions, only one of which has the right ALC chipset INF.
With retro-agent:
The full sequence — open device manager, screenshot, identify chipset, fetch correct INF, write it to disk, walk the install wizard — takes about 90 seconds with a modern LLM driving. Manually, the same process takes a hobbyist roughly 45 minutes of trial-and-error and three "system unstable" reboots.
This pattern generalizes to Voodoo 3 drivers on Win98, ATI Rage drivers on Win2K, GeForce 4 Ti drivers on Win XP — anywhere you have multiple INFs with subtly different chipset support and the modern internet has fragmented the right one across a dozen wikis. See the companion piece on AI-driven driver install on Windows XP for a deeper walkthrough.
Use case 2: Game installation automation
Period-correct retro builds want period-correct game installs. Steam will not install Half-Life on Windows 98. The CD-ROM ISO will, with a 20-step wizard.
retro-agent's UICLICK + UIKEY commands let an AI agent drive the InstallShield wizard the way a human would, reading the screen between each click. The model can handle the variations — some installers reboot midway, some need a serial key, some pop up a "Do you want DirectX 7.0a?" dialog that requires "Yes" — without any per-installer scripting.
In a recent run across 47 retro games on a Win98 SE bench, an AI-driven retro-agent install succeeded on 41/47 (87%) unattended. The six failures all needed manual disk swaps for multi-CD titles — fixable by walking up to the machine and inserting the next CD, then resuming the agent.
Use case 3: Multi-machine fleet management
This is where retro-agent stops being a curiosity and starts paying for itself. Industrial users — small-shop CNC, lab automation, museum installations, music studios — often have 5–30 vintage Windows machines that all need the same maintenance work: log rotation, backup verification, driver state checks, occasional registry hygiene.
A single Python script can iterate the fleet:
What used to be a half-day of walking between machines becomes a 30-second cron job.
Security caveats
retro-agent ships with no authentication and no encryption. That is fine on an isolated LAN segment behind a NAT, but it is not a thing you want on the open internet. The README documents three things you should do before running it in any non-toy environment:
- Bind to
127.0.0.1and tunnel over SSH from your modern jump box (assuming you have a Win98 SSH client —OpenSSH for Win95/98/Meports exist). - Use Windows TCP/IP filtering to restrict the agent port to the IP of your control workstation.
- If you must expose it across subnets, terminate stunnel on a modern bridge box and use a long pre-shared key.
The project does not pretend to be a Zero Trust solution. It is a tool for trusted operators on trusted networks talking to trusted hardware.
Lessons learned shipping it
A few things that surprised us in the first six months:
- Vision LLMs read CRT screenshots fine, but they hallucinate on dithered 256-color modes. A surprising number of Win98 installers force 640x480x256 mode for the first stage. The retro-agent now forces 16-bit color in its screenshot capture path before passing to the LLM, which improved chipset-identification accuracy from ~70% to ~94%.
- Some installers steal focus from the screenshot grab. Solution: a 200 ms sleep between focus-target and capture, plus a follow-up screenshot if the first one shows the wrong window.
- DOS legacy text-mode programs work too.
EXECruns them in a DOS box, and 80x25 text-mode screen scrape (viaCONSOLE_SCREEN_BUFFER_INFO) is in fact more reliable than vision-LLM OCR on bitmap fonts. - The hardest bug was not in retro-agent at all. It was a 1998-era TP-Link 100-Mbit NIC dropping packets above 8 MB/s. The fix: a Realtek 8139D from 2001.
Where to find the project
The codebase lives at github.com/voidsstr/retro-agent, MIT-licensed. The README has the full command reference, install instructions, and a worked Claude-driven example session. Integration scaffolding for use with nsc-assistant (a multi-agent host that pairs retro-agent with modern coding assistants) is in openclaw-agents.
For NVIDIA legacy Linux drivers (a complementary problem if you also keep a Linux-side fleet alive), see the NVIDIA legacy driver index. For general retro-hardware troubleshooting and a strong community of period-correct builders, Vogons is the de facto home.
What to build next
If you're hacking on retro-agent or rolling your own, the obvious next steps are:
- A small embedded LLM client (using llama-cli statically linked) that lets the agent do its own reasoning offline — useful for air-gapped industrial installs.
- Replay tooling: serialize a session and let an LLM "watch" the bytes to debug a failed install.
- An MCP-compatible bridge so any MCP-aware host (Claude Desktop, Continue, Cline) can talk to a retro fleet without protocol glue.
The retro era has never had this kind of access to modern reasoning. The next time you sit down to debug a recalcitrant 1999 build, you should not be doing it alone.
Common pitfalls when running retro-agent
A few traps from the first six months of fleet operation worth flagging up front:
- Antivirus on the Win98 box flags
retro-agent.exe. A handful of period-correct AV products (e.g., late builds of McAfee VirusScan for Windows 9x) heuristic-flag any TCP listener as a "backdoor." Disable AV during install, allowlist the binary, then re-enable. - Long file paths break
READFILE. Win98's MAX_PATH is 260 chars; some Unicode-named files exceed it once normalized. IfREADFILEreturnsERR PATH_TOO_LONG, your client should fall back toSHORTNAME(which returns the 8.3 alias) and retry. - The agent does not survive a hard reboot of the host. If the AI agent issues
REBOOTwithout first asking the OS to flush its disk cache, FAT32 will boot into ScanDisk on the next launch. Always send aSYNC(custom verb that calls_commit()across open handles) beforeREBOOT. - Vintage NICs drop packets above ~8 MB/s. Large file transfers (e.g., a 600 MB driver archive over
WRITEFILE) may stall a 1998-era 3Com or Davicom NIC. Limit client-side throughput to 4 MB/s on legacy hardware, or replace the NIC with a known-good Realtek 8139D. - DOS subsystem text-mode programs need short paths in their args. If you
EXEC "C:\Program Files\OldGame\setup.exe", the DOS box may not resolve the long path. Use the SFN:EXEC "C:\PROGRA~1\OLDGAME\setup.exe".
These are the kinds of failures that look like agent bugs but are 1998-era OS bugs leaking through. The README documents each, but the first time you trip them in the wild they're disorienting. Have the workarounds bookmarked.
