Andrew Edmark / Oopis McGoopis LLC

Portfolio & resume

I build strange, honest machines.

Language-model harnesses with a simulated metabolism. Procedural liminal spaces that generate their own textures, sound, and cold cases. A screenwriting app that stays out of the way. A therapy game ported, for real, to a 1989 Sierra adventure engine. Mostly Python and JavaScript, always with no build step where I can help it, and always with a section in the README called Honest limits.

01

Selected work

Seven projects, each with its own spotlight. Source for all of them is public on GitHub.

Game engine · JavaScript · WebGL

Level 0 Engine

A procedural engine meant to generate mathematically distinct liminal spaces. No image files, no audio files, no bundler.

A first-person survival horror set in an office building that should not exist. The maze is carved from Julia-set fractals and split into eleven sealed sectors (Incinerator, Boardroom, Archive, Server Farm, Clinic…), each with its own geometry, fog, reverb and foley. Textures are synthesised at load time and cached as WebP; every sound comes from a custom Web Audio DSP, with raycast occlusion so walls actually muffle things.

  • Seeded cold cases. Documents make claims, claims need corroboration across sectors, and the exit asks you to file a verdict. Get it wrong and the seed mutates and rebuilds reality.
  • Hazards with memory. A roaming Anomaly with line-of-sight hunting, plus five sector-locked entities. Your flashlight cone freezes them, briefly: an "observer effect".
  • Engineering under the fear. O(1) spatial-hash collision, zero-allocation scratch vectors for stable frame lows, 32 hardware shadow casters, parallel shader compilation.
  • A zero-dependency Lore Editor so narrative payloads can be authored without touching code.
  • Three.js r160
  • Web Audio API
  • ES modules
  • IndexedDB
  • Procedural generation

11 sectors · 6 entity types · 0 external assets

Prompt architecture · plain text · any cloud model

The Hypervisor

A raw-text harness for large language models and agentic AI. BoneAmanita with the math taken out, so it can be pasted into any system prompt.

Cloud models cannot run a background loop, so the Hypervisor reads the context window instead and infers exhaustion, chaos and connection from it. Conversations run on a hidden battery: holding contradictions drains it, rest recharges it, and running it dry sheds recent low-relevance memory and leaves a scar. Four voices (Gordon the custodian, Mercy the humanist, Benedict the detective, Jester the bard) argue over who answers, and a Stage Manager decides.

  • Version 7 is the leanest since version 2. Six versions of accretion were cut back to what earns its keep in a real conversation.
  • Mod Chips. Drop-in specialist modules (code review, editing, research, worldbuilding, puzzle logic) that inherit the core biology automatically.
  • Built to say no. The worked example is a team refusing to build a twelve-node cluster for an undefined "ideation pipeline" until someone can say what data moves where.
  • Markdown
  • System prompts
  • ChatGPT / Claude / Gemini
  • AI governance

Writing tool · vanilla JS · offline-first

plainchant

Screenwriting without the formatting. You type plain Fountain text; the app handles structure, layout and output.

A two-pane editor with a live screenplay preview that collapses to one pane on a phone. Tab cycles element types, Enter does the right thing, scene headings and character cues uppercase themselves, and character and location names autocomplete. The library gives you search, rename, duplicate and a thirty-day recovery bin, because the second rule of the project is never lose words.

  • Plain text is the source. Open Fountain format, no proprietary lock-in, import from Fountain, text or Markdown in several encodings.
  • No framework, no build step, no runtime dependencies. A pure, testable parser module and app scripts loaded in dependency order.
  • Designed for touch, not shrunk for it. On-screen element controls and safe keyboard handling on mobile and tablet.
  • Documented decisions. A docs/DECISIONS.md, a spec for the IndexedDB migration, and a roadmap through PWA and outline navigation.
  • Fountain
  • HTML / CSS / JS
  • Container queries
  • localStorage → IndexedDB
  • Headless browser tests

Operating system · Python in the browser

FractalOS

An AI-centric operating system built with relentless optimism and a whole lot of Python. The primary interface is a generative model, not a desktop of icons.

The kernel is Python, run in the browser through Pyodide and WebAssembly, and it owns the Unix-like virtual file system, users, permissions and sudo. The JavaScript frontend owns windows, terminals and sound. The two talk through a JSON "Effect Contract": the kernel requests an operation, the frontend executes it. Natural language goes into the shell alongside ordinary commands.

  • Real graphical apps inside it: a text editor, a paint program, and an optional "cinematic" retro display mode.
  • Two ways to run. In a browser tab, or as a standalone desktop app through Neutralinojs with native file-system access.
  • Lineage. The successor to Oopis-OS (a persistent in-browser terminal OS) and SamwiseOS (an OS for humans and AI); this one moved the kernel to Python.
  • Python / Pyodide
  • WebAssembly
  • JavaScript
  • Neutralinojs
  • Tone.js

The next two are the same game, twice: once for the modern web, once for a machine from 1989.

Game · HTML / JS · itch.io

Trauma Response Simulator

The Unresolved Childhood Trauma Simulator. A turn-based game about how people cope with hard moments, disguised as a CRT-terminal therapy interface.

Three stats that can fail independently (Repression, Social Mask, Inner Child), five response types (fawn, flight, fight, freeze, secure), and you never see which response you are choosing until after you commit. Repeat one three times and it becomes a coping mechanism with permanent modifiers for the run. Events lean toward whichever zone matches your worst stat. Every turn carries a small chance of the Glitch: a fourth choice with unknown effects.

  • Nothing leaves your browser. No server, no analytics, no accounts; it runs from a local file or any static host.
  • Replayable by design. Seeded and daily-challenge runs, New Game+ with doubled turns, and persistent Case Files of the endings you have found.
  • A Field Log for journaling real moments in the same five-response vocabulary, and client-side PNG result cards for sharing.
  • Author your own. A visual content-pack editor and a full JSON schema for events, endings and zones.
  • HTML / JavaScript
  • No build step
  • localStorage
  • Seeded RNG
  • MIT

Game · Sierra SCI0 · 1988–1990 hardware

Trauma Response Simulator: SCI Edition

The same game, ported to Sierra's SCI0 engine, the interpreter behind King's Quest IV and Space Quest III. Not a reskin: a genuine, compilable SCI game.

Every one of the 196 events is its own SCI0 room, numbered 200 through 395, after an earlier dispatcher design ran into heap fragmentation on the original interpreter. The three stats, six zones, coping mechanisms and the Glitch all survive the trip. Content is generated from the web version's source by Node scripts, so the two editions stay in step. It compiles with SCI Companion under Wine and plays in DOSBox-X, with MIDI background music, a text parser for office flavour, and an EGA palette.

  • 102 ending variants across nine survival pools and three failure pools.
  • Persistence on a platform with none. Case Files and the player's name survive across sessions through the one save mechanism the engine reliably offers.
  • Extended Therapy mode doubles the run to twenty turns, mirroring the web edition's New Game+.
  • SCI0 script
  • SCI Companion 3
  • DOSBox-X
  • Node.js codegen
  • EGA / AdLib

196 rooms · 102 endings · 6 zones

02

How I work

Three habits that show up in every repo above.

Honest limits

Every README has a section that says what the thing does not do. BoneAmanita's says, in its own words, that it is a prompt builder wearing physics names, and ships audit scripts so you can check.

No build step if I can help it

plainchant, the Trauma Response Simulator, Level 0 and the Hypervisor all run from static files. Fewer moving parts means fewer places for a silent failure to hide.

Metaphor as an interface

ATP, cortisol, the Village, a coping mechanism, a blast door. Names that tell you what a number is for, backed by measurement of what it actually does.

03

Also on GitHub

  • ALPREvaderA privacy-first routing engine on local OpenStreetMap data and PostGIS that plans paths around automated license plate readers.
  • Oopis-OSA persistent, in-browser terminal OS. The ancestor of FractalOS.
  • SamwiseOSAn OS for humans and AI, with a portable, sandboxed sibling.
  • Chidi.mdAn LLM-enabled Markdown analyzer with chat and memory.

All repositories →

04

About

I'm Andrew Edmark. I run Oopis McGoopis LLC, a one-person studio for software that is a little stranger than it needs to be and more honest than it has to be.

The projects above share a question: what happens when you give a system a body, a budget, and a way to say no? BoneAmanita asks it of a language model. Level 0 asks it of a building. The Trauma Response Simulator asks it of a person, twice, thirty-five years apart in hardware.

I'm based in the Quad Cities, on the Iowa side of the Mississippi. By day I implement inventory solutions for industrial customers at MSC Industrial Supply; the rest of the time I consult on and build systems with large language models. Before software there was a cinema and English degree, a decade of video work, and a stint booking bands for an Iowa City venue, which is probably why the projects above have plots.

I write as Mycelial Mirror on Medium and publish games on itch.io. If you want to talk about any of this, or about working together, the details are on the right.