
Who needs AI psychosis? I gave myself VR psychosis
Modern life is an impossible luxury. You have a king’s ransom of salt and spices in your home, clumpy from neglect. These were once worth their weight in gold, and abundance has relegated them to the slithy toves of ALD…
以下正文同步自 Hacker News 最新,版权归原站所有,已转换为易读排版。
Jacob Bartlett
Sep 23, 2026
3
Share
Modern life is an impossible luxury. You have a king’s ransom of salt and spices in your home, clumpy from neglect. These were once worth their weight in gold, and abundance has relegated them to the slithy toves of ALDI. It took centuries of globalisation to transform spice into an everyday commodity.
In the early 2000s, I read a tabloid profile of a lottery winner: “I might buy my son a video game”. The journalist guffawed, “you know you could pay a company to build him his own game!” A hilarious extravagance. And yet in the last ~year, something you can just do, the price collapsing from $millions down to $20/month.
When you’re set up properly… you can do some pretty bonkers stuff. I’ve become obsessed with vibe coding VR games, auto deploying them to the web, and playtesting to iterate. In short, I want to share my descent into VR psychosis with you.
Can’t read? Just want to play some VR games? I got you covered:
With a game, you know within 10 seconds if you’re into it. A compelling story and overarching goal are great: rescue the princess. But even more critical is an engaging primary gameplay loop: jump on a lot of Goombas along the way.
Iterative game generation is the fastest way I’ve found to hone taste. In a new world underpinned by agentic engineering, it’s the most defensible skill of all.
Here’s what you might get out of this (somewhat meandering) life story:
How I ended up regularly shipping VR games from the pub.
How to set up an auto-deploying web game generation pipeline.
Iterating towards a secondary gameplay loop
Allow me to jump back a few months in this deeply untethered narrative.
My first brush with this came not from nascent VR psychosis, but from wanting to be a fun dad. A fun dad in tech.
Many parents guiltily give their kids access to electronics when they need a breather. My daughter, between spats of dodgy YouTube slop, is partial to a balloon popping game. On a whim, I thought to myself: this is total dogsh*t. I could do much better than this. So I opened Claude and asked it to make a balloon popping iOS app with powerups.
My fatherly vision of giving my daughter a flavour of this impossible dream: to become equal to a lottery winner, dictating the terms of a video game built before her eyes… might have missed the mark. Teamwork. User research. Bonding.
Left: a balloon game that’s hot garbage. The rest: a f*cking rad balloon game.
Did my daughter start playing the upgraded version of her own accord? No. Did she like it more than the (crap) original? Also no. But I got some super useful lessons about performing user research on a 5-year-old:
“Make it better. Make it less bad. It’s boring.” —Lyra, 2026. Thanks, Lyra.
Later that weekend, at a kid’s birthday party, while trying to desperately find testers to get in on the balloon action, I had a crushing realisation: I can’t iterate as fast while tied to iOS.
Sitting in my home office, neglecting my kids, as I voice-prompt an agent to build a new power-up, is all well and good, but deeply limiting to iteration speed.
Apple doesn’t exactly help themselves here either. The web, for all its faults, is (by a drastic margin) the easiest way to deploy things.
Indulge me with another tangent, so I can set the scene. It’s relevant, I’m trying to explain the level of handsfreeness we’re playing with in 2026.
It was May 12th. My birthday. You can send me gifts here btw.
I was at the pub. A friend reminded me of a bit I used to do when I was 18 (which, for the record, I do not remember) which I employed in my eternal quest to be really annoying. When I’d make an edgy joke, I’d obnoxiously open an app called “Privilege Checker”™ to l a checklist (white, straight, cis, etc, etc), and, having checked my privilege, would deploy my moderately offensive joke. It’s all about the timing, you see?
I chuckled at the alleged memory, and then, in my brooding, mysterious way, walked outside for a moment. I came back a few minutes later and shoved this web app in my friend’s face.
I can’t really take credit for this: I own no inference clusters, I have no complex pipeline, and I’m not personally touching Git on a Friday night. I just orchestrate moving parts that greater minds created. I’m just the glue. Specifically, the glue is my mouth.
Typing? Okay, grandad. Back to the nursing home with you.
It’s crazy how much my workflow has changed since adopting voice-dictation tools. The vast majority of my day-to-day work is meanderingly mumbling into a microphone, and then code comes out the other side.
Get on my level, bro
This is great for fast, messy iteration and field research. You emit a stream of consciousness and get something useful out the other side. Assuming there’s a model capable of interpreting your genius.
This is rad for the one-shot approach. But also great for iteration.
I get solid results with Wispr Flow and Granola. Wispr Flow is better for rapid live-testing loops where you’re tasting your own dog food and giving live shot-calling dictation. Granola is better for set-and-forget long-form user research.
This works with Codex too, but I try to save my credits for important stuff.
The /remote-control command, alongside caffeinate (to stop your machine falling asleep), become the poor man’s OpenClaw. You can prompt Claude in a folder on your machine from the app.
I say the poor man’s OpenClaw. It’s probably more like the poor man’s Mac Mini. I don’t quite feel dropping £799 is worth the luxury of not closing my clamshell.
That said, once I got into the throes of VR psychosis, I got close.
Me trying not to buy a Mac mini after learning I can vibe-code VR games
Unshackled from my home office, I can dictate commands to my agent from the pub. Naturally, my agent has git access, able to push straight up to my repo and deploy.
Frankly, if you held a gun to my head, and told me to explain what Vercel does or you’ll blow my brains out, my last words would be a curse upon Vercel. I kinda reckon it hosts web servers, but don’t take my word for it.
With some slightly annoying admin, you can make it so every git push automatically goes through to Vercel and gets deployed. So… I guess it’s a CI service?
Cloudflare is a DDoS protection service, which for some reason also does domain registration. I set up a CNAME for the subdomain games.jacobstechtavern.com that keeps my wildest ideas airgapped from my colleagues at Granola.
This basically means for my jacobstechtavern.com domain, I can easily create subdomains, and Vercel routes the deployed web pages there.
Vercel and Cloudflare work together in ways I simply cannot comprehend, but they steam a good ham.
The point is that, now, the cost of deploying is zero. The cost of implementing is also zero. The cost of putting my thoughts into a computer is reduced to a moment of mumbling. Thus blurs the line between ideas in your head and working software in your hand.
The fan-made Attack on Titan VR game. You fly around and kill big fellas with swords.
There are many degrees of freedom in VR: 2 triggers, plus face buttons, in each hand, with 360° range of motion for each hand.
The traversal mechanics in Attack on Titan VR involved shooting a cable at a wall. The other trigger reels you in, building momentum. The simple physics alone here allowed for incredibly dynamic motion. I couldn’t stop playing, for hours, acrobatically spidermanning through a city, until I was completely floored by the motion sickness that had been building up as my brain fell over trying to reconcile my senses of sight and balance.
I digress. Traversal mechanics are fun. They are a huge component of a primary gameplay loop: the moment-to-moment enjoyment. See Mario 64: the devs spent half of development working on 3D motion, making the space fun to move around in. They didn’t even begin building the levels in Peach’s Castle until they perfected the ability to jump about and handle the camera in a 3D space.
Now, a friend at work showed me something that he vibe coded that ties this all together.
He put a VR headset on my head and showed me a fun little space where I could shoot little Granola logos at targets. We’ll find a business use case soon, I’m sure.
He gave me an insight I didn’t know before: it turns out that it’s really easy to vibe VR games and deploy them online using Three.js, WebXR, and Vite. Whole VR games.
Everything I understand about game design comes from Ben “Yahtzee” Croshaw.
In short, your story, concept, and genre are deeply unimportant considerations compared to the main thing: the primary gameplay loop. Consider this hierarchy:
Primary Loop: Second-by-second action; the core mechanics the player repeats, Think shooting monsters in Doom or eating pills and avoiding ghosts in Pac-Man.
Secondary Loop: Minute-by-minute, short-term goals. This is the level of levels, or perhaps working through a day of planting and harvesting in Stardew Valley.
Tertiary Loop: Hour-by-hour macro-goals which tie gaming sessions together. Consider working through the narrative (rescue the princess), or climbing a ranked ladder.
When you’re experimenting with game design, the primary loop is the most important thing by far. Amazing level designs, fascinating concepts, or emotional storylines can’t carry a boring moment-to-moment.
Fortunately, this primary loop is also the easiest to experiment with in the agentic world.
What gives you greater degrees of freedom than actual space? Star Crusader was based on the idea of total 3-dimensional freedom of movement. Duel-weilded guns shoot in front of you; jetpacks propel behind you. Total freedom of motion, within and between the gravity wells in a star system.
I got very obsessed, very fast, iteratively building this out in bursts over the last several months. It’s not even hard work: I plug in, play, voice transcribe all my thoughts, and my agent will have the next round of improvements built and deployed in ~10 minutes.
Iterating towards a secondary gameplay loop
The core mechanic immediately felt compelling: moving across a planet with a jetpack and shooting enemies. But a million things felt a bit off, that took many iterations to iron out:
It was extremely easy to get disoriented and not sure what way you were facing; so I added a “re-orient” function that pointed your feet at the gravity well.
If you went into space, you could very easily get lost, so I designed a gyroscopic 3D wrist-mounted holomap that showed your orientation in the whole system.
There isn’t really a way to make scientifically-accurate acceleration fun (you need to spend 50% of your journey to another world decelerating) so I added a momentum-cancelling ability to the other face button that makes you feel insanely powerful when arriving on another world.
The least fun, most painful, iteration loop was working out how to tutorialise the progression systems: controls, upgrades, and mission selection. I can’t overwhelm players with a huge info dump, so drip-feeding mechanics while still keeping the introduction engaging was a fine balancing act. My storyline actually fell out of the necessity of an in-game character giving you these tutorials.
Even the Monday before I published this, combat still kind of sucked. A lot. It was impossible to manage position using rockets while also fighting enemies in front of you. Until I had a brainwave: in combat, you want rockets PERPENDICULAR to your guns, not behind them, so you can strafe perfectly in 3 dimensions. This suddenly unlocked WAY more interesting tactical gameplay and made the other primary gameplay loop suddenly exciting.
After many iterations, here’s the basic (secondary) game(play loop) and progression system I ended up with:
First, you wake up in a crater, and pick up a pistol. You have to fight a grumpy robot.
He drops a jetpack, allowing you to escape the crater and explore the planet, an abandoned church-like world. You work
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。