Snappish Productions

I just can't help believing, though believing sees me cursed…

The Future Versus The Past, Part 1: Deathchase

Ever since I first read the World Models paper, there has been a nagging irresistible thought at the back of my mind: “I want to try that out on Deathchase". And, to be fair, I have over the years spent a few Sunday nights trying to make it work. The RNN or the VAE code wasn’t the problem; I have working code on my old 1080Ti PC tower that trains well enough on the example toy racing world. The problem was somehow hooking it up to a Spectrum. I tried a lot of different approaches, including some major surgery to MAME, and I got tantalizingly close, to the point of hand-disassembling Z80 code to work out where information like lives and scores were being kept but never enough to really make it work in a fashion I could run a full training loop without it keeling over and dying a few iterations in.

(you know how this is going to go)

It popped up in my head again recently, and this time I asked Claude. It laughed, saying: “Why do you not just use zx, as it’s basically built exactly for what you want to do?” because I didn’t know it existed, you smug little SkyNet! And then we set to work.

The World Model paper is actually three different models. Firstly, a variational autoencoder (VAE) takes the pixels from the screen (resized in the paper to 64x64, in my code to 84x84) and compresses them down to a latent vector. Just 64 numbers to describe everything going on in every single frame fed into the model. This is then chained into a LSTM network, which takes the latent vectors and learns to predict what comes next. These two models together form the world model; eventually, you can feed a starting frame into the autoencoder and then ‘dream’ the entire sequence of the game inside the LSTM. And this is the trick that seemed magic in 2018; it’s annoyingly hard to do reinforcement learning or any sort of gradient descent work when you have to keep going back to the game state, perhaps in an awkwardly coded emulator. There’s a lot to go wrong. Here, the controller model trains directly on the dream world and then you transfer the trained controller model back to the real world…and it works! Mostly.

Fig 1 · V–M–C pipeline

world model · runs with no environment (the dream)

zₜ

zₜ, hₜ

aₜ

next frame

obs oₜ64×64 frame

V · VAE encodercompress → zₜ ∈ ℝ³²

M · MDN-RNNpredict P(zₜ₊₁ | zₜ, aₜ, hₜ)

C · controller1 linear layer · ~900 params

real environment

V compresses the frame · M predicts the future in latent space · C maps the latent state to an action
mermaid source
flowchart LR
  o["obs oₜ<br/>64×64 frame"]
  subgraph WM["world model · runs with no environment (the dream)"]
    direction LR
    V["V · VAE encoder<br/>compress → zₜ ∈ ℝ³²"]
    M["M · MDN-RNN<br/>predict P(zₜ₊₁ | zₜ, aₜ, hₜ)"]
    V -->|"zₜ"| M
  end
  o --> V
  M -->|"zₜ, hₜ"| C["C · controller<br/>1 linear layer · ~900 params"]
  C -->|"aₜ"| E(["real environment"])
  E -->|"next frame"| o
  classDef ha fill:#2a2214,stroke:#eaa63f,stroke-width:2px,color:#f3e7d4;
  classDef ctl fill:#1b2130,stroke:#cfd6e2,stroke-width:2px,color:#eef2f8;
  classDef io fill:#141a26,stroke:#6b7688,stroke-width:1.5px,color:#c7d0de;
  class V,M ha; class C ctl; class o,E io;
  style WM fill:transparent,stroke:#eaa63f,stroke-dasharray:5 5,color:#c69a52;

After spending an afternoon with Opus a couple of weeks ago, the first discovery was that Ha’s world model…just didn’t work very well for Deathchase. It did learn a grand plan of surviving…which was to slowly go through the first day, shoot at a few things, and simply sit tight when night falls. Which is a strategy, but one that would have got you slapped if you tried it back in the day round your friend’s house. Also, it does have a tendency to hit the trees a lot. But then I have that problem as well.

Despite that, looking at the dream sequences of the VAE model is spooky; you can see exactly what the model is seeing and, yep, well, it’s certainly Deathchase.

Anyhow, I was not to be stopped by that little failure. Because I kept reading these sorts of papers, and I specifically remembered DreamerV3 from DeepMind. Back in 2023 it pretty much set the new state of the art for autonomously playing Atari games. So Claude, myself, and the DGX Spark worked for a day or two to train a new model based on this new approach.

The DreamerV3 framework is a lot more complicated (see the image, yikes!), but I’d say that the too key points are: a CNN model to better capture what’s going on versus the older autoencoder, and a training regime that keeps the world model anchored to reality, with joint training focused on reconstructing the frame, optimising the reward, and whether the model has left the game in a playable state. And this works a lot better.

Fig 2 · the DreamerV3 world model, one timestep

KL: pull prior → posterior

hₜ₋₁ · zₜ₋₁ · aₜ₋₁

sequence modelGRU

hₜdeterministic memory

obs xₜ

encoderCNN

representation qposterior zₜ | hₜ, xₜ

dynamics pprior ẑₜ | hₜ · no obs

state sₜ(hₜ, zₜ)

decoder → x̂ₜ

reward → r̂ₜ

continue → ĉₜ

The prior predicts the latent from memory alone — the dream path; the posterior corrects it using the real observation during learning. The dashed KL ties them together.
mermaid source
flowchart LR
  prev["hₜ₋₁ · zₜ₋₁ · aₜ₋₁"] --> GRU["sequence model<br/>GRU"]
  GRU --> H["hₜ<br/>deterministic memory"]
  X["obs xₜ"] --> ENC["encoder<br/>CNN"]
  ENC --> Q["representation q<br/>posterior zₜ | hₜ, xₜ"]
  H --> Q
  H -.-> P["dynamics p<br/>prior ẑₜ | hₜ · no obs"]
  Q -. "KL: pull prior → posterior" .-> P
  H --> S["state sₜ<br/>(hₜ, zₜ)"]
  Q --> S
  S --> DEC["decoder → x̂ₜ"]
  S --> REW["reward → r̂ₜ"]
  S --> CON["continue → ĉₜ"]
  classDef dr fill:#123039,stroke:#43c0d0,stroke-width:2px,color:#dff3f6;
  classDef prior fill:#123039,stroke:#43c0d0,stroke-dasharray:5 4,color:#dff3f6;
  classDef neut fill:#1b2130,stroke:#8b97ac,stroke-width:1.5px,color:#e9edf6;
  class GRU,H,Q,S dr; class P prior; class prev,X,ENC,DEC,REW,CON neut;

This is Dreamer dreaming of trees and motorbikes, learning how to ride in just 12,000 iterations.

0k2k4k6k8kmaxes the ridelearns to kill 2k steps: return 368, ride 65612k steps: return 1181, ride 150022k steps: return 1232, ride 150032k steps: return 2220, ride 84442k steps: return 3309, ride 126052k steps: return 2330, ride 87662k steps: return 1980, ride 69472k steps: return 3278, ride 125582k steps: return 5862, ride 150092k steps: return 6177, ride 1500102k steps: return 4815, ride 1500112k steps: return 7098, ride 1500122k steps: return 7060, ride 1500132k steps: return 4104, ride 1500142k steps: return 4883, ride 1326152k steps: return 5377, ride 1500162k steps: return 7409, ride 1500172k steps: return 5991, ride 1500182k steps: return 6888, ride 1500192k steps: return 6296, ride 1500202k steps: return 6014, ride 1500212k steps: return 8720, ride 1500222k steps: return 5258, ride 1394232k steps: return 7811, ride 1500242k steps: return 6554, ride 1389252k steps: return 7972, ride 15000k50k100k150k200k250k eval return environment steps
survived the full episode died chasing kills phase marker

And this is Dreamer playing the actual game, having learnt to ride safely and shoot things with 300k steps played in the imagined worlds1

I think we can say it’s mostly solved at this point…but if you don’t believe me, then here’s five minutes of it playing without losing a life.

Of course, now that I had Deathchase sorted, I started thinking about other games. We’ve got another post coming that stays firmly in the 16K era, but is a touch more complicated…and another classic. We’ll be going to Ashby-de-la-Zouch…


  1. Although I will admit that the model is definitely cheesing things by not hitting the full acceleration. ↩︎

DeathchaseUsing 120Gb of VRAM to play a 16K ZX Spectrum gameWe bought it for your homework

It's Been A Week

Current status:

View this post on Instagram

A post shared by Ian Pointer (@carsondial)

(80s bit is delayed a little for reasons. It’s done, but I just can’t face writing it up right now)

stickbird

Then And Now. Plus, BIRDS!

This episode of Horizon from 1978 is an interesting historical look at microprocessors and how they were starting to filter through into the world at large. As a piece of its time, it’s an interesting documentary all by itself, but I was intrigued/amused at the back half, which was all about how white and blue-collar jobs will be eliminated by our 6502 overlords, showing examples of a doctor creating an expert system that would replace consultants, and a building contractor who only had to tell a system how to do something once and then a robot would be able to perfectly replicate the process. Again, 1978. It’s interesting how we now seem to be in the same position, only this time…maybe it’s more real? Or are we getting ahead of ourselves once more, and the advent of Claude/etc. just means a new normal, like how coding in C or Pascal is often much faster than trying to write assembler.

I find I can do more; this weekend, I trained a new model for work, yes, but I did two other things that I could have done myself, but it would have taken weeks and weeks of effort. Firstly, I finally started setting up the smart solar bird feeder I bought during a recent sale. But it wasn’t the brand I somehow assumed it was, and the only way to communicate with it is to use an iOS or Android app, and they want an extra $20/year for sharing the account. I sat down with Claude just after 13:00 on Saturday, and by 15:00, we had mapped out the entire API, pulled out a long-lived JWT token that allows me to authenticate whenever and where-ever, and built a small web server that produces a child-friendly set of HTML cards ready to show Maeryn just what birds have visited today, and hooking up the audio to BirdNET so it’s strictly speaking better AI than what the company is offering through the app alone.

Then, for a laugh on Sunday afternoon, I pointed Claude at the source code for Grid Wars. Every so often, I remember how fun that game was and then I rediscover that the Intel builds currently crash on MacOS. I told Claude to port it to a Rust WASM runtime that could be played in the browser. And damn if it didn’t just go ahead and do it. It required a little hand-holding to get the blur and gravity mesh effects just right…but I can now just play Grid Wars by serving up just a few files on a website1. It is very strange having all these horizons just open up in front of you. And it is something of a siren call; just one more idea that you can run before bedtime, just one more run and you’ll be fixed. I feel like I have stepped away from the edge a couple of times already, but every Friday night, the AI abyss comes around again…

(Next week? Back to the 1980s)


  1. I would put it up publicly, but I seem to recall that the owners of Geometry Wars did get a little affronted back in the day, and I don’t really want to get into trouble. But…if you email me wink wink ↩︎

gloom and doom…but grid wars 2026!

Well, what the hell’s the presidency for?

“By G-d I’ll fight till hell freezes over and then I’ll cut the ice and fight on. TVA Iwo Jima LBJ Pelham-1-2-3 Big Bird The best NASA logo 1976 Bicentennial Logo Tiffany Monkey Island 2 Sneakers Netscape Heat Courtney Love Obama Inauguration 2009 ICE OUT Remember Who You Are, Liberal

It might be surprising, considering I grew up in the irony-poisoned Britain of the 90s, but the last 10 years in this country has made me somewhat patriotic. But that’s patriotic in the sense that I’m now a person who reads the Federalist papers, letters from the Civil War and the biographies of LBJ, and remembering that day in 2009 on the Mall. Patriotism in the sense of I’ll be damned if I let these people desecrate the founding documents of this country and the nation of immigrants that gave rise to the American Century. Patriotism in the service of bending the arc of the moral universe to justice. Patriotism in living our lives as a form of resistance, a happier life than I could ever have imagined, and worth fighting for.

Five words that changed America.

with bill kristol at the barricadesall embarrassing, really, but earnestly

'Ver Curves & 'Ver Boy — 20 Years Later

Honestly, I don’t remember exactly when I joined ILX. I think it was likely in either late 2002 or early 2003, when I was living in Chapel Hill, and for some reason I vaguely believe it was due to searching for information on Saturday Looks Good To Me, which is a little odd, as they’re not exactly an ILM or ILX band. Anyway, I loved hanging out in the background1, making a comment here and there, but mostly being a lurker as Poptimism took root there and I rediscovered my younger Smash Hits reading self (heavens above! — Ed.)

What I really wanted to do is meet up with everybody at Club Popular. But…while I had got to the point where I was relatively okay with going to concerts by myself (seriously, the hours spent awkwardly hanging about before the advent of mobile phones), I was absolutely not okay with making the trip from Bicester to London for a club night all by myself. I just couldn’t do it. Still a regret.

By 2006, I was still mostly lurking, but I had made a friend — Forest Pines, or Caitlin. And ILX had a band! Shimura Curves! ‘Ver Curves! Kate ‘Masonic Boom’, Anna, Frances, and Miss AMP! Krautrock and girl group harmonies! Zeitgeist songs like Noyfriend and Keep My Name Out of Your Blog (there isn’t another song that encapsulates the pre-Facebook Web 2.0 era as perfectly as the latter). They had an afternoon gig on a Sunday when I was already going to be going to London to see Johnny Boy. Suddenly, I was invited to a pre-gig pub meet up with Kate and Caitlin.

So I ended up drinking strawberry beer with them for several hours before we decided we’d better actually go to the Notting Hill Arts Club, Kate carrying her guitar through town. By that time, we’d also picked up Ed, another ILX regular. The concert itself is mostly lost to my memory, but I remember groupie cards kissed by individual band members, banter about Brown and Sticky, and the Berlin, 1973 ending of Stronger.

Even just all that would have made for a wonderful day. But I still had the second half. Johnny Boy at The Luminaire in Kilburn. I was, of course, back on my own, and resigned to standing sheepishly in the venue waiting for the band to come on stage. But it wasn’t quite to be. I’ll admit my memory does not give me perfect recall, but the way I remember it is this: I noticed a group of people sitting in a booth. One of whom I was damn sure was Kieron Gillen, who’d I known in an online sort of way since joining the Kenickie Mailing List back in 1997. Eventually, I worked past my shyness enough to go over and say hello. This was about two months before the first issue of Phonogram, so we talked about that, and me seeing Miss AMP earlier in the day. The idea of just randomly bumping into somebody I knew at a concert…it had just never happened to me before. And given how the day had gone so far, I was getting beyond giddy at this point.

Towards the end of the gig itself, I found myself dancing with him and Alex De Campi. The elation I had coming out of the venue and rushing to get the last train from Marylebone to Bicester North was something I hadn’t felt since that house party in Chapel Hill way back in 2003, or that time I went into the Carrboro woods to smash up a piñata for a late birthday celebration. On the journey back, I think I was plotting…or more realistically, fantasising about the potential of moving to London. Maybe every weekend could be like that, I thought, as I went past Haddenham & Thame Parkway.

Anyway, twenty years ago this week. I never did move to London; instead I took a rather different direction which sees me typing this in Cincinnati. Which I have to say has worked out very well for me, as I pause to think about Maeryn demanding I play drop dead again on the way home from daycare (Tammy: “With me, it’s Wheels On The Bus. There’s apparently a different vibe in Daddy’s car). And then this September, I’m going to be back in London again, Saint Etienne will likely play Popular, and I’ll smile, recognising all the names.


  1. Okay, there was one person from the British contingent I took an initial dislike to, and that was before I knew details that really made me glad we never met… ↩︎

straight in at 101

tony cascarino circa 1995

I felt a little attacked on Wednesday morning when my boss jokingly referred to me as “sometimes a little workaholic.” Later, as I was writing messages on Slack as I was literally having an IV attached…yeah okay, I guess I can sometimes see it. Vaguely.

(nothing too much to worry about - an endoscopy to check on my acid reflux. And I did a reasonable job at staying offline from work on Thursday and Friday. So there.)

Anyway, a truncated week, and I feel like I let the opportunity of two days off mostly slip by without filling them properly, although watching Eno yet again (now that a new version is out every month on the Criterion Channel) did get me to start work on The Assembly Machine, of which I will probably talk a little more about in July when it’s slightly more stable.

It is Father’s Day, and I have the greatest Father’s Day present ever — the best LC! tour t-shirt ever made, and a Lego cement mixer to go along with it, as every Lego city needs the means of production so the city can grow and grow, right? I’m fairly sure that’s correct.

Oh, and I got complimented at the playground today for a t-shirt that is, perhaps, over 25 years old?

definitely fine with my work life balance

A Post-Google World?

This article by Drew Magary gets at the heart of the craziness behind Google’s recent decision to go all in on AI and essentially declare war on its own historical business model. I’m not really sure how that’s going to work out for them, but I also have some thoughts — thoughts that I imagine would be incredibly unpopular across parts of the internet and Bluesky: which is that the World Wide Web is not the only model for the information superhighway, and I think we possibly forget that. Google’s search/ad dominance led to the world of SEO, ragebait, and our current international nightmare…maybe its interaction with the web just wasn’t healthy at any point.

Back in the ’90s, things like William Gibson’s Neuromancer, David Brin’s Earth, and the Knowledge Navigator video from Apple — which is one of my secret origin stories — presented a different world, a world that was not taken. You can also see it in the documentary on General Magic, where their initial vision was very much ‘agentic’ before the Web came and killed them stone dead. You can catch glimpses of another world in The Net, which had indepth segments on anonymous FTP servers and USENET.

But whilst I agree with Drew that Google declaring war essentially on the rest of the web is a terrible idea, I’m also wondering: is it possible that the web itself is something that might need to go away? This is one of those things I keep toying with in the back of my head; I do not particularly want to live in a world where everybody lives in Sam Altman’s walled gardens.

The new frontier models are powerful and amazing, and everybody should have them. I remember arguing on the web a few years back that all I wanted was an army of trans cat girls with a lava lamp in their basement doing crazy things locally on Llama models. I still believe that (although I’ve moved on to Qwen models in 2026). I think democratizing these things to the extent that they run in everywhere is potentially as revolutionary a change as having a computer in every home.

But I’m starting to think: can we take that a bit further? Like: “No, son, we have Google at home.” What would it take ti give everybody had their own search engine at home? Could we put something akin to 2000-era Google on your PC / Mac / Laptop? What would that look like? Is it feasible? How does it update? Sure, it doesn’t solve the money problem, but it might help keep the open web alive.

Obviously a lot of this comes from the fact that I’m completely obsessed with search. If Google isn’t going to be the only search engine around any more, then maybe we have to look back to the situation that existed in the mid-to-late ’90s. Infoseek, AltaVista, Ask Jeeves, MetaCrawler, HotBot — all the different search engines that were the way we interacted with the web; each engine had its pluses and minuses and required a bit of knowledge (or research) to work out which one to use for what scenario.

What I envision is a three tier local system. Tier 0 is your emails and documents. Tier 1 is the main search engine, where something like 100m documents from the web can be searched locally. This engine is updated on a monthly basis based on a user’s explicit wishes and implicit signals from what they’re searching, drawing on the monthly Common Crawl dump to stay current. And then there’s Tier 2, which is the connection to the outside world. Paid API sources like Kagi, Bing, and anything else that you’d like to plug in. There would be a program on top of this1 that would do routing for search queries, working out when a queries need to go to the outside world, or if they can be answered locally and delegating appropriately (balancing API costs and whatnot, obviously).

But who would build such a thing. Well…I have the local search engine prototyped already…


  1. okay, I’ll call it an agent if you force me… ↩︎

googlesearchcrazy ideas going bump in the night

New Yorker Unbound

Okay, so last week I promised a longer diatribe, and I swear that I haven’t forgotten about it; it needs to be edited down a bit, but it does exist, and I’ve also actually written a bunch of code to prove that my idea is at least viable. But…well, something happened this weekend that means it’s been bumped, probably until mid-week.

Almost twenty years ago, I bought a copy of The Complete New Yorker. This was a very interesting collection of DVDs that contained every copy of The New Yorker from 1925 until 2005. Spread across 8 DVDs, it had a proprietary viewing system locked down with DRM, but it was still quite a fun thing to have. The main problem was that the Mac version of the software was compiled for 68k Macs. This suddenly became a big issue when Apple switched off 68k Rosetta support; instead of 8 DVDs filled with decades of print, the collection ended up being a brick. Even the Windows software eventually bitrotted, and the collection has just been hanging out on my bookshelves waiting for the DVDs to fail.

Over the past decade, I have probably searched once or twice a year to see if anybody has cracked the DRM encryption. The closest I’ve ever got was this user over on GitHub, who cracked equivalent versions for Rolling Stone and Playboy. Hints were dropped that the New Yorker collection would soon follow, but that was two years ago, and things have been silent. But it did suggest there was some hope.

Enter Claude.

Claude Opus spent an afternoon this Saturday with the NSA’s Ghirda reverse engineering framework and comprehensively cracked the DRM. NewYorkerUnbound hosts little more than a simple Python script (with in-line dependencies, even!) that will take any file from the DVD set and produce an uncracked DJVU file, with an optional PDF export if you have the right support on your Linux box.

After almost 15 years of them sitting idle, I have 80 years of the New Yorker available again. Hurrah!

(I was so very excited that I didn’t do anything that I had actually planned to do this Saturday, which was probably a mistake…)

death to drmclaude dark magic

Goodbye Sava

Well, I can finally talk about the thing I couldn’t talk about. Last Friday was Sava’s last day at Lucidworks after almost ten years. We’ve been together for thick and thin, even during the year where I wasn’t even at Lucidworks. That there won’t be an early morning rant waiting for me in my Slack DMs tomorrow is hitting me like a body blow. But it is not the end. We’re already making plans to meet up this September when I’m in town for the last Saint Etienne tour1.

Next week: something longer…and perhaps a little more controversial, providing I can finish my Friday night thoughts on the future of the web, and the past of the information superhighway…


  1. I also don’t normally plan these things to this level of detail, but I also think I have my outfit for said concert worked out? Normally, I wouldn’t put much thought into it, but it feels appropriate to be a little fancy for the last time of seeing them… ↩︎

TEN YEARS!

That Memorial Weekend Feeling

Normally after my family leaves, there are a few days where everything seems a lot quieter. Less hustle and bustle in the house, less to do, etc. Well, with a three year old, we don’t get that luxury; she starts at 6:30am whether or not family is visiting, and she would quite like the Ms. Rachel episode with the baby dolls in, thank you very much (at this point, I retire to make tea, as I need something to cut against Ms. Rachel’s voice first thing; she’s a lovely person. But still…).

We have a brief interregnum of a week before the house is full again, this time with some of Tammy‘s high school friends, which means I have to clean the house to a slightly higher standard than when family comes (this mostly means: ‘probably do something with the IKEA circus tent and clear off all the DVDs waiting for encoding in the back bedroom). Otherwise, not a huge amount going on at the moment. We are doing Memorial Weekend DIY things, I have downloaded all of A Very Peculiar Practice for my pre-2000 TV viewing requirements, and this week at work is the end of an era as one of my close coworkers will be leaving this Friday which I am quite sad about. But he did get me this watch!1


  1. Also, it appears that May / June is my time for buying new Swatch watches. I have finished my ‘spite buying because it looks like I have an expensive roof situation coming up’ spree, with three new Swatches winging their way to me as I type… ↩︎

cleaning all the chocolate moldsempty-ish house