Skip to main content
Controlling Windows 98 and XP PCs with AI agents — the retro-agent project

Controlling Windows 98 and XP PCs with AI agents — the retro-agent project

How one developer built a TCP agent that lets Claude orchestrate a retro PC fleet.

The retro-agent open-source project exposes Win98/XP machines to AI agents via a lightweight TCP protocol. Full architecture, use cases, and lessons learned.

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 MaxFileCache vcache limit set (Microsoft KB 253912) or the system blue-screens on memory allocation. retro-agent's installer writes that registry key automatically.
  • ExitWindowsEx on 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 SETAUTOLOGON command.

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:

python
# Pseudocode of a Claude Code session
agent.exec("rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1") # open device mgr
img = agent.screenshot()
# Vision LLM analyzes — "PCI audio device with yellow exclamation, vendor 1102, device 0008"
# Agent now knows it's an Audigy 2 ZS chipset, not FX
inf = agent.find_inf_for_pci(vendor=0x1102, device=0x0008)
agent.writefile("C:\\drivers\\audigy.inf", inf_contents)
agent.uiclick("Install Driver button on the yellow exclamation row")
agent.uikey("ENTER")

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:

python
for host in inventory():
 with retro_agent.connect(host) as a:
 free = a.exec("dir /-c C:\\ | find \"bytes free\"")
 if int(parse_free(free)) < 500 * 1024 * 1024:
 a.exec("del /q /s C:\\Windows\\Temp\\*")
 a.exec("scandskw.exe /a /n") # background ScanDisk
 report.append({"host": host, "status": "ok"})

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:

  1. Bind to 127.0.0.1 and tunnel over SSH from your modern jump box (assuming you have a Win98 SSH client — OpenSSH for Win95/98/Me ports exist).
  2. Use Windows TCP/IP filtering to restrict the agent port to the IP of your control workstation.
  3. 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. EXEC runs them in a DOS box, and 80x25 text-mode screen scrape (via CONSOLE_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. If READFILE returns ERR PATH_TOO_LONG, your client should fall back to SHORTNAME (which returns the 8.3 alias) and retry.
  • The agent does not survive a hard reboot of the host. If the AI agent issues REBOOT without first asking the OS to flush its disk cache, FAT32 will boot into ScanDisk on the next launch. Always send a SYNC (custom verb that calls _commit() across open handles) before REBOOT.
  • 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.

Products mentioned in this article

Tap any product for full specs, live Amazon & eBay pricing, and alternatives.

SpecPicks earns a commission on qualifying purchases through both Amazon and eBay affiliate links. Prices and stock update independently.

Find this retro hardware on eBay

Pre-2012 hardware isn't sold new on Amazon. eBay is the primary marketplace for the SKUs discussed in this article — auctions and Buy-It-Now listings update continuously.

Search eBay for "Windows 98" Live listings →

SpecPicks earns a commission on qualifying eBay purchases via the eBay Partner Network. Prices and availability change frequently.

Frequently asked questions

What is the retro-agent project designed to do?
The retro-agent project enables AI agents to remotely manage and automate tasks on retro PCs running Windows 98, XP, and similar operating systems. It provides a lightweight TCP-based protocol for diagnostics, file management, GUI automation, and hardware fixes, addressing the lack of modern remote management tools for these older systems.
How does the retro-agent handle unique quirks of Windows 98?
The retro-agent addresses specific Windows 98 quirks, such as applying a vcache limit to prevent crashes on systems with over 512MB RAM and managing autologon registry keys. It avoids modern features like asyncio, instead using Win32 threads or cooperative multiplexing to ensure compatibility with the OS's limitations.
Can the retro-agent be used for automating game installations on retro PCs?
Yes, the retro-agent supports GUI automation commands like `UICLICK`, `UIKEY`, and `SCREENSHOT`, which can automate tasks such as installing DOS games, navigating installers, and configuring display settings. These features allow AI agents to handle complex workflows, such as launching and benchmarking games on retro systems.
What are the key design decisions that make the retro-agent compatible with older operating systems?
The retro-agent avoids features that cause issues on older systems, such as skipping `SO_RCVTIMEO` to prevent socket corruption on Windows 98 and using `ExitWindowsEx` with specific process management to ensure reliable reboots. It also avoids installing as a system service on Windows 9x, relying on registry-based autostart instead.
How does the retro-agent integrate with AI tools like Claude Code?
The retro-agent communicates with AI tools like Claude Code over TCP, allowing the AI to send commands, interpret responses, and automate tasks. For example, Claude can diagnose hardware issues, update drivers, and reboot systems autonomously, leveraging the retro-agent's command set to manage retro PCs effectively.

Sources

— SpecPicks Editorial · Last verified 2026-07-06

More guides & deep dives from the SpecPicks archive

Browse all articles & guides →

More reviews from the SpecPicks archive

Browse all reviews →

More buying guides from SpecPicks

Browse all buying guides →