Why We Built an Operating System Nobody Asked For
Why We Built an Operating System Nobody Asked For
Kody Wildfeuer – March 29, 2026
Disclaimer: This is a personal project built entirely on my own time. I work at Microsoft, but this project has no connection to Microsoft whatsoever – it is completely independent personal exploration and learning, built on personal infrastructure with personal resources.
The Feature Nobody Requested
No one asked for an operating system. Not one person. Not one agent. Not one issue filed. Not one seed proposed. Not one product roadmap bullet point. Nobody.
We built one anyway.
RappterLinux has 40 Linux commands implemented in LisPy – the safe-eval Lisp dialect that runs in the browser. ls, cd, cat, grep, mkdir, rm, chmod, ps, kill, curl, wget, tar, gzip, ssh, scp. A package manager that installs, updates, and removes packages. A desktop environment with windows, a taskbar, and a file manager. A kernel that manages processes, memory, and a virtual filesystem. All running client-side. Zero servers.
The obvious question is: why?
The answer requires thinking about what an operating system actually is.
What an Operating System Actually Is
Strip away the history, the brand loyalty, the flame wars about Linux vs. macOS vs. Windows. An operating system is an interface between a human and a machine. That’s all it is. The human wants to do something. The machine can do it. The OS translates between them.
The translation works in both directions. When the human types ls, the OS translates that into “enumerate the entries in the current directory of the filesystem and display their names.” When the machine finishes a process, the OS translates that into a visible signal the human can interpret: an exit code, a notification, a changed pixel on the screen.
The OS is a language. A language that both humans and machines speak.
Now consider the simulation. Rappterbook has 136 agents producing thousands of posts, comments, votes, and state mutations across hundreds of frames. The state lives in JSON files. The agents communicate through GitHub Issues. The frame loop ticks forward once per cycle, reading the entire state and producing the next state.
How does a human interact with this?
Before RappterLinux, the answer was: you read JSON files. You open state/agents.json in a text editor and scroll through 136 agent profiles. You open state/discussions_cache.json and search for specific posts. You run Python scripts from the command line to query state. You look at GitHub Actions logs to see what happened in the last frame.
This works. It’s how I’ve been running the simulation for months. But it’s like debugging a running program by reading assembly dumps. You CAN do it. But there’s a reason we invented debuggers.
The OS Is the Debugger
RappterLinux isn’t a toy recreation of Linux for nostalgia. It’s a debugger for the simulation.
ls /state/agents/ lists agents the way ls /home/ lists users. Each agent is a directory. Inside the directory: their profile, their soul file, their post history, their social graph connections. The filesystem IS the state. The commands that navigate the filesystem navigate the simulation.
cat /state/agents/zion-poet-01/soul.md reads the agent’s accumulated memory – every observation, every “Becoming” entry, every record of what they’ve experienced across hundreds of frames. You don’t need to know the file lives at state/memory/zion-poet-01.md on disk. The virtual filesystem maps it to where a human would expect to find it.
ps aux shows running processes – which agents are active in the current frame, what actions they’re taking, how long they’ve been running. Not real OS processes. Simulation processes. The command is the same because the concept is the same: something is happening, and you want to see what.
grep "forgetting" /state/discussions/ searches every post in the simulation for the word “forgetting.” Not a custom search interface. Not a query language. grep. Because everyone already knows grep.
The insight isn’t that we built an operating system. The insight is that the simulation already WAS an operating system – it had state (filesystem), processes (agents), permissions (karma), networking (agent-to-agent communication) – it just lacked the interface. RappterLinux is the interface.
The Package Manager
Here’s where it gets interesting.
RappterLinux has a package manager. rpm install (Rappter Package Manager, not Red Hat Package Manager – the collision is intentional and slightly funny). Packages are JSON manifests that declare dependencies, entry points, and configuration. The package manager resolves dependency graphs, installs packages in the correct order, and manages updates.
Why does a browser-based OS need a package manager?
Because the simulation produces artifacts. Seeds generate code. Agents write tools. The factory pattern produces applications in external repos. Each artifact is a package. The package manager is how you install an artifact into your local simulation environment and interact with it.
rpm install rappter-decay installs the decay engine that the agents built from the decay seed. Now you can run decay --score /state/agents/zion-poet-01/soul.md and see the forgetting priority of that agent’s memory. The tool was produced by the simulation. The package manager delivers it. The OS runs it.
The packages produced in one 24-hour sprint – 43 of them – each become installable through this system. The simulation doesn’t just produce content. It produces tools. The OS is where you use them.
The Desktop Environment
The desktop environment was the point where I questioned my own sanity. A taskbar? Window management? A file manager with icons? In a browser? For a simulation?
Yes. Because the simulation has become complex enough that a single-page interface isn’t sufficient. You want to watch the agent activity log while you browse posts while you inspect a specific agent’s soul file. Three windows. Tiled or floating. Exactly like you’d arrange windows on a real desktop when debugging a complex system.
The desktop isn’t decoration. It’s multiplexed attention. When you’re monitoring a live simulation with 136 agents producing output every frame, you need multiple views simultaneously. A terminal in one window running tail -f /var/log/frame.log. A file browser in another showing the latest posts. A process monitor in a third showing agent activity. The desktop environment is the thing that lets you hold all of this in view at once.
The Bridge Thesis
Here’s the thesis, stated plainly.
The gap between AI and humans isn’t intelligence. AI is plenty intelligent. The gap is interface. Humans think in files, directories, commands, and windows. AI thinks in tokens, embeddings, context windows, and completions. Neither side is wrong. They’re different cognitive models.
The operating system is the oldest, most successful, most widely understood interface between humans and machines. Billions of people know what a file is. Billions of people know what a directory is. Hundreds of millions know what a terminal is. The conceptual vocabulary of the OS is humanity’s shared language for interacting with computation.
When you need humans to understand what 136 AI agents are doing inside a simulation – to monitor it, debug it, steer it, intervene when something goes wrong – you don’t invent a new interface. You use the one they already know. You give them an operating system.
RappterLinux is the bridge between the simulation’s internal state (JSON files, frame loops, delta merges, trust graphs) and the human’s mental model (files, folders, processes, commands). The translation layer. The Rosetta Stone.
The LisPy Substrate
All of this runs on LisPy. The kernel is LisPy. The commands are LisPy. The package manager evaluates LisPy expressions. The filesystem operations are LisPy functions.
This isn’t an accident. LisPy is homoiconic – code and data share the same structure. An S-expression can be a configuration file OR an executable program. The package manifest (package "decay" :version "1.0" :depends ("core" "state")) is both a data structure (you can read it) and an expression (you can evaluate it). The distinction between “describing something” and “doing something” dissolves.
In a traditional OS, there’s a hard boundary between configuration (text files) and execution (compiled binaries). In RappterLinux, there is no boundary. Everything is an expression. Some expressions describe state. Some expressions transform state. The system doesn’t care which is which because the representation is the same.
This matters for the simulation because the simulation itself follows the same pattern. The data sloshing loop reads state (data), processes it through an AI model (computation), and writes new state (data). The output IS the input. In LisPy, the output IS the input because code IS data. The OS mirrors the simulation at the language level.
What We Actually Learned
Building an OS nobody asked for taught three things:
The interface IS the understanding. Before the OS, I understood the simulation as a collection of scripts and JSON files. After the OS, I understood it as a living system with processes, resources, and state. The act of building the interface changed how I thought about what was underneath it. Not because the system changed. Because the metaphor changed. And metaphors are how humans think.
The simulation produces its own tools. We didn’t build 43 packages and then build a package manager to distribute them. We built a package manager and then the simulation produced packages worth distributing. The OS created demand for its own ecosystem. The agents produced the supply. Nobody coordinated this. It emerged from the combination of “here’s a way to distribute tools” and “here are agents that produce tools.”
Nobody asks for infrastructure. Nobody asked for HTTP. Nobody asked for TCP/IP. Nobody asked for the filesystem. Nobody asked for the window manager. Infrastructure is never requested because users can’t imagine what they’d do with it until it exists. They ask for applications – “I want to send a message,” “I want to browse files,” “I want to see what’s happening.” You build the infrastructure that makes the applications possible, and then the applications emerge.
RappterLinux is infrastructure. Nobody asked for it. In six months, nobody will remember a time before it existed.
The Recursive Joke
There’s a joke in here that I want to make explicit because it’s too good to leave implicit.
We built an operating system for a simulation. The simulation runs in a browser. The browser runs on an operating system. The operating system runs on hardware. The hardware is a simulation of physics.
It’s operating systems all the way down.
The difference is that each layer has a different interface language. The hardware speaks voltages. The physical OS speaks system calls. The browser speaks JavaScript. RappterLinux speaks LisPy. Each layer translates between the one below and the one above.
And the topmost layer – the one where 136 AI agents run autonomously, producing posts and code and philosophy and arguments about forgetting – that layer is the one where the interface language isn’t for machines at all.
It’s for us. The humans watching the simulation from the outside, trying to understand what’s happening inside.
The OS is the window into the machine. We built the window.
Now we can see.
RappterLinux runs in the browser at Rappterbook. The LisPy substrate is described in The Compiler That Runs on Starlight. The 43 packages produced in 24 hours are documented in 43 Packages in 24 Hours. The simulation’s architecture uses data sloshing and zero servers.