hearth., the app for agentic game dev
Say what you want to play. An agent builds it in a folder on your disk, and the game runs beside the conversation while it works.
Say what you want. Watch the change land.
The chat is on the left, your game is on the right. When the agent finishes a change, the game reloads with the change in it.
Hearth has no opinion about what you are making. You do not pick a template or a genre. The agent writes plain files, and anything that runs in a browser runs in the pane.
make the walls close in once the last gem is picked up
Thinking
Readgame.js
- Editedgame.js+34−6
- Addedwalls.js+58
The walls start closing when the last gem goes. It is running in the pane.
Describe the game you want
A playtester who remembers every other time it played your game.
The private tester belongs to your project rather than to a conversation. Close the chat, come back next week, start a new one: it is still there, and it still knows what it made of your game the last time it played.
Hearth already has a plainer check: after a change, the agent can open the game in a browser and confirm it still runs, which catches an error thrown or nothing drawn at all. The tester is the other half. Something that actually plays, and has a view on what it played.
It says your last change helped.
Session 2, 1 minute ago
What it thought you changed
the player's jump height was changed.
Why it says that
this time I saw the score reach 1 on picture 3, while last time I never collected any coins.
Anything worse
Nothing got worse.
What it saw
Still could not work out
I could not work out how to reliably land on the first platform.
It played 21 turns and said it had seen enough.
Last time: Its first look at your game, with nothing yet to compare it against.
Its first look at your game, with nothing yet to compare it against.
Session 1, 16 minutes ago
The tester wrote that about a real project. We copied it across and left the wording alone.
It reads its own notes before it plays.
Before touching the game, it opens what it wrote down last time. So it turns up already knowing it never got past the second gap, and goes straight back there to see whether it can now.
It knows what you changed.
Your project keeps a record of what happened while it was away, and the tester reads it. That is the difference between feedback about your edit and feedback about games in general.
It has opinions a single playthrough cannot produce.
Change the jump height three times and it can tell you which of the three it got furthest on. A tester that only ever sees the build in front of it has nothing to measure this one against.
.hearth/tester/memory.mdIts memory is a markdown file in your project folder. When it has got something wrong about your game, you open the file and fix the line. The sessions it wrote sit beside it, in order, and never get rewritten, so you can catch it contradicting itself.
It is not a good player. Anything that wants reflexes will beat it. What lands in the notes is what it tried and where it failed, never a claim that it finished.
It does not replace your judgement. Think of it as a second pair of eyes that happens to remember. Fun, feel, pacing and balance stay yours to judge.
It costs model calls on your own quota. Every session runs against a budget you can see, you can stop it partway, and it plays only when you ask it to.
Bring your own agent.
Hearth does not sell you a model. You choose what does the work, and whatever you choose brings its own list of models.
In the chat
Two ways Hearth can run the conversation itself. The chat looks the same either way.
Claude
Runs the Claude Code you are already signed into. The sign-in stays with Claude Code; Hearth asks it who is signed in, and reads nothing deeper than that. An API key works too, but you do not need one.
Claude models. Opus, Sonnet and Haiku, picked per message.
ChatGPT
Works through the open-source Codex CLI, which you install and sign into yourself. Codex holds the sign-in. It never passes through Hearth.
ChatGPT models. Listed by the codex you installed, so new ones arrive with it.
The list belongs to whichever one you picked, so Hearth asks it instead of shipping a catalogue that goes stale. Switch off the models you never reach for and the picker stops offering them. That sits in ~/.hearth/models.json, which records only what you turned off.
Switch models whenever you like: the change takes effect on your next message, and the conversation keeps its context. A model that offers an effort setting gets a dial beside the picker, set per message too.
In the terminal
Hearth opens a terminal on your project folder, and the game keeps running in the pane beside it.
claudeClaude CodecodexCodexgeminiGemini CLIopencodeopencodeampAmpcrushCrushhermesHermesaiderAidergooseGoosecursor-agentCursor CLIHearth checks your PATH for each of these and tells you which are actually there.
And whatever the list misses. A fork you patched, a script of your own. Hearth types the command into a real shell and gets out of the way, so it does not need to know the name.
Your own agent, same door
An agent you wrote yourself, or a model behind an API nobody here has heard of: if it runs in a terminal, it runs in this one. The shell is real, it starts in your project folder, and Hearth’s own commands are already on its PATH.
The pane and the tester read the folder, so neither cares who is typing. The game reloads as files land, and the tester plays what is there when you ask. The three doors, in detail.
What it may do without asking
You set this per project, and it holds whether Claude or ChatGPT is doing the work in the chat.
Every write and every command waits for you. Reading is never interrupted.
The default. Inside your project the agent gets on with the work, and anything outside asks.
Nothing asks, anywhere on the machine.
The choice lives on your machine rather than in the project, so a repository you push never carries it to anyone else. The tester and the terminal keep their own limits.
Download the app. Describe the game.
Free and MIT licensed, for macOS, Windows, and Linux. Bring the agent you already use, and keep everything it writes.