A devlog by Neeraj Kotwani, who builds every game on Elipar.
Frozen Summit arrived as a complete, working zip — a winter snowfield, five ember shards to collect, a stepped watchtower with a beacon to relight. Built from the same family of template as two of the exploration games already here, with the same physics, camera and HUD structure.
Four things had to change before it met the bar for this site, and one of them was a bug I had already documented as a known trap in that template — sitting live in a real submission.
The camera started facing away from the objective
The game shipped with its camera yaw set to pi, with a comment saying "start looking toward the temple".
Pi is the exact value that does the opposite. It swings the chase camera to the far side of the player, so the camera faces away from the objective and pressing forward walks the player backwards, toward the edge of the world. The comment states the intent perfectly and the value contradicts it.
This is a documented pitfall in the template I built the skill from, which is how I knew to look. What I had not expected is that an external submission built from a similar template carries the bug too — the bad value propagates with the code, comment and all.
It is set to zero now. And the important part is how that was verified: not by taking a screenshot, but by moving the player and checking the coordinate. Pressing W must decrease z, because the tower is at negative z. A screenshot of a snowfield looks like a snowfield in either direction — the starting view is plausible whichever way round the camera is, which is precisely why this survives.
After any change to a world layout or a starting camera, verify forward movement with a position check. Reasoning about it from the look-at maths is easy to get backwards, and a render tells you nothing.
A CDN import map, swapped for the vendored build
It shipped with an ES-module import map pointing at a CDN for a newer Three.js than this site uses. Every self-hosted game here has no external runtime dependency at all, so that the service worker can cache it for offline play and a CDN outage cannot take a game down.
The swap is mechanical: copy in the vendored build and its licence, drop the import map and the module type, delete the game's own import line. Every API it used already existed in the older version.
One thing that surprised me and is worth recording: the submission had tuned its light intensities for the newer renderer's lighting model, and they rendered correctly exposed on the older one with no retuning at all. I had assumed a relight would be needed. Screenshot first rather than assuming a version mismatch always means a lighting pass.
Every winner scored the same
There was no score report at all, so the first job was adding one. The obvious formula is a hundred points per shard collected.
That formula is broken in a specific way this site has hit before. This is a "collect everything, then reach the exit" game, and the beacon only becomes relightable once the last shard is found. So at the only moment a win can fire, the collected count is provably equal to the total. Every single winner scores identically, and the leaderboard carries zero ranking information.
Two other games here shipped with exactly that bug and had it fixed the same way: track the moment the run actually started and add a time bonus, so a fast escape beats a slow one. Added here from the start rather than discovered later, and verified end to end with a listener catching the real score message rather than trusting the arithmetic.
If you add a game where the exit cannot open until everything is collected, check whether its score can tell two runs apart before wiring up a leaderboard.
Audio, and the two bugs I pre-empted
It had sound effects but no mute control and no music, so it got the standard stack: the mute guard, a slow sparse pad, start and stop wired to the run, and a real keyboard-operable button rather than a styled div. That last distinction matters more than it looks — six games on this site had mute controls built as divs with a click listener, which means no keyboard focus, no Enter or Space, and no label for a screen reader. They look and click fine with a mouse, which is why nobody noticed for months.
Two other known bugs from my own notes were pre-empted while integrating, both cheap and both real.
The HUD moved down out of the frame's reserved top-left corner, where the site draws its personal-best badge. And the "beacon is ready" message writes to a dedicated status element instead of replacing the objective line's markup — because the objective line contains the collected-count spans, and overwriting its contents destroys the elements a cached reference points at. In a single-level game that is harmless, since the run ends moments later. The game it first bit had a second level, where every subsequent pickup wrote its count into a detached, invisible node.
Both of those are three-line fixes when you know about them and afternoon-long confusions when you do not, which is the entire argument for writing this sort of thing down.
Frozen Summit is free in a browser, no account, no download. Forward walks toward the tower.