Skip to content
← All design work

Design case study · Everywhen

Getting people tocome back to alearning app.

A place-based learning app nobody needed to open twice, and how it became a daily where-and-when game people return to, down to the physics of a single sheet.

The reveal for Rani ki Vav: a dashed line from the guess to the answer, with where and when scores.
Place 1 of 4: a photograph of the London Eye and a clue that never names it.
The scorecard: 616 of 1,000 and a 40 day streak.
Scroll

Everything that ever happened, happened somewhere.

The hard part wasn’t the places. It was giving anyone a reason to come back tomorrow.

Role

1person,
every hat
  • Product
  • Interaction
  • Visual
  • Code

Timeline

14 iOS versions in four months, live the whole time

JulAugSepOctNov1.01.31.61.71.9.2Daily gameeverywhen.cc中文

Platforms

  • iPhone & iPadSwiftUI
  • AndroidKotlin · Compose
  • Webeverywhen.cc

Scale

930places in eight realms, in English and 中文

  • The Past130
  • Turning Points163
  • Science & Invention88
  • Arts & Culture118
  • Belief & Myth104
  • Earth & Sky125
  • The Living World74
  • Mind & Society128

The short version

Problem

A learning app gives you no reason to open it tomorrow.

Bet

A daily round of four real places: guess where, guess when, then read what happened there.

Craft

Input that makes precision possible, scoring that rewards being close, a voice that takes your side, and one sheet that moves the way your hand expects.

Honesty

The app collects no analytics, so this is design reasoning and my own daily play, not a retention chart.

The problem

A lovely app with no reason to open it tomorrow.

The first Everywhen, shipped in mid-July, was a place-anchored learning app. You opened it, a place lit up on the map, and you got a two-minute story about it, ideally listened to on a walk. One place, one takeaway, one question. The premise still drives everything: memory is exceptionally good at hanging facts on locations (the method of loci), so every fact in Everywhen is pinned to the spot where it happened.

The loop was tidy and the content was good. What it lacked was pull. Explore was built on “pull, don’t push”: nothing appeared unless you asked. A daily notification named a random place. Tomorrow looked exactly like today, so there was no particular reason to come back to it, and in my own use I mostly didn’t.

Everywhen's Explore map: coloured pins for places across Europe and Africa, with a Surprise me button.

Explore, the original front door. It is still in the app, but it is no longer the reason to open it.

The bet

Make it a daily game, and end every round in learning.

The day after 1.0 shipped, I wrote a new first line for the spec: “The retention engine: one shared daily round of four place-guessing puzzles that ends in learning.” It was built and merged that same day, and Today became the first tab.

Why a daily

A new round each day is a reason to come back that needs no explaining. A streak turns that into a small promise to yourself.

Why shared

Everyone gets the same four places on a date, so scores are comparable and a share is an invitation, not a brag.

Why scarce

Four a day keeps learning spaced, which is how it sticks. Bingeing a catalog is cramming, so the scarcity is the feature, not a limit.

  1. 9:00A reminder that points at the game, not a place
  2. ClueA photo and a hint that never names it
  3. WhereA pin anywhere on Earth
  4. WhenA range, then a year
  5. RevealHow close, said kindly
  6. StoryWhat happened there
  7. CardA score to share that spoils nothing
  8. StreakTomorrow is now a promise
Four places. One loop a day, the same four for everyone. It closes on tomorrow.

Guessing before reading also does real work. The guess is a retrieval attempt, a moment of “I think I know this”, and the story then lands on a question you already care about. The game feeds the Passport, the atlas of every place you have collected. It is not a parallel universe.

The shape of a day

Four places. A thousand points.

A day runs easy to hard, and each place is worth more than the last: 100, 200, 300 and 400 points. Knowing the obscure place pays the most, which is the right incentive for a learning game, and the maximum comes out a clean 1,000. A fifth bonus place is optional and never counts toward the streak or the shared score, so the core day stays comparable for everyone.

Place 1 of 4: A slow wheel with a missing number. A photo of the London Eye with a clue card.
The scorecard: 616 of 1,000, a strong round, a 40 day streak, and four places with their scores.

A place never repeats

I chose never over “once a year”. At five a day that is roughly 150 new places a month, forever, so content became a permanent rate to hold rather than a backlog to clear. An unscheduled place is invisible in the app, so the schedule is the product.

Easier early rounds

Playing in October, I noticed I mostly didn’t recognise round two at all. Places had drifted to being rated more famous than they are. The fix wasn’t harder content but a nudge: a region chip and an era chip on the first rounds, always on, at no cost.

930places, every one dated
8realms, one colour each
4places a day, the same for everyone
1,000points, weighted to the hard one

Asking “when”

An era first. Then a year.

The first when-input was one slider from 4.5 billion years ago to today, log-scaled so the sixties and the age of the dinosaurs felt equally reachable. It looked elegant and was physically impossible to use: the full-points window was about half a pixel of track at every era. It became two steps, a range and then a year inside it, shipped the same day the daily did. Try both.

Pompeii from above, with Vesuvius behind it.

When was Pompeii buried?

Pompeii, Italy · full points within ±97 years · try both inputs

First design · one slider

67,000 years ago
4.5 billion years agotoday

Off by 65,135 years.

1.4 px wide: the whole full-points window on this track.

Shipped · range, then year

Pick a range

 

Six ranges, oldest first. The slider wakes up in the one you pick.

Same answer, same tolerance, same rules as the app. Only the input changed.

A chip has to earn its place

The first ranges followed textbook eras, and Modern alone held 47% of the places while Prehistory held 4%. Merging the two oldest into “Before history” and splitting Modern at 1900 brought the fullest range down to about 30%, so every choice is a real choice.

Forty years of grace

Tolerance is 5% of an answer’s age, which is fair for antiquity and brutal near the present: ±3 years on a 1962 temple that looks medieval. Within forty years of a modern date now scores in full, because the present is exactly where a photograph lies to you.

Making it fair

Close should count.

The original where-score had, in my own note, “a cheap top and a cruel middle”. Anything within about 64 km showed a perfect score, while a guess 2,000 km along the Amazon earned a quarter and 5,000 km earned almost nothing. In late October I reshaped the curve so it falls fast near the answer, keeping a top score meaningful, and flattens across the middle, so the right continent keeps real credit.

Points for a pin, by distance from the answer Before (to Oct 31) After
0%50%100%01k2k3k4k5k6kkm from the answerBeforeAfter

Hover the chart to compare.

As a table
km off1003001,0002,0003,0005,000
Before96%83%50%24%12%3%
After92%81%60%44%33%21%

Clues that don’t give it away

An audit found 44% of the hints leaked: a century, an era label, a word from the place’s own name. With a forgiving when-score, one leaked century was worth full marks. All of them were rewritten, and a test now fails the build if a hint names its place or runs past 140 characters.

The story is the answer key

A date has to match the event the story itself tells, backed by a quote from the story. Otherwise a player who read carefully would be marked wrong, which is the one thing a learning game can’t do.

On the player’s side

When a place fools you, it’s the place’s fault.

The reveal says one line, right away, in the voice of a delighted friend across the table. It is never scoreboard-speak. When you nail it, it says so. When you don’t, the puzzle takes the blame: the place was hiding, and being wrong is how these stick. The hardest place of the day stays forgiving-funny, because nobody is meant to get that one cold.

The reveal for Rani ki Vav: a dashed line from the guess, 146 of 200 for where at 522 km away, 175 of 200 for when, and the line: You felt the era. The map played tricks.
The story of Copacabana Beach: the beach where the pavement became a picture.
“You felt the era. The map played tricks.”

Every reveal ends in a real place and what happened there.

  • Petra100 BC

  • Mount Fuji750

  • Uluru550 million years ago

  • Great Wall1570

  • Terracotta Army210 BC

  • Hagia Sophia532

  • Stonehenge3000 BC

  • Gombe1960

  • Potala Palace1682

  • Salem1692

  • Alcatraz1934

  • Sistine Chapel1508

  • Machu Picchu1450

  • Galápagos1835

  • Borobudur800

  • Abu Simbel1264 BC

  • Pompeii79

  • Rapa Nui1000

A face for every place

Nine hundred and thirty places, no two alike.

A list of 930 places is a lot of names to tell apart. In late October every place got its own small line drawing: a bridge, a crater, a stepwell, a chimp. They sit beside each place in the Library and its collections, drawn in the colour of the place’s realm, so a shelf of places has a shape before you read a word. Find one, or filter by realm.

120 drawings
  • Cappadocia
  • Jallianwala Bagh
  • Soros burial mound
  • Jokkmokk
  • Aboukir Bay
  • Hans Island
  • Espace Van Gogh
  • Tashkent
  • Avenue of the Baobabs
  • Khujand
  • Pitch Lake
  • Sundarbans
  • Nimrud
  • Tierra del Fuego
  • Geirangerfjord
  • Teouma
  • Omaha Beach
  • Ephesus
  • Great Barrier Reef
  • Bletchley Park
  • Castillo San Felipe del Morro
  • Tillya Tepe
  • Banpo Archaeological Site
  • Burgess Shale
  • Nauru
  • Parthenon
  • Venice
  • San Salvador Island
  • Mapungubwe
  • Omni Mount Washington Resort
  • Port Newark
  • Aoraki / Mount Cook
  • Jantar Mantar
  • Barro Colorado Island
  • Medeu Dam
  • Betpak-Dala steppe
  • Verona Arena
  • University of al-Qarawiyyin
  • Kaffeklubben Island
  • Mactan Shrine
  • Dead Sea
  • Ancient Merv
  • Mare aux Songes
  • Amalfi
  • Charles Bridge
  • Indira Gandhi Memorial
  • Atacama Desert
  • Rani ki Vav
  • Ujiji
  • Darién Gap
  • Marina Bay Sands
  • Sigiriya
  • Chogha Zanbil
  • Bridge on the River Kwai
  • Griffin's Wharf
  • New York Stock Exchange
  • Golden Bay / Mohua
  • Mount Wilson Observatory
  • Mahabodhi
  • Grosse Île
  • Kharkhorin
  • Taj Mahal
  • Omo Kibish
  • Kola Superdeep Borehole
  • Île de la Tortue
  • Lake Victoria
  • Jellyfish Lake
  • Lake Guatavita
  • Mehrgarh Archaeological Site
  • Colosseum
  • Siwa Oasis
  • Bayreuth Festspielhaus
  • Himeji Castle
  • Ecbatana Ancient Site
  • Shenzhen
  • Ngorongoro Crater
  • Paektu Mountain
  • Mont Blanc
  • Glastonbury Tor
  • Saint Basil's Cathedral
  • Camp Century
  • Hill of Tara
  • Herat Citadel
  • Nabta Playa
  • Theresienwiese
  • Scott's Hut
  • Bois Caïman
  • Barentsburg
  • Nuuk
  • Golden
  • Cromford Mill
  • Jemaa el-Fnaa
  • Dawson City
  • Kaziranga
  • Washikaguchi
  • Mycenae
  • Mekong Delta
  • Santiago de Compostela Cathedral
  • Cape Horn
  • Dejima
  • Bagan
  • Genghis Khan Equestrian Statue
  • San Agustín
  • MeerKAT Radio Telescope
  • Cajamarca
  • Hobart
  • Pamir Highway
  • Serengeti
  • Bethlem Royal Hospital
  • Buenos Aires
  • Huaca Rajada
  • Khongoryn Els
  • Baghdad
  • Basilica of Our Lady of Guadalupe
  • Sistine Chapel
  • Paramaribo
  • Matmata
  • Satawal Island
  • Jebel Barkal
  • Loulan

No two alike, by rule

The content build refuses two places with the same drawing, and refuses a catalog where any place is missing one. Distinct isn’t a hope I check by eye; it’s a test.

One drawing, three renderers

Each icon is a few path strings on a 24-point grid with round caps and no fill, drawn natively by SwiftUI, Compose and the browser. iPhone reads paths most strictly, so every one is checked the way iOS will read it before it ships.

Reasons to come back

Small promises, kept honestly.

One streak, one source

A restored phone once read “0-day streak” over two hundred played days. Every screen now counts it one way, pinned by a test.

A nudge that names no place

It points at the game, not an answer. Android asks permission only after your first round.

A missed day mends

Past dailies stay playable, and finishing one heals the streak. A streak that can only break teaches you to stop caring.

A score is an invitation

Everyone plays the same four, so a friend can take you on today. The cards →

Pro sells speed, not reading
  1. Unlock the whole catalog
  2. Binge everything
  3. The daily loses its pull
  1. Collect faster
  2. Up to two past days a day, no ads
  3. The daily stays the reason to open it

Cards that leave the app

A picture made for someone else’s thread.

A share is the one part of Everywhen that leaves the app and lands in someone else’s messages. So each card is designed for whoever receives it, which means two people at once: a friend who plays, and a stranger who doesn’t. Every card is the same 4:5 object on iPhone, Android and the web. Tap through them, then flip the thread to dark.

1080 × 1350, the shape Messages and Instagram treat best

No map, ever

A pin would hand the answer to a friend who hasn’t played yet.

Four columns

Each filled to its round’s score: the same numbers as the text share.

Everywhen.cc #122 · November 8

46😬 54😬 47😬 80🌟

Final score: 616 / 1,000 · 🔥 40

The picture, then a line of textThe same bytes from a phone or a browser. No names, no pins, no years.
  1. 👑 🏆 💯both perfect
  2. 🎯 🔥 🌟90%+
  3. 👏 💪 🙌70%+
  4. 😬 😅 🤔45%+
  5. 😨 💀 🙈a miss
A crown is earnedA 50 and a 49 is near-perfect, not a crown. Seeded by the day, so a re-share never reshuffles.

616Georgia

616Charter

Figures that line upGeorgia’s numbers bounce, so it goes last in the card’s font stack.

Motion: one sheet

It should go all the way up, then scroll.

“See your guesses” lets you step back through the day’s four places: your pin and the answer on the map, your scores, then the place’s story. The whole design is one sheet over a map, and almost all of its quality is in how it moves. Every rule below is in the shipped app, with the same constants on iOS, Android and the web.

The temple you enter by going down

Rani ki Vav, Patan, Gujarat, India

You felt the era. The map played tricks.

Where146/200522 km away
When175/200around AD 1050

At Rani ki Vav, the grand architectural approach leads down into the ground. Built in the eleventh century as a memorial, the stepwell made access to water into a carefully designed descent, with stairs, pavilions, and carved panels along the way.

Its seven levels were conceived as an inverted temple. Water was both a practical resource and something sacred, so the structure joined engineering to religious imagery. More than five hundred major sculptures and many smaller ones filled the walls around the descending visitor.

Flooding and changes to the nearby Saraswati River eventually buried the well in silt. That ended its original function but helped protect the carvings for centuries.

The recovered stepwell makes a daily necessity feel monumental. Instead of raising a temple above the plain, its builders created a richly worked space beneath it.

Photo: Bernard Gagnon, CC BY-SA 3.0

Try it

Drag it, flick it, push it past the top.

Release–px/s
Lands atHalfwhere it opens
SpringSettlesk 200 · c 30

Every release is projected to where it would coast to a stop, then settles on the nearest of three stops: Open, Half and Peek.

  1. Project the flick. A release is projected to where it would coast to a stop, using the same deceleration as scrolling (0.998 per millisecond). A firm flick from the bottom reaches the top; a lazy one doesn’t.
  2. Three stops. Half shows the whole reveal panel and is where every place opens. Peek gives the map nearly the whole screen. Open is the story.
  3. Settle, don’t bounce. A critically damped spring that starts at your finger’s speed. A wobble on a sheet holding a story reads as a toy. Reduce Motion gets a stiffer one.
  4. Bend, don’t wall. Past either end the sheet follows at a shrinking fraction of your finger, so an edge feels soft instead of broken.
  5. One surface. Pushing up moves the sheet to the top, then the same gesture scrolls the story. Pulling down scrolls the story back, then brings the sheet down.
  6. The map holds still. It is framed once, for the half stop, and never re-centres as the sheet moves.
  7. One haptic, at commitment. A light tick when the sheet commits to a new stop, never just for passing one.

One day of getting it right

  1. “See your guesses” arrives: a way back into the day’s four places from the scorecard.

  2. First design: pull the panel up and the story rises over it as a separate page. It read as a second page stacked on the first, and I reverted it 26 minutes later.

  3. A half sheet over the map instead. Push it up and the photo and story are right there below the scores.

  4. The motion rules arrive: project the flick, settle on a critically damped spring, bend past the ends instead of hitting a wall.

  5. A third, lower stop, so the map can have nearly the whole screen when you want to look at it.

  6. The map stops moving when the sheet does. Every camera fix re-centred it a beat later, so the review map became a native map view with its margins split from its camera.

  7. The rule I’d written down (“stop at the top, pause, then scroll”) was wrong in the hand. Reversed: the sheet and its story are one surface.

  8. Driving it by touch in the simulator found it didn’t move at all on the newest iOS, and that Read story was a dead tap. Both fixed before 1.9.2.

One game, three clients

Same rules. Native in each place.

Everywhen is three separate clients: SwiftUI on iPhone and iPad, Kotlin and Compose on Android, and React on the web at everywhen.cc. The game rules are shared, not the interface: scoring and streak fixtures are generated from the Swift code and checked by the Android and web tests, so a day scores identically everywhere.

Tests aren’t flow

The first Android daily passed every test and was one step from release when I played it on my phone and found five ways it didn’t feel like the iOS game: the story in the wrong place, no map on the reveal, ranges that scrolled, and more. A port has to reproduce the flow, not just the features. Now I play every port end to end before it ships.

每個地方

All 930 places, every clue and every story, read in Traditional and Simplified Chinese. The Simplified text is converted from the Traditional, with hand-made exceptions where the converter picks the wrong word.

The Passport: collected places pinned on a world map in realm colours, with region progress.
The Copacabana story in Traditional Chinese.

What I’d measure next

Honest about what I know.

Everywhen has no analytics SDK, by choice, so I can’t show you a retention curve. What I can show is the reasoning, the craft, and a habit of playing my own game every day and fixing what it teaches me. If I added consented measurement, these are the questions I’d want answered first:

  • How many people play on day 2 and day 7, and which round they stop at.
  • Whether a healed streak keeps people longer than a broken one.
  • How often a share turns into a new player’s first round.
  • Whether people go back to stories in the Passport, or mostly return for the next game.