CoOp:Anything
Search any game and see how much of it you can play with friends: every co-op mod, its stage, quality and community rating.
Survive one night in a dark room. Keep the fire alive, eat, and be careful what you let in.
GamesGitHub @Zach-ShirleyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
A short horror-survival game in pixel art: survive the night, keep the fire alive.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Survive one night in a dark room. Keep the fire alive, eat, and be careful what you let in.
A short horror-survival game in chunky pixel art. One night lasts about seven minutes and gets worse every hour; a run is up to five nights: the third and fourth in a blizzard, the fifth under a blood moon. Most first nights end in death; each death screen tells you what killed you and gives a hint. Only a night survived to dawn scores, mostly for how you got through it.
Play: https://firelight-topaz.vercel.app (desktop browser with keyboard or mouse, or a phone held sideways)
Status: playable and complete, still being polished. Five nights, three difficulties, six challenges and five endings are in. Online leaderboards (a Render + MongoDB backend) are planned but not built, so scores, challenge records and achievements stay in your browser for now.
Zach made Firelight as a game for his sister: something genuinely scary that she'd want to beat. It started on 2026-10-15 as a single night in a dark room and grew, round by round, from what happened when they played it: she and Zach playtested every version, and their deaths, complaints and "that was too easy" drove each redesign (the difficulty modes, the two scare settings, nights 3 to 5, the challenges). It's built entirely in the browser with no assets: the pixel art is drawn in code, and the sound and music are synthesized live. Balance is tuned by simulation: bots play thousands of seeded runs, and an evolutionary search finds the strongest play for each mode (see Difficulty, tuned by simulation).
| Key | Action |
|---|---|
| S | Stoke the fire (1 wood) |
| E | Eat: cooked meat if you have it, raw if that's all you have (raw fills you less and makes you sick). 1.5 s cooldown |
| X | Douse a blaze with blood (2 blood) |
| N | Music on or off |
| C | Cook up to 3 raw meat. It finishes on its own in about 6 s, as long as the fire is lit |
| G | Go out for wood (short trip) |
| F / Space | Burn her claws (1 wood, needs a fire), or slam the cellar hatch from night 2 |
| R | Run back from a trip |
| B | Build |
| 1–9 | Dialogue choices |
| J | Journal (everything you've heard tonight) |
| M | Sound (also on the title screen; the game goes silent while the tab is in the background) |
| Esc | Menu, which pauses |
Every threat has a tell and a counter. Threats arrive as the night goes on.
| From | Threat | The tell | What saves you | Death |
|---|---|---|---|---|
| 10 pm | The dark | Slitted eyes open around the room, a heartbeat starts, red creeps in from the edges. Once the fire is out you have about ten seconds | Keep the fire above smoldering. It burns down faster every hour | The dark comes in |
| 10 pm | Hunger | A stomach growl at "hungry"; at "starving" it repeats and a dull red border closes in. Meat goes bad: raw in about an hour of the night, cooked in about three, and its count turns green when something is about to turn | Keep eating, which means traps early: at night they're the only meat, checked on every wood trip. Cook raw meat first; raw makes you sick. Salt-cured meat keeps | You starve |
| 11 pm | The thing in the trees | A howl, and its amber eyes shining in the treeline outside the window. While you're out and it's close, a grin grows beneath its eyes | One rule: once it's close, the grin fills in four seconds, every time. Leave while its eyes are in the treeline and the grin races to half full almost at once, so you have about two. A falling howl tells you when it moves off. If it howls while you're already out, you get a moment to turn back first. Running back brings you home empty-handed | A full grin |
| midnight | The mimic | Real visitors' footsteps crunch through the snow before they knock. The mimic just knocks, word for word in the voice of someone you'd open for. There is only one stranger | Keep the door shut when nothing walked up | You opened the door. It was not a person |
| 1 am | Her, at the window | She rises into the window from below the sill: a gaunt black figure backlit in red, with one huge pale eye, an empty socket, a hanging jaw and wet hair. On her first visit the glass always explodes inward, boarded or not, and from then on wind and snow blow in; through a bare frame the fire burns down faster | Board the window beforehand. Her eye watches through a gap while her hand hooks a board and pulls, to a rhythm of thuds. Burn the hand and she snatches it back in a burst of flame and smoke. Don't, and she tears every board off and drags them away. You have to board the window again (8 wood) | Bare window: she climbs in, even while you're out, and through the frame; you can't burn her back. You can still nail boards up in the last seconds |
The door never opens by itself. Every knock asks you: open it, or keep it shut. Opening for the right people matters:
That's everyone. Knocks are rare, and nobody but the stranger stays: most knocks late in the night are mimics. Each real person you let in is worth 10 points at dawn.
Familiar voices. The mimic copies whoever you'd open for, word for word, even how they greet you once you've let them in before ("It's me. The woodcutter."). From night 2 it knows the trader's voice too.
Knocks while you're out wait at the door. You can't hear footsteps from the trees, so when you come back the snow tells you: fresh footprints leading up to the door, or none.
Keep the door shut on a real visitor and you hear their footsteps leave. Keep it shut on the mimic and the knocking stops, but no footsteps leave.
Make it to dawn and you choose: end here and bank your score, or rest through the day and face the next night. A run is up to five nights: the blizzard on nights 3 and 4, and the blood moon on night 5. Longer runs score far more, and the leaderboard marks them with one ☀ per night.
The day is a planning screen over the daylit room. It runs from 6 am to 10 pm: 16 hours, and every choice costs some. Each button shows what time it'll be when you're done.
| Action | Hours | What it gives |
|---|---|---|
| Chop wood | 2 | 9–12 wood |
| Hunt in daylight | 2 | Safe meat, sometimes blood |
| Check the traps | 1 | Two catches per trap (from night 2, sometimes fur) |
| Scavenge the empty village | 3 | Salt, sometimes blood, sometimes a jar of nails (each board holds through one extra pull). The village tells its own story: barred doors, torn boards, tally marks that stop at two |
| Repair or board the window | 2 | Back to three boards. The glass is gone for good, so the wind is in from the start |
| Bury her | 2 | Only if you dragged the stranger's body out; it stops drawing the hunter |
| Sit with the stranger | 1 | Only if she's alive; she gives you salt and warns you about the floor |
| Sleep | 6 | Skip it and the night gets worse; see No sleep below. Sleeping resets the count |
The day also thaws every frozen log and spoils any meat that isn't cured. The day screen warns you what the next night brings.
Night 2 keeps what you have and what is broken: resources, traps, the lantern, the boards, the broken window, and the stranger alive, gone or buried. Everything that hunts you behaves as if it were two hours later: the thing in the trees and the knocking start as soon as it's dark, she comes to the window from 11 pm, the walkers from 1 am, the fire burns faster and the mimic knocks more often. The day screen and the start of night 2 both warn you.
| New on night 2 | |
|---|---|
| Salt | Salt the doorway (2 salt): the next thing you open the door to that isn't a person can't cross; the line breaks instead of you. Salt the sill (2 salt): the next time she would get through the window, she recoils |
| The thing under the floor | There is a cellar hatch in the room. The floorboards creak and dust puffs up, then the lid lifts and pale fingers curl out, with eyes in the gap. It sits right under the meat rack. Slam the hatch (F/Space). Bar it with a beam (4 wood): slam it in time and the beam stays whole; miss, and the beam breaks instead of it getting out. With no beam, a long pale arm comes up the wall and strips half your meat off the rack, then stays down a long while. No meat, and it takes the stranger: one sharp breath and she's gone. No stranger, and it takes you. While you're out, nobody is there to slam it |
| Fur | From night 2, traps now and then catch a pelt. Fur makes a coat or insulation, or keep it: 3 points each at dawn |
Night 4: the goblins. The blizzard again, and now they come in, two ways.
Night 5: the blood moon. The snow stops and the moon comes up red. Every one of them comes, from every part of the woods, to the last fire still burning, and they're all awake from 10 pm. There's no cold and no frozen wood: it's the siege.
The stranger, and the endings. She is not a person. She was the fire of the village, and when its fire went out the things took it. She reached your door two days later, a dying ember. She can only take what fire has touched (cooked meat), raw meat poisons her, and when she starves what's left under the cloak is the dark of a dead fire. Feeding her makes her stronger; your fire going out with her inside weakens her. On the blood moon every one of them gathers at your cabin, and at the fifth dawn:
| Ending | How |
|---|---|
| The Burning | She's with you and strong. She lets the cloak fall, and she is fire. She walks out, and the forest burns with every one of them in it. The winter is over |
| The Last Ember | She's with you but weak. She has only enough to burn the clearing, and burns herself out getting you through |
| The Ash | She died along the way, and came back to your door all night |
| The Cold Hearth | She isn't with you: never let in, sent away, taken by the hatch, or the false one. The sun comes up and nothing changes. The snow begins again |
| The Keeper (secret) | Your fire never once went out, all five nights, and she's beside you at the end |
The endings are simple cards for now; their scenes come later.
The woodcutter's axe. He'll sell his spare for 3 meat, once. Every wood trip then brings back 5–7 logs instead of 3–5.
No sleep. Each day in a row you skip sleep makes the next night worse:
| Days awake | What happens |
|---|---|
| 1 | Your eyes close every 15–20 seconds or so for 2–3 seconds, and while they're shut you can't do anything: not even burn her back or slam the hatch. Slower hands and trips, and you get hungry faster |
| 2 | Longer, more frequent dozes, and things that aren't there: knocks with footsteps but nothing under the door (the lantern shows no feet at all); howls with no eyes in the treeline; whispering at the edge of hearing; her at the window when she isn't (look closely: a faint double of her drifts around her); the hatch rattling three times as often, only one in three real. And every mimic seems to walk up, so footsteps tell you nothing |
| 3 | Longer and more frequent still, trips take two seconds more, it howls every few seconds, its eyes and grin flicker in the treeline, and the false hers have no tell at all |
| 4 | You don't make it to the first hour |
Night 3 is the blizzard. Everything still comes two hours early, and:
| The house gets cold | Only a fire burning or roaring keeps the house warm: at flickering it's chilly, at smoldering it's freezing, and you slowly take on the house's cold. A broken window lets the wind in (less through boards, none through shut curtains), insulation helps, and every time the door opens the cold rushes in. You can see it: frost glazing in from the corners, snow drifting in under the window, your breath. Your own cold is in the top left |
| You can barely see out | The window is a white-out. On normal and hard, if the thing in the trees is close, its eyes show for a moment once every three seconds, very faintly. On insane, never. Listen for its howl, and for the falling howl when it leaves |
| Trips take half again as long | Wood runs, building the shed, everything outside, and now and then you lose the path for a moment in the white |
| Frozen logs | Everything you bring in is frozen, even from the woodshed (the woodcutter's isn't). Frozen logs show dark and rimed on top of the pile ("18/25 · 6 frozen") and thaw in about a minute by a good fire; the drying rack thaws them three times faster. Stoking uses thawed wood first; a frozen log burns half as long and hisses |
| She is quicker in the cold | Her pull on a board is about 30% faster |
| Fur | Clothes slow how fast you get cold, and the set makes you all but immune: coat (6 fur, 35%), trousers (5, 20%), hat (4, 20%), socks (3, 15%). Fur curtains (5 fur) over the window: click the window to open or shut them. Shut, the wind stays out and the house is far warmer, but you can't see the treeline at all, she is only a faint outline, there's no warning to burn her, and she has less time before she gets a board. Fur is also 3 points each at dawn, so every piece you wear costs you score |
Pick a difficulty for each run; each has its own leaderboard.
| Normal | The night as it was meant to be |
| Hard | A little less wood (90% on trips, 85% chopping), 30% fewer catches, hungrier, meat goes bad sooner, a smaller woodshed (70). The grin takes three seconds; she and the hatch are quicker; more of the knocks are mimics. The trader sells one bundle of smoked meat a visit (1 blood + 2 logs for 2 cooked meat) |
| Insane | The traps barely feed you (42% of normal catches), much hungrier, less wood, a 50-log woodshed that loses some logs to damp each day. The trader comes every night (from 11 pm), charges a jar of blood less, sells an iron trap that never wears out, and trades smoked meat for logs (2 logs for 2 cooked meat, three times a visit). A night with no one knocking is nearly always the last |
Challenges go on top of any difficulty, one per run, picked beside the difficulty when you start (challenges.js). Each multiplies every night's score and has its own achievement for surviving all five nights under it:
| No axe | the woodcutter keeps his axe | ×1.15 |
| No woodshed | the pile by the fire is all the wood you have | ×1.3 |
| No lantern | you can never count the feet under the door | ×1.2 |
| One trap | never more than one | ×1.35 |
| No torches | the goblins have every corner | ×1.15 |
| No visitors | the door never opens to a knock: no woodcutter, no trader, no stranger | ×1.4 |
Under each challenge is its record for the difficulty you're pointing at: the best finished run by a person (kept on this computer until there are accounts), otherwise the best finished run by the evolved bots (sim.certifyChallenges), otherwise presumed impossible: no bot survived all five nights in hundreds of tries. Presumed-impossible challenges can still be played.
Bot records (2026-10-22; each a replayable seed and genome in tools/challenge-records.json; 640 to 3,500 runs tried per cell):
| No axe | No woodshed | No lantern | One trap | No torches | No visitors | |
|---|---|---|---|---|---|---|
| Normal | 5,399 | 5,514 | 6,267 | 3,385 | 5,605 | 3,222 |
| Hard | 3,991 | 3,825 | 4,819 | presumed impossible | 4,317 | presumed impossible |
| Insane | 3,403 | 3,759 | 4,107 | presumed impossible | 3,724 | presumed impossible |
The bots first called no visitors impossible on normal, and a person beat night one easily: the bot was spending 86 of the 125 logs it gathered in a night rebuilding worn-out traps, and lighting a lantern it had no use for. New genes (trapMax, trapFood, shedEarly, skipSleep) let it hold back on traps and put the woodshed up on night one; it then finished once in about 80 tries. The bots are good at the ordinary game and still weaker than a careful person on the lean challenges, so treat "presumed impossible" as "no bot has managed it", not proof.
Scares (on the title screen) is separate from difficulty:
Everything you build costs something you could have kept. Build in the room itself: a small amber ember glows over each spot where you could build something right now:
Click an ember for a card with what it does and what it costs. The build button (B) still lists everything.
| Build | Cost | What it does |
|---|---|---|
| Window boards | 8 wood | Three boards. Without them, her first visit at 1 am kills you. Repair one for 3 wood |
| Trap (up to 3) | 6 wood each | The only way to get meat at night (there's no hunting after dark). Raw meat and blood, collected on every trip. Each wears out after a few catches, and sometimes something tears one apart: a heavy iron clank and the chain dragging, and you bring the mangled bear trap back inside the door. The smell keeps the thing in the trees close for longer |
| Blood lantern | 8 wood + 4 blood | Red light under the door shows whether anything is actually standing there. That's the only way to catch the walkers after 3 am. It burns a jar of blood every minute, and goes dark when you run out |
| Woodshed | 25 logs, 1 s outside each | A shed against the outside wall that holds 100 more logs. You build it a bit at a time: each trip carries out the wood you have and builds it in log by log, and you can run back any time without losing what's built. That's also how you spend a pile that's getting too tall. Once it stands, a small cabinet appears in the right wall with a candle beside it: it opens straight onto the shed. Click it to look in. Wood moves on its own: extra logs go into the shed, the pile restocks from it a few logs at a time when it runs low, and the cabinet swings open while they do. The wood count shows what's in the shed |
| Corner torches (up to 4) | 2 wood each | An iron sconce in each corner of the room, where the eyes like to sit. Once you have a woodshed, its candle lights the back-right corner and that torch isn't offered (build it first and you keep both). Burns all night with a faint warm glow, and nothing opens its eyes inside it. The first time you light a corner, now and then a rat bolts out of the shadows |
| Cure meat | 1 salt | Rubs salt into 2 cooked meat so it never goes bad |
| Drying rack | 12 wood | Beside the fire. Thaws frozen logs three times faster, eight at a time. (It no longer smokes meat; salt-cure it instead) |
| Fur clothes | coat 6, trousers 5, hat 4, socks 3 fur | Each slows how fast you get cold; the whole set makes you all but immune |
| Fur curtains | 5 fur | Over the window; click the window to open or shut them (see night 3) |
| Insulate the walls | 6 fur |
Some nights (about 3 in 5), once, from midnight: slow footsteps and a clink, and a tall man in a long gray coat and a wide hat. Let him in and he opens the coat. His goods hang on hooks in the lining, more than should fit.
| Item | Price | What it does |
|---|---|---|
| Iron fire grate | 3 blood + 1 cooked meat | The fire burns down 40% slower |
| Snowshoes | 2 blood + 2 cooked meat | Every trip is 30% faster |
| Bone spear | 3 blood | If the thing in the trees catches you, you drive the spear into it. It drags itself off into the trees, and you finish your trip in a hurry. Once |
| Salt | 1 blood | 3 salt, for curing meat (and salt lines on night 2) |
| Iron stove (from night 2) | 5 blood + 2 cooked meat | Your fire in an iron box with a pipe through the roof. Cooks in 4 s instead of 6, warms you 30% more and burns 25% longer, but throws less light, so the eyes come closer sooner. Replaces the grate |
| Bone charm | 3 blood + 2 cooked meat | For the rest of the night the grin takes seven seconds instead of four: enough to finish a normal wood trip after it gets close, not a blizzard trip. It crumbles at dawn |
Only a night survived to dawn scores: for making it, how you lived through it, and what you held on to, which counts for a lot. A well-stocked cabin (say 25 logs, 15 cured meat, 15 blood and a woodshed) is worth 200, twice the dawn itself. On the score screen, what you held on to opens into each thing you kept and what it was worth.
| At dawn | Points |
|---|---|
| Made it to dawn | 100 |
| Each real person you let in | 10 |
| Each time you burned her back | 5 |
| The stranger still with you | 25 |
| What you held on to | 1 per log (pile and shed), 1 per raw meat, 3 per cooked meat, 5 per cured or smoked meat, 4 per blood, 2 per salt, 3 per fur, 5 per level of fire, and 40 for a woodshed. After a blizzard night, ×1.25 |
| Each dawn after the first | +100, on top of the nights before |
The resource bar uses small pixel icons: a log end (with the pile's 25-log limit), then the meat in three counts, cured (dark and salt-flecked, which never goes bad; shown once you have some), cooked (which goes bad in a few minutes and over the day) and raw, then salt and a vial of blood. Hover an icon for its name. The room shows what you're keeping too: elk haunches hang from a meat rack (raw dark red and marbled, cooked seared brown, cured dark and salt-flecked, gray-green when about to turn), and below it a shelf holds corked vials of blood and a crock of salt.
The edges of the screen tell you how close you are: a sickly green when you're starving, and red only when something is about to kill you. Red means the grin nearly full, the dark almost in, her climbing in with fewer than ten logs to take, the hatch opening with no beam, no salt and nothing left but you, a blaze with no blood to douse it, the cold or hunger almost there. Losing boards or food doesn't count.
Every death has its own few seconds before the red screen:
| Killed by | What you see |
|---|---|
| The dark | The last coal goes out. Eyes open one pair at a time all around the room. They blink together, and every time they open again they are closer, until one pair is right in front of you |
| Hunger | You slump sideways to the floor. Your vision blurs and narrows with each slower heartbeat, and a pair of red eyes waits at the edge of the light |
| The fire | Flames race out from the pit along the floor and climb the walls, smoke rolls down from the roof, and a burning beam comes down |
| The mimic | The door bangs open on what looks like a person. It unfolds, too tall for the doorway, its head bending down under the lintel on a broken neck and a mouth splitting down its face. Then it comes in, arms spread |
| Her, at the window | She pulls herself through the window, drops off the wall and comes across the floor toward you on her long arms |
| The thing in the trees | Its grin opens all the way and its eyes go red. A scream outside, something dragged past the window through the snow leaving a red smear, and then the door swings open in the wind and the fire sinks. Nobody comes home |
| The stranger, risen | Her body gets up in jerks, sitting, then standing, then taller than she was, and walks toward you |
| The thing under the floor | The hatch is thrown open, pale arms come up out of it and across the floor, and you're pulled down into the hole |
| The false stranger | In the dawn light her shadow climbs the wall, far too tall, red-eyed, its arms spreading across the ceiling, and bends down over you as the light goes out |
| The cold | A white glaze creeps in from the edges and frost ferns grow over it, your breath shows slower and fainter each time, and the fire seems to shrink away |
| The white (very rare) | About one blizzard night in a hundred, you lose the path for good. The whiteout swallows the room and a small dark figure walks away into it |
Every ending, death or dawn, shows a recap of your night: people let in, mimics kept out, times you burned her back, trips, meat cooked, how hungry you got and your closest call: the nearest you came to any of the threats you survived, such as the grin 92% full, burning her back with 0.4 s to spare, the dark 88% of the way in, slamming the hatch at the last moment or putting out the blaze with a second left. Whatever actually killed you doesn't count as a close call. It also shows an all-time tally, for example "14 nights · 2 dawns · killed by: the mimic 6, her, at the window 3, hunger 2". The tally also appears under best nights on the title screen. The simulation's automated nights don't count toward it.
The top-10 board takes three arcade initials. It's stored in the browser on that computer, like a single arcade cabinet; a shared online board would need a server, which was left out of scope.
tools/sim.js plays full nights at high speed through the game's test hook. Its players only use what a person could perceive: the footsteps, the lantern, the howl, the eyes in the treeline.
Results on 2026-10-17, after hunting was taken out (traps are the only meat at night; they cost 6 wood and catch less):
| Player | Nights | Survives | Main causes of death |
|---|---|---|---|
| Beginner | 100 | 0% | the trees 63%, mimic 17%, hunger 8% |
| Learner | 100 | 13% | hunger 51%, mimic 24%, her at the window 8% |
| Strong | 100 | 96% | her at the window 3% |
| Hoarder | 100 | 74% | mimic 20%, her at the window 6% |
The hoarder plays like the strong player but with the rush-traps-then-hoard plan: three traps at once, wood until midnight, then as few trips as possible. Before this round that plan let a good player coast through the rest of the night. It still survives less often than steady play (74% against 96%) and scores about the same: the pile caps at 25, meat spoils, traps wear out and hunger keeps you going out.
Night 2, among the runs that reach it (sim.runTwo):
| Player | Reached night 2 | Survives night 2 | Main causes of death |
|---|---|---|---|
| Learner | 45 of 200 | 9% | mimic 47%, the hatch while away 13% (measured before the economy round) |
| Strong | 48 of 60 | 63% | the hatch while away 15%, the dark 10%, her at the window 10% |
Two-night scores for the strong player now land between about 550 and 850. (Keeping a mimic out no longer scores, since letting one in kills you.)
A real first-time player lands between the beginner and the learner, so the large majority of first nights end in death. The doubled lantern cost is what brought the strong player down from about 93% to 84%: it now has to work to have the lantern lit when the walkers start.
The bots need some human sense to be realistic. Beginners sometimes run from a widening grin, and readers cook their meat after the first bout of sickness.
Tuning changes along the way:
perfect in tools/sim.js plays whole five-night runs, days included, and knows every defense from nights 3 to 5 (fur clothes and curtains, torches, salting and planking against the goblins, the slot, the blood hour and the flood). Every choice it makes is a number in a genome (GENES: how bold its trips are, its log reserves, when it eats, trades and buys, how it spends the day).
sim.replay(genome, seed, diff).sim.evolve(diff) keeps the best genomes, mutates them, and tests each generation on fresh seeds; sim.pickBest(evo) checks the leaders on validation seeds so a lucky one can't win.sim.replayBest('hard', 0) replays one.sim.sweep(diff, genome, [{ traps: 0.45 }, ...]) measures difficulty variants on the same seeds; sim.measure reports survival per night, scores, causes of death, and night-1 survival with and without a woodcutter or trader knocking.Hard and insane were rebalanced against the evolved players. Results with the best genome for each, 100 to 150 seeded runs:
| Survive night 1 | Reach dawn 1 / 2 / 3 / 4 / 5 | Night 1: no visitor / a visitor | Final score (median) | |
|---|---|---|---|---|
| Normal | 91% | 91 / 86 / 79 / 77 / 75% | 9 of 9 / 82 of 91 | 3,898 |
| Hard | 77% | 77 / 64 / 51 / 43 / 31% | 15 of 20 / 62 of 80 | 3,212 |
| Insane | 51% | 51 / 41 / 11 / 6 / 2% | 8 of 40 / 69 of 110 | 2,772 |
Before the rebalance the evolved hard player finished 13% of runs and the insane one never got past night 2. The playtest kits (DEV_KITS in main.js) are the best genomes' median holdings at each dawn and after each day (sim.kitsFrom).
To rerun the simulation, open the game locally and run this in the browser console:
const sim = await import('/tools/sim.js');
sim.report(120); // night 1, the five older players
sim.measure((await sim.genomes()).genomes.hard, 'hard', 100); // whole runs, the evolved player
Plain HTML, CSS and JavaScript modules, with no framework, no build step and no dependencies.
Two-layer rendering.
The night is one state object advanced in fixed 50 ms steps. Each system is a small update function, gated by the hour:
Dialogues pause the night, and the flames, snow and flicker drop to half speed so the pause is visible.
Her is drawn at half-pixel detail on the light layer: black, with a dark-red rim, backlit by a red glow that also lifts the darkness enough to show the boards she's clawing at.
Sound is generated with the Web Audio API, with no audio files:
Scoring and the leaderboard are pure functions in score.js, with Node unit tests. Stored entries are sanitized before use.
index.html markup: canvases, HUD, actions, dialogue, panels, title and ending screens
style.css pixel-styled UI, all sized from one --s scale variable
main.js the night, threats, trips, doors, drawing, UI wiring
sound.js procedural audio
score.js scoring and leaderboard logic (pure, tested)
tests/ Node test runner tests
tools/sim.js difficulty simulation, the evolved perfect player (not deployed)
tools/genomes.json its best genomes and replayable best runs
tools/challenge-records.json the bots' challenge records, replayable
challenges.js the challenges, their multipliers and the bots' records
docs/ README screenshots
The game runs in a phone browser, held sideways.
python -m http.server 5350 --bind 127.0.0.1
Then open http://127.0.0.1:5350.
npm test
Pushes to main deploy to Vercel automatically.
As of 2026-10-22 (v0.72):
npm test): scoring and the leaderboard, the achievement store, and the challenges (multipliers, their achievements, records, board entries).tools/sim.js). Runs are deterministic: a saved seed and bot genome replay to the exact same score, checked after page reloads and with other runs in between.docs/ are staged with the test hook, so their numbers aren't from real play.The background music is generated in the browser like the rest of the sound: a low, slowly breathing drone under a warped music box picking out a minor-key lullaby one note at a time, never quite in tune. As the night goes on, and as the dark closes in, a sour note creeps into the drone and the music box plays faster, with notes that clash. It's quieter during the day, and silent at dawn and when you die. N or the music button turns it off (remembered per browser).
Scroll to the very bottom of the achievements and there's a faint "experimental features" switch, off by default. With it on, a few silly, deliberately unbalanced extras can be found in the game; how to set them off is left for players to discover. One lasts only for the game it's found in, and a night that uses one counts as a playtest night: no stats, no leaderboard, no achievements.
Third-party material (not ours). One of these extras is a DOOM tribute and uses two things that belong to others, in a small non-commercial fan project shared with friends. We'll remove either at once if the owners ask:
music/rip-and-tear.mp3, a close variant of "Rip & Tear" by Mick Gordon, from the DOOM (2016) soundtrack, © id Software / Bethesda.assets/doom-shotgun.webp, the super shotgun cut out of a DOOM Eternal screenshot and colour-graded, © id Software / Bethesda.The gore, bullet puffs, muzzle flash, shot and reload sounds are original, made in code.
54 achievements, under achievements on the title screen, with a toast and a chime when you earn one:
They're stored in this browser for now (achievements.js). Each unlock keeps its time and a "not synced yet" flag, so a future account system can upload what you earned before you signed in. Simulated and playtest runs don't earn them.
Open the game once with ?dev on the address (https://firelight-topaz.vercel.app/?dev) and the title menu gets a playtest button, remembered in that browser. Pick a difficulty, then start at the day before a night or straight into night 2, 3 or 4 (optionally a few days awake), with the kit a strong player typically has by then on that difficulty (the evolved bots' median holdings: wood, meat, blood, salt, fur, traps, and what's built). Playtest runs don't count toward the stats or the leaderboard.
The playtest menu also opens the death lab (or go straight there with ?lab, https://firelight-topaz.vercel.app/?lab): every death on its own in an empty lit cabin, set up the way the room looks when it really happens (night 4's goblins, night 5's blood hour, out in the trees for the hunter and the whiteout), plus the flood from each way in, the goblins from one, two or three corners, the jump scare for every death, the face at the window on a close call, and the mimic stopped at the salt line. Play, pause, restart, scrub, slow it to 0.25x or 0.5x, switch scares between eerie and terrifying, and turn sound on or off (space, R, the arrow keys for one frame, Esc to leave). Scenes run from a fixed seed, so scrubbing shows the same frames each time. Nothing in the lab touches your saved night, the stats, the leaderboard or achievements.
The version is in the bottom-right corner (v0.78 is the 78th commit; the number counts every commit, docs included), so you can tell a refresh picked up the latest build.
Noted for later and very much subject to change:
vercel.app.Inspired by A Dark Room by Michael Townsend / Doublespeak Games. No code, text or art was copied from it.
The hidden DOOM tribute uses "Rip & Tear" (Mick Gordon, DOOM 2016) and DOOM Eternal's super shotgun, both © id Software / Bethesda, credited under Experimental features. They aren't covered by this project's rights and will be taken down on request. The game also credits them on screen when the tribute starts.
Built with heavy AI assistance (Claude Code) under Zach Shirley's direction:
Concept and look: chose the concept and the chunky pixel style with smooth firelight.
Core horror elements: the eyes in the dark, and visitors with dialogue.
This redesign: called out that the previous version had no stakes, and set:
The follow-up round:
The polish round:
The next round:
Day 2:
Zach asked for a second day and left the design to Claude; the outline came from an earlier recommendation he had approved in principle.
The font is VT323 (SIL Open Font License).
All rights reserved; source is public to read. No open-source license has been chosen yet.
| any time | The fire itself | The wood pile leans toward the fire when it's over 25 logs | Keep the pile at or under 25, or build a woodshed. If it topples, logs crash into the fire and it roars toward the roof: douse it with 2 blood in time | The cabin burns down |
| 3 am | The walkers | Some mimics have learned to fake footsteps. Nothing in the text or sound gives them away | A lit blood lantern shows the shadows of feet under the door. People stand on two feet. A mimic gets it wrong: one foot, or three. The words are the same either way, so count | You opened the door |
| night 3 | The cold | The blizzard. A cold meter beside hunger (warm, chilled, cold, freezing); at "freezing" a white-blue frost border closes in | Outside you chill fast: one blizzard trip takes you most of the way (two-thirds of the meter, half with a fur coat), so two in a row will kill you. Being cold costs you too: from "cold" your hands are slow (stoking takes longer), trips take longer, and from halfway you burn through food faster. A strong fire warms you back up, about 3 points a second roaring and barely at all smoldering. A broken, bare window lets the cold in | You freeze |
| The house stays warmer for a given fire. (Six fur is also 18 points at dawn; whether insulation is worth it is up to you) |
| Salt the doorway / the sill | 2 salt each | One use each; see night 2 |
| Salt a trap | 1 salt | A salted trap catches meat and blood twice as often (and fur, from night 2), for as long as it lasts; the salt goes when the trap breaks. You can see the white flecks on it |
| Salt around the hatch (night 2) | 2 salt | One use: the next time it would get out, it touches the salt and drops back down. Spent before the beam |
| Bar the hatch (night 2) | 4 wood | A beam across the cellar hatch. Breaks instead of you the first time you miss the slam |
Her rebuild: a scarier design with real animations for rising, grabbing, being burned, stealing and climbing in; the glass always breaking on her first visit; wind and cold through the broken window.
Nights 3 to 5 and everything after, from playtesting with his sister:
Checked and corrected throughout: played every version, reported what felt wrong, and approved or rejected each design.