Skip to main content
GameiOS + Android + Web

Terra Tempus

Year2026
RoleSolo
StatusLive

A daily geography and history game, built and published solo under Endpaper Labs. Read a clue about a real historical event, then place it in space and in time. Live on the App Store and Google Play.

10k
Points per Round
2
Store Listings
2
Guesses per Round
Play in Browser
Terra Tempus daily history map game
A clue, the year guess, and the round score

Overview

Each round gives you a clue about something that actually happened. You drop a pin on a world map for where, and slide along a timeline for when, and score against both. The interesting constraint is content rather than code: a history game is only worth playing if the history is right. Coordinates and dates come from Wikidata under CC0, the clues are original editorial grounded on Wikipedia under CC BY-SA, and a harvest pipeline stages every candidate event through grounding and review before it can reach a player. The catalogue is organized into region and era modules so play can be endless rather than a fixed set, with an optional daily challenge on top.

Why It Matters

Content as Engineering

The pipeline that decides what is true enough to ship is the real system, and it is enforced in code rather than by discipline.

Licensing Taken Seriously

CC0 facts and CC BY-SA grounding, attributed, with user-facing claims kept inside what the review process can actually support.

A Second Product on Shared Rails

Built on the same scaffold as Verdict, which is what made two live store products feasible solo.

Subject-Matter Fit

My degree is in history, which is why the editorial bar here is set where it is rather than at whatever ships fastest.

Content Pipeline

The hard part of a history game is being right, so the pipeline is the product:

Wikidata as the SpineCoordinates and dates come from structured CC0 data rather than being written by hand, so the scoreable facts have a provenance.
Grounded EditorialClues are original writing anchored to Wikipedia sources, kept separate from the structured facts they describe.
Staged ReviewDrafts flagged as unverified or ungrounded are hard-blocked from publishing, with an explicit override that has to be taken deliberately.
Coverage MatrixThe admin surfaces a region-by-era grid so thin cells are visible rather than discovered by a player hitting an empty module.
Honest ClaimsBecause review is not complete, the library is never described to users as verified or human-reviewed.

Map and Timeline

Two guesses per round, each with its own interaction and scoring curve:

MapLibre RenderingVector map with a draggable pin, running the same way on phone, tablet and web.
Distance and Date ScoringUp to 10,000 points a round, split between how close in space and how close in time.
Region and Era ModulesContent grouped so play can continue indefinitely, with mastery tracked per module.
Daily ChallengeAn optional five-round daily shared by every player, deliberately kept unranked.
ChroniclesA guided long-form mode threading ordered moments together, with probes between them.

Technical Architecture

The same monorepo shape as Verdict, with a map renderer and a content system added:

MobileReact Native via Expo SDK 56 with MapLibre for vector maps
Web + APINext.js 16 with a guest-playable web build sharing the round engine
DataPostgreSQL with Prisma 7, content models separate from play models
AuthBearer tokens for the app, with Google and Apple sign-in on native and on the web
BillingRevenueCat for the stores and Stripe for the web, one entitlement record
HostingSelf-hosted on Hetzner via Coolify, with Sentry and self-hosted Umami

Key Learnings

A Wrong Fact Is Worse Than a Missing OneIn a history game a single confidently wrong date destroys trust in the whole catalogue, which is why publishing is gated on grounding rather than on volume.
Map Interaction Is Not FreeA canvas-based map exposes almost nothing to assistive technology, so accessibility needs a genuinely different affordance rather than a label on the canvas.
Two Apps, One ScaffoldSharing a scaffold across products pays for itself, but the forks drift. Fixes found in one app have to be deliberately carried to the other, because they will not propagate on their own.
Environment Variables Are a Release SurfaceClient environment values are frozen at build time, so an over-the-air update can silently ship a build with none of them and break a paid path without any code being wrong.

More Projects

Planning an interactive or cross-platform product?

I bring product planning and hands-on engineering together, from the core mechanic through release and production operations.