Inspiration
Every museum label carries two facts almost nobody retains: where the painter was born and when the work was made. Circa turns those two facts into a daily game with no trivia and no right-or-wrong. You answer with a pin on a map and a year on a timeline, and you are scored by how close you got. Being 40 km off is not a failure; it is 40 km.
Why the birthplace and not the country: the countries of centuries ago no longer exist. The Duchy of Brabant is on no modern map. A place and a distance survive changing borders.
What it does
- Five paintings a day, the same for everyone. No timer, no rush.
- For each painting you drop a pin where the painter was born and pick the year. Each question is worth 1,000 points and decays with the error in kilometres and in years.
- The correction shows the answer, the distance, and the painting's details: museum, medium, size, movement.
- 503 works from Gothic to the twentieth century: Van Eyck, Velázquez, Vermeer, Goya, Turner, Monet, Hopper.
- A level computed over your last ten editions, so missing days matters and catching up matters.
- Wordle-style share card: two rows of squares, place and year.
- Game Center leaderboard and achievements. Progress travels between devices over iCloud. No accounts, no sign-up.
- Eight languages: English, Spanish, French, German, Italian, Portuguese, Japanese, Chinese.
- Runs on Vision Pro too, where paintings hang on the wall at their real size.
Monetization (RevenueCat)
Today's edition is always free. Patron is a single one-time purchase (€4.99, non-consumable) that opens the whole archive of past editions and removes ads. No subscription, and buying gives no advantage inside a game.
The piece I am proudest of: the last seven editions can be recovered without buying, by watching an ad on entry and one before the score. A missed week no longer ruins your level, and the paid tier still owns everything older. Ads are never shown while you are looking at a painting.
RevenueCat powers the entitlement (circa_pro), the offering and a remote paywall built in the RevenueCat dashboard that follows the app's own design rules: one typeface, one weight, no colour, no rounded corners, no shadows. A local fallback paywall covers the offline case. RevenueCat's Firebase integration feeds purchase events into the same analytics as the rest of the app.
How I built it
- SwiftUI, iOS 17+, one codebase for iPhone and Vision Pro, plus a spatial widget.
- Dataset pipeline in Python (standard library only): candidates from the Met and Art Institute of Chicago open APIs, resolved against Wikidata entities, images from Wikimedia Commons. Author-match and date-coherence filters keep later copies and homonyms out. Data is CC0; attribution is in the app.
- No backend. The daily edition is derived from the date with a seeded shuffle, so the archive can be reconstructed on any device. The catalogue is dealt in cycles: every painting appears exactly once per cycle, balanced across periods.
- RevenueCat, AdMob (with UMP consent and ATT), Firebase Crashlytics and Analytics, Game Center, iCloud key-value store.
- A design system where the whole UI is achromatic: the only colour on screen is the paintings'.
Challenges
- Wikidata lies sometimes. Matching by title pulled in a 1700 copy of a Velázquez. Two hard filters (author must match, date must fall within the painter's life) fixed it, plus a hand-verified override table.
- Copyright. Twenty works (Picasso, Dalí, Kahlo, Warhol...) have no free image and are excluded from the deck. Not a bug; the law.
- The scoring curve. An exponential punished the precision of your finger, not your knowledge. Switched to
1/(1+x²)with a 15 km grace radius on the map and none on the year. - Fair distribution. A fresh shuffle every day showed some paintings 30 times a year and others never. Cycles fixed it: measured over 365 editions, every work appears 7 or 8 times.
- Foldable iPhone. The layout treats the hinge as the rule of the grid: painting on one leaf, map and year on the other.
What's next
A browsable gallery of the catalogue, hints, and an Android port that keeps the same seeded editions so both platforms play the same day.
Categories
Best Game Award, RevenueCat Design Award, HAMM Award.
Log in or sign up for Devpost to join the conversation.