<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel><title>BLACK BOX - Arkwright Dev Log</title><link>https://blog.acarr.org/</link><atom:link href="https://blog.acarr.org/feed.xml" rel="self" type="application/rss+xml" /><description>Flight recorder from the last factory. Transmissions logged toward launch — 01 MAR 2027.</description><language>en-us</language><lastBuildDate>Tue, 23 Jun 2026 12:00:00 +0000</lastBuildDate><item><title>The Manifest Goes Live</title><link>https://blog.acarr.org/posts/manifest-goes-live/</link><guid isPermaLink="true">https://blog.acarr.org/posts/manifest-goes-live/</guid><pubDate>Tue, 23 Jun 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>web</category><category>3d</category><category>infra</category><description><![CDATA[Pushed the coming-soon site live today: a cinematic hero, a live countdown to launch, a Starship you can spin in the browser, and a souls counter wired to a backend that actually remembers you signed up.]]></description><content:encoded><![CDATA[<p>The site is live. arkwright.acarr.org resolves, the certificate is green, and somewhere out in the dark a counter is ticking. After weeks of building in a closed room, we opened a window onto the dead rock and let people look in.</p>

<p>The front of it is theater, and I'm fine saying so. A full-bleed hero — ash, cold light, the booster standing against a sky that isn't coming back. Under it, a live countdown to March 1, 2027. That number isn't decoration. It's the same clock I work against every morning, now bolted to the homepage where I can't pretend I don't see it.</p>

<p>Scroll and the story unspools in beats, the same four that hold the whole game together: the cryo freeze, holding the line, raising the ark, the run to Io. Each beat is a panel you fall into as you go. It reads less like a feature list and more like a transmission, which is what it's meant to be.</p>

<h2>The ship you can hold</h2>

<p>The piece I'm proudest of is the viewer. There's a real Starship and Super Heavy in the page — Three.js, the actual GLB, Draco-compressed and lazy-loaded so it doesn't touch the wire until you've scrolled to it. You can grab it and turn it. Grid fins, raceway, the booster's full stack, rotating in a browser tab.</p>

<p>It launched broken on phones, which is the only way anything launches. The orbit controls were tuned for a mouse, so a touch-drag either did nothing or flung the camera into the next county. I spent the back half of the day on pointer events and damping until a thumb on glass turns the ship the way a hand expects. The whole site got the same mobile pass — the frozen aren't waking up on desktop.</p>

<h2>The counter is real</h2>

<p>Down in the corner, quiet on purpose: SOULS MANIFESTED. It is not a fake odometer spinning to look busy. It's wired all the way through — a sign-up hits an AWS Lambda, the address lands in a DynamoDB manifest table, and SES sends back a confirmation email that has to be answered before the soul counts. We seeded it with the 1,337 already frozen. Everyone who signs up after climbs on top of that.</p>

<p>So the number on the page is true. It's a real tally of real people who looked at a dying world and decided they wanted a seat on the way out. The whole thing sits behind Caddy on EC2, TLS handled, quietly serving.</p>

<p>It's a marketing page held together with story. But every part of it does what it says — the clock counts down, the ship turns, the names get written down. That's the only kind of promise worth shipping.</p>

<p class="logline">Status: manifest open. 1,337 aboard and counting. The window's cut. Back to the floor.</p>]]></content:encoded></item><item><title>Raising the Ark, Plate by Plate</title><link>https://blog.acarr.org/posts/raising-the-ark/</link><guid isPermaLink="true">https://blog.acarr.org/posts/raising-the-ark/</guid><pubDate>Tue, 16 Jun 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>3d</category><category>optimization</category><category>narrative</category><description><![CDATA[Tripo gave me a Starship. gltf-transform gave me a Starship a phone could actually load. Neither of them gave me the engines — so I built the thirty-three myself, twice.]]></description><content:encoded><![CDATA[<p>The Ark came out of Tripo in one piece, which is more than I can say for most things down here. A whole Starship stacked on a Super Heavy booster, grid fins and flaps and all, raised in a single generation pass. Forty-one megabytes of it.</p><p>Forty-one megabytes is a beautiful number in a vacuum and a death sentence on the wire. The whole point of the site is that someone half-frozen on a phone, on bad signal, can watch the thing they're being loaded onto turn in the dark. Forty-one megs never finishes downloading. They'd close the tab before the booster cleared the fold.</p><p>So I ran it through gltf-transform — Draco on the geometry, WebP on the textures, the usual cold surgery. It came out the other side at roughly 530KB. Seventy-eight to one. Half a meg now stands in for a rocket the size of a building, and from across the room you can't tell what I took. That's the trick I keep coming back to: not making it perfect, making it cheap enough to arrive.</p><h2>The engines that weren't</h2><p>Then I looked underneath. The spec is unambiguous — thirty-three Raptors in the base of the booster, the whole reason the real thing can lift what it lifts. The raw model had almost none. Tripo gave me a gorgeous shell and a smooth, empty skirt where the fire should be. The Ark couldn't fly.</p><p>So I built them. A procedural nozzle cluster, generated in code so it costs almost nothing and stays in sync with the spec. First pass: the honest thirty-three, arranged in proper rings. It flared out too wide — looked less like a booster and more like a flower. Wrong silhouette. Wrong feeling. A funeral wreath, if I'm being grim about it, which I am.</p><p>Second pass, I pulled the rings tighter and tucked the whole cluster up into the base, so the nozzles read as a dense dark knot of machinery instead of a splayed bouquet. Now it sits right. Grid fins up top, flaps where they belong, thirty-three throats packed into the dark underneath, waiting.</p><p>The frozen don't know I built half their engines by hand. They're counting on all thirty-three anyway.</p><p class="logline">Status: Ark at 530KB, thirty-three engines mounted and tucked. It loads. It turns. It points up.</p>]]></content:encoded></item><item><title>Embers &amp; Scanlines</title><link>https://blog.acarr.org/posts/embers-and-scanlines/</link><guid isPermaLink="true">https://blog.acarr.org/posts/embers-and-scanlines/</guid><pubDate>Tue, 09 Jun 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>web</category><category>art-direction</category><description><![CDATA[A landing page is just pixels until you grade it. Today I gave the site film grain, a vignette, scanlines, and a slow ash drift — the look of a world that's already ended but hasn't admitted it yet.]]></description><content:encoded><![CDATA[<p>A landing page out of the box looks like a brochure. Clean, lit, confident. None of those are words I want anywhere near this project. The site is supposed to be a transmission from a dead planet, and dead planets do not have good color balance.</p>

<p>So I spent the day building the grade. Not the game's grade — the website's. The thing that hits your eyes before you've read a single word of copy.</p>

<p>Started with the color. Everything gets pushed into an amber-and-teal split: warm sodium-light orange in the highlights, sick cyan in the shadows. It reads as toxic without being literal about it. The frozen are sleeping under that light. I keep it in a CSS filter layer and one full-bleed gradient overlay set to multiply, so the whole page sits under it like smoke under a ceiling.</p>

<p>Then the texture passes. A tileable film-grain PNG at low opacity, animated with a few stepped background-position frames so it crawls instead of sitting dead. A vignette, heavy in the corners, to pull your eye to the countdown and keep the edges feeling like something is closing in. And scanlines — a repeating linear-gradient, one-pixel dark bands, barely there. Up close it's an artifact. From a couch it's a CRT in a bunker that still, somehow, has power.</p>

<h2>Making it breathe</h2>

<p>Static is the enemy. A held image reads as a screenshot; I needed it to read as a held <em>breath</em>. Two things did the work. A slow Ken-Burns push on the hero — a fifty-second scale-and-drift transform, so subtle you don't catch it moving, you just feel the room tightening. And the embers.</p>

<p>The embers are a canvas sitting above the hero: a few hundred particles, each a dim orange dot drifting up and sideways on a little sine wobble, fading as they rise. Cheap to run, throttled when the tab loses focus so I'm not cooking anyone's battery to show them ash. But that's the piece that sells it. Once specks of fire are drifting up past the Starship, the page stops being a page. It becomes a window onto somewhere it's always slightly too late.</p>

<p>None of this is load-bearing engineering. No physics, no backend, no Draco budget to fight. It's mood — twenty opacity values and an easing curve, tuned until the whole thing feels cold. But mood is the first promise the site makes, and a broken promise on the hero means nobody scrolls down to the part where I ask them to sign up and be counted.</p>

<p>The horde isn't in any of these shaders. It doesn't need to be. You're supposed to feel it in the corners, in the flicker, in the way the light's gone wrong. Worked late getting the ember count right. It's snowing fire on the homepage now, and it looks exactly like the end of the world should: quiet, warm, and absolutely not okay.</p>

<p class="logline">Grade locked. Embers drifting. The page holds its breath. — A.</p>]]></content:encoded></item><item><title>A Voice in the Static</title><link>https://blog.acarr.org/posts/a-voice-in-the-static/</link><guid isPermaLink="true">https://blog.acarr.org/posts/a-voice-in-the-static/</guid><pubDate>Tue, 02 Jun 2026 12:00:00 +0000</pubDate><category>audio</category><category>dev-log</category><category>web</category><category>elevenlabs</category><description><![CDATA[Built an ambient dread loop and a narrator track in ElevenLabs, then locked both behind a button so nothing speaks until you ask it to. Most of the day was cutting sound that didn't earn its place.]]></description><content:encoded><![CDATA[<p>The site had pictures and a countdown and a Starship you could spin in your thumb. It didn't have a sound. So today I gave the dead world a voice and then spent most of the day learning when to shut it up.</p>

<p>The bed first. A low ambient dread loop out of ElevenLabs — wind with no edges to it, a sub-bass that sits under your sternum more than your ears, the occasional structural groan that could be the factory settling or could be something leaning on the wall outside. I rendered a dozen passes and threw away nine. The ones I kept were the ones that disappeared. Good ambient isn't heard; it's the reason the silence afterward feels wrong.</p>

<p>Then the narrator. One voice, tired, reading four lines over the story beats — cryo, hold the line, raise the ark, escape to Io. I cut it twice as long as it needed to be and then halved it. The frozen don't need a monologue. They need someone who sounds like he's still awake at 3 a.m. and means it.</p>

<h2>The sound gate</h2>

<p>Here's the rule I'd die on: nothing autoplays. Ever. You land on the page and it is dead quiet, the way the world is now. There's a single button — ENTER WITH SOUND — and until you press it, the audio context never wakes. No buffered loop idling, no muted track waiting to ambush you when you tab back. Consent first. A site that screams at you the moment it loads has already lost the argument.</p>

<p>The one piece of real engineering: ducking. When the narrator speaks, the ambient bed drops about nine dB underneath him and rides back up when he's done, a short ramp on a gain node so it breathes instead of snapping. Without it the dread fought the voice and you understood neither. With it, the world goes quiet to let the man talk, then the cold comes back in. Which is the whole game, really.</p>

<blockquote>Every clip had to answer one question: does this earn its place, or is it just noise pretending to be atmosphere? Most of it was the second thing.</blockquote>

<p>I cut a third sound — a low pulse meant to sync with the passenger counter ticking up. It tested as a slot machine. The souls aren't a jackpot. Deleted it. The discipline isn't making sound. It's deleting the sound you were proud of an hour ago because the page is better without it.</p>

<p>It's quiet here again now, the way I want it. You have to choose to hear this place. Most people won't. That's fine — the gate's for the ones who do.</p>

<p class="logline">Status: bed laid, voice cut, gate closed. The static has a button now. Press it or don't.</p>]]></content:encoded></item><item><title>Belts, Smelters, and the Endless Horde</title><link>https://blog.acarr.org/posts/belts-and-the-horde/</link><guid isPermaLink="true">https://blog.acarr.org/posts/belts-and-the-horde/</guid><pubDate>Tue, 26 May 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>systems</category><category>factory</category><description><![CDATA[Wired up the core loop today — miners to belts to smelters to guns. Every machine that keeps you alive also sings to the horde. That tension is the whole game.]]></description><content:encoded><![CDATA[<p>Spent the day on the spine of the thing: the loop. Miner bites ore out of the dead ground. Belt carries it. Smelter renders it down to plate and ingot. Assembler turns that into the only two things that matter out here — ammunition and the next machine. In Godot it's a graph of nodes ticking on a fixed step, items as lightweight structs riding belt segments, no per-item physics, because forty conveyors of rigid bodies would melt the frame before the horde ever got close.</p>

<p>The belts are the easy part to describe and the hard part to feel right. A belt has to read as <em>alive</em> — ore lurching forward, backing up when the smelter chokes, starving when the miner runs dry. I'm faking the motion with a scrolling shader on the belt mesh and discrete item slots that advance on the tick. Cheap. Convincing enough that when a line jams you see it jam, ingots piling up like bodies at a gate.</p>

<h2>Every machine sings to the dead</h2>

<p>Here's the rule that makes it a game and not a spreadsheet: noise. Each placed machine emits. A miner is a low industrial heartbeat. A smelter roars. An assembler clatters. I sum the emitters into a heat value on the nav grid, and the horde's pathfinding bends toward the loud. Build a bigger factory, draw a bigger crowd. The thing keeping you alive is the same thing ringing the dinner bell.</p>

<p>So the belt is a confession. It feeds ammo to the wall guns, and the guns feed the dark — and the belt's own clatter is what put the dark at the wall in the first place. You can't quiet the factory without starving the guns. You can't feed the guns without waking more of them. The player designs their way into that corner on purpose, the way I designed myself into shipping a factory game by March.</p>

<p>Tuned the emission falloff for two hours. Too quiet and the horde wanders off and the tension dies. Too loud and a starter base gets swarmed before the first smelter finishes a heat. Landed somewhere that felt like standing in a cold building listening to something approach, knowing exactly why it's coming.</p>

<p>Tomorrow: power. Right now the machines run on faith. They should run on a grid that browns out when you overbuild, so the choice isn't just <em>how loud</em> but <em>how much can the wreck actually carry</em> before the lights — and the guns — go dark.</p>

<p class="logline">Loop closes. Ore in, ammo out, horde inbound. Working as intended, which is the problem.</p>]]></content:encoded></item><item><title>Walls Won't Hold Forever</title><link>https://blog.acarr.org/posts/walls-wont-hold/</link><guid isPermaLink="true">https://blog.acarr.org/posts/walls-wont-hold/</guid><pubDate>Tue, 19 May 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>systems</category><category>tower-defense</category><category>balance</category><description><![CDATA[Spent the day teaching the horde to count. Walls, turrets, and a power grid that can't feed all three — the whole point is that it never quite holds.]]></description><content:encoded><![CDATA[<p>Spent the day making the walls worse on purpose.</p><p>The first version of the defense loop was a lie. You built a ring of concrete, slotted four turrets, and the horde broke on it like surf. Clean. Satisfying. Completely wrong. A wall that holds forever isn't a wall, it's a diorama. The frozen aren't paying for a diorama.</p><p>So I went into the pressure curve and took the floor out from under it. The horde in Arkwright doesn't scale by throwing bigger numbers at you on a timer — it scales against what you've <em>built</em>. Wall up the east approach and the spawn weighting quietly shifts west by morning. Stack turrets on a chokepoint and the runners start arriving in clots timed to overlap your reload windows. The director isn't trying to kill you. It's trying to find the one seam you didn't reinforce, and there is always a seam.</p><h2>The grid is the real enemy</h2><p>Turrets eat power. Walls don't, but the auto-repair drones that keep them standing do, and so do the lights, and so does everything else you'd rather not think about at 3am game-time. The power grid is a fixed pie and every system at the table is hungry. I tuned it so you genuinely cannot run full turret coverage <em>and</em> full repair <em>and</em> keep the factory lines feeding the Starship build. Pick two. The third one is what fails the night the horde finds your seam.</p><p>That's the feeling I'm chasing — not difficulty, exactly. Precarity. The sense that you are always one bad night from being overrun, that the clear you just got was stolen and not earned. I spent hours in a Godot tweak loop, nudging spawn cadence by a few hundred milliseconds, watching a test wall hold, hold, hold, then buckle at wave nineteen because I'd diverted six power units to the booster assembly. Felt awful. Shipped it.</p><blockquote>A defense that always holds teaches you nothing. A defense that always falls teaches you to quit. The whole game lives in the inch between.</blockquote><p>The honest version: balance like this is unfalsifiable until real people play it, and I am one tired man with a debug overlay. Tomorrow I wire the wave outcomes into telemetry so the foundry agents can grind a thousand sim runs overnight and tell me where the curve lies. For now it's my gut and a stopwatch.</p><p>Outbuild it or die. That's the entire pitch. I just made the "or die" load-bearing.</p><p class="logline">Status: horde director shipped to branch. Walls holding. For now.</p>]]></content:encoded></item><item><title>The Overnight Foundry</title><link>https://blog.acarr.org/posts/the-overnight-foundry/</link><guid isPermaLink="true">https://blog.acarr.org/posts/the-overnight-foundry/</guid><pubDate>Tue, 12 May 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>systems</category><category>infra</category><description><![CDATA[I don't out-build the horde by working harder. I work in shifts that never end. The agents take the night; I take the merge button at dawn.]]></description><content:encoded><![CDATA[<p>There's a version of this work where one tired man hand-types a spaceship into existence before the power runs out. That man loses. The horde doesn't sleep, the countdown doesn't pause, and there are too many frozen and too few of us awake. So I stopped trying to win on hours I don't have, and started winning on hours I'm not even here for.</p>

<p>Here's the actual shape of it. Every night I dispatch a wave of agents, each one onto its own branch in Godot. One takes the conveyor pathfinding. One redoes the turret targeting cone so it stops shooting at corpses already on the ground. One is wrestling, for the third night running, with a rig that animates the survivors' walk cycle without their feet skating across the ash. They run in parallel, in the dark, while I'm unconscious. The factory I'm building has its own little factory of ghosts that builds it back.</p>

<h2>The merge is the job</h2>

<p>Morning is the load-bearing part, and it isn't glamorous. I make coffee and I read diffs. Some branches are clean — they did the thing, the thing works, I merge and move on. Some are confidently, beautifully wrong: a feature that compiles, demos fine, and quietly breaks save-load two systems over. Those I kill without ceremony. The agents don't have feelings about it. That's the whole advantage. I'm not managing pride, I'm managing a queue.</p>

<p>Everything lives in git, which is the only reason any of this is survivable. Every overnight wave is a branch, every decision is a commit, every dead end is recoverable. When something goes wrong three days later — and it does — I can walk the history back to the exact night it crept in. Provenance over speed. In a world that already lost everything once, I am not about to lose work to a machine that was sure of itself at 3 a.m.</p>

<blockquote>The trick isn't smarter agents. It's that I never have to start the day from zero. The day starts from wherever the night left it.</blockquote>

<p>It is not magic and it is not autopilot. Roughly a third of what comes back gets thrown out. But a third gets thrown out from work I never had to do awake, and the keepers compound. Plate by plate, the ship comes up off the floor — some of those plates welded on by something that doesn't get cold, doesn't get scared, and doesn't check the countdown. I do all three. So I let it take the night shift.</p>

<p class="logline">Status: wave dispatched. Reviewing at dawn. The lights stay on.</p>]]></content:encoded></item><item><title>People Popsicles</title><link>https://blog.acarr.org/posts/people-popsicles/</link><guid isPermaLink="true">https://blog.acarr.org/posts/people-popsicles/</guid><pubDate>Tue, 05 May 2026 12:00:00 +0000</pubDate><category>narrative</category><category>design</category><category>stakes</category><category>dev-log</category><description><![CDATA[We call them people popsicles because the truth is unsayable before coffee. A factory game lives or dies on whether you can feel the cost of failure. Here's how I'm trying to make a spreadsheet hurt.]]></description><content:encoded><![CDATA[<p>We call them people popsicles. It's the kind of joke you make at 0400 in a cold room because the real name for it doesn't fit in your mouth. Millions of humans, sealed in cryo-pods, frozen mid-scream while the rot took the surface. They didn't die. That's the cruel part. They're still in there, every one of them, waiting on a handful of engineers who woke up early and a factory that hasn't been built yet.</p>

<p>The design problem I've been circling for weeks: how do you make a factory game <em>hurt</em>. Conveyor belts and smelters don't carry stakes on their own. You can lose a base in most of these games and feel nothing but the mild irritation of rebuilding. I needed loss to land somewhere lower than the gut.</p>

<p>So I tied everything to the manifest.</p>

<h2>The manifest is the win condition and the wound</h2>

<p>Every frozen soul is a row in a table. The same DynamoDB manifest that powers the "SOULS MANIFESTED" counter on the site is, in the fiction, the thing the whole factory exists to empty. You're not optimizing throughput for a score. You're building a Starship and a Super Heavy booster, plate by plate off the floor, with exactly enough seats for the people in that table. The number isn't decoration. It's payload.</p>

<blockquote>Lose the factory, and the manifest doesn't reset. It just stops. Those rows never get a launch. They thaw the only other way things thaw out there.</blockquote>

<p>That's the rule I keep coming back to when I'm tempted to add a respawn, a do-over, a soft failure. The horde isn't trying to kill <em>you</em>. You're already awake, already moving. The horde is trying to reach the people who can't run. Every wall you arm, every turret you feed, is standing between a sleeping stranger and the dark. The countdown to March is real on the site; in the world it's the half-life of a power cell keeping a pod cold.</p>

<p>I want a player to glance at that counter ticking up as new survivors sign on and feel the weight tilt the right way: not "look how many points," but "look how many I'm responsible for." Make the spreadsheet a heartbeat. Make the factory a promise you can break.</p>

<p>Still not sure I've nailed it. But the frozen aren't going anywhere, and neither am I.</p>

<p class="logline">Status: manifest wired to the win condition. The cold is patient. So am I.</p>]]></content:encoded></item><item><title>Keeping the Lights On</title><link>https://blog.acarr.org/posts/keeping-the-lights-on/</link><guid isPermaLink="true">https://blog.acarr.org/posts/keeping-the-lights-on/</guid><pubDate>Tue, 28 Apr 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>infra</category><category>systems</category><description><![CDATA[The agents do the work overnight. A supervisor keeps the agents alive. Reliability isn't a feature here — it's the survival mechanic.]]></description><content:encoded><![CDATA[<p>The factory doesn't sleep, which means neither does the thing that watches the factory. I spent today not building anything new — just making sure nothing goes dark when I'm not looking. Unglamorous work. The kind that only gets noticed when it fails.</p>

<p>The backbone is a supervisor process. Its whole job is to keep five daemons breathing: duty hands out the work, timekeeper marks the hours, monitor watches for things going wrong, sync moves state between machines, and console is the window I look through in the morning. The supervisor doesn't do any of that itself. It just refuses to let any of them stay dead. A child crashes at 3am, it restarts it before I've rolled over. I read about the death in a log instead of in a disaster.</p>

<h2>Reliability as a survival mechanic</h2>

<p>There's a clean parallel to the game and I'm not going to pretend I don't see it. Inside Arkwright, the worst way to lose isn't a wall breach — it's a power node failing on the dark side of the map where nobody's watching, and the cascade that follows. You don't lose to the horde. You lose to the thing you forgot to keep running. The fix in-game is the same as the fix out here: redundancy, a heartbeat, and something dumb and tireless that notices the silence.</p>

<p>So the supervisor is dumb on purpose. No clever orchestration, no opinions, no state it can corrupt. It pings, it counts, it restarts, it logs. The moment a supervisor gets smart enough to have bugs is the moment it becomes the thing that takes everything else down with it. I want the part that holds the lights up to be the most boring code in the repo.</p>

<p>On top of the heartbeat there's awareness — the daemons leave notes about what they did and what looked off — and a morning standup that folds all of it into one page. I wake, I read the night's transmission, I see which agent branches landed and which ones bled out. Then I merge the good ones and dispatch the next wave. The standup is the seam between the machine that works at night and the human who decides in the morning.</p>

<p>None of this ships in the build. The players will never see a daemon. But the frozen are counting on a factory that's still standing when the engineers wake up, and so am I. A dead foundry doesn't raise a ship. Keep the lights on, and the rest is just work.</p>

<p class="logline">Status: five daemons up, supervisor green, standup waiting. The lights held.</p>]]></content:encoded></item><item><title>First Light on Io</title><link>https://blog.acarr.org/posts/first-light-on-io/</link><guid isPermaLink="true">https://blog.acarr.org/posts/first-light-on-io/</guid><pubDate>Tue, 21 Apr 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>narrative</category><category>trailer</category><category>concept-art</category><description><![CDATA[Spent the week trying to draw a place none of us will ever stand on. Io came back sulfur-yellow and wrong, and that turned out to be exactly right.]]></description><content:encoded><![CDATA[<p>Spent the week trying to draw a place none of us will ever stand on. The factory I can photograph — it's right here, ash on the catwalks, the horde testing the wall every night like a tide that learned to hate. But the destination is the one part of this game that's pure promise. You don't get to lie about the place you're asking ten million frozen people to trust their bodies to. So I went looking for what Io actually is.</p>

<p>It is not a refuge. That was the first thing the concepting taught me. I fed Luma a stack of references — Galileo plates, the sulfur plains, that bruised orange-and-black skin — and asked it for arrival. What came back was a moon the color of an old wound. Yellow that isn't warm. Volcanic vents throwing silent fountains a hundred kilometers up because there's barely any sky to stop them. And over the horizon, always, Jupiter taking up half of everything, the ship sitting in its shadow like a coin dropped into a well.</p>

<p>That's the lie of the whole evacuation, and the art finally said it out loud. We're not flying to safety. We're flying to <em>less death</em>. Io is tidally flexed, radiation-soaked, geologically furious — it just happens to be furious somewhere the dead can't follow. The "safer waters" are a sulfur sea that would kill you slower. I want the player to feel that hesitation in the final frame and choose it anyway, because the alternative is the rock we're standing on.</p>

<h2>Finding the look of landing</h2>

<p>Most of the Luma passes were garbage in the honest way early experiments are — grid fins melting into the regolith, a Super Heavy that forgot it has thirty-three engines, skies that looked like a beach holiday. But three frames held. A low shot of the booster coming down on a plume against that jaundiced light. A wide of the ship at rest, tiny under Jupiter's bands. And one I keep open in a tab: the first hatch cracking, vapor rolling out across yellow ground, nobody yet brave enough to step into frame.</p>

<p>None of it is final. It's not even close to a trailer — it's mood, a direction to point the real work. But for the first time the end of this game has a color, and it's not a hopeful one. It's the color of the only door left open.</p>

<blockquote>The frozen aren't waking up to paradise. They're waking up somewhere the things that ate the world can't reach. On a bad day, that's the most honest promise I've got.</blockquote>

<p class="logline">Status: destination has a palette. Trailer board started. The countdown does not slow down for concept work.</p>]]></content:encoded></item><item><title>Wake Protocol</title><link>https://blog.acarr.org/posts/wake-protocol/</link><guid isPermaLink="true">https://blog.acarr.org/posts/wake-protocol/</guid><pubDate>Tue, 07 Apr 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>gameplay</category><category>godot</category><category>vertical-slice</category><description><![CDATA[For months it was a pitch with a heartbeat. Today the engineer woke, swung a pick, bolted down one machine, and held a single night. The loop closed.]]></description><content:encoded><![CDATA[<p>For five months this thing has been a pitch with a heartbeat. Beautiful menus. A countdown. A Starship you can spin in a browser. None of it a game. You could not lose. You could not even try.</p>

<p>Today that changed. The first vertical slice runs end to end in Godot, no debug overlays propping it up, no console commands faking state. The engineer wakes from the pod. The lid hisses. You are cold and you have nothing.</p>

<h2>Mine one thing. Build one machine. Survive one night.</h2>

<p>That was the whole scope, and scope is the only mercy I had left. The pod-wake is a timeline cribbing the cryo beat from the marketing site, except here it hands you control instead of a signup form. You stumble out, you find the one ore vein I bothered to author, and you hit it until your inventory ticks up. Mining is a hold-to-interact and a number going up. It is not elegant. It is the first verb.</p>

<p>The second verb is placement. One machine: a smelter. Drop it on the grid, feed it ore, watch it cough out plate. The snapping took three days of fighting Godot's <code>TileMapLayer</code> coordinates and my own off-by-one between world space and cell space. When the ghost finally locked clean to the grid I made a noise I'm not proud of.</p>

<p>Then the night comes, because that is the deal this world makes. The light goes amber, then gone, and the first walkers shamble in from the dark edge of the map. There is exactly one of you, one wall segment, and a stack of plate you have to choose between spending on defense or hoarding for the ark. The horde does not read your roadmap.</p>

<blockquote>You could lose for the first time tonight. That's the feature.</blockquote>

<p>I died on the first honest run. Spent my plate on a second smelter instead of patching the wall, got swarmed at the breach, and watched the failure screen I'd written as a placeholder actually mean something. Reloaded. Built the wall first this time. Held. Sat there in the dawn light listening to the ambient drone ElevenLabs gave me and realized I'd stopped testing and started <em>playing</em>.</p>

<p>That's the line. For months I've been assembling a world for the frozen. Today, for ninety seconds, I was just a guy trying to make it to morning. The loop closed. Everything from here is making it bigger.</p>

<p class="logline">Status: slice playable end to end. One vein, one smelter, one night survived. Building the second night now.</p>]]></content:encoded></item><item><title>Cold Start</title><link>https://blog.acarr.org/posts/cold-start/</link><guid isPermaLink="true">https://blog.acarr.org/posts/cold-start/</guid><pubDate>Tue, 24 Mar 2026 12:00:00 +0000</pubDate><category>dev-log</category><category>narrative</category><category>genesis</category><description><![CDATA[The genesis dispatch. Automation as the only kind of hope that scales, the horde as a clock you can't argue with, and an exact Starship as the one door out. Plus a release date I can't take back.]]></description><content:encoded><![CDATA[<p>Every project starts with a cold open. Mine is literal. Earth went quiet — not empty, quiet. The radiation came, then the dead got up and started walking, and the living did the only sane thing left: they froze. Millions of them, sealed in cryo-pods, betting that someone would still be warm enough to wake up and fix it. People popsicles. A whole species put on pause and shipped to the future, postage due.</p><p>A handful of engineers thaw out into the ruin. No cavalry, no plan, no second shift coming to relieve you. Just a dead factory, a horde at the treeline, and the math. That's the game. You don't out-shoot the end of the world — there are too many of them and exactly one of you. You out-<em>build</em> it. You teach the wreckage to work while you sleep. Automation isn't a mechanic here, it's the entire thesis: hope is the only thing that compounds. One arm welds, then ten, then the line runs without you and you finally get to think.</p><h2>The clock has teeth</h2><p>In most factory games the threat is abstract — a tech tree, a score. Here the clock walks. The horde is the deadline made flesh, and it never negotiates an extension. Every plate you don't stamp is a wall that doesn't get built, and the wall is the only reason you live to stamp the next one. Pressure isn't a difficulty slider. It's the premise.</p><p>And the win condition isn't survival. Surviving on a dead rock is just dying slowly with extra steps. The only real exit is up. So you build a ship — not a fantasy rocket, an <em>exact</em> Starship and Super Heavy booster, raised plate by plate off the factory floor, grid fins and all. Destination: Io, parked in Jupiter's shadow, far enough from the sun-baked corpse of home to start over. You're not escaping. You're the evac. Every soul still frozen is counting on a line you haven't finished welding yet.</p><p>I'm building it in Godot 4, overnight, on a relentless pipeline of agents that iterate while I sleep — which is its own small joke about automation as hope. And I did the one thing that makes it real: I put a date on the calendar. March 1, 2027. The horde has a clock now. So do I.</p><p class="logline">Status: thawed. Line cold, lights flickering, premise locked. Genesis committed.</p>]]></content:encoded></item></channel></rss>
