<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Prometheus devlog</title>
  <subtitle>Building Prometheus, a custom 2.5D engine and editor, on the way to Forgotten Memories, Endless Abyss.</subtitle>
  <link href="https://blog.prometheanworks.dev/" rel="alternate" type="text/html"/>
  <link href="https://blog.prometheanworks.dev/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://miketec-ra.github.io/prometheus-devlog/</id>
  <updated>2026-11-09T22:59:47.971Z</updated>
  <author><name>MikeTec-RA</name></author>
  <entry>
    <title>The night I deleted my own Forge</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-11-07-the-night-i-deleted-my-own-forge/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-11-07-the-night-i-deleted-my-own-forge</id>
    <published>2026-11-07T12:00:00.000Z</published>
    <updated>2026-11-07T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;A little after midnight on Halloween, a routine change to one of my git worktrees deleted most of Forge. Spooky timing. It ended up shaping everything I&amp;#39;ve done since.&lt;/p&gt;
&lt;h2&gt;798 files, gone&lt;/h2&gt;
&lt;p&gt;I keep a lot of worktrees, and they share their dependency folders through Windows junctions, which are links that look like normal folders. Narrowing what one worktree checks out made git follow one of those junctions straight into my main checkout. It took out 798 tracked Forge files, Forge&amp;#39;s dependencies, its settings file and the folder holding its keys.&lt;/p&gt;
&lt;p&gt;Git brought the tracked files back in seconds. Everything else was harder:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I rebuilt the settings file with new keys.&lt;/li&gt;
&lt;li&gt;Forge&amp;#39;s sign-in key was gone, so every device had to sign in again.&lt;/li&gt;
&lt;li&gt;The key that signs DD-ReForged&amp;#39;s licences couldn&amp;#39;t be recovered at all. I made a new one, and the desktop app, the phone app and the editor now trust it alongside the old one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing I&amp;#39;d written was lost, but it was closer than I like. Now a weekly backup copies my untracked secrets, both databases and a verified bundle of every branch and tag, and a quick git-only backup runs before every merge.&lt;/p&gt;
&lt;h2&gt;Every git write can be undone&lt;/h2&gt;
&lt;p&gt;A few hours later I was planning the fix. If my own git tool can&amp;#39;t protect me from a night like that, it isn&amp;#39;t done. DD-ReForged 0.3.16 and 0.3.17 grew a full git toolkit, built around one rule: anything that changes a repo has to be recoverable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every write is recorded.&lt;/strong&gt; Each one saves a journal line and a snapshot of the refs first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery centre.&lt;/strong&gt; Browse the reflogs, saved refs and the journal, and undo a ref move. Pruning makes you type a word first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lost and found.&lt;/strong&gt; Dangling commits and dropped stashes can come back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destructive commands got softer.&lt;/strong&gt; &lt;code&gt;clean&lt;/code&gt; moves files to quarantine instead of deleting them, and &lt;code&gt;reset --hard&lt;/code&gt; and discarding changes both save a copy first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup centre.&lt;/strong&gt; Verified bundles and mirrors, kept outside any repo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The junction guard.&lt;/strong&gt; Removing or repairing a worktree now refuses to reach through a link. That&amp;#39;s the exact mistake from Halloween, with tests against real git for a junction at a tracked folder and a junction below a junction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#39;s also plenty of everyday git: history search with blame and line history, a commit composer, local-only merges, tags, remotes, a panel for stuck operations and conflicts, and a safe force push. An MCP server lets an AI coding assistant work through the same rules, with the protected-branch override off by default. I&amp;#39;ve pushed the Prometheus repo through DD-ReForged itself, too.&lt;/p&gt;
&lt;p&gt;Repairing my own repo was the real test. It has 22 orphaned pack files, and an early version of the repair would have let any tool&amp;#39;s garbage collection delete 446 objects that exist nowhere else. I caught that before it ran. Trying hard to break things before merging also found ways that Send to Forge could lose data, three rounds of them. Passing tests alone would have shipped all of it.&lt;/p&gt;
&lt;p&gt;Then I walked every workflow in the desktop app with real clicks against a throwaway Forge. No work was lost, but it found bugs worth fixing, including a leftover lock file that stopped the app from opening and a Create tag button that wrote to Forge&amp;#39;s copy while the screen said local.&lt;/p&gt;
&lt;h2&gt;A new look, and boards that travel&lt;/h2&gt;
&lt;p&gt;0.3.17 also rearranged the app. Every page now fits in one bar, or a left rail if you&amp;#39;d rather, and Wake and the boards get the whole window. Wake opens from its last known graph and only reads what&amp;#39;s new, and the branch list stays fast past 1,000 branches. I know because the Prometheus repo had 1,013 of them, until I cleared out 1,004 merged ones.&lt;/p&gt;
&lt;p&gt;Boards and cards now work across your own PC and Forge. Cards can hold attachments, images and safe HTML, and a deleted card or board on Forge sticks around for 30 days in case you want it back. A notifications bell and tabs above the toolbar are merged and waiting for the next build.&lt;/p&gt;
&lt;h2&gt;The phone&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-the-night-i-deleted-my-own-forge/phone-branch-graph.png&quot; alt=&quot;The phone&amp;#39;s branch viewer: commit history as a continuous graph, with a Graph and List switch (from the design)&quot;&gt;&lt;/p&gt;
&lt;p&gt;The phone got a branch viewer with a continuous commit graph, plus commit details and making or deleting a branch on origin. It also got line comments, long-press to move a card, formatted Markdown and importing a photo into your avatar. App lock now uses the device&amp;#39;s own lock and blanks the preview in your recent apps.&lt;/p&gt;
&lt;p&gt;I have to be honest here: the newest of this hasn&amp;#39;t reached my Fold yet, and app lock has only been tried on an emulator with a PIN. Fingerprint, face and folding are still to test.&lt;/p&gt;
&lt;h2&gt;Forge grows up&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-the-night-i-deleted-my-own-forge/forge-audit.png&quot; alt=&quot;Forge&amp;#39;s audit log: who did what, when and how, with filters and exports&quot;&gt;&lt;/p&gt;
&lt;p&gt;Forge now keeps an audit log of who did what, when and how, and you can check your own under &lt;strong&gt;My activity&lt;/strong&gt;. Almost every Forge page now works on a phone as well.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s also getting ready to leave my PC. I&amp;#39;ve had a hosted Forge running in a Podman pod with MySQL, Caddy and Tailscale, reachable only on my private network. I haven&amp;#39;t moved over yet. That comes after the testers&amp;#39; pieces are in place: invites that carry a licence, a list of who may sign up, a page for tracking testers, and a Downloads page that only serves builds to people with a licence.&lt;/p&gt;
&lt;h2&gt;Back in the editor&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-the-night-i-deleted-my-own-forge/editor-sign-in.png&quot; alt=&quot;The editor&amp;#39;s new sign-in screen, with GitHub or a Forge password&quot;&gt;&lt;/p&gt;
&lt;p&gt;The plugin platform moved forward as well. Plugins now say where their panels go, add status items, send notifications and get a say before the app quits. They also declare their permissions, and the editor limits their menus, commands and panels to match.&lt;/p&gt;
&lt;p&gt;The editor has a real sign-in screen and a new desktop installer, 0.4.0. Forge can also sign in players from a shipped game now, the first small piece of the game itself touching these tools.&lt;/p&gt;
&lt;p&gt;Scene saving got more careful too. A whole-scene save keeps records it wasn&amp;#39;t sent, a slow asset listing no longer blocks Load and Save, offline deletes survive a reload, and a half-saved script no longer gets imported.&lt;/p&gt;
&lt;h2&gt;Tools first&lt;/h2&gt;
&lt;p&gt;I also made a call that day: no new game content until the tools and every app work properly. I don&amp;#39;t want to build a game world on tools I can&amp;#39;t trust. The full test suite is past 27,000 tests now, and the game comes next once these pass.&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;Build 0.3.18 and get the newest app onto my phone. Then the last checks before the first testers: a run as a brand new Windows user, the newer MySQL version, and a real build going through the Downloads page.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Seal: licences for the tools</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-11-07-seal-licences/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-11-07-seal-licences</id>
    <published>2026-11-01T12:00:00.000Z</published>
    <updated>2026-11-01T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;A few days ago I tackled something I&amp;#39;d been putting off: licensing. I&amp;#39;ve put a lot of time into DD-ReForged and the tools around Prometheus, and I want to protect that before other people start using them. It went from plan to running on my own devices in a single day, and I wanted to think about how to tell you before writing it up.&lt;/p&gt;
&lt;h2&gt;The plan&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The engine will be free&lt;/strong&gt; once I&amp;#39;m done building my game with it. The custom parts I build for the game, not so much. But there will be a way, with documentation, to build your own plugins and extend the engine to your heart&amp;#39;s content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DD-ReForged has a free version&lt;/strong&gt; that links up with the engine, at the low, low cost of registering for a free licence. Free never locks. It covers working on your own PC: Drydock, Wake, reviews and boards stored locally, and the VS Code extension. The phone app is free too, for reading.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro&lt;/strong&gt; adds everything that talks to a Forge server: syncing reviews and boards, server worktrees, notifications, and taking action from the phone (comment, approve, merge, move a card). Pro comes with a year of updates, and you keep the app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt; isn&amp;#39;t a thing... yet. More on that below.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which feature sits in which tier is just data on the licence, so I can move things around later without shipping new code. Payments aren&amp;#39;t part of this yet. For now I issue keys by hand.&lt;/p&gt;
&lt;h2&gt;Why licences at all&lt;/h2&gt;
&lt;p&gt;Let me be upfront, because &amp;quot;licence&amp;quot; sounds scarier than this is.&lt;/p&gt;
&lt;p&gt;No, I won&amp;#39;t sell your stuff. Registering is how I find out how many real users I&amp;#39;ve got, and whether enough support comes my way to keep delivering what I can, when I can. I have a family and a full-time job. I&amp;#39;m a web developer by day and a game developer at night and on weekends, and this is a passion project for me. I love to build stuff, and if I can make a few dollars from Pro, great.&lt;/p&gt;
&lt;p&gt;I use all of it myself, every day. I&amp;#39;m the test bed, and the battle testing is done by friends and beta testers. If you want a custom solution for your team, we can talk enterprise, and see what custom features you&amp;#39;d want me to build to help the ecosystem grow and get more robust.&lt;/p&gt;
&lt;p&gt;And to be honest, I&amp;#39;m sick of paying an arm and a leg for software. This stuff will basically be free. Pro comes with a year of updates, and you keep the app. Enterprise? Well, that&amp;#39;s not a thing... yet. Maybe in my wildest dreams. This is just for funzies, and some cool tools to use for development.&lt;/p&gt;
&lt;p&gt;Did I mention it will be almost free? Buy me enough cups of coffee and I won&amp;#39;t need to buy my own anymore.&lt;/p&gt;
&lt;p&gt;I appreciate you all for your support.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;In keeping with the fire names, the licensing part of Forge is called &lt;strong&gt;Seal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-seal-licences/desktop-licence.png&quot; alt=&quot;DD-ReForged&amp;#39;s Licence tab: Pro active, the features it unlocks, and the three devices using it (from the design)&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A licence is a signed statement.&lt;/strong&gt; Forge signs something like &amp;quot;this account has Pro, these features, up to 3 devices, updates until next October&amp;quot;. Every app carries Forge&amp;#39;s public key, so it can check the signature without going online. Nobody can turn Free into Pro without Forge&amp;#39;s private key, and that never leaves the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A key is how you claim it.&lt;/strong&gt; You sign in, open Settings → Licence, and enter a key like &lt;code&gt;DDRF-XXXX-XXXX-XXXX-XXXX&lt;/code&gt; once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Each device gets its own pass.&lt;/strong&gt; Every install makes its own device key and keeps it in the operating system&amp;#39;s secure store. Activating sends Forge the public half, and Forge sends back a pass that only works on that device. Copying it to another machine gets you nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A daily check-in keeps it fresh.&lt;/strong&gt; Once a day the app checks in and gets a pass that&amp;#39;s good for another 14 days. If you&amp;#39;re offline, everything keeps working until the 14 days run out. A licence that&amp;#39;s been revoked stops at the next check-in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Up to 3 devices.&lt;/strong&gt; You can release one yourself, from the desktop or the phone, to free its slot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-seal-licences/phone-licence.png&quot; alt=&quot;The phone&amp;#39;s licence page: Pro, the features, and the devices (from the design)&quot;&gt;&lt;/p&gt;
&lt;p&gt;When a feature isn&amp;#39;t in your licence, it doesn&amp;#39;t vanish. It shows as locked, says which tier unlocks it, and everything else keeps working.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-11-07-seal-licences/desktop-locked.png&quot; alt=&quot;A locked feature: connecting to a Forge server is a Pro feature, with Unlock with Pro (from the design)&quot;&gt;&lt;/p&gt;
&lt;p&gt;As usual, I drew all of these screens in Figma before building them: activating a key, the licence page, locked features, a failed check-in, the end of the offline grace, the device limit, and Forge&amp;#39;s page for issuing and revoking keys.&lt;/p&gt;
&lt;h2&gt;Being honest about protection&lt;/h2&gt;
&lt;p&gt;Anything checked only inside an app can be cracked by someone determined enough. Desktop apps and Android apps can both be unpacked and patched. So I put the real protection where it can&amp;#39;t be patched out: on the server. The paid features that matter run on Forge, and Forge checks the licence before it does anything. A patched app that skips its own check just gets turned away.&lt;/p&gt;
&lt;p&gt;On top of that, the desktop app refuses to start if its files have been modified, and code signing is on my list so a tampered build can&amp;#39;t pass as mine. What I deliberately didn&amp;#39;t do is heavy obfuscation and anti-debugging. They slow honest debugging down more than they slow down anyone cracking it.&lt;/p&gt;
&lt;h2&gt;Working end to end&lt;/h2&gt;
&lt;p&gt;By that evening Seal was running on my Forge. I issued myself a licence and activated it on my PC and my phone. Then I switched on Forge&amp;#39;s rule that refuses paid features without a licence, and tried it for real: I commented on a card from my phone, and the comment showed up in DD-ReForged on the PC.&lt;/p&gt;
&lt;p&gt;The first real use found a bug, as usual. The Activate button on the PC was greyed out. The app asked for the licence details when I signed in, but at start-up the sign-in arrived before the licence part had finished starting, so the request was dropped. Now it loads the licence when it starts, waits properly for a sign-in that arrives early, and shows &amp;quot;Loading the licence…&amp;quot; until Forge answers.&lt;/p&gt;
&lt;p&gt;Build 0.3.11 has Forge&amp;#39;s public licence key built in, so it only trusts licences my Forge has signed.&lt;/p&gt;
&lt;h2&gt;Getting it to testers&lt;/h2&gt;
&lt;p&gt;What comes next is putting DD-ReForged in front of a few testers. They&amp;#39;ll reach my Forge over Tailscale, a private network that also gives Forge a proper https address, and each tester gets a Pro key that expires when the beta ends. Later, Forge moves off my PC into a hosted setup on that same private network.&lt;/p&gt;
&lt;h2&gt;Plugins&lt;/h2&gt;
&lt;p&gt;I also settled the ground rules for the engine&amp;#39;s plugin platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For now, only my own trusted plugins.&lt;/li&gt;
&lt;li&gt;Plugins that only affect the editor can be switched on and off while it&amp;#39;s running.&lt;/li&gt;
&lt;li&gt;Every plugin carries a licence, and the ones that ship with the engine get a free one.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;Hand out the first beta keys once the last checks pass, and keep building the plugin platform, which is the next big step for the engine.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A real phone, and scene saving done</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-29-a-real-phone/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-29-a-real-phone</id>
    <published>2026-10-29T12:00:00.000Z</published>
    <updated>2026-10-29T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Last time the phone app had only ever run on an emulator, and scene saving had a few gaps left. This week the app went onto my own phone, the gaps are closed, and DD-ReForged is built as far as I can take it on my own.&lt;/p&gt;
&lt;h2&gt;On a real phone&lt;/h2&gt;
&lt;p&gt;My phone is a Galaxy Z Fold 7, so I got two screens to test on: the big inner one and the tall, narrow cover screen. I installed the app over Wi-Fi straight from my PC, then pointed it at Personal Forge on my home network.&lt;/p&gt;
&lt;p&gt;The very first sign-in failed, and it was a good failure to find. To sign in, Forge gives the phone a short code and the address of a page to approve it on. Forge hadn&amp;#39;t been told its own home-network address, so it handed the phone &lt;code&gt;localhost&lt;/code&gt;, which on a phone means the phone itself. The app was right to refuse to open that, but then it gave up without showing the code, so I had no way to approve it from the PC either. Now, if the app can&amp;#39;t safely open the approval page, it still shows the code and tells you to approve it on your PC. I also gave Forge its proper home-network address.&lt;/p&gt;
&lt;p&gt;After that, everything I tried worked: the inbox, the repos, the branches, the boards and a card&amp;#39;s discussion. Two more things turned up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings → Notifications&lt;/strong&gt; had nothing on Forge&amp;#39;s side to talk to. Forge now keeps notification preferences for each person, and the phone reads them from there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The cover screen.&lt;/strong&gt; On the narrow screen, the &amp;quot;Edit server&amp;quot; button grew two rows tall whenever the connection test result appeared next to it. The result now sits on its own row under the buttons, the way the design always had it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forge&amp;#39;s branch list also has a time limit now, so a slow repo can&amp;#39;t leave the phone waiting forever.&lt;/p&gt;
&lt;p&gt;The fixed build went onto the phone as an update, so I didn&amp;#39;t have to sign in again. One mystery is still open: for about five minutes one afternoon, the phone couldn&amp;#39;t reach my PC at all, then it recovered on its own. I&amp;#39;ve noted it and I&amp;#39;m keeping an eye out.&lt;/p&gt;
&lt;h2&gt;Scene saving, finished&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-29-a-real-phone/held-in-hierarchy.png&quot; alt=&quot;The Hierarchy with a banner saying some records couldn&amp;#39;t be restored, and a Held group holding two items&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the last post, the engine learned to hold on to anything in a scene it can&amp;#39;t load and save it back untouched. This week I finished the part you can see. When a scene has held items, the editor shows a banner and gives them their own &lt;strong&gt;Held&lt;/strong&gt; group in the Hierarchy. Each one is marked as either missing (its plugin isn&amp;#39;t in this build) or unavailable (its plugin is there but couldn&amp;#39;t load it).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-29-a-real-phone/held-inspector.png&quot; alt=&quot;The Inspector showing a held item read-only: it is kept and saved exactly as it was written&quot;&gt;&lt;/p&gt;
&lt;p&gt;Selecting one shows exactly what was saved, read-only. You can delete it, but only after a confirm that spells out what you&amp;#39;re losing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-29-a-real-phone/held-delete.png&quot; alt=&quot;The delete confirmation for a held item&quot;&gt;&lt;/p&gt;
&lt;p&gt;None of this ever shows up for players; the markers only exist in the editor.&lt;/p&gt;
&lt;p&gt;To prove it all works, I ran the full loop against a real backend and editor: open a scene with held items, save it, load a later save back from the database rather than the browser&amp;#39;s copy, delete one with the confirm, and reload. All 20 checks passed.&lt;/p&gt;
&lt;p&gt;That run turned up one more mismatch. The editor and the game disagreed about physics that had been switched off: in one case the editor still built a physics body the game wouldn&amp;#39;t, and in another it was the other way round. They now agree. The editor&amp;#39;s list of avatars and the server&amp;#39;s catalogue also now always give the same entry for the same name.&lt;/p&gt;
&lt;p&gt;With that, scene saving is done, and it&amp;#39;s safe for a plugin to be switched off without taking anyone&amp;#39;s work with it.&lt;/p&gt;
&lt;h2&gt;DD-ReForged: built as far as I can take it&lt;/h2&gt;
&lt;p&gt;I went through DD-ReForged again against everything I want it to do, and every piece I can build is built. What&amp;#39;s left is on my side: a code-signing certificate so Windows stops warning about the installer, a real Linux desktop to check the tray on, and handing the team build to the people who&amp;#39;ll use it.&lt;/p&gt;
&lt;p&gt;Builds 0.3.9 and 0.3.10 went onto my PC in place, with backups first. Two smaller fixes made it in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a save fails because of a database error partway through, DD-ReForged now says so plainly and logs it, instead of failing with a vague message.&lt;/li&gt;
&lt;li&gt;If you open Forge&amp;#39;s approve-a-device page while you&amp;#39;re signed out, signing in now brings you back to that page instead of dropping you on the home page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;The engine, for real this time. Scenes are safe now, so the next step is either the plugin platform itself or the export targets for phone and Steam builds.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Forge in my pocket, and scenes that forget nothing</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-25-forge-in-my-pocket/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-25-forge-in-my-pocket</id>
    <published>2026-10-25T12:00:00.000Z</published>
    <updated>2026-10-25T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Two days ago the phone app was nineteen drawings in Figma. Last night it signed in to my Forge, read a pull request, left a comment, approved it and merged it, all on an Android emulator. Along the way Forge learned to push updates as they happen, and I spent part of the day on something less flashy that matters more for the game: making sure a scene can&amp;#39;t quietly lose data.&lt;/p&gt;
&lt;h2&gt;The phone app is real&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-25-forge-in-my-pocket/phone-inbox.png&quot; alt=&quot;The phone&amp;#39;s inbox: a card assigned and a new review comment, with Reviews and Boards filters&quot;&gt;&lt;/p&gt;
&lt;p&gt;The app is a small React project wrapped with Capacitor, so it shares DD-ReForged&amp;#39;s colours and components with the desktop app instead of copying them. It does what the drawings said it would:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sign in.&lt;/strong&gt; Personal Forge signs in with a code, like the desktop apps. The phone shows a short code, you approve it on Forge, and you&amp;#39;re in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inbox.&lt;/strong&gt; Review requests, comments, approvals, merges and card changes, each one tapping through to what it&amp;#39;s about.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pull requests.&lt;/strong&gt; The list, the details, the changed files and each diff, plus comment, approve and merge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branches.&lt;/strong&gt; The remote branches, and merging one branch into another on the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boards.&lt;/strong&gt; View a board, move a card, comment on it. Docs are read-only for now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings.&lt;/strong&gt; Accounts, an app lock, and the avatar editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-25-forge-in-my-pocket/phone-device-code.png&quot; alt=&quot;Approve this phone: a short code to type into Forge, with Copy and Open GitHub&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first Android build ran on a headless emulator. Then I ran the whole thing end to end against a scratch Forge: sign in, read the inbox, open a board, move a card, comment, open a pull request, read the diff, approve and merge. Forge&amp;#39;s own records agreed with what the phone said had happened.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-25-forge-in-my-pocket/phone-merge.png&quot; alt=&quot;Merging from the phone: the merge sheet over an approved pull request, with &amp;quot;The branches merge cleanly&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Personal Forge lives on my PC at home, so the phone talks to it over the home network. I decided plain http is fine there for now. Forge only listens on the network if you turn that on, and it can also be reached through Tailscale when I&amp;#39;m away. Proper HTTPS on the home network is a later job.&lt;/p&gt;
&lt;h2&gt;Forge talks back&lt;/h2&gt;
&lt;p&gt;Until now everything that showed Forge&amp;#39;s data had to keep asking whether anything had changed. Forge now has a live event stream instead. When a review gets a comment or a card moves, Forge sends a small hint saying what changed, never the content itself. Each person only gets hints about things they&amp;#39;re allowed to see.&lt;/p&gt;
&lt;p&gt;Forge&amp;#39;s web pages refresh themselves from it, and DD-ReForged on the desktop refreshes and shows a notification. Each person also has their own notification list now, with read and unread, and that&amp;#39;s what feeds the phone&amp;#39;s inbox.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-25-forge-in-my-pocket/forge-web-phone.png&quot; alt=&quot;Forge&amp;#39;s Bench board at phone width&quot;&gt;&lt;/p&gt;
&lt;p&gt;Forge&amp;#39;s web pages work on a phone now too: the menu, the boards and the reviews all fit at 360 pixels wide. Forge also fetches every repo it knows about on its own, every 15 minutes, and there&amp;#39;s an &lt;strong&gt;Open in DD-ReForged&lt;/strong&gt; button for jumping from a review in the browser straight into the desktop app.&lt;/p&gt;
&lt;h2&gt;Who sees which repos, done&lt;/h2&gt;
&lt;p&gt;The rule from the last two posts is finished. A teammate on my Forge only sees the repos their own GitHub account can reach, and the boards, cards and docs that belong to those repos. I also went after the sneaky ways a hidden repo could still give itself away: a name in a list, a parent folder, a path, or even the wording of an error. A member now learns nothing about something hidden from any of those. Before turning it on, I checked that my GitHub token could only read, not write.&lt;/p&gt;
&lt;h2&gt;DD-ReForged keeps going&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reviews go both ways.&lt;/strong&gt; Reviews on my PC and on Forge now sync in both directions. DD-ReForged brings in Forge&amp;#39;s reviews and keeps them current, and sends back new reviews, threads and decisions made locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Code.&lt;/strong&gt; It now sees Forge through the desktop app&amp;#39;s sign-in. It also has a &lt;strong&gt;Sync down now&lt;/strong&gt; command and shows the sync state in the status bar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safer secrets.&lt;/strong&gt; The Forge API key moved out of a plain file into the operating system&amp;#39;s encrypted store, backups included.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-healing.&lt;/strong&gt; If the background agent crashes, it restarts by itself once the old process is completely gone. A restart I ask for doesn&amp;#39;t count against the crash limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The tray&lt;/strong&gt; shows which GitHub account you&amp;#39;re signed in as, with its avatar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux.&lt;/strong&gt; I checked the install on Linux for the first time, with both the .deb and the AppImage in a throwaway Linux setup. It caught a real bug: the app made its profile folder with the wrong permissions and then refused to start. That&amp;#39;s fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also chased down the flaky tests that failed only when the machine was busy, and fixed each one at its cause instead of just giving it more time. My favourite find: one of Forge&amp;#39;s web tests had been quietly sending 77 real requests to my actual Forge server every time it ran. The tests can&amp;#39;t reach a real server any more.&lt;/p&gt;
&lt;p&gt;Builds 0.3.6, 0.3.7 and 0.3.8 each went onto my own PC in place, with a backup first.&lt;/p&gt;
&lt;h2&gt;Scenes that forget nothing&lt;/h2&gt;
&lt;p&gt;This is the one that matters most for the game. The rebuild turns big parts of the engine into plugins, and plugins can be turned off. That raised an ugly question. If a scene uses lights from a plugin that isn&amp;#39;t loaded, and you open the scene and save it, what happens to the lights?&lt;/p&gt;
&lt;p&gt;Until now, the honest answer was that they could vanish. The loader skipped anything it didn&amp;#39;t recognise, and saving wrote back only what it had loaded. Nothing was being lost yet, because nothing could be unloaded yet. But it would have been the first thing to bite once plugins arrived, so I fixed it before building any of them.&lt;/p&gt;
&lt;p&gt;Now, when the engine finds something in a scene it can&amp;#39;t load, it holds on to it exactly as written, keeping its id and its place in the order, and saves it back untouched. Held items show up in the editor, read-only, so you can see they&amp;#39;re there. Deleting one asks you to confirm. Lights, emitters, physics settings and avatars all keep their authored values, even if their part of the engine fails to start. An avatar whose model is missing is held instead of dropped. The server carries along anything it doesn&amp;#39;t recognise too, and a deletion made while offline still reaches the server and doesn&amp;#39;t come back.&lt;/p&gt;
&lt;p&gt;To prove it, I built a round-trip test harness: load a scene, save it, load it again, and check that the document comes out the same. That harness found more than one way data could slip through, and each one is fixed.&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;A few more gaps in scene saving to close before any plugin is allowed to unload. After that, back to the engine itself: either the plugin platform or the export targets.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A team of more than one</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-23-a-team-of-more-than-one/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-23-a-team-of-more-than-one</id>
    <published>2026-10-23T12:00:00.000Z</published>
    <updated>2026-10-23T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Yesterday Forge got a front door. Since then I&amp;#39;ve been getting the rest of the house ready for guests: Forge knows who is on the team, the engine knows who is editing, and DD-ReForged can talk to GitHub without borrowing anyone&amp;#39;s token.&lt;/p&gt;
&lt;h2&gt;Forge has a team&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-23-a-team-of-more-than-one/team-people.png&quot; alt=&quot;The Team page: me as the Super User and one invited developer, with their GitHub name, role and last sign-in&quot;&gt;&lt;/p&gt;
&lt;p&gt;Forge now has a Team page that only Admins and the Super User can see. It lists everyone who can sign in, their role and when they last signed in. If someone needs to go, I can disable them without wiping their history.&lt;/p&gt;
&lt;p&gt;Adding someone starts with an invite. I pick a role, Forge gives me a link, and that link works once and expires after a week. Whoever opens it sees who invited them and what the role lets them do, then joins with GitHub or sets a password.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-23-a-team-of-more-than-one/invite-page.png&quot; alt=&quot;The invite page: who sent it, the role and what it allows, and the choice of GitHub or a password&quot;&gt;&lt;/p&gt;
&lt;p&gt;Roles are a grid: one row per permission, one column per role. The built-in ones (admin, dev, member, player) sit next to any I make myself. The Super User has every key and isn&amp;#39;t a role at all, so nobody can edit their way into it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-23-a-team-of-more-than-one/roles-matrix.png&quot; alt=&quot;The roles grid: Anvil, Bench and Kiln permissions down the side, the roles across the top&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are service tokens for scripts too. A token is shown once, can be revoked, and can never do more than the person who made it. That&amp;#39;s the rule everywhere on this page: you can only hand out what you already have. I found one spot where a change skipped that check, so now every kind of change has its own test for it.&lt;/p&gt;
&lt;h2&gt;The engine knows who you are&lt;/h2&gt;
&lt;p&gt;Until now the engine trusted one shared key, the same mistake Forge used to make. Now it accepts a Forge sign-in, both on its regular API and on the live connection the editor uses. A session can only be picked back up by the person who started it. Every edit, version and session records who made it, so when two people bump into each other the editor tells you who, not just &amp;quot;conflict&amp;quot;. Settings are per person now, and asset downloads use short-lived tickets tied to one session.&lt;/p&gt;
&lt;p&gt;The editor&amp;#39;s side is in as well. It signs in and keeps the session fresh in the background. Until the editor learns to use those asset tickets, a signed-in session opens scenes read-only, so you can&amp;#39;t make edits the engine would just refuse. Last night the signed-in live connection went in too: if it drops, your edits wait a moment and go through once when it comes back.&lt;/p&gt;
&lt;p&gt;None of this is switched on for my own setup yet. That&amp;#39;s on me: swap out the default key it shipped with and point the engine at Forge.&lt;/p&gt;
&lt;p&gt;I tested all of this hard before it went in, and it paid off. One bug was a password reset code that could be used twice if two requests landed at the same moment. Now using the code and setting the new password happen together in one step, so the second request gets nothing.&lt;/p&gt;
&lt;h2&gt;Who sees which repos&lt;/h2&gt;
&lt;p&gt;Yesterday I said a teammate should only ever see the repos their own GitHub account can reach. That now has a plan, and I&amp;#39;ve made the calls it needed. Teammates won&amp;#39;t be able to push, merge or open pull requests through my GitHub token in Forge; they&amp;#39;ll do that from DD-ReForged with their own login. Repos show up only for people who are collaborators on them, even public ones, and anything on GitHub that Forge doesn&amp;#39;t track stays hidden. Building it starts with a read-only check of the token, before anything can write.&lt;/p&gt;
&lt;h2&gt;DD-ReForged connects to GitHub itself&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-23-a-team-of-more-than-one/wake-file-diff.png&quot; alt=&quot;DD-ReForged&amp;#39;s Wake view, with a file from a commit open as a side-by-side diff&quot;&gt;&lt;/p&gt;
&lt;p&gt;DD-ReForged can now connect to GitHub on your own PC through Git Credential Manager, the same sign-in git already uses, or with a pasted token. That turns on GitHub features that were already built but had no way to reach GitHub, including a pull request sweep that had been sitting there unused.&lt;/p&gt;
&lt;p&gt;Also new in DD-ReForged:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can join a Forge from an invite link, and its screens follow what your role on that Forge allows.&lt;/li&gt;
&lt;li&gt;VS Code shows who you&amp;#39;re signed in to Forge as.&lt;/li&gt;
&lt;li&gt;In Wake, clicking a file in a commit opens its diff right there, and the sidebar folds away into a drawer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before starting on those, I went through the whole tool against what I want it to do, checking the actual code and not just my task list. What&amp;#39;s left on the DD side comes to roughly 80 to 110 hours. It also turned out about 45 tasks were done and just never closed.&lt;/p&gt;
&lt;p&gt;Review build 0.3.5 went out tonight in two versions, mine and the team&amp;#39;s. The first attempt failed its own smoke test, because the new sign-in check stopped it at the door. I taught the smoke test about the check, and both versions pass now.&lt;/p&gt;
&lt;h2&gt;A phone app, drawn first&lt;/h2&gt;
&lt;p&gt;DD-ReForged is getting a phone app for reviewing and merging pull requests and moving cards around. Same rule as the editor: Figma before code. I&amp;#39;ve drawn nineteen screens in both themes, from sign-in to the inbox, a diff, the merge sheet and the boards, all built from DD&amp;#39;s own theme and components.&lt;/p&gt;
&lt;p&gt;The interesting part is Personal Forge. It runs on my PC at home, so until it&amp;#39;s hosted somewhere the phone can only reach it on the home Wi-Fi. The app is upfront about that: it shows the last thing it read and tells you why.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-23-a-team-of-more-than-one/mobile-away-from-home.png&quot; alt=&quot;Away from home: the last read is kept, with a note that Personal Forge is on the home network&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;Repo visibility on Forge, a live event stream from Forge, and the rest of that list. Once that&amp;#39;s done, DD-ReForged is in good enough shape that I can get back to the engine.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The shell, the engine and a front door</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-22-the-shell-the-engine-and-a-front-door/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-22-the-shell-the-engine-and-a-front-door</id>
    <published>2026-10-22T12:00:00.000Z</published>
    <updated>2026-10-22T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Yesterday the code for the rebuild started. Today three pieces of it came together, and the team got a new build of the git tool.&lt;/p&gt;
&lt;h2&gt;The shell is built&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-22-the-shell-the-engine-and-a-front-door/editor-shell.png&quot; alt=&quot;The editor shell at 1600 pixels wide: the title bar with the transport, the command search, the Hierarchy on the left and the Inspector on the right&quot;&gt;&lt;/p&gt;
&lt;p&gt;The frame from the design round is now the real editor: a title bar with the menus, the scene switcher, the mode switch and the transport (play, pause, stop) in the middle, and a command palette on the right. Press the search box and you can run any command the editor or a plugin offers.&lt;/p&gt;
&lt;p&gt;The bigger change is how panels dock. The Hierarchy sits in a zone on the left and the Inspector in a zone on the right. Tool windows can dock into a zone as tabs or float, and a bottom zone holds wide panels.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-22-the-shell-the-engine-and-a-front-door/jobs-docked.png&quot; alt=&quot;Jobs docked into the bottom zone, under the viewport&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jobs, the server-side job list, now lives there. When the window gets small the left zone folds into a flyout and the bottom zone shrinks, while the right zone holds on longest. If a panel would not fit anywhere, the editor tells you instead of quietly hiding it. A fresh install opens with the Hierarchy left and the Inspector right, and &lt;strong&gt;Reset layout&lt;/strong&gt; in Settings puts you back there in one click. Splitters work from the keyboard too.&lt;/p&gt;
&lt;p&gt;Before any of this was called done, I ran the whole shell against my real scene in the browser, read-only. It passed, and it also found two real bugs: the editor could open on a theme that had been retired, and Space on a focused switch did nothing. Both were fixed the same night.&lt;/p&gt;
&lt;h2&gt;The desktop editor runs its own engine&lt;/h2&gt;
&lt;p&gt;The desktop editor used to need a backend started by hand. Now Settings has an Engine section: point it at the engine&amp;#39;s folder, press Start, and the editor checks that the folder is the right one, that nothing already answers, and that the database is up, and only then starts the engine as a child process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-22-the-shell-the-engine-and-a-front-door/engine-running.png&quot; alt=&quot;The Engine row in Settings showing the engine running, with Start and Stop&quot;&gt;&lt;/p&gt;
&lt;p&gt;I ran it for real, against the real engine and database: about 6.6 seconds from pressing Start to &amp;quot;Running&amp;quot;, and about 3 seconds from Stop to &amp;quot;Stopped&amp;quot; with the engine confirming it had flushed its scenes. Quitting the editor takes the engine with it.&lt;/p&gt;
&lt;p&gt;There is an option to keep the engine running after the editor quits, and it had a Windows quirk worth a paragraph. A program started from another inherits every inheritable handle its parent holds, not only the three it was meant to get. A kept engine was therefore quietly holding on to the editor&amp;#39;s own debugging socket after the editor had gone, so the next launch couldn&amp;#39;t use it. The fix is a tiny launcher that starts the engine and passes it only the handful of pipes it needs. After the editor dies, it no longer owns anything.&lt;/p&gt;
&lt;h2&gt;Forge has a front door&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-22-the-shell-the-engine-and-a-front-door/forge-sign-in.png&quot; alt=&quot;The new Forge sign-in card: Sign in with GitHub, or an email and password&quot;&gt;&lt;/p&gt;
&lt;p&gt;Forge, the git manager, used to trust one shared key, so anyone who reached it was effectively me. That was fine for one person and wrong for a team. Forge now has people.&lt;/p&gt;
&lt;p&gt;You can sign in with an email and password, or with GitHub. A new account gets a one-time password that must be changed on first use. Wrong passwords and unknown emails get the same answer, and repeated failures are rate-limited. The card shows when a key is still the shipped default, and refuses to run until it is changed.&lt;/p&gt;
&lt;p&gt;GitHub here means identity, not git access. When you sign in, Forge reads your GitHub id and your primary verified email, then throws the token away. It is never stored and never logged. That matches the rule I&amp;#39;m building toward for the team: a teammate should only ever see the repos their own GitHub account can reach, never mine through my token, and nothing of theirs should sit on my server. The sign-in half is done; the repo-visibility half is still ahead.&lt;/p&gt;
&lt;p&gt;Desktop apps have no browser cookie, so DD-ReForged and the editor use a device flow. The app asks Forge for a short code and shows it, you open Forge in your browser, type the code and approve.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-22-the-shell-the-engine-and-a-front-door/device-approval.png&quot; alt=&quot;The Approve a device page, naming the app that is asking&quot;&gt;&lt;/p&gt;
&lt;p&gt;The code is never put in a link, so a phishing message can&amp;#39;t carry it. The page names the app and where the request came from, and the shared key cannot approve a device. Only a signed-in person can.&lt;/p&gt;
&lt;h2&gt;DD-ReForged 0.3.2, for the team&lt;/h2&gt;
&lt;p&gt;The review build for the team is 0.3.2, with a matching VS Code extension. It stops Settings saves from restarting the local agent unless a setting the agent actually reads has changed, makes a restart wait up to 30 seconds for a busy agent, and keeps a redacted log per profile. Building it found that the agent change had broken the packaged app in a way the tests hadn&amp;#39;t caught, so that was fixed and guarded before it went out.&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;The repo-visibility rule for the team, then the desktop editor&amp;#39;s remaining slices.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The rebuild starts: a desktop app and its first plugin</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-21-the-rebuild-starts/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-21-the-rebuild-starts</id>
    <published>2026-10-21T12:00:00.000Z</published>
    <updated>2026-10-21T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;A day after round one of the designs was approved, the code started. Four pieces landed today.&lt;/p&gt;
&lt;h2&gt;A desktop app&lt;/h2&gt;
&lt;p&gt;The editor now runs as its own desktop app on Windows, built with Electron, with its own
installer. The browser version keeps working alongside it.&lt;/p&gt;
&lt;p&gt;The interesting part was closing it. The editor saves your work a moment after each edit, so
closing the window has to save the last edit first. The plan assumed that a page closing itself
from a script would raise the same &amp;quot;about to close&amp;quot; event as clicking the X. It doesn&amp;#39;t. In
Electron the window simply goes, with no close event at all. So now every way out (the X,
quitting, Windows shutting down) waits up to a second while the last draft is written, and the
page saves its own work on the one event that still fires on its way out.&lt;/p&gt;
&lt;h2&gt;The new title bar&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-21-the-rebuild-starts/title-bar.png&quot; alt=&quot;The title bar as designed in Figma on October 19, and as built on October 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first slice of the new shell is in: the frame, the title bar with the menus and the
transport in the middle, the Forge and Blue themes, and the dock layout underneath. It&amp;#39;s checked
against the Figma frames screenshot by screenshot. The scene switcher, the modes and command
search come in the next slices.&lt;/p&gt;
&lt;h2&gt;Plugins, for real&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-21-the-rebuild-starts/plugin-guard.png&quot; alt=&quot;The plugin manager refusing to turn off a plugin with unsaved work&quot;&gt;&lt;/p&gt;
&lt;p&gt;The plugin host is in. Plugins can add commands, menu entries, windows and settings pages, and a
Plugins manager lists them and turns them on and off. The test plugin above has an unsaved
draft, so the manager won&amp;#39;t turn it off until that draft is dealt with. That&amp;#39;s the close guard
from the designs, working.&lt;/p&gt;
&lt;h2&gt;Jobs, the first plugin&lt;/h2&gt;
&lt;p&gt;The Jobs window, which follows imports, sprite bakes and exports on the server, is now the first
plugin that ships with the editor. Turn it off and its window, its menu entry and its status
item all disappear. Turn it back on and it comes back exactly where it was.&lt;/p&gt;
&lt;h2&gt;Every review found something&lt;/h2&gt;
&lt;p&gt;Every piece is reviewed before it&amp;#39;s merged, and every review found something real. My favourite:
the editor used the Space bar for Play and Pause everywhere, so pressing Space on a focused
button in any tool window started the simulation instead of pressing the button. Buttons get
their Space bar back now.&lt;/p&gt;
&lt;h2&gt;Next&lt;/h2&gt;
&lt;p&gt;More of the shell (the activity bar, dock tabs and the command palette), then the rest of the
tools move into plugins one at a time. Round three of the designs is drawn and waiting for review.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Round two: play, previews and Frieze</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-21-round-two-play-previews-and-frieze/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-21-round-two-play-previews-and-frieze</id>
    <published>2026-10-21T12:00:00.000Z</published>
    <updated>2026-10-21T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Round two of the editor designs was approved today. Round one was the frame and the everyday
tools. Round two is everything you do in the editor besides building.&lt;/p&gt;
&lt;h2&gt;Play mode&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-21-round-two-play-previews-and-frieze/play-mode.png&quot; alt=&quot;Play mode: the layout changes, the inspector reads out live state, and scripted sequences sit in a panel at the bottom&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pressing Play switches to a Play layout instead of just setting the viewport running. The
inspector becomes a live readout of the selected character: its position and velocity, which
behaviour-tree node it&amp;#39;s running and what&amp;#39;s on its blackboard. Values update live, but edits
wait until Stop, so nothing you poke at while playing quietly ends up saved. Dialogue and
scripted sequences get their own panel, with Play, Cancel and Replay.&lt;/p&gt;
&lt;h2&gt;Frieze as a plugin&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-21-round-two-play-previews-and-frieze/frieze-plugin.png&quot; alt=&quot;Frieze at the Review step: an eight-direction sprite sheet with its animation states, palette and frame events&quot;&gt;&lt;/p&gt;
&lt;p&gt;Frieze, the sprite maker, moves out of a floating window and into a document tab of its own.
Models and drawings sit on the left, the live preview and the whole sheet in the middle, and the
sheet&amp;#39;s settings on the right: cell size, eight directions, palette, rig, animation states, and
frame events such as which frames of the walk play a footstep. Batch re-bakes run as server jobs
in the panel underneath.&lt;/p&gt;
&lt;h2&gt;Seeing it on a phone&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-21-round-two-play-previews-and-frieze/phone-preview.png&quot; alt=&quot;Previewing the game on an iPhone 14 Pro with its safe area and touch controls. This is a design mock-up, so the numbers are placeholders.&quot;&gt;&lt;/p&gt;
&lt;p&gt;The game ships to phones and Steam, so the editor will preview it on them: an iPhone, a Galaxy
Fold, a Steam Deck or a desktop screen, in portrait or landscape, with the safe area drawn in
and the touch controls where a thumb would land. There&amp;#39;s even a fake language that makes every
string 40% longer, to check the HUD text still fits before a real translation finds out the hard
way. A banner says plainly that a preview is an estimate, not a measurement, and a real run on
the device is one command away.&lt;/p&gt;
&lt;h2&gt;And the rest&lt;/h2&gt;
&lt;p&gt;Round two also covers a 3D dev tools mode for performance work, with a benchmark that flies the
demo camera and a warning when a scene goes over a phone&amp;#39;s budget. And it has a first run for
brand-new world builders: a short setup, a starter level, a tour, and a choice between a simpler
World builder layout and the full editor. As the screen puts it: your helpers can each pick
their own.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Design first: drawing the new editor</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-20-design-first/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-20-design-first</id>
    <published>2026-10-20T12:00:00.000Z</published>
    <updated>2026-10-20T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;The rebuild has started, and the first tool I picked up wasn&amp;#39;t a code editor. The new Prometheus
editor is being designed in Figma first, approved screen by screen, and only then built. The
rule for the whole rebuild: the design comes first, changes go into the design, and then the
code changes to match.&lt;/p&gt;
&lt;h2&gt;The shell&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-20-design-first/shell.png&quot; alt=&quot;The new editor shell in the Forge theme. The labels in the margins mark which parts are plugin slots.&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is the frame everything else plugs into. It&amp;#39;s drawn as the desktop app, with a browser
version kept alongside.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The title bar&lt;/strong&gt; holds the menus, a scene switcher, the modes (Build, Play and 3D dev tools),
command search, and the Play, Pause, Stop and Delve controls, right up in the title bar where
they&amp;#39;re always in reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The dock zones&lt;/strong&gt; on the left, right and bottom take tabs, and the middle holds documents, so
a scene and the tools I&amp;#39;m using open side by side, like files in a code editor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The status bar&lt;/strong&gt; shows the engine connection, whether my changes are saved, notifications,
frame stats and the device budget.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A plugin can only add UI through a small set of slots, and every slot on every frame is drawn
with its way in: a menu path, an icon, a command or a shortcut. If you can&amp;#39;t find a feature, it
might as well not exist.&lt;/p&gt;
&lt;h2&gt;Everyday editing&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-20-design-first/scene-editing.png&quot; alt=&quot;Scene editing: hierarchy, viewport and inspector. The right-click menu has a &amp;quot;From plugins&amp;quot; section, and an undo toast confirms the move.&quot;&gt;&lt;/p&gt;
&lt;p&gt;The everyday loop is select, move, edit, undo, save. Plugins show up where you&amp;#39;d look for
them. Here a Lightning plugin adds &amp;quot;Strike from this light&amp;quot; to the right-click menu and its own
section to the inspector, with a small badge saying which plugin it came from.&lt;/p&gt;
&lt;h2&gt;Turning a plugin off&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-20-design-first/plugin-off.png&quot; alt=&quot;Turning off a plugin that owns data: its records are held, locked and kept by saves, never dropped.&quot;&gt;&lt;/p&gt;
&lt;p&gt;The plugin manager lists what&amp;#39;s installed, what each plugin adds and where to find it, what it
needs and what needs it. Core plugins are always on.&lt;/p&gt;
&lt;p&gt;The interesting part is turning one off. If the Lightning plugin owns three things in the scene,
the editor doesn&amp;#39;t delete them or pretend they&amp;#39;re gone. It holds them, shows them locked and
keeps saving them, so turning the plugin back on brings everything back. That&amp;#39;s
&lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-10-the-save-that-deleted-things/&quot;&gt;the save that deleted things&lt;/a&gt;, designed out
from the first sketch.&lt;/p&gt;
&lt;h2&gt;Round one, approved&lt;/h2&gt;
&lt;p&gt;Round one is six screens: the shell, scene editing, the plugin manager, settings with a page
per plugin, the Jobs panel as the first real plugin, and the project&amp;#39;s git tools living inside
the editor. Each one is drawn in two themes, Forge and Blue, along with every state it can be
in: loading, offline, a plugin failing at start-up, a version conflict while two people edit the
same scene, a script with a compile error. I approved them today.&lt;/p&gt;
&lt;p&gt;Round two is next: Play mode, 3D dev tools mode, Frieze as a plugin, a first run for brand-new
world builders, and previews of the game on a phone and on Steam from inside the editor.&lt;/p&gt;
&lt;h2&gt;On the calendar&lt;/h2&gt;
&lt;p&gt;To be honest about time: with a full rewrite in front of it, the first vertical slice now looks
more like mid to late 2027 than the end of this year. The &lt;a href=&quot;https://blog.prometheanworks.dev/roadmap/&quot;&gt;roadmap&lt;/a&gt; has the details.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A plugin-shaped future</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-18-plugins-and-the-rebuild/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-18-plugins-and-the-rebuild</id>
    <published>2026-10-18T12:00:00.000Z</published>
    <updated>2026-10-18T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;The &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-10-18-catching-up/&quot;&gt;catching-up post&lt;/a&gt; ended with development pausing for a
rebuild. Here&amp;#39;s the thinking behind it.&lt;/p&gt;
&lt;h2&gt;The problem&lt;/h2&gt;
&lt;p&gt;Today, adding something to Prometheus means editing the core in a dozen places: the list of
entity kinds, the component registry, the inspector, the menus, the tool windows, the frame loop,
the save system, the event catalogue, script commands, the exporter and the server&amp;#39;s validators.
Nothing can be switched off without deleting code, and nothing outside the core can add to the
engine.&lt;/p&gt;
&lt;h2&gt;Plugins, widgets and modes&lt;/h2&gt;
&lt;p&gt;The rebuild turns each of those places into a socket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-plugins-and-the-rebuild/plugin-layers.png&quot; alt=&quot;The planned layers: a core every project needs, built-in plugins on by default, optional plugins on top, and modes that bundle them&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;plugin&lt;/strong&gt; is a package that adds capabilities: new kinds of entity, components, simulation
systems, script commands, importers, server jobs.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;widget&lt;/strong&gt; is a piece of UI a plugin brings with it: a tool window, an inspector section, a
menu item.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;mode&lt;/strong&gt; is a named bundle of plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Modes are the part I&amp;#39;m most excited about. The same engine could be a game, a simulation or a 3D
development tool depending on which mode you load, even one that renders apps or websites in 3D
and lets you take them apart.&lt;/p&gt;
&lt;h2&gt;What stays in the core&lt;/h2&gt;
&lt;p&gt;Not everything becomes optional. The core keeps what every project needs: scene formats, edits
and undo, saving and recovery, and the renderer and simulation lifecycle. The everyday tools,
like the hierarchy, inspectors, scene browser and asset browser, ship as built-in plugins that
are on by default. Specialist tools become optional plugins: sprite tools, retargeting,
behaviour-tree authoring, generation labs, and git and review tools.&lt;/p&gt;
&lt;h2&gt;The rule it can&amp;#39;t break&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Unloading a plugin never loses data.&lt;/strong&gt; A scene that uses a plugin you don&amp;#39;t have loaded must
still open, save, restore and export with that plugin&amp;#39;s data intact, held exactly as it was.
It&amp;#39;s &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-10-the-save-that-deleted-things/&quot;&gt;the save that deleted things&lt;/a&gt;, grown up:
missing isn&amp;#39;t the same as unavailable, so hold, don&amp;#39;t drop.&lt;/p&gt;
&lt;h2&gt;The desktop and beyond&lt;/h2&gt;
&lt;p&gt;The editor is moving into a desktop app built on Electron, and it will keep running in a browser
too. Further out there are two ideas: a faster backend, possibly in Rust, that can still run the
TypeScript plugins, and a Figma connection for managing models and their updates. Those are
plans, not promises.&lt;/p&gt;
&lt;p&gt;The order is: settle the plugin contracts, build a minimal desktop editor, then move the first
tool out of the core and into a plugin. After that the rest follow, one at a time.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Catching up: two months of Prometheus</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-18-catching-up/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-18-catching-up</id>
    <published>2026-10-18T12:00:00.000Z</published>
    <updated>2026-10-18T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Two months and a little over 1,800 commits in, this is where Prometheus stands, with links to
the posts that go deeper. It ends with why development is pausing for a rebuild.&lt;/p&gt;
&lt;p&gt;Quick reminder of the goal: &lt;strong&gt;Prometheus&lt;/strong&gt; is a custom 2.5D engine with a browser-based editor.
The world is fully 3D; the characters and props in it are 2D pixel-art sprites. Everything is
being built toward &lt;em&gt;Forgotten Memories, Endless Abyss&lt;/em&gt;, an online MMO set in an endless dungeon
that reshapes itself around how its players behave. The game itself is still a future milestone.
Right now the work is the engine and the tools.&lt;/p&gt;
&lt;h2&gt;The editor and the server&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-catching-up/reforged.png&quot; alt=&quot;The Re-Forged showcase scene in the editor: lightning, particle effects, camera paths and sprite characters&quot;&gt;&lt;/p&gt;
&lt;p&gt;The editor is a remote session into a backend that owns the simulation. The browser renders
locally and trades state snapshots with the server rather than streaming video. In September
that hit its first real milestone: two browser tabs editing the same scene at once, with undo
carrying across them and nothing lost when a tab refreshes mid-edit. The same simulation
package runs on the server in the editor and locally in an exported game, so what you test is
what ships. More in &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-12-the-server-owns-the-world/&quot;&gt;The server owns the world&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On top of that there&amp;#39;s now most of what you&amp;#39;d expect from a scene editor: a hierarchy and
inspector, a four-pane quad view, lights and shadows, materials, post-processing, particle
effects (campfires with flames, smoke and embers, wall torches, lightning), Rapier physics, and
camera rails for fly-throughs. Scenes keep a version history you can preview and roll back, and
the editor recovers unsaved edits after a crash.&lt;/p&gt;
&lt;p&gt;Every feature that lands also goes into one showcase scene, &lt;strong&gt;Re-Forged&lt;/strong&gt;, which has a guided
tour that walks through the engine feature by feature. It&amp;#39;s the scene in the screenshot above,
and it&amp;#39;s how I check that new work actually reaches the screen and doesn&amp;#39;t just pass its tests.&lt;/p&gt;
&lt;h2&gt;Frieze: from 3D models to pixel sprites&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-catching-up/sprite-generator.png&quot; alt=&quot;The sprite generator baking an animated character from a 3D model&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every sprite in the game starts life as a real 3D model. &lt;strong&gt;Frieze&lt;/strong&gt; imports the model, borrows
animation clips from a shared library and retargets them to the model&amp;#39;s rig, then captures it
from several angles and bakes the result into pixel-art sprite sheets. It has its own palettes,
a pixel editor for touch-ups, and batch re-baking when a source changes. More in
&lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-15-frieze-pixel-art-from-3d/&quot;&gt;Frieze: pixel art from 3D models&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-catching-up/frieze-review.png&quot; alt=&quot;Frieze reviewing an imported prop, with the import report beside it&quot;&gt;&lt;/p&gt;
&lt;p&gt;The sprites also bake a normal map, so a flat sprite catches light from the 3D scene around it:
a torch on its left lights its left side. The whole route, from importing a model to baking it,
publishing it and placing it in a scene, is now one workflow with a readable report at each step.&lt;/p&gt;
&lt;h2&gt;Walking around: Delve&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-catching-up/delve.png&quot; alt=&quot;Delve: a third-person 2.5D camera following a sprite character&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delve&lt;/strong&gt; is the first mode where you actually walk around: a third-person camera at a 35° tilt
following a sprite character, with the billboards turning to face the camera and switching
animation frames as they move. The first stress test put fifty animated billboards in a scene
and held a mean of 12.7 ms per frame on my desktop. That&amp;#39;s a dev machine, not a phone, so it&amp;#39;s a
baseline, not a verdict. More in &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-18-first-steps-in-delve/&quot;&gt;First steps in Delve&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The gameplay foundation&lt;/h2&gt;
&lt;p&gt;None of this is gameplay yet, but most of what gameplay will stand on now exists (more in
&lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-10-06-teaching-sprites-to-think/&quot;&gt;Teaching sprites to think&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Input:&lt;/strong&gt; keyboard, mouse and gamepad, with rebinding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI:&lt;/strong&gt; widgets and HUD panels with anchoring, focus and keyboard/gamepad navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scripting:&lt;/strong&gt; script files edited in your own editor and watched from disk, with type
checking, readable errors and shared scripts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI:&lt;/strong&gt; behaviour trees with a shared blackboard, sensing and perception, navigation, and
crowds that send a couple of hundred agents to one goal along a shared flow field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systems:&lt;/strong&gt; physics queries and collision layers, an event bus, a game clock, sprite
animation states, dialogue, localisation, entity pooling and a component model.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Built for phones&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-18-catching-up/budget-hud.png&quot; alt=&quot;The budget readout comparing a running scene against mobile limits&quot;&gt;&lt;/p&gt;
&lt;p&gt;The game is aimed at mobile, so the editor measures every scene against a device budget:
triangles, draw calls, texture memory, sprite sheets and entity counts, each checked against
mobile, browser and desktop limits. The world is split into regions that load and unload
around the camera, so distant areas give their memory back and come back intact when you
return. A scene can also be exported as a static build that runs with no backend at all. More,
including the first numbers from real phones, in
&lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-10-09-will-it-run-on-a-phone/&quot;&gt;Will it run on a phone?&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s next: a pause to rebuild&lt;/h2&gt;
&lt;p&gt;Two decisions have changed the plan. The editor is moving into a desktop app built on
Electron, and the platform is becoming plugin-based, so features plug into a core rather
than being built into it. Together those mean a full rewrite. So development is on pause
while I rework: new designs in Figma, and the platform redesigned from the plugin
perspective from the ground up. More in &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-10-18-plugins-and-the-rebuild/&quot;&gt;A plugin-shaped future&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The engine work is more or less done. What it needs now is more thought about how to make
the rest of the game a reality on top of it. The biggest piece of that thinking is the living
world. The dungeon won&amp;#39;t be a complete map hidden under fog; ground that nobody has reached
doesn&amp;#39;t exist yet. Terrain is generated as players, and monsters, actually travel into it. A
monster wandering off on its own extends the world along the path it walks, without revealing
that ground to anyone. What each player has discovered stays private to them, while the
terrain itself is shared by everyone. More in
&lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-09-22-a-world-that-isnt-there-yet/&quot;&gt;A world that isn&amp;#39;t there yet&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Three stores, one launch&lt;/h2&gt;
&lt;p&gt;Beyond the editor, the game still needs a mobile version for the App Store and Google Play,
and a Steam version for PC. All three will release at the same time. That&amp;#39;s a substantial
undertaking for a solo developer.&lt;/p&gt;
&lt;h2&gt;Not entirely solo&lt;/h2&gt;
&lt;p&gt;My teenagers are studying engineering and will, I hope, help me design and build the game
world. A few friends are taking on the music and ambience, playing the first vertical slice
as they write for it. That slice is the next real milestone: maybe later this year, maybe
early 2027, we&amp;#39;ll have something to show for all the hard work. There&amp;#39;s a lot to do until
then, so stand by.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The tools behind the tools</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-17-the-tools-behind-the-tools/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-17-the-tools-behind-the-tools</id>
    <published>2026-10-17T12:00:00.000Z</published>
    <updated>2026-10-17T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Prometheus has a sibling: &lt;strong&gt;Forge&lt;/strong&gt;, a set of project tools that lives in the same repository and
runs beside the editor. It started life as tools I&amp;#39;d built for earlier projects, got ported in
under new names, and has grown since.&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s in it&lt;/h2&gt;
&lt;p&gt;The names follow the rule from &lt;a href=&quot;https://blog.prometheanworks.dev/posts/2026-07-20-reforged-from-the-ashes/&quot;&gt;the start of the project&lt;/a&gt;:
tools that build the game get fire and forging names, and systems inside the game get abyss and
memory names.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anvil&lt;/strong&gt; handles repositories, branches, git operations, code review and pull requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ember&lt;/strong&gt; is Anvil&amp;#39;s commit graph.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bench&lt;/strong&gt; has the boards and cards, a burndown chart and a roadmap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kiln&lt;/strong&gt; is the documentation library. Every project document is versioned and has a review
queue: propose a change, approve it or send it back, and the approved version is written to
disk.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The file is the truth&lt;/h2&gt;
&lt;p&gt;Work is tracked as plain Markdown files, one per issue, numbered, with a status line at the top.
The board cards are a mirror of those files, not the other way round. As of this week the
mirroring is automatic: change a file and its card updates within seconds, and Forge syncs
everything once when it starts.&lt;/p&gt;
&lt;p&gt;Why files? Because they live in git with the code. An issue&amp;#39;s history sits next to the commits
that closed it, nothing is locked inside a database, and the whole plan for the game is
something I can search.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Stocking the shelves</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-10-stocking-the-shelves/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-10-stocking-the-shelves</id>
    <published>2026-10-10T12:00:00.000Z</published>
    <updated>2026-10-10T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;A sprite generator is only as good as what you feed it, so this week went into the pantry.&lt;/p&gt;
&lt;h2&gt;Animations&lt;/h2&gt;
&lt;p&gt;About 2,400 animation files, sorted by what they do (locomotion, idles, gestures, unarmed combat
and so on) and by which skeleton they were made for. Clips made for one skeleton don&amp;#39;t fit
another without retargeting, so that sorting matters more than it sounds. A search finds what
you need. &amp;quot;Zombie&amp;quot; turns up 44 files, which is more zombie than I expected to own.&lt;/p&gt;
&lt;p&gt;Every original file is fingerprinted, so I can prove nothing has been changed or lost. Twelve
exact duplicates are kept on purpose. I&amp;#39;ve learned not to delete things on a hunch.&lt;/p&gt;
&lt;h2&gt;Models&lt;/h2&gt;
&lt;p&gt;For the world itself: 409 models from two of Kenney&amp;#39;s free CC0 packs, the Nature Kit with 329
models and the Survival Kit with 80. Trees, rocks, cliffs, fences, logs and barrels.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-10-stocking-the-shelves/kenney-packs.png&quot; alt=&quot;Kenney&amp;#39;s Nature and Survival kits in the library: 409 CC0 models waiting to become sprites&quot;&gt;&lt;/p&gt;
&lt;p&gt;They&amp;#39;re split into 13 import batches by category, at most 80 to a folder, each with its licence
and source kept alongside. Next stop for them is Frieze, to come out the other side as pixel-art
sprites. Thanks to Kenney for making these free for everyone.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Will it run on a phone?</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-09-will-it-run-on-a-phone/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-09-will-it-run-on-a-phone</id>
    <published>2026-10-09T12:00:00.000Z</published>
    <updated>2026-10-09T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;The game is meant for phones first, so this week was about finding out how far the engine is
from that, with real numbers instead of hopes.&lt;/p&gt;
&lt;h2&gt;A budget you can see&lt;/h2&gt;
&lt;p&gt;The editor now measures a scene against a device budget (triangles, draw calls, texture memory,
sprite sheets and entity counts) with separate limits for mobile, browser and desktop. The first
time I pointed it at the showcase scene, it said texture memory was 78% over the mobile budget.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-09-will-it-run-on-a-phone/budget-hud.png&quot; alt=&quot;The budget readout on the showcase scene, flagging texture memory&quot;&gt;&lt;/p&gt;
&lt;p&gt;That turned out to be the meter: it was counting shared textures more than once. Counted
properly, the scene was under budget all along. Phones still shouldn&amp;#39;t download desktop-sized
textures, though, so a new asset pipeline publishes a separate version of each texture per
device, with phone textures capped at 512 pixels. On the showcase scene that takes texture memory
from 131.9 MiB to 83.9 MiB on mobile, well inside the 192 MB budget.&lt;/p&gt;
&lt;p&gt;Draw calls are the open problem. The showcase scene makes 178 of them, and the mobile limit is
100.&lt;/p&gt;
&lt;h2&gt;Streaming the world in&lt;/h2&gt;
&lt;p&gt;The world is split into regions. As the camera moves, nearby regions stay loaded, the next ones
wait warm, and distant ones give back their memory, then come back intact when you return.&lt;/p&gt;
&lt;h2&gt;Exporting a game&lt;/h2&gt;
&lt;p&gt;A scene can now be exported as a static build: plain files that run in a browser with no server
behind them, with the simulation running on the device. That&amp;#39;s the shape a shipped game will
take.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-09-will-it-run-on-a-phone/static-export.png&quot; alt=&quot;A static mobile export running on its own, with its own controls&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Real phones&lt;/h2&gt;
&lt;p&gt;Then the real test. A profiling page runs a fixed workload on the phone itself and records the
results. I ran it on a Galaxy Z Fold7, folded and unfolded, and on an iPhone 14 Pro, against a
hall of about 60 sprites.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-09-will-it-run-on-a-phone/phone-profiler.png&quot; alt=&quot;The on-device profiler, set up on an iPhone 14 Pro&quot;&gt;&lt;/p&gt;
&lt;p&gt;The median frame came in right on 60 fps on the Fold7 (16.6 to 16.7 ms) and a little slower on
the iPhone (19 to 21 ms). The slowest frames ran past the 60 fps budget on both. Treat these as
early samples rather than benchmarks, but the verdict is clear enough: close, not there yet, and
now it&amp;#39;s something I can measure instead of guess.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Teaching sprites to think</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-06-teaching-sprites-to-think/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-06-teaching-sprites-to-think</id>
    <published>2026-10-06T12:00:00.000Z</published>
    <updated>2026-10-06T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;The last few weeks went into the systems game logic will be written on. The last pieces of a
first set landed today, so here&amp;#39;s a tour.&lt;/p&gt;
&lt;h2&gt;Scripts are files&lt;/h2&gt;
&lt;p&gt;Game scripts are ordinary files, so I write them in VS Code instead of a text box in the editor.
With file watching on, saving in VS Code reloads the script in the running editor. Scripts are
type-checked, errors show up where I can see them, and a script that throws no longer drags the
frame down with it.&lt;/p&gt;
&lt;h2&gt;Behaviour trees&lt;/h2&gt;
&lt;p&gt;Characters run behaviour trees: small graphs of decisions like &amp;quot;if you can see the player,
approach; otherwise wander&amp;quot;. Trees share a blackboard, a set of named values characters can read
and write, which is how two characters can hold a conversation or a group can coordinate.&lt;/p&gt;
&lt;h2&gt;Seeing and hearing&lt;/h2&gt;
&lt;p&gt;A character can have a view cone, a hearing range and a memory, and its behaviour tree reads
them. In the editor I can show the cone and the hearing ring and tune them live.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-06-teaching-sprites-to-think/perception.png&quot; alt=&quot;Perception on a sprite: the blue view cone, the hearing ring and their settings&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Getting around, together&lt;/h2&gt;
&lt;p&gt;Characters find routes across the navigation grid. Crowds go one better. When many characters
head for the same goal, the engine builds one flow field, a grid of arrows pointing the way, and
they all read it instead of each searching for its own route. In a test with 200 characters
heading for one goal, that meant zero route searches per second and at most one field build.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-06-teaching-sprites-to-think/crowd.png&quot; alt=&quot;Fifty characters on a shared flow field; each arrow points the way to the goal&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Talking&lt;/h2&gt;
&lt;p&gt;There&amp;#39;s a dialogue system too: lines, choices and branches, with the camera able to move to
whoever is speaking. The first test conversation in the showcase scene goes: &lt;em&gt;&amp;quot;You found the
stairs. Most people forget them.&amp;quot;&lt;/em&gt; Choose &lt;em&gt;&amp;quot;I remember.&amp;quot;&lt;/em&gt; and the reply is &lt;em&gt;&amp;quot;Then the abyss
remembers you too.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-06-teaching-sprites-to-think/dialogue.png&quot; alt=&quot;The dialogue reply floating above the speaker in the showcase scene&quot;&gt;&lt;/p&gt;
&lt;h2&gt;And the rest&lt;/h2&gt;
&lt;p&gt;Gamepads and rebindable controls, UI widgets and HUD panels, an event bus, a game clock,
localisation, collision layers, physics queries for AI, and entity pooling so a burst of spawns
doesn&amp;#39;t stall a frame. None of it is a game yet. It&amp;#39;s the toolbox the game will be built with.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A guided tour of every feature</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-10-05-a-guided-tour-of-every-feature/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-10-05-a-guided-tour-of-every-feature</id>
    <published>2026-10-05T12:00:00.000Z</published>
    <updated>2026-10-05T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Every feature that lands goes into one showcase scene, Re-Forged. By this month it had become a
pile: lights, particles, sprites, widgets and physics props all fighting over the same patch of
floor. So I rebuilt it as a tour.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-05-a-guided-tour-of-every-feature/overview.png&quot; alt=&quot;The tour hall from above: ten stations down a long hall, with the camera flight weaving between them&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Ten stations&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s now a hall 40 metres wide and 140 long, with numbered stations down its length, each with a
sign: a welcome, then sprites and paths, behaviour trees, scripting, physics, lighting,
particles, UI widgets, shared simulation, and a wall of materials. A saved camera flight weaves
between them, so the whole tour plays as a fly-through.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-05-a-guided-tour-of-every-feature/physics.png&quot; alt=&quot;The physics station: a scripted spawner sends balls rolling down a ramp&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-05-a-guided-tour-of-every-feature/particles.png&quot; alt=&quot;Particles and effects: campfire, torch, pyre, fog and lightning&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-10-05-a-guided-tour-of-every-feature/materials.png&quot; alt=&quot;The materials wall: brick lit by three spotlights over a row of materials&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The dry run caught three mistakes&lt;/h2&gt;
&lt;p&gt;I didn&amp;#39;t build the new layout straight into the saved scene. A script built the proposed version
as a private copy, flew a camera to each station and took a picture, without saving anything.
Those pictures caught three problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Invisible signs.&lt;/strong&gt; They stood outside the camera&amp;#39;s view from the walking line, so nobody
would ever have read them. They moved five metres in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A moonlit wall.&lt;/strong&gt; The three spotlights on the brick wall were 30 candela each, eight metres
away. That works out to roughly the light of two full moons. Atmospheric, but not what a
showcase wall needs. They went up to 140.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A distracted camera.&lt;/strong&gt; The fly-through was pointing at the wrong places, and now looks at
the stations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the physics station the spawner dropped four balls while the scene played, and none were left
after Stop, so stopping really does put the world back. Then the layout was saved, and the same
camera run against the saved scene gave the same pictures.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A world that isn't there yet</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-22-a-world-that-isnt-there-yet/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-22-a-world-that-isnt-there-yet</id>
    <published>2026-09-22T12:00:00.000Z</published>
    <updated>2026-09-22T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;This week I pinned down one of the most important rules of the game world, and it changes what
the engine has to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ground that nobody has reached does not exist.&lt;/strong&gt; It isn&amp;#39;t hidden or fogged over; it hasn&amp;#39;t been
generated. The dungeon is endless, so it gets built as it&amp;#39;s explored.&lt;/p&gt;
&lt;h2&gt;Monsters explore too&lt;/h2&gt;
&lt;p&gt;Monsters don&amp;#39;t idle in rooms waiting for a player to show up. They wander, head home, follow
routes, and keep doing it when no player is anywhere near. When a monster walks toward the edge
of the known world, terrain is generated for its path, and only its path. It learns the ground
it has actually walked, not a circle of everything around it, and none of that reveals anything
to players.&lt;/p&gt;
&lt;p&gt;Terrain is shared: once it exists, it exists for everyone. Maps aren&amp;#39;t. What each player has
discovered is theirs alone by default.&lt;/p&gt;
&lt;h2&gt;The rules that hold it together&lt;/h2&gt;
&lt;p&gt;A few engine rules fall out of that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nothing walks on nothing.&lt;/strong&gt; Before any actor, player or monster, moves into new ground, that
ground is generated and committed, with its collision and navigation. Nobody crosses a blank
region, a guessed bridge or a floor that doesn&amp;#39;t exist yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First come, first fixed.&lt;/strong&gt; Once ground exists, it stays. Otherwise a monster could head home
to its den and find a lake there, because a player&amp;#39;s arrival had regenerated the area. A player
who turns up later finds the same trails, dens and residents the monster left.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Budgets.&lt;/strong&gt; An endlessly wandering monster could otherwise generate an endless world with
nobody in it. Generation distance, active populations and simulation time all have limits,
and when one runs out a monster waits at the edge rather than inventing ground.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reproducible from history.&lt;/strong&gt; A seed alone can&amp;#39;t rebuild a world shaped by what happened in
it, so the engine keeps the seed, the generator version, the behaviour that shaped the world
and everything that was committed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not flat.&lt;/strong&gt; Hills, valleys, cliffs, gaps and water. One spot on the map can hold a bridge
above a cave, so a single height per point isn&amp;#39;t enough.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where it starts&lt;/h2&gt;
&lt;p&gt;None of this is gameplay yet. These are engine requirements, and the first building block
arrived the same day: navigation. The editor can now bake a grid that says where an agent of a
given size fits, and find a route across it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-22-a-world-that-isnt-there-yet/navigation-grid.png&quot; alt=&quot;A baked navigation grid: green cells fit an agent, red cells are blocked, and the pink line is a route&quot;&gt;&lt;/p&gt;
&lt;p&gt;Today that works on flat floors in scenes I&amp;#39;ve built by hand. Terrain that generates itself as
monsters walk into it is the long road from here.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>First steps in Delve</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-18-first-steps-in-delve/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-18-first-steps-in-delve</id>
    <published>2026-09-18T12:00:00.000Z</published>
    <updated>2026-09-18T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Until this week, Prometheus was something you looked at. Now you can walk around in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delve&lt;/strong&gt; is the engine&amp;#39;s first walking mode. A third-person camera tilted at 35° follows a
sprite character, and every billboard in the scene turns to face the camera, picking the right
direction and animation frame as it moves. It runs inside the editor, so I can step into a scene
I&amp;#39;m building, walk around it, and step back out to carry on editing.&lt;/p&gt;
&lt;h2&gt;Input that isn&amp;#39;t tied to a keyboard&lt;/h2&gt;
&lt;p&gt;Delve brought the input system with it. Game code never asks &amp;quot;is W pressed?&amp;quot;. It asks for
actions like &lt;em&gt;move&lt;/em&gt; and &lt;em&gt;turn&lt;/em&gt;, and whatever the player is holding supplies them. On a keyboard
that&amp;#39;s the usual keys. On a touchscreen a virtual stick appears bottom-left, with turn buttons
on the right:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-18-first-steps-in-delve/touch-controls.png&quot; alt=&quot;Delve with touch controls: a virtual stick bottom-left, turn and exit buttons bottom-right&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hide the editor around it and what&amp;#39;s left is what a player would see:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-18-first-steps-in-delve/player-view.png&quot; alt=&quot;The same character with the editor hidden: the player&amp;#39;s view&quot;&gt;&lt;/p&gt;
&lt;h2&gt;How heavy is a crowd of sprites?&lt;/h2&gt;
&lt;p&gt;Every billboard has to be turned, framed and positioned every frame, so I measured that early.
Fifty animated billboards held a mean of 12.7 ms per frame on my desktop while I walked around
them, about 79 frames a second. That&amp;#39;s a development machine, not a phone, so it&amp;#39;s a baseline to
measure later work against rather than a verdict.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Frieze: pixel art from 3D models</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-15-frieze-pixel-art-from-3d/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-15-frieze-pixel-art-from-3d</id>
    <published>2026-09-15T12:00:00.000Z</published>
    <updated>2026-09-15T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Every character and prop in Prometheus is a 2D pixel-art sprite standing in a 3D world. Drawing
all of those by hand, from eight directions, for every animation, isn&amp;#39;t something a solo
developer can do. So the engine makes them. The tool is called &lt;strong&gt;Frieze&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Models in, sprite sheets out&lt;/h2&gt;
&lt;p&gt;Frieze takes a 3D model, poses it with animation clips, captures it from several angles and bakes
each frame into pixel art at a fixed size, then packs the frames into a sprite sheet. Clips can
come with the model or be borrowed from a shared library and retargeted to the model&amp;#39;s skeleton,
so one walk cycle can serve many characters.&lt;/p&gt;
&lt;p&gt;It also works from 2D art. A drawing can be given joints and animated with the same library
clips. For testing that I used a free character turnaround from OpenGameArt:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-15-frieze-pixel-art-from-3d/turnaround.png&quot; alt=&quot;A CC0 character turnaround by Technopeasant on OpenGameArt, used to test rigging 2D art&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Palettes&lt;/h2&gt;
&lt;p&gt;A sheet can be indexed, so each colour belongs to a palette slot. Change a slot and the character
changes colour everywhere it appears, with no new bake. The green-trousered character here is
the same artwork as the blue one, with four of its thirteen palette slots changed:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-15-frieze-pixel-art-from-3d/palette-swap.png&quot; alt=&quot;Two characters from one bake, four palette slots apart&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Touching up by hand&lt;/h2&gt;
&lt;p&gt;Automatic isn&amp;#39;t always right, so Frieze has a pixel editor built in, with onion skinning across
frames. A bad frame can be fixed in place without leaving the tool or re-baking the sheet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-15-frieze-pixel-art-from-3d/pixel-editor.png&quot; alt=&quot;The pixel editor inside Frieze, with its tools, palette and frame strip&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Sprites that catch the light&lt;/h2&gt;
&lt;p&gt;Each bake also produces a normal map, so a flat sprite reacts to the 3D lights around it: a
campfire on its left lights its left side.&lt;/p&gt;
&lt;p&gt;That led to my favourite bug so far. Seen from behind at a low angle, a character&amp;#39;s shoes glowed
white-hot, as if lit from inside:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-15-frieze-pixel-art-from-3d/glowing-shoes-before.png&quot; alt=&quot;Before: the shoes glow at a grazing angle&quot;&gt;&lt;/p&gt;
&lt;p&gt;The cause was in the sprite material. A tweak that softens how light wraps around a sprite was
also being applied to its reflections, and at grazing angles that amplified the reflection
enormously, even on a completely rough surface. Limiting the softening to diffuse light fixed it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-15-frieze-pixel-art-from-3d/glowing-shoes-after.png&quot; alt=&quot;After: the same view, correctly shaded&quot;&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The server owns the world</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-12-the-server-owns-the-world/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-12-the-server-owns-the-world</id>
    <published>2026-09-12T12:00:00.000Z</published>
    <updated>2026-09-12T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;The editor passed its first real milestone today, so it&amp;#39;s a good moment to explain the decision
underneath it.&lt;/p&gt;
&lt;h2&gt;Two ways to put a game in a browser&lt;/h2&gt;
&lt;p&gt;The Prometheus editor runs in a web browser, but the scene lives on a server. There were two ways
to build that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pixel streaming&lt;/strong&gt; renders every frame on the server and streams video to the browser, the way
cloud gaming does; the browser is a remote monitor. That costs a GPU video encoder per viewer,
tens of megabits a second, text and thin lines softened by video compression, and input lag on
every click.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;State streaming&lt;/strong&gt; keeps the renderer in the browser. The server runs the authoritative
simulation (physics, behaviour, game rules) and sends compact updates about what changed; the
browser draws them locally and sends edits back. The research I did put that at a few hundred
times less bandwidth than video, with no server GPU per viewer and a UI that responds at local
speed.&lt;/p&gt;
&lt;p&gt;Prometheus streams state.&lt;/p&gt;
&lt;h2&gt;One simulation, two homes&lt;/h2&gt;
&lt;p&gt;The simulation is a standalone TypeScript package with no browser or server dependencies. In
the editor it runs on the server, which is the authority. In a shipped game there&amp;#39;s no editor
server, so the same package runs on the player&amp;#39;s device.&lt;/p&gt;
&lt;p&gt;Writing it once and hosting it twice is why the backend is TypeScript rather than something
like Rust: the code that ships to players is the code I test in the editor.&lt;/p&gt;
&lt;h2&gt;The milestone&lt;/h2&gt;
&lt;p&gt;Today two fresh browser tabs edited the same scene on the server at once. One tab was refreshed
mid-edit and lost nothing, and undo worked across both tabs. Then I pressed Play in one tab and
watched the simulation from the other, through a full stop and restart of the backend.&lt;/p&gt;
&lt;p&gt;It doesn&amp;#39;t look like much in a screenshot, but everything else stands on it: the editor is a
window onto a world the server owns, and that world survives the window closing.&lt;/p&gt;
&lt;h2&gt;A scene for every feature&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.prometheanworks.dev/images/2026-09-12-the-server-owns-the-world/early-showcase.png&quot; alt=&quot;The showcase scene in its first week: lights, shiny materials, particle fire and smoke, and a camera rail&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every feature also goes into one scene, &lt;strong&gt;Re-Forged&lt;/strong&gt;, so new work can be seen rather than read
about. This is how it looked in its first week: a handful of lights, shiny materials, particle
fire and smoke, and a camera rail for fly-throughs. It will grow with everything that lands.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Six times faster type checking</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-11-six-times-faster-type-checking/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-11-six-times-faster-type-checking</id>
    <published>2026-09-11T12:00:00.000Z</published>
    <updated>2026-09-11T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Prometheus is TypeScript across three workspaces: the editor, the engine backend and Forge, my
project tools. Type checking the lot took about 19 seconds. Today I switched to TypeScript 7,
the native rewrite of the compiler, and it takes under 7.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;TypeScript 5.9&lt;/th&gt;
&lt;th&gt;TypeScript 7&lt;/th&gt;
&lt;th&gt;Faster&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;The editor, whole program&lt;/td&gt;
&lt;td&gt;6.6 s&lt;/td&gt;
&lt;td&gt;0.84 s&lt;/td&gt;
&lt;td&gt;7.9×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All three workspaces, compiler only&lt;/td&gt;
&lt;td&gt;15.8 s&lt;/td&gt;
&lt;td&gt;2.5 s&lt;/td&gt;
&lt;td&gt;6.3×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All three workspaces, full typecheck scripts&lt;/td&gt;
&lt;td&gt;19.3 s&lt;/td&gt;
&lt;td&gt;6.6 s&lt;/td&gt;
&lt;td&gt;2.9×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The full-script number improves less because some of that time isn&amp;#39;t the compiler at all, like
building the shared libraries first.&lt;/p&gt;
&lt;h2&gt;Two catches&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;No language service.&lt;/strong&gt; TypeScript 7 doesn&amp;#39;t ship &lt;code&gt;tsserver&lt;/code&gt;, the part a code editor talks to
for autocomplete and red squiggles. Upgrading in place would have quietly broken my editor. So
the new compiler is installed under an alias beside the old one: TypeScript 7 does the checking
and building, and 5.9 keeps the code editor happy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two programs, one name.&lt;/strong&gt; Both versions install a command called &lt;code&gt;tsc&lt;/code&gt;, and whichever installs
last wins. Installing the alias really did repoint &lt;code&gt;tsc&lt;/code&gt; at the new compiler; I checked rather
than assumed. So no script in the project says a bare &lt;code&gt;tsc&lt;/code&gt; any more. Every one names its
compiler by its full path.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The save that deleted things</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-10-the-save-that-deleted-things/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-10-the-save-that-deleted-things</id>
    <published>2026-09-10T12:00:00.000Z</published>
    <updated>2026-09-10T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;This week I found four bugs that could permanently lose work. They looked unrelated. They turned
out to be the same bug wearing four hats.&lt;/p&gt;
&lt;h2&gt;Four ways to lose a scene&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A save that quietly dropped the scene&amp;#39;s camera fly-through.&lt;/li&gt;
&lt;li&gt;A loader that gave up waiting a moment too early on a cold start, and threw away every rail
that objects were riding along.&lt;/li&gt;
&lt;li&gt;An auto-save guard that pressing Pause switched off, so a running simulation, mid-tumble,
could be saved over the scene you&amp;#39;d actually built.&lt;/li&gt;
&lt;li&gt;An object whose model couldn&amp;#39;t be found was skipped when the scene loaded, and the next
auto-save, sixty seconds later, wrote the scene without it. Opening a scene while the backend
was restarting was enough. No edit required.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The shape&lt;/h2&gt;
&lt;p&gt;Every one went the same way. Something failed to load, for a reason that wasn&amp;#39;t its own fault:
the server was restarting, a cache was cold, a load was still in flight. So it never made it into
the live scene. Then a save came along, looked at the live scene, and wrote down what it saw.&lt;/p&gt;
&lt;p&gt;To a save, something that failed to load looks exactly like something you deleted on purpose.
Nothing complains on either side. The load logs a warning and carries on, and the save looks
perfectly normal. You find out when the thing is gone.&lt;/p&gt;
&lt;h2&gt;Three rules&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Missing isn&amp;#39;t the same as unavailable.&lt;/strong&gt; &amp;quot;This doesn&amp;#39;t exist&amp;quot; and &amp;quot;I couldn&amp;#39;t reach it just
now&amp;quot; are different answers, and only the first is allowed to remove anything. A comment in
the code puts it best: collapsing the two is what let &amp;quot;a backend that was merely restarting
look like a mass deletion.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hold, don&amp;#39;t drop.&lt;/strong&gt; If something can&amp;#39;t be loaded, keep its saved record and write it back
out unchanged. It&amp;#39;s missing from the screen, which is honest. It isn&amp;#39;t missing from the file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teach the guard you already have.&lt;/strong&gt; There was already a check that stops a half-loaded scene
being saved over a full one. Teaching it about these cases beat bolting a second guard on
beside it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All four bugs are fixed. The rules stay: anything new that saves data gets asked what the next
save writes when its load goes wrong.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The game behind the engine</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-09-04-the-game-behind-the-engine/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-09-04-the-game-behind-the-engine</id>
    <published>2026-09-04T12:00:00.000Z</published>
    <updated>2026-09-04T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Before the engine posts start, here&amp;#39;s what all of it is for.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Forgotten Memories, Endless Abyss&lt;/em&gt; is an online MMO built around one shared goal: dive as
deep and as far as possible. Humanity has found a dungeon that seems to have no bottom. It&amp;#39;s so
vast that towns have sprung up just to keep adventurers supplied, and everyone is chasing the
same questions. Does it end? Why does it exist? Is there a story beneath it all?&lt;/p&gt;
&lt;p&gt;The name has some history. &lt;em&gt;Forgotten Memories&lt;/em&gt; was a game idea of mine from college, and it
still has a Steam page from back then. Once there&amp;#39;s a game to talk about, that page will be
carrying this one.&lt;/p&gt;
&lt;h2&gt;A dungeon that reads its players&lt;/h2&gt;
&lt;p&gt;The dungeon isn&amp;#39;t just procedurally generated; it&amp;#39;s behaviourally generated. It watches what
its players do, in aggregate, and reshapes its landscapes, difficulty and monsters to match.
Every layer sits somewhere between order and anarchy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Order&lt;/strong&gt; comes from cooperation, guild work and players policing each other. Monster
pressure eases, towns grow, and blighted ground heals into livable land.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anarchy&lt;/strong&gt; comes from player-killing and hostility. Spawns get nastier, the terrain
degrades toward a hellscape, and town defences can be overrun.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anarchy spreads like a sickness: one pocket, then many, then faster and faster. A layer that
flips blocks fast travel through it and creeps back up toward the shallower layers, so griefing
on a deep floor becomes everyone&amp;#39;s emergency. Nothing is permanently solved. A paradise left
alone can fall again.&lt;/p&gt;
&lt;h2&gt;You can&amp;#39;t die, but you can forget&lt;/h2&gt;
&lt;p&gt;There&amp;#39;s no permadeath. Every revival costs you something instead: fragments of memory.
Abilities you&amp;#39;ve earned can weaken with each revival until they&amp;#39;re gone, becoming Forgotten
Memories. You feel yourself slipping before anything is lost outright.&lt;/p&gt;
&lt;p&gt;The way to get them back is to go deeper. Clearing the dungeon and discovering new layers
recovers what death took, so loss pushes you forward rather than back toward safety. That&amp;#39;s the
title: the endless abyss is the dungeon, and Forgotten Memories are what it costs you, and
what it repays.&lt;/p&gt;
&lt;h2&gt;Holding the line&lt;/h2&gt;
&lt;p&gt;Roughly every ten layers a raid boss blocks the way. Beat it and travel to that depth unlocks
for everyone. But bosses come back. As one nears its return, monsters surge until the layer
breaks out in a stampede, and an ignored break loses that layer, then the ones above it, one by
one. The frontier and the homeland are the same responsibility.&lt;/p&gt;
&lt;p&gt;Towns need supplying too. Players haul materials to keep them running, and an under-supplied
town dries up and loses its services. Guilds form around defence, expansion, exploration or
policing, and a big enough guild can hold a layer, for a while.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s more under the surface than this, and some of it is meant to be discovered by players
rather than read in a devlog, so I&amp;#39;ll leave it there.&lt;/p&gt;
&lt;h2&gt;Why build an engine for it&lt;/h2&gt;
&lt;p&gt;A world like this needs things an off-the-shelf engine doesn&amp;#39;t hand you: a server that owns the
simulation for everyone, the same simulation running on the player&amp;#39;s device in a shipped game,
and a pipeline that turns 3D models into the pixel-art sprites that live in its 3D dungeon. It
also has to run well on phones.&lt;/p&gt;
&lt;p&gt;So I&amp;#39;m building &lt;strong&gt;Prometheus&lt;/strong&gt;, a custom 2.5D engine and editor on an all-open-source stack with
no vendor royalties. The next posts are about that.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Reforged from the ashes</title>
    <link href="https://blog.prometheanworks.dev/posts/2026-07-20-reforged-from-the-ashes/" rel="alternate" type="text/html"/>
    <id>tag:miketec-ra.github.io,2026:prometheus-devlog:2026-07-20-reforged-from-the-ashes</id>
    <published>2026-07-20T12:00:00.000Z</published>
    <updated>2026-07-20T12:00:00.000Z</updated>
    <content type="html">&lt;p&gt;Prometheus didn&amp;#39;t start from nothing. It started from the ashes of something else.&lt;/p&gt;
&lt;p&gt;For about a year before this, a friend and I built an avatar project: animated 3D characters in
the browser, with an editor for building the scenes they lived in. He did a lot of the animation
system and a good share of the engine work. As a product it didn&amp;#39;t work out, but a lot of what
we built was good.&lt;/p&gt;
&lt;p&gt;So rather than throw it away, I went through it for anything worth saving, and there was plenty:
the entity system, the editor&amp;#39;s interface, the renderer and the animation work. The parts that
no longer fit, like the chat layer that let the avatars talk back, were cut out. What was left
is the starting point for something new.&lt;/p&gt;
&lt;h2&gt;A new shape&lt;/h2&gt;
&lt;p&gt;The old project ran everything in the browser. The new one splits it in two: a server owns the
world and runs the simulation, and the browser becomes a window onto it, using the editor and
renderer we already had. The game all this is for is an MMO, so the server has to be in charge
anyway.&lt;/p&gt;
&lt;h2&gt;Why the fire names&lt;/h2&gt;
&lt;p&gt;Everything rebuilt on top of the old project is named for fire and forging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;, who stole fire for humanity, is the engine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forge&lt;/strong&gt; is the project tools, with &lt;strong&gt;Anvil&lt;/strong&gt;, &lt;strong&gt;Ember&lt;/strong&gt;, &lt;strong&gt;Bench&lt;/strong&gt; and &lt;strong&gt;Kiln&lt;/strong&gt; inside it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-Forged&lt;/strong&gt; is the showcase scene, where every rebuilt feature goes to prove it works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The old project was melted down, and this is what gets hammered out of it.&lt;/p&gt;
&lt;p&gt;From here on it&amp;#39;s just me. I&amp;#39;m grateful for the year of work that got it this far. This is
where the devlog picks up.&lt;/p&gt;
</content>
  </entry>
</feed>
