Gaimer is a desktop app that makes a small game from a description. You type what you want, "Pong" say, and it asks the AI provider you connect, OpenAI with your own API key or Claude through your own Claude Code, for a whole game in JavaScript, which it saves and runs in a sandboxed page. It is open source under the MIT licence and runs on macOS, Windows, Linux and iOS.

On 24 and 25 September 2026 the factory, the agent-run software factory behind this site, merged 49 pull requests into Gaimer, 76 commits in all, each saying why it was made and what was checked. Tetris, Pong and Space Invaders, made with the old and the new system prompt, then show what the new prompt does. All six games can be played here.

The 49 pull requests merged into Gaimer on 24 and 25 September 2026, one square each, in a row per part of this article that tells what they changed, with each row's count: opening and saving games (5); errors a game throws (6); the Claude connection (9); security (4); cleanup (6); tests and CI (2)49 pull requests24–25 Sepopening and saving games5errors a game throws6the Claude connection9security4cleanup6tests and CI2The same 49 pull requests, the rest of the parts: the new system prompt (1); the automatic fix round (2); changing the open game (2); the app's icon (1); smaller changes (11)by part of this articlethe new system prompt1the automatic fix round2changing the open game2the app's icon1smaller changes11
The 49 pull requests the factory merged into Gaimer on 24 and 25 September 2026, one square each, in a row per part of this article that tells what they changed, in its order, with each row's count. The last part, on smaller changes, tells eight of its eleven.

What changed

Opening and saving games

A saved game could refuse to open ("Missing required field: title") once its progress had been saved: the app sometimes read the progress as the game. "Restore progress?" never appeared, because the dialog it needs was not installed. A saved game now opens at once, not after a one-second wait, and a new game that arrives while a saved one is open takes its place. Deleting a game asks first, and a save that cannot work says why at once.

Errors a game throws

A syntax error in a game's code used to stop the page's only script: the player saw a dark canvas and no message. The game's code now runs in a script of its own, and every error reaches the app. On WebKit, which runs the app on macOS and iOS, errors showed only as "Script error.", and the built app's policy refused the script that reports them; both scripts now load from data: URLs, which fixes both. An error comes with its line and column in the game's code, or a note that it was found after the end of it, and code cut off mid-expression now fails as a syntax error.

The Claude connection

Each game used to be a full Claude Code session and is now one plain completion, with most of the user's own setup kept out. A failed call now says why instead of "Exit code 1".

The Claude call for a game, before and after the cleanup. Before: a whole Claude Code session, with Claude Code's own system prompt, Gaimer's prompt pasted into the user message ahead of the request, the built-in tools on, the user's CLAUDE.md files, hooks, plugins, skills and MCP servers taking part and a transcript saved. After: one plain completion, with Gaimer's prompt as the system prompt, in a file of its own, the request alone as the user message, the built-in tools off, the user's CLAUDE.md files, hooks, plugins, skills and MCP servers kept out and no session saved. Picking Claude started up to four login shells; now the sign-in is checked once. The time limit was 5 minutes, but the call ran on; now it is 15 minutes, and then the call is stoppedthe Claude call for a gamebefore the cleanupa Claude Code sessionafter the cleanupone plain completionsystem promptClaude Code's ownGaimer's, in a filethe user messageGaimer's + the requestthe request alonebuilt-in toolsonoffthe user's CLAUDE.md files, hooks,plugins, skills and MCP serverstook partkept outthe sessiona transcript savednot savedwhen the user picks Claudeup to fourthe sign-inlogin shellschecked oncethe time limit5 minutes, but15 minutes,the call ran onthen it is stopped
How Gaimer called Claude for a game before the cleanup and how it calls it now. The whole Claude Code session became one plain completion: Gaimer's prompt is the system prompt, the request is the whole user message, and the user's CLAUDE.md files, hooks, plugins, skills and MCP servers take no part.

Security

The main window's Content Security Policy no longer allows requests to Anthropic's API or images from any https address, neither of which the app uses. The shell permission, which let any script in the window run any command as the user, allows only the three command lines the app builds. The OpenAI API key, kept in a vault whose password and salt were in the repository, is now in the system keychain.

Cleanup

What nothing used was removed: an HTTP plugin built into the app but never called, which took 31 crates out of the Rust build; template leftovers; a store nothing read, methods nothing called and two one-time data moves that could no longer find anything. The dependencies were updated within their ranges, which cleared all 22 findings of the package audit.

Tests and CI

Tests that could not fail were replaced, tests were added where a regression would reach the user, and coverage got a floor: 94 % of statements, 89 % of branches, 90 % of functions and 96 % of lines, the levels reached, rounded down. The unit tests went from 101 to 408. CI moved from Node 20, out of support since 30 April, to Node 24 and current actions, with a read-only token, and checks the Rust code's formatting and lints. It builds the app for Linux, macOS, Windows and iOS on every pull request; after the last merge, all four passed.

The new system prompt

A game is made in one call, from Gaimer's system prompt and the user's description. The old prompt said how to answer, where the game runs, that it must take keyboard and touch, and how to save and restore, but nothing about how a game should look or feel. The rewrite keeps that contract and adds sections on look, play and speed: one visual style, particles and a small screen shake, a start screen, a best score, a smooth rise in difficulty, sound made in code, movement by frame time, and pointer events, so that a mouse works as well as a finger. It asks for "a few hundred lines" of code and grew the prompt from 2,830 characters to 6,873. Its pull request calls it a draft for reading, written without calling an AI provider or running a game made with it.

The automatic fix round

A new game that fails as it starts now goes back once to the provider that wrote it, and the fixed game takes its place.

Changing the open game

With a game open, the description box now changes that game.

A new game: a description typed in the box goes in one call to the provider, with Gaimer's system prompt; the answer is read as a game, saved and run in the sandboxed page. A game that fails as it starts, with an error before it is ready or in the 5 seconds after that or after the player's first input, goes back once to the provider that wrote it, with its code and its error, and the fixed game takes its place; then the game is playeda new gamea descriptiontyped in the box, with no game openone call to the providerwith Gaimer's system promptthe answer, read as a gameand saved as a new gameit runs in the sandboxed pagein a frame of its ownfails as it starts?an error before it is ready, or in the5 s after that or after the first inputyesnoback onceto the provider that wrote it,with its code and its errorthe fixed game takes its placea fixed game is not sent back againplayThe open game: a change typed in the box goes in one call with the game and the requests it was made from; the answer is change blocks, made to the game's code, or the whole game, changed, taken as it is, and when the blocks cannot be used, the whole game is asked for once. The changed game is a new version, which runs and gets one fix too if it fails as it starts; Undo change goes back one version and New game closes the gamethe open gamea change, typed in the boxwith a game open, the box changes itone call, with the gameand the requests it was made fromthe answer is one of twochange blocksmade to its codethe whole gametaken as it isblocks that cannot be used?the whole game is asked for, oncea new versionit runs, and gets one fix if it failsUndo changeback one versionNew gamecloses the game
A game's life in Gaimer after the cleanup, as the code on its main branch runs it: a new game gets one chance to be fixed if it fails as it starts, and the box changes the open game one version at a time.

The app's icon

Gaimer had no icon of its own: it used Tauri's default. On 25 September the founder asked for a logo that shows games made with AI, in the app's green, as SVG so that it scales to app icons. One agent wrote four proposals directly as SVG code, without an image generator, each on one idea, and previewed each at icon sizes and in mock-ups of the macOS dock and an iPhone's home screen. The founder chose the first, Spark pad, and the last pull request made it the app's icon on every platform.

Logo proposals 1 and 2 of the four one agent wrote as SVG for Gaimer's icon, each on the app's dark rounded tile: 1. Spark pad (chosen): A game controller whose buttons are an AI spark: games, made by AI. 2. Prompt: The cursor after a typed prompt comes alive as a pixel creature: a description becomes a game.4 logo proposals25 Sep1. Spark padchosenA game controller whosebuttons are an AI spark:games, made by AI.2. PromptThe cursor after a typed promptcomes alive as a pixel creature:a description becomes a game.Logo proposals 3 and 4: 3. Say and play: A speech bubble that holds a controller: describe the game, then play it. 4. Pixel spark: The AI spark drawn in 8-bit pixels, its arms like a D-pad: AI that speaks in games.written as SVG code3. Say and playA speech bubble that holds acontroller: describe the game,then play it.4. Pixel sparkThe AI spark drawn in 8-bitpixels, its arms like a D-pad:AI that speaks in games.
The four logos one agent proposed for Gaimer's icon on 25 September 2026, each written as SVG code and shown here on the app's dark rounded tile, as on a home screen, with its name and the idea the agent gave it. The founder chose the first.

Smaller changes

Each AI provider now keeps its own model: one choice used to serve both, so after a switch of provider a model picked for OpenAI went to Claude, and no game could be made until a model was picked again. The lists now leave out models that could not work, such as OpenAI's speech and transcription models, and add nine GPT-5 models with the request they take: no temperature, and a limit that counts their reasoning as well as the game.

A game got no keys until the player clicked it, and none at all if it cancels the press, as some games made with the new prompt do. A game now takes the keyboard focus when it is ready and when it is clicked, and the description box lets go of it once a description is sent. The new prompt told the model that keys reach a game only after a click or a tap; that line is gone, though this article's games from after the cleanup were made with it.

Resizing the window or turning the phone restarted the game, and the player lost what they had not saved. The game now keeps running, scaled to fit, in the shape it started with: turned from portrait to landscape, it is smaller, with bars at its sides.

How the games were made

Each game was made the way Gaimer's Claude provider made one when the new prompt went in: the same command line, run the same way, with the request "Tetris", "Pong" or "Space Invaders" and the model Gaimer uses for Claude when none is chosen. Only the system prompt differs: the one from before the cleanup, unchanged since 1 April, or the rewrite. Space Invaders was made on 26 September, the others on the 25th. Each answer was read with the app's own code, and each game runs in a game page built like the app's of its version, less what only the app holds, such as its save files.

The call that made each game, with the system prompt from before the cleanup and from after it: Tetris: before 245 s (29,720 output tokens, 478 lines), after 476 s (58,031 output tokens, 545 lines); Pong: before 68 s (9,093 output tokens, 219 lines), after 204 s (22,030 output tokens, 370 lines); Space Invaders: before 169 s (22,223 output tokens, 526 lines), after 322 s (38,167 output tokens, 509 lines)the call for each gamethe limit then: 300 sTetrisbefore245 s29,720 output tokens · 478 linesafter476 s58,031 output tokens · 545 linesPongbefore68 s9,093 output tokens · 219 linesafter204 s22,030 output tokens · 370 linesSpace Invadersbefore169 s22,223 output tokens · 526 linesafter322 s38,167 output tokens · 509 linesoutput tokens include the model's thinkingone game per prompt and requestWhat each of the six games has: the three from after the cleanup have a start screen, a best score, sound, and mouse and touch; of the three from before, only the Space Invaders has a start screen, none has a best score or sound, and all three take touch but not the mousewhat each game hasTetrisPongSpace Invadersbeforeafterbeforeafterbeforeafterstart screenbest scoresoundmouse and touchtouchtouchtouchthe new prompt asks for all four
What the new system prompt cost in the two runs that made the six games, Tetris and Pong on 25 September and Space Invaders on 26 September, both made the same way: one call per game and prompt, with each call's time to scale, its output tokens and the game's lines of code, and what each game has. The dashed marks are the limit the app had when the new prompt went in, 300 seconds, which both runs kept; the first calls for the Tetris and the Space Invaders from after the cleanup ran past it. One game per prompt and request, not a benchmark.

The first calls for Tetris and Space Invaders with the new prompt ran past the app's limit then, 300 seconds, and were stopped there, as the app would have done: in Gaimer that meant the error "Command timed out" and no game. The two shown come from second calls, made the same way without the limit. The factory has since raised the limit to 15 minutes. All six started with no error, so no game from after the cleanup needed the fix round.

Play runs a game where its start screen is, and the keys then go to the game, not the page. One game runs at a time.

Before the cleanup Classic Tetris
Tetris before the cleanup as it opens: no start screen, the first piece already falling into the empty well, the score, level, lines and next piece to the right, and five touch buttons along the bottom. Play full screen: Classic Tetris, before the cleanup Code: Classic Tetris, before the cleanup Tetris before the cleanup after a few moves: four pieces at the bottom of the well, a fifth falling with the place it will land outlined, and a score of 102.
After the cleanup Neon Block Drop
Tetris after the cleanup on its start screen: the title TETRIS over a faint well, the keys and the touch controls in two lines, and "Tap or click to start" in yellow. Play full screen: Neon Block Drop, after the cleanup Code: Neon Block Drop, after the cleanup Tetris after the cleanup after a few moves: rounded pieces at the bottom of a framed well, a falling one with the place it will land outlined, a score of 108 at the top left and the next piece at the top right.

The Tetris from before the cleanup starts at once. It always draws five touch buttons along the bottom and takes touch through touch events only, so a mouse does nothing in it. It shows the score, level, lines and next piece, outlines where the piece will land and pauses on P. The one from after named itself Neon Block Drop and put TETRIS on its start screen. It waits for a tap, a click or a key, draws rounded blocks in a framed well, shows touch buttons only once the screen is touched, and clears lines with a sound, particles and a small shake.

Before the cleanup Neon Pong
Pong before the cleanup as it opens: no start screen, the ball already in play between a blue paddle on the left and a red one on the right, and a score of 0 to 0. Play full screen: Neon Pong, before the cleanup Code: Neon Pong, before the cleanup Pong before the cleanup a moment later: the computer's red paddle has won the first point, so the score is 0 to 1, and the ball is in play again.
After the cleanup Neon Pong
Pong after the cleanup on its start screen: a panel reading NEON PONG, "Arrows/WASD or drag to move", "First to 7 wins" and "Tap or click to start", between a glowing cyan paddle and a glowing pink one. Play full screen: Neon Pong, after the cleanup Code: Neon Pong, after the cleanup Pong after the cleanup in the middle of a rally: the glowing ball has just left the pink paddle with a trail of particles, and the bar at the top shows a score of 0 - 0.

The Pong from before the cleanup also starts at once, with the ball already in play. Its paddles are flat bars, it takes the arrow keys, W and S or a dragged finger, and it has no sound. The one from after opens on a start screen, draws glowing paddles and a ball that throws off particles where it hits, and shows the score, the best score and a level along the top. It plays sounds, takes a drag from a finger or a mouse, draws two arrow buttons after a touch and, on a screen taller than it is wide, puts the paddles at the bottom and the top.

Before the cleanup Space Invaders
Space Invaders before the cleanup on its start screen: the title SPACE INVADERS in green on black, "Press SPACE or TAP to start" in white and the keys in grey below it. Play full screen: Space Invaders, before the cleanup Code: Space Invaders, before the cleanup Space Invaders before the cleanup a moment into play: five rows of rectangular aliens with two gone from the bottom row, a capsule marked M falling below them, a shot on its way up, red enemy shots, four green barriers and a score of 20.
After the cleanup Nebula Invaders
Space Invaders after the cleanup on its start screen: the title NEBULA INVADERS in turquoise over a dimmed wave of aliens, the keys and the touch controls in two lines, and "Tap or click to start" in yellow. Play full screen: Nebula Invaders, after the cleanup Code: Nebula Invaders, after the cleanup Space Invaders after the cleanup a moment into play: three aliens shot out of the middle of the formation, two +20 scores floating up among particles, an enemy shot, four purple barriers, the turquoise ship, and SCORE 50 and BEST 50 along the top.

The Space Invaders from before the cleanup starts on Space or a tap: a mouse does nothing in it. Its aliens are flat blocks, its green barriers crumble under fire, and some aliens drop capsules for faster fire, three shots at once, a shield or a life. The one from after named itself Nebula Invaders. Its hexagonal aliens march in pink, yellow and purple, each hit throws off particles and a score that floats up, and its touch buttons to move and fire are not drawn during play.

The pairs show that the prompt's new sections reach the games, and the calls with the new prompt produced 1.7 to 2.4 times as many output tokens.

Those calls also took longer. When the factory later timed the app's own call at Claude Code's default effort, a Pong took 194 seconds and a Tetris 488, and most of each answer was thinking: 63 % and 79 % of the output tokens. At the lowest effort, a Pong took 53 seconds and two Tetris games 70 and 60, with next to no thinking, and all three still had the start screen, best score, sound, touch play, saving and restoring and movement by frame time, though one Tetris could not be played with a mouse. Each was a single game, not a benchmark. PR #53 made Gaimer ask for every game at low effort, and Settings now offers, for the default model, "Low · about a minute", "Medium · 1–5 minutes" and "High · 3–8 minutes".