Inspiration
The Last Lantern turns a classic haunted-house setup into a compact, clue-led escape room. A single five-minute deadline gives each small discovery a little urgency, while the story leans on quiet atmosphere and mystery rather than graphic horror.
What it does
The front door of Blackthorn House has slammed shut. Explore the foyer, study, and cellar, gather useful objects, and piece together clues in your field notes. A date from a burned newspaper clipping opens a locked desk drawer; a diary clue points toward something hidden in the dark. Light the candle, find the iron key, and reach the back door before time runs out.
The game includes an inventory, a clue-led four-digit lock, a five-minute countdown, win and timeout endings, and a restartable loop. Progress is saved locally in the browser, so you can continue on the same device. It runs directly from index.html without an account, install, build step, or network connection.
How it was built
The prototype is a single-page game built with HTML, CSS, and vanilla JavaScript. Browser local storage keeps progress on the device. The interface includes keyboard-operable controls, visible focus styling, a responsive layout, and reduced-motion support.
The initial game starter and the first .kiro planning/specification files were created manually before Kiro was used. Kiro CLI was used later in development to validate save data, refactor the game-action logic, fix a restart/save edge case, and improve keyboard focus, retention of text entered while the timer runs, and text contrast. This was a manually started project developed further with Kiro assistance—not a project authored entirely by Kiro.
Challenges
One tricky detail was keeping the game responsive without disrupting what a player was doing: the countdown needed to update without clearing a code as it was being entered, and re-rendering a scene needed to preserve useful keyboard focus. Save data also needed validation, and restarting after a saved or finished game needed to return to a genuinely clean state.
What we're proud of
The game is small enough to open and play immediately, yet its clues connect the rooms into a complete escape-room loop. The same compact design also keeps state local and avoids accounts or network dependencies.
Testing and accessibility
Development checks reported for the project included 64 Node.js checks and 20 Chromium checks. Browser scenarios covered keyboard game flow, winning and timing out, and text-contrast checks, with a minimum measured contrast ratio of 4.67:1. Screen-reader behavior has not been tested with NVDA or VoiceOver, so this draft makes no screen-reader compatibility claim.
Learning and next steps
This project reinforced that a small state-driven game benefits from explicit save-data validation and carefully separated action logic. It also showed that timer updates, re-rendering, keyboard focus, and text-entry retention need to be tested together rather than treated as isolated interface details.
Next, the project could benefit from broader assistive-technology testing, further playtesting of clue clarity and pacing, and continued review of restart and persistence behavior across browsers and devices.
Built With
- css
- html
- javascript
- kiro-cli