Skip to main content
GameiOS + Android + Web

Verdict

Year2026
RoleSolo
StatusLive

A daily logic-grid deduction game, designed, built and published solo under Endpaper Labs. Live on the App Store and Google Play, and playable free in the browser.

9
Game Types Daily
2
Store Listings
6
Listing Locales
Play in Browser
Verdict daily deduction puzzle on Android
Daily cases, the home shelf, and a board mid-deduction

Overview

Verdict is a daily puzzle in the tradition of the zebra or Einstein riddle: place suspects, objects and times along a grid using only the clues. The design constraint that drove everything else was that a player should never be rewarded for guessing, which turns out to be a generator problem rather than a content one. Each candidate board is produced by a seeded generator and then handed to an exact solver that proves the solution is unique before the puzzle is allowed to ship. Nine game types run daily across three difficulties, with a rolling archive, streaks, tiered hints that teach the technique rather than give the answer, and a spoiler-free emoji share. A Pro tier unlocks the full archive and a weekly seven-case serialized arc, billed through RevenueCat on mobile and Stripe on the web.

Why It Matters

Correctness as a Feature

The no-guessing promise is the product. Enforcing it with a solver rather than trusting the generator is the whole design.

End-to-End Ownership

Concept, engine, app, backend, billing, store submissions and post-launch analytics, all solo.

Real Store Operations

Two live listings under an LLC, with the compliance, review cycles and release management that come with them.

Measured, Not Assumed

Instrumented funnels, first-party platform attribution and store-side ranking checks drive what gets built next.

Puzzle Generation

The guarantee that no board ever requires a guess is enforced, not asserted:

Exact Solver VerificationEvery generated board is solved exhaustively before it ships. If more than one solution exists, the board is discarded.
Seeded and ReproducibleGeneration is deterministic from a day seed, so the same three cases reach every player and any board can be regenerated for debugging.
Difficulty as a MeasurementUniqueness is binary but difficulty is not. Grading measures how deep constraint propagation has to run before the board collapses.
Nine Game TypesThree logic grids plus The Lineup, The Briefing and five brain teasers, each with its own generator and validator.
Curation SurfaceAn editorial dashboard previews upcoming days and can reroll a board from a fresh seed before it goes live.

Shipping to Two Stores

One React Native codebase, two store review processes, and a web build sharing the same engine:

Expo + EAS PipelineRemote version management, per-profile environments, and store submission driven from the command line.
Two Billing RailsRevenueCat for App Store and Play in-app purchases, Stripe for the web, reconciled server-side so entitlement has one source of truth.
Store ComplianceSign in with Apple including token revocation on account delete, data-safety declarations on both stores, and age ratings.
Shared EngineThe puzzle engine lives in a shared workspace package consumed by both the mobile app and the web build, so the two can never disagree about a solution.
Six Localized ListingsStore metadata in English, Spanish, Portuguese, German, French and Japanese.

Technical Architecture

A monorepo with three workspaces and a single deployment target:

MobileReact Native via Expo SDK 56, Expo Router, TypeScript
Web + APINext.js 16, React 19, server components, bearer-token API for the app
DataPostgreSQL with Prisma 7, hand-written idempotent migrations run on container start
BillingRevenueCat webhooks and Stripe webhooks, both reconciled into one entitlement record
HostingSelf-hosted on a Hetzner VPS orchestrated by Coolify
ObservabilitySentry for both client and server, self-hosted Umami for cookieless analytics

Key Learnings

Uniqueness Is Cheap, Difficulty Is NotProving a board has one solution is a solved problem. Making it feel Easy, Medium or Hard consistently meant grading on solver depth rather than on clue count, which is the intuitive but wrong proxy.
Store Ranking Is Not SymmetricThe App Store ranks a brand-new app largely on text relevance, so it can surface immediately. Google Play scores candidates on installs, retention and ratings, so a zero-install app is effectively invisible regardless of how good its listing is.
Verify the Fix, Not Just the BugRepeatedly, adversarial review of my own repairs found more defects in the fixes than in the original code. Reviewing the repair is now a standing step.
Instrument Before You Need ItSeveral early questions were unanswerable because the events did not exist yet. Platform tagging derived server-side from the request, rather than trusted from the client, is what made the launch diagnosable at all.

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.