I wrote this post as part of the Kiroween 2026 hackathon.
I am not a developer by training. I am the author of the Ladder method and a solo founder from Kazakhstan. My service, 108psy.com, helps women see the gap between where they are and where they want to be. For Kiroween I wanted to find out if Kiro could turn that method into something people can see, not only read.
The result is Haunted Ladder: live demo, no login, code on GitHub, 3-minute video.
A fear without a name feels bigger
The Ladder method asks four things: your goal, where you are now, the obstacles in between, and the fears above the goal. Women tell me the fears are the hardest part. Halloween gave me a simple frame: if a fear is a spirit, you can see it, name it and give it a next step.
So you write your goal and up to five fears. A night staircase appears under a blood moon. Obstacles hang on the steps as cobwebs. Fears stand above the goal as Zheztyrnaq, a copper-clawed witch from Kazakh folklore. For each fear you write one small step for this week, and the witch turns into Peri, a bright golden spirit. A glowing heart beats faster for every fear without a step and calms down as you write them. When every fear has a step, dawn comes.
Specs first, even for feelings
My favorite thing about Kiro: I could write in the spec what a person should feel, and Kiro built it. I stopped thinking in code and started thinking in moments.
The main spec in .kiro/specs/haunted-ladder/ has 19 requirements in EARS form, a design with 21 correctness properties and 27 tasks. Kiro built the app task by task. When I wanted a change, I changed the spec first and let Kiro build from there.
The requirement I care about most is about safety, not spookiness:
WHEN the answer has
kind: "crisis"THEN the system SHALL remove the staircase, ghosts, cobwebs, moon, fog, the heart and every Halloween element from the page, and SHALL stop all sound at once.
Written as one EARS line, it became something a test can check, not a wish in my head.
Not every change needed the full process. For the falling stars on the waiting screen I used a quick spec (perseids-starfall). For the wording of the English legend I used a bugfix spec (english-legend-clarity). My rule now: a full spec for the core (draft rules, parsing the server answer, crisis handling, storage), a lighter spec for polish.
Property tests for words, not only for code
The app works in English, Russian and Kazakh. I cannot check every string in three languages by eye. The 21 correctness properties are tested with fast-check: 111 tests, all passing.
Two catches I remember:
- A contract test built from a real
analyze_ladderanswer caught a type mismatch with the live server early:fearsAboveGoalis a number. - A property test failed on the Russian intro because my wording had a capital letter where the rule said it should not. Kiro read the failing test, fixed the text, and the suite went green.
Steering: rules every chat remembers
Seven files in .kiro/steering/: product, tech, structure, safety, style, kazakh-folklore and devpost-writeup. The trick that helped most: tech.md pulls in live code files, so the server contract in the rules cannot drift away from the code. Safety and folklore have their own files, so every new chat already knew that spirits must turn kind and that sound never starts by itself.
Hooks: a second pair of eyes on every save
Ten hooks in .kiro/hooks/:
- tests run on save;
- a forbidden words check looks at wording,
innerHTMLand autoplay; - a locale check makes sure every key exists in all three languages;
- after each task, a safety and style review;
- a prompt guard;
- a hook that blocks
git push, so nothing leaves my machine without me; - screenshot hooks and a compaction log.
Agents, MCP and the rest
- Two custom agents.
haunted-builderwrites code with a tool allowlist and the Ladder MCP.haunted-revieweris read only. - MCP.
.kiro/settings/mcp.jsonconnects my Ladder MCP server (get_ladder_questions,analyze_ladder) and Playwright MCP for browser checks. Kiro calledget_ladder_questionsin Russian and Kazakh and copied the method's own question texts intosrc/locales. So the translations are my words, not machine guesses. That was the moment MCP stopped being a buzzword for me. - Power, skill, workflow. A Ladder power in
powers/ladder, a skill for adding a new spirit in.kiro/skills/add-spirit, and a release workflow that runs checks, screenshots and three language reviews, then waits for my yes. - IDE and CLI. 33 chats in the Kiro IDE and 5 with
kiro-cli. All 38 are exported tokiro-sessions/in the repo, so anyone can read how the app was built.
The hardest part: spooky, but not scary
A spooky look must not frighten a person who is already anxious. So there are no jump scares. Night sound is off on every page load and starts only after you press "Night sound", with a slow fade. With reduced motion turned on, nothing moves. The page works with the keyboard alone.
And if the server finds signs of crisis in the words, the whole costume disappears. Only a calm message, a link to help and one button back remain.
What I would tell another non-developer
- Write the feeling into the spec. Kiro can build a moment if you describe it as clearly as a feature.
- Put your non-negotiables into steering and hooks, not into your memory.
- Use property tests for text too. They caught mistakes I would never see in three languages.
Pre-existing work
The app calls the Ladder MCP server at https://108psy.com/mcp, which I built before the hackathon for 108psy.com and the Ladder plugin in ChatGPT. Everything in the Haunted Ladder repo (specs, steering, hooks, agents, app code, tests, graphics) was made during the submission period, from 30 October 2026.
Meet your ghosts: open the demo.
This post was written with AI assistance and edited by me.

![Embodied AI and Robotics — Ch.23: Human Robot Interaction [EN]](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffbn7a1c1nj4avqhy57gx.png)
![Embodied AI and Robotics — Ch.24: Embodied AGI [EN]](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3umdji1vob209jeeusfd.png)

![Embodied AI and Robotics — Ch.02: Perception Action Loop [KR]](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqm1k8wvw9a4pvnnx8p8g.png)
![Embodied AI and Robotics — Ch.03: Robot Perception [KR]](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgplpdgf76ac4f5fnpvjh.png)
![Embodied AI and Robotics — Ch.04: SLAM and Mapping [KR]](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fji1ma0rjblnag2lns88j.png)