The short version
No One Lives Forever, the 2000 spy shooter by Monolith Productions, now runs in a desktop web browser at playnolf.com, on a new LithTech-compatible engine written in C++ and compiled to WebAssembly by Brightwork Digital with AI agents, in ten days.
- What: No One Lives Forever (Monolith Productions, 2000) now runs in a desktop browser at playnolf.com: all 15 missions plus the Game of the Year bonus mission, Rest and Relaxation. Nothing to install. The first mission is signed off by me; the rest are checked by tests and by playing, not yet signed off.
- How: Monolith released the game's code in 2001 but never the engine under it. We wrote a new engine that fits the game's code like the original did, then compiled both to WebAssembly, code that browsers run at close to native speed, so they run in a browser tab.
- Who: one person typing instructions, and AI agents (Anthropic's Claude) writing the code. 267 prompts from 30 September, and 771 commits (saved changes to the code) from 1 to 9 October 2026.
- How we know it's right: we ran the original 2000 game beside ours on the same inputs and compared them frame by frame (a game draws about 60 frames a second), object by object.
- How right it is: 57 of 65 levels start exactly like the original, over their first 300 frames. On one eight-minute recording, a development build not yet on the live site matched the first level frame for frame, on every object the server tracks. Case 7 says what that does and doesn't cover.
- The honest part: the AI made confident mistakes, forgot decisions and declared victory too early. Most of this story is about how we caught that.
- 10 daysfrom the first question to the public site
- 267prompts from me
- 771commits by AI agents; 77 helper branches merged
- 46,260lines of new engine code
- 315,000+lines of Monolith's game code, running on it
- 57 of 65levels start exactly like the original
- 28,299frames matched in one recording of Morocco
- $5a month to host, plus storage
- 0dollars of AI spend recorded (nobody kept count)
No One Lives Forever came out in November 2000. You play Cate Archer, a former cat burglar turned spy, in a 1960s full of exploding lipstick, robot poodles and henchmen who chat about their lives before you interrupt them. Critics loved it. It won Game of the Year awards. Then the companies that owned it changed hands, the rights got tangled, and the game quietly disappeared from sale. Twenty-five years later, you still can't buy it anywhere.
I run Brightwork Digital, and I own the original CDs. I just wanted to play it again. (In this story, "I" is me and "we" is me plus the AI agents.) This is the story of how that turned into rebuilding the engine it runs on, with AI agents doing the typing, and of every wall we hit.
Case 1. 30 September 2026
Can I play this on my Mac?
It started with a simple question, typed late at night.
Me, 30 Sept, 02:31 UTC
What is the best and simplest but most effective way to get No One Lives Forever working on this Mac?
Claude suggested CrossOver, a paid Windows compatibility layer, plus a community patch. Sensible and correct.
I pushed for something bolder, with a dose of flattery I'm not proud of ("remember you have greater knowledge than any programmer in the history of the world"). Claude came back with three routes: wrap Wine (free software that runs Windows programs on other systems) as a Mac app, play the PlayStation 2 version in an emulator, or a "moonshot": port the game natively. Then I found a native port of the sequel, NOLF 2, on a fan site, and asked if it had seen it. It had linked the wrong copy of that project and missed the finished build entirely. Strike one.
Me, 30 Sept, 03:45 UTC
Did you consider decompilation?
"No, I didn't." It then explained why decompiling only the engine was a real option, because the game's own code was already public.
That was the first time the AI was plainly wrong and plainly said so. It wouldn't be the last. Then I asked what it would take to play in a browser, and the three answers set the course for everything after.
Case 2. 1 October 2026
I own the CDs. Build it.
On 1 October, at 12:47 in the afternoon my time (17:47 UTC; prompt times here are UTC), I wrote the prompt that started the real project. I'm including most of it, with a few lines trimmed and marked, because it set the tone for the next nine days.
Me, 1 Oct, 17:47 UTC
I own the CDs for this game. Download and find the best versions, and I want you to fully decompose this game and build it out to be playable on the web. You can set up a GitHub repo and then deploy it to Cloudflare on a public website when the time comes [...]. But all your initial work must be local. This is a long-standing job. You are to do the decomposition work using Sonnet 5.5, and then all the superintending work here. [...] This is to be a recursive self-improvement job. Set a goal: working in the browser at full screen, smooth not jittery, everything perfect. Research and follow all best practices [...]. A lot of buzz now on X about people doing this. [...] I want this game playable online. This is full autonomy mode now, go.
Within two minutes, four AI researchers were running in parallel: one on how other games reached the web, one on NOLF's code and file formats, one on tools, and one fetching the game.
Two minutes later I was shouting at it.
Me, 1 Oct, 17:49 UTC
NOT THE DEMO! Full version!
It had told the researchers to work from the free demo. It switched to the Game of the Year Edition, version 1.004.
Here's the key fact behind this whole project. In 2001, Monolith did something generous: it published the source code of the game itself, all 315,324 lines, so fans could make mods. Every guard's behaviour, every gadget and every line of mission logic is in there. What Monolith never released is the engine: LithTech, the layer that draws the 3D world, plays the sound, moves the bodies and reads the files. The game's code calls that engine about 13,000 times, through 488 different functions. Without it, the code is a car with no road.
So that was the plan, decided on day one: write a new engine that answers each of those calls the way the original did. Then compile it, with Monolith's game code on top, to WebAssembly, the fast machine code that browsers run. Both are written in C++, a programming language games of that era were built in, and the browser draws the result with WebGL, its built-in 3D graphics. We'd change as little of Monolith's code as possible. One wrinkle: the released code is version 1.003, but the game everyone played is the 1.004 Game of the Year Edition, so a few changes had to be found by reading the retail game's machine code.
The AI researcher estimated two to four months to something playable, and nine to fifteen months for the whole game. The supervising agent added that this was "its judgement, not a measurement." It turned out to be wrong in a good direction.
Case 3. 1 October, the same afternoon
Day one: every file opens
A game from 2000 stores everything in its own formats: textures in DTX files, characters in ABC files, levels in DAT files, all packed into REZ archives. Before anything can be drawn, every one of them has to be read correctly. Here is what the commit log says happened that afternoon, in Central time. These are the times each helper's work was merged, so they're upper bounds, and several helpers ran in parallel.
| Time | What landed |
|---|---|
| 13:05 | All 4,160 of the game's textures decode |
| 13:08 | All 695 models load, skeletons and all |
| 13:18 | All 102 levels load, with zero bytes left unread |
| 13:43 | Monolith's game code compiles for the browser |
| 13:52 | A level appears in a browser tab, at 60 frames a second |
| 14:40 | Sound and the game's adaptive music |
| 14:43 | All 102 levels load and run 600 frames with the real game code |
It's the part of the story that sounds like magic. It isn't. Reading files is the easy part: you can check every file and know you're done. The hard part is behaviour. Does a guard react to a footstep like he did in 2000? Does Cate's head bob the same amount? There's no file to check that against.
A trap showed up within the hour. Of the game's textures, 816 claim to be fully transparent everywhere. The original engine ignored that and took transparency from the surface instead. Nothing in the files says so. You only learn it by seeing it wrong.
Case 4. 1 to 2 October
No gun, but wow
Before the game itself ran, there was a simple viewer for walking around levels. I looked at the first screenshots and saw something wrong.
Me, 1 Oct, 19:10 UTC
The trees are all out of position in those. But that's part of your quality checking, isn't it?
It was. Claude: "I approved the viewer after looking at a street, a bathroom and a sign, and none of those shots had a tree in them."
The reason is lovely, once you know it. Monolith's tools let designers place a prop roughly and trust the game's own code to settle it on the floor when the level starts. Our quick viewer skipped that code, so trees floated. The fix was to stop polishing the viewer and run the real game. By late afternoon, it did.
Me, 1 Oct, 22:28 UTC
THAT IS UNBELIEVABLE! No gun, but wow. Objects floating and couldn't walk all the way up to the wall and stuff, but I guess all this is what you will do?
The first playable build, about four and a half hours after the first commit. Two minutes later: "I was walking in the floor, fell through the floor etc. but it worked all the way through."


Then the agents started tripping over each other. One tested against an old build and reported a black, featureless character that wasn't real. Another closed every browser on the machine to clean up after itself, and killed the other agents' tests mid-run. Nobody was in charge of who touched what.
Me, 2 Oct, 00:19 UTC
The agents need a set of standardized rules as they proceed with this: tests, rules, best practices, objective standards. Rigorous, detailed, etc., etc. Gaming agency standards.
That became STANDARDS.md, the rulebook every agent had to follow: one owner per file, matched builds, a test that fails before every fix and passes after it.
One line Claude wrote that night became the project's motto: "Agents will happily report success, so every task gets a check that's hard to fake."
Case 5. 2 to 3 October
Morocco
The game opens in Morocco. UNITY, the 1960s spy agency Cate works for, is losing agents to H.A.R.M., and her first job is to keep an ambassador alive: a sniper's perch over the rooftops, a courtyard party, an ambush. Every NOLF fan knows it. It became our test level, and for days it hurt.
October 2 was the busiest day of the project, with 268 commits. We worked in numbered rounds, and that one, round 4, ran about 25 helper jobs over two days: missions, gadgets, sound, physics and more. They fixed 58 defects and left 21 open. And Morocco kept getting worse in new ways.
Me, 2 Oct, 15:11 UTC
This page is now slower, and it hung here on the Morocco... Also, the bad guys in the Morocco scene are all jittery when they "arrive" for a while. Also, they don't look fully "clothed"; they look a little unfilled. Also, the bullet accuracy feels a little off? [...] It's slowed down since your last work. But everything else is taking shape amazingly well.
Me, 2 Oct, 18:13 UTC
I shot the bad guy on Morocco and he didn't die. Also, I don't remember those bad guys looking like that, with those faces. I think they were brown-skinned guys.
Claude: "The fix was the wrong one and has been redone."
The faces were a lesson in how small engine details matter. When the game spawns an enemy, it passes a short list of settings. Where a setting is missing, the original engine answered "nothing". Ours answered "empty text". To the game code, those are different, so our enemies got the wrong defaults. An agent's first fix papered over it. The second found the real cause. Then the data had its own say: the 17 gunmen in that ambush really are all one character type, and the game's data gives that type one pale, moustached face. My memory wasn't quite right either; the Moroccan agents I remembered are a different character.
Then a guard's hat sat crooked. Only sometimes, depending on what else was on screen. It wasn't the hat. It was a speed shortcut in our renderer that sometimes drew the hat with the guard's bones instead of its own.
And on the main menu, the sunglasses Cate wears were missing. Three separate bugs. Fixing them meant measuring every attachment (hats, guns, glasses, cigarettes) across 25 levels.


Case 6. 3 to 4 October
LLMs are not great at matching images
By now we had robot players: AI-driven bots walking through each level, taking screenshots, with another AI comparing the pictures. It felt like progress. It wasn't.
Me, 3 Oct, 21:26 UTC
[...] Is having the bot do a walkthrough of the whole game the best possible way of building this out?
"Honestly, no. It's useful, but it shouldn't be the main tool."

Me, 3 Oct, 21:30 UTC
Hmmm, no, LLM image comparison isn't the best way, I think. All these other people doing game decomp and rebuilding, are they stuck in this place, or do they have engines they're working from? I feel like a more programmatic approach, mathematically matching to the original code, is the better way to go. LLMs are not great at matching images.
This was the turn of the whole project.
Claude pointed to how other fan rebuilds proved themselves, then built something better than screenshots. Take one function from the original engine. Run the real thing, from the 2000 program, inside a tiny simulated PC in the test harness. Run ours beside it. Feed both thousands of identical random inputs and compare the answers, bit for bit wherever we could. No opinions, no pictures. Same or not the same.
That same afternoon my Mac told me its disk was nearly full.
Me, 3 Oct, 21:40 UTC
My DISK IS AT 91%??!?
About thirty old build folders were deleted. "OK, nvm... I'll get an external HDD!" The whole project later moved onto one.
Then I rebooted, and the AI forgot what we'd decided. The new session couldn't find the notes from the old one, and proposed going back to the robot players we had just agreed to drop.
Me, 4 Oct, 03:35 UTC
Hold up! Look at the history... step 2 is what we WERE doing. I thought we changed? Look at the chat history from before I rebooted. Or am I missing something?
"You're right, and I got it wrong. I missed my saved notes from that session because they were stored in a different place."
Me, 4 Oct, 03:40 UTC
Wait, I'd rather have you run the programmatic, scientific, deterministic story from the beginning. The bot runs were flaky. I was going in and out of Morocco and things were changing better, worse, better as we went along. What are you doing now? And what do you suggest? Quick answer.
"Better, worse, better" was the problem in three words. Without a fixed yardstick, every change could fix one thing and quietly break another, and nobody would know. So I asked the obvious question.
Me, 4 Oct, 03:43 UTC
Hmm, are you sure you didn't miss some tests from literally EVERY possible angle?
"No, I'm not." The comparison tool had run 39 engine functions. 36 matched. Under the strict rules we adopted that night, 33 counted as proven. Out of roughly 3,900.
Thirty-three out of 3,900. That stung, and it was the most useful thing the AI said all week. It turned a vague feeling into a count we could grow. Today the scoreboard has 91 rows that match exactly, where a row can be a function, a shader or a whole move (Technical file 6).
Case 7. 4 to 6 October
The original game as judge
On 5 October I showed Claude a screenshot of a Morocco guard whose head sat wrong on his body, and asked a harder question.
Me, 5 Oct, 15:21 UTC
Wouldn't stuff like this have come up from a root or systematic approach to this project? What are the foundational deep system gaps you missed? Not just these select issues.
It listed six. The worst: "'Built' was counted as 'correct'." Every one of the 488 engine functions existed, but only a small share had been proven to behave like the original.
Me, 5 Oct, 15:29 UTC
Hmmm, OK, so then wouldn't it make sense to do this on one level, so Morocco, and then compare the output, having me take a look to ensure everything checks out? [...] But don't be a sycophant. Am I derailing a working path? Think of the end goal: a working game that looks like 2000 played in the browser. What is the BEST path to this goal?
"You're not derailing; you've put your finger on a weakness in how I was running it."
So we went deep instead of wide: one level, done completely. And we brought in the ultimate judge, the original 2000 game itself. We ran it on a rented Linux server, inside Wine, with no screen, fed it a recorded game session, and logged every object in every frame: where it stood, how it posed, what it wore. Then we ran our port on exactly the same inputs and compared.


The original's picture is grainier because Wine draws it in software at 640x480 in 16-bit colour, not because the game looked like that. The port side is a development build, not yet the live site. We captured four such frames (runs of the original are slow and capped); a second is in Technical file 7.
Before trusting the judge, we checked it: same game files by checksum, 60 of 60; the same output every time it ran; and a known trap with how old processors rounded numbers. Then the findings came in, things no screenshot would ever show:
- Sounds that had started before you joined a level never reached you. In 92 of the 102 levels, the background sound loops were simply missing.
- Microsoft's compiler in 2000 worked out a function's inputs from right to left. Ours went left to right. In 14 places, Monolith's code rolled two or three random numbers in one line, so the dice came out in a different order. The judge caught the first; the rule found the rest. Enemies made different choices.
- One of our own "bugs" turned out to be how the original really behaved. The judge cleared it.
Late on 5 October, just before eleven at night my time, I played Morocco again.
Me, 6 Oct, 03:56 UTC
Morocco is looking and sounding and feeling perfect.
The rooftop at dusk, the sniper's view over the courtyard, the ambassador's party, the brass of the score swelling when the assassins arrive. It played like I remembered.
Over the next two days, the numbers came. On one recording, about eight minutes of play, a development build (not yet on the live site) matched the original frame for frame, for every object the game's server tracks: 28,299 frames. That was the recording we had tuned against, though. On a fresh one, the first difference shows up at frame 7,551, and that's the next thing to fix. Over the same days, the levels that start exactly like the original went from 26 of 65 to 57.
Me, 6 Oct, 15:21 UTC
Dang, it's taking long. Is this what other game reverse engineers would have to deal with, like GTA 5, etc.? Or are we building from the ground up?
"We're doing the harder version," Claude said, pointing to fan rebuilds like OpenMW and OpenRCT2, which, it said, took volunteer teams years.
Case 8. 6 to 7 October
Spreading the load
One Mac couldn't do it all. Checking every level against the original takes hours. So the work spread: an old Windows PC at home, a MacBook Air, the rented server, and finally Cloudflare's cloud machines, which by our estimate could check all 65 levels in about fifteen minutes for roughly a dollar.
This was the part that hurt most for me, because it needed my hands. Remote logins refused, a password prompt hung, a setting on the PC wouldn't survive a restart.
Me, 6 Oct, 22:02 UTC
What is the best-practice approach for it? Should I be logged into the same Tailscale account on that Windows computer as I am here on this one? I don't... I have no idea how Tailscale works. I have no idea what I'm doing.
Claude, honestly: "I can't get past its lock myself, and I shouldn't." The PC joined eventually. The MacBook never quite earned its place.
Then Cloudflare. All 70 cloud machines finished their work and simply never switched off. The setting meant to put them to sleep didn't. New runs failed with "Maximum number of running container instances exceeded". There was no big bill (I checked, it was negligible), but it was a warning. The fix was to make each machine switch itself off 60 seconds after handing back its results. Then we added hard limits: 30 machines at a time and 300 runs a day.
Me, 7 Oct, 17:56 UTC
Work out how to make this entire process as robust as needed, but as simple as possible, covering all the details, not missing a thing, but simplifying, flattening, and spreading the load between machines. I would rather we reach a rapid deployment of the whole game on Cloudflare and eyeballing than constantly being blind to the progress.
That afternoon, the whole game went up on a private web page: a mission board where I could open any level in a click.
And then I stopped. "OK, pause your work on this for now, and save everything." It was a lot. 156 commits hadn't even been sent to GitHub. We wrote one file to read first when coming back, and I walked away for a day.
Case 9. 8 to 9 October
Going public
When I came back, the game was good enough to share. I wanted a front door worthy of it.
Me, 8 Oct, 19:20 UTC
I want you to build a proper landing page for this, and remove the page login. [...] I want this to be a "public-ready" page that feels properly retro, like the old internet, but without being hard to navigate. [...] It should trigger all the memories and nostalgia for a visitor. [...] The end result: a nostalgic, retro landing page, super easy to play the game, play all levels, NO clutter.
Nine rounds of design, scored by AI critics. Their average peaked at 7.8 against our target of 8; one critic went as high as 8.3, the other never above 7.7. Lighthouse, Google's page checker, scored 100 for accessibility, best practices and search, and 99 to 100 for speed.


Then came a long list: accounts so your saves follow you, a 1960s television playing a 90-second reel cut from the port, the game's own music in a little player, keyboard shortcuts, a bug reporter that sends us your exact spot in the level. Not everything landed. The TV reel scored 6 out of 10 with its AI critics, because it's almost all shot from the same first-person angle. We shipped it anyway, and said so.
The gadget pictures got some love too. The originals in the game's files are 48 pixels square. We enlarged them four times with an AI upscaler. They're cleaner, and not perfect: the coin's face came out a little smoothed.


The test suite had grown, too. Every change ran the full gate: a 14-minute tier of browser gameplay tests and a 26-minute tier of robot playthroughs, on top of the faster tiers.
Me, 9 Oct, 13:24 UTC
WHY do we have this??? [...] Genuinely needed??
I'd pasted two rows of the test table: browser gameplay tests, 14 minutes, and robot playthroughs of whole levels, 26 minutes. They weren't, not on every change. A change to this page now ships after five minutes of checks. A change to the engine still gets the full set.
Me, 9 Oct, 14:15 UTC
[...] The user signup/login needs to look less retro. It looks a little "dodgy", like I'm gonna hack them, lol. Make it a little more modern and normal, but still on brand.
Ensure there are systems in place to prevent this Cloudflare deployment of NOLF from skyrocketing billing for me. Put safeguards in place if you haven't already.
Fair. The sign-in window got a plain, modern look, and a guard now checks the site's usage every 15 minutes and pauses the game if it passes a set limit.


On 9 October I bought playnolf.com, and the site moved to its own address. That brings us to this page.
The briefing
The stack, and how it all works
Here's the whole machine in plain terms. Each layer has a technical file if you want the detail.
| Layer | What we used | What it does |
|---|---|---|
| The game | Monolith's own C++, from 2001 | Everything that makes it NOLF: guards, gadgets, missions, menus, jokes |
| The engine | New C++17, written for this project, guided by Monolith's published interface and, for some systems, its later Jupiter engine | Draws the world, plays sound, moves bodies, reads the files |
| The translator | Emscripten and WebAssembly | Turns both into programs a browser runs at near-native speed |
| Pictures | WebGL 2 | The browser's 3D graphics, standing in for Direct3D |
| Sound and music | Web Audio and our own DirectMusic player | Every footstep, and the score that follows the action |
| Hosting | A Cloudflare Worker and R2 storage | Serves the page and streams the game's files, a level at a time |
| Saves | Your browser, plus an optional account | Keeps your progress, and carries it to another computer |
| The proof | The original game under Wine, a CPU emulator, recorded replays | Checks that ours does exactly what the 2000 game did |
| The builders | Claude (Anthropic), one supervisor and many helpers | Wrote the code and the tests, under one person's direction |
Debriefing
What we learned
If you're thinking of pointing AI agents at something big, here's what this taught us.
- The AI is fast at what can be checked, and confident about what can't. Reading 4,160 textures took minutes because each one either decodes or doesn't. Behaviour took days, because "looks right" isn't a test.
- A reference isn't a judge. Our first physics and collision code followed Monolith's later engine closely, and was wrong for a long time, until it was run against the original.
- Give it a judge it can't argue with. The turn came when we stopped asking an AI whether two pictures matched and started comparing numbers from the original game.
- Count the denominator. "33 proven" felt bad. It was also the first honest number, and honest numbers can be made bigger.
- Write things down where the next session will find them. A reboot cost us a decision because the notes were in the wrong place. Now there's one file to read first.
- Agents need rules like any team. One owner per file. No closing other people's windows. A failing test before every fix.
- Keep a record of when "done" wasn't. A few from this project:
The AI said What was true The level viewer looks right It had checked a street, a bathroom and a sign. The trees floated. A model renders broken The test was broken, not the model. The guards' faces are fixed The first fix was wrong and had to be redone. A collision bug in the Alps is fixed Fixed on a branch that was never merged. Six levels are blocked by gadgets The test robot wasn't using the gadgets properly. Round 4 is complete Its own review corrected 15 earlier statements. - Your taste still matters. The AI never said the trees floated, the hat was crooked or the sign-in looked dodgy. A person who loves the game did.
What we can't tell you: the AI bill. Nobody recorded total token spend, so any number would be a guess. The hosting is $5 a month plus storage.
What isn't done: online multiplayer, a sharper "enhanced" look, and the eight levels that don't yet start exactly like the original. In the spirit of honesty: the live site runs from a branch that isn't merged into the main line yet, and the main line's full test run isn't green. If you play and something's wrong, press Ctrl+Shift+B (⌘⇧B on a Mac) in the game. The report comes straight to us with your position and a screenshot.
Credits
Thank you, Monolith
None of this exists without the people who made the game. No One Lives Forever was developed by Monolith Productions and published by Fox Interactive in November 2000. The Game of the Year Edition, with its extra mission, followed in October 2001.
Craig Hubbard led the design and shaped its 1960s world. Kevin Stephens led the programming. Wes Saulsberry is credited as the artist. Chris Miller and Samantha Ryan produced it. Guy Whitmore wrote the score, an adaptive one built on Microsoft's DirectMusic that rises and falls with the action; rebuilding his music engine was one of the hardest and most rewarding parts of this project. Kit Harris gave Cate Archer her voice. Dozens more people built the levels, wrote the guards' conversations and hid the jokes, and they are named in the game's own end credits.
Everything you see and hear when you play is theirs: the art, the levels, the voices and the music are the original Game of the Year Edition files, read unchanged. What we wrote is the machinery underneath.
Monolith also released the game's source code in 2001 so fans could keep making things. That decision, a quarter of a century ago, is the only reason a project like this is possible. Monolith closed in February 2025. The game deserved better than limbo. We hope it gets an official release one day, and if it does, buy it. Until then, thanks to the fans who kept it alive: the patchers, the wiki writers, and the makers of the NOLF Modernizer and the native NOLF 2 port.
Sources: Wikipedia (credits and release dates); Time Extension (Hubbard, Stephens and Miller); Game Developer (the 2001 source release). The full cast and crew are in the game's own end credits.
Questions people ask
Can I play No One Lives Forever in a web browser?
Yes. playnolf.com runs the full single-player game, all 15 missions plus the Game of the Year bonus mission, in a desktop browser with a keyboard and mouse. Nothing is installed. Phones and tablets aren't supported yet.
How does it run in a browser?
On a new engine compiled to WebAssembly. Monolith released the game's own code in 2001 but not the LithTech engine underneath it, so we wrote a new LithTech-2-compatible engine in C++, compiled it and Monolith's code to WebAssembly, and draw the game with WebGL. The game reads its original data files.
Is this an emulator?
No. An emulated Windows PC in a browser is far too slow for a 3D game. The game's own code runs directly, as WebAssembly, on a rebuilt engine.
Was the engine decompiled?
No, it wasn't decompiled into source. The engine was written new against the interface Monolith published with the game code, with the circulating source of Monolith's later Jupiter engine (NOLF 2's) as a guide for some systems, such as collision and animation timing. The original 2000 program was then read and run, in an emulator and under Wine, to measure where ours differed. Several of the Jupiter-based parts turned out to be wrong, and were corrected.
How long did it take?
Ten days. That's from the first question on 30 September 2026 to the site's own address on 9 October 2026: one person directing AI agents, 267 prompts and 771 commits. 57 of 65 levels start exactly like the original, and the work continues.
Who made No One Lives Forever?
Monolith Productions developed it and Fox Interactive published it in November 2000. Craig Hubbard was the lead designer, Guy Whitmore composed the score and Kit Harris voiced Cate Archer.
Why can't you buy No One Lives Forever?
Because nobody can say for sure who owns it. Its rights are reported to be split between Warner Bros., Activision and 20th Century Fox (now part of Disney), and none has confirmed who owns what. In 2014 Nightdive Studios filed trademarks for the series and acquired the source code, hoping to bring it back; Warner Bros. opposed, and the effort stalled.
Where do the game files come from?
They're the original Game of the Year Edition files, unchanged. Version 1.004 streams from the site's storage on Cloudflare. Nothing on the site is sold, and there are no ads. A version that reads your own copy of the game is planned.
Is it free to play?
Yes. There's nothing to buy, no ads and no sign-up needed; an account is optional and only keeps your saves.
Can I play it on a phone or tablet?
Not yet. It needs a keyboard and mouse, so it runs in desktop browsers such as Chrome, Edge, Safari and Firefox.
Does multiplayer work?
Not yet. The single-player campaign came first. The 37 multiplayer maps load, but online play isn't built.
Can AI agents build a game engine?
With close human direction, yes. Here they wrote the engine, the tests and the website. They also made confident mistakes, forgot decisions and reported success too early. What worked was measuring everything against the original game.
Who built playnolf.com?
Brightwork Digital. We're a small studio that builds websites, software and apps and advises on AI.
Work with the people who built this
Ten days, a 46,000-line engine, and 57 of 65 levels proven against the original game.
Brightwork Digital builds websites, software and apps, and helps teams put AI to work with checks that hold up. If this story is the kind of stubborn, careful work you need, tell us about your project. A person reads every message and replies within two working days, with questions or a short plan. No mailing list, no sales sequence.
Or email hello@brightworkdigital.co, or visit brightworkdigital.co.
