Skip to content

Everywhen · Product engineering

A daily game that keeps moving offline.

Keeping local play independent of account sync, and separating game rules from the UI so scoring and progress can be checked without launching a simulator.

← All engineering work
Role & scope
Independent · iOS
Built with
SwiftUI · SwiftData · MapKit · Supabase
Everywhen’s Passport atlas showing collected places
The Passport makes accumulated progress visible. Its data needs to remain useful when a network connection is unavailable.

The constraint

Everywhen turns real places into a daily guessing game: guess the location and year, read the story, and collect the place. A short daily session should not depend on waiting for an account service.

I shifted the product from open exploration toward a daily round based on my own use. That was a product judgment, not a retention result established by analytics.

Local play, background sync

SwiftData is the source for interface reads. Optional account sync runs as background reconciliation, so network availability does not decide whether local progress can be displayed.

Sync writes are designed to tolerate retries without duplicating progress. The tradeoff is that conflict handling must be explicit: some competing write-once results can remain different on two devices. I don’t treat background sync as a promise that every screen is always identical.

Testing below the screen

Scoring, streaks, scheduling, sync, and storage logic are kept independent of the UI. Standalone Swift harnesses exercise those rules without a simulator, making it practical to check behavior while iterating on the interface.

These checks do not prove that a map gesture or a screen layout works. The repository explicitly separates logic coverage from manual screen verification; both are needed to evaluate the product.

What I take from this

An offline-capable product needs a clear answer to which data the interface trusts. Once that boundary is explicit, networking can be treated as reconciliation rather than a prerequisite for using the app.