-
-
Morning in Lower Manhattan. Spirits placed by real OpenStreetMap geography — every glow is a species in the place it belongs.
-
The only way to collect one is to physically walk there. That's the whole game.
-
A new player's first morning by the Thames. The dark cloud is Noctis's storm — tap it for a small gift.
-
Zoomed out: friends' Lamps across Europe. Only people you've accepted as friends can see where your Lamp is.
-
Touch and hold to call a spirit to your Lamp. Each of the 13 worlds has its own catch screen, painted as a day/night pair.
-
Every light you see at night has to physically exist in the daytime version of the same place.
-
Nothing from our world is ever on their bodies — no hats, no tools, no props. They read as beings, not mascots.
-
The Underlamp — the room beneath your Lamp. A place, not a menu. The spirits living there comment on what's been happening.
-
The default Underlamp. The portal in the corner leads to the Market World, where new skins and themes arrive.
-
Lamp skins — all priced the same, so choosing one is a matter of taste rather than budget. A new one arrives every Tuesday.
-
Thirteen worlds behind the creatures, each with its own geography, families and names.
-
Essences draw a specific world's spirits to your own street — so players who can't travel aren't locked out of the good content.
-
Every species has its own page in the Diary: where it lives, how it behaves, and a triple experience bonus the first time you meet it.
-
48 species across 13 worlds, each with its own name, etymology and place in the mythology.
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
- android
- claude
- codemagic
- dart
- deno
- firebase
- flutter
- ios
- maplibre
- maptiler
- openstreetmap
- osrm
- postgis
- postgresql
- posthog
- revenuecat
- sentry
- supabase
- typescript
Log in or sign up for Devpost to join the conversation.