Inspiration

I built the first version of this for my own kids.

The problem was small and completely ordinary: the same walk, every day, and two children who had run out of reasons to be interested in it. Our street didn't need to be more exciting. It needed something in it that hadn't been there yesterday.

So I made a game where the world quietly restocks itself overnight — where the corner you've passed a thousand times has something waiting on it this morning, and the only way to find out what is to go and look.

It worked. They wanted to go out. They took the long way home. And a walk I'd been nagging them into became something they asked for.

That's when I started wondering whether the same thing would work for people who weren't 12 years old — and it turns out the mechanism has nothing to do with age. Fitness apps are built on obligation: step goals, rings to close, streaks that punish you for a bad week. Obligation is exactly what makes people quit in February. Curiosity doesn't work that way. Nobody has ever abandoned curiosity out of guilt.

Iskrio is that mechanism, built out properly: no streaks, no timers, nothing that expires while you're at work, nothing taken away from you for skipping a week. Just a reason to look at your own street again.

What it does

You place a Lamp somewhere real — your street, your park, the block you already walk every day. The Lamp is permanent, and it's yours alone.

Every night, the Lamp draws iskrio, small glowing spirits, out of the streets around it. They aren't scattered randomly: the game reads the real geography from OpenStreetMap and settles each species where it belongs. Water spirits by water. Forest spirits under trees. Something older near the old stones. In the morning they're waiting on your map, and the only way to collect one is to physically walk to it.

That's the whole loop. Go outside, walk somewhere, come back with something.

The visual language is warm and storybook, not utilitarian — and one rule governs every creature: nothing from our world is ever on their bodies. No hats, no tools, no props. They read as beings, not mascots.

What the game deliberately does not have:

  • No streaks. Skip a week, skip a month — nothing is taken from you.
  • No countdown timers on rare finds. Nothing expires while you're at work.
  • No rewarded ads. No ads at all.
  • No leaderboards ranking you against people who walk more than you.
  • Outside the limited Founder edition, nothing purchasable that you can't also earn by playing.

The design rule I wrote down early and never broke: scarcity in cosmetics is acceptable; scarcity in the game loop is toxic. Money buys speed, never access.

Walking, health, and who gets left out

Location-based games have a quiet accessibility problem: the good content is somewhere else. Mountains, coastlines, tourist districts. If you can't travel — no car, no money, small child, bad knee, wrong city — the game is simply not for you.

Iskrio's answer is the Essence system. Essences are earned by playing and attract spirits from a specific world to your neighbourhood. A player who can't get to the mountains can still meet a mountain spirit on their own street. Crucially, lures redistribute where spirits appear — they never increase how many exist. The player who travels isn't punished, and the player who can't isn't excluded.

The health claim I'm willing to make is a modest one: this game will not make anyone an athlete. It gives people a small, pleasant reason to walk twenty minutes more than they otherwise would — and, because there's nothing to lose by stopping, a genuinely easy way to come back after they do.

How I built it

Flutter for the client, Supabase for everything behind it: PostGIS for spatial queries, Edge Functions for game logic, pg_cron for the nightly generation. MapLibre GL with MapTiler tiles for the map, OSRM for the walking routes behind the Guiding Thread — a pixel-dot trail that shows you the way to a chosen spirit without ever turning the game into turn-by-turn navigation.

RevenueCat handles purchases and the Iskrio+ subscription. Money prices exist in exactly one place — the store — and arrive in the app as a localized string. There is no price number anywhere in my code or my database, which means no currency mismatch and nothing to redeploy when prices change.

Iskrio was designed and directed by one person and built with AI tools for both code and art — a workflow that made a systems-heavy game with 48 creatures and 26 painted backgrounds possible at this scale solo.

Challenges

Nightly generation at scale. Ten thousand Lamps would mean roughly a hundred thousand spirit placements per night, each one requiring real geodata for a specific patch of the world. The naive version — one cron tick, all Lamps in sequence, public Overpass for geodata — would have died quietly well below the traffic I'm hoping for. And it would have failed silently: nobody gets an error, they just wake up to an empty map. Getting the foundation right mattered more than making it fast, and the foundation is: the spirit rows themselves are the record of "this Lamp is done for today," so the run can be torn into pieces, retried, and parallelized without ever double-placing.

Privacy. A permanent Lamp on a real map is your home, or near it. So it's visible only to friends you've accepted; strangers nearby see it only if you choose to show it. Even the community rules steer sharing toward customization — lamp skins, interiors — and away from screenshots with map data on them.

Designing an economy with the FOMO removed. Take away streaks, timers, and limited-time drops and you've removed most of what the genre uses to make money. What's left has to be genuinely worth buying: cosmetics people actually want, and a steady rhythm of new ones. It's a harder business, and it's the only one I was willing to run.

What I learned

Failures in a game like this don't announce themselves. Overpass — the public geodata service the night generation reads from — answers a truncated query with HTTP 200, valid JSON, and a quiet note in a field nobody looks at. Cache that and you've stored a half-empty city for thirty days. Nothing throws, nothing logs, and one morning a neighbourhood just has fewer spirits in it than it should. Most of the hardening work on this project wasn't fixing errors; it was teaching silent wrong answers to become loud ones.

The same lesson arrived from the other direction when I tried to measure how long generation took. The runtime's own CPU counter doesn't error out — it passes every "is this working?" check you can write — it simply returns a number that never moves. It reported 0 ms for a tick the platform billed at 1613 ms. You cannot measure yourself from the inside.

Everything on a map has one of two citizenships. It either lives in the world and is measured in metres — Lamp radius, catch range, the zone a spirit belongs to — or it lives on the screen and is measured in pixels: markers, icons, the dotted trail of the Guiding Thread. Pick wrong and you don't get one bug, you get four at once: the thing grows when you zoom, its edges go polygonal, its size is off, its opacity is off. I built the Guiding Thread out of the same mechanism as the radius circles because that mechanism was right for radius circles. The question that decides it is simply: should this grow along with the ground?

What's next

Iskrio is live on the App Store, with Iskrio+ available from day one.

Next, the mechanic I most want to build: a lure you're not allowed to place near yourself. It has to go outside your own radius, it calls a rare spirit that wasn't in anyone's night, and you can never catch it — only someone else can. A gift left on a street corner for whoever walks past.

Beyond that, the world keeps growing: world portals into the thirteen worlds behind the creatures, gifts between friends, new species, and a new theme every month. A cozy game without pressure has to earn attention by giving people something new to find, not by threatening to take something away — so a steady supply of art isn't a nice extra here, it's the business model. The game already ships in eleven languages, with more to come.

Built With

Share this project:

Updates

Submission history