WorkSAYPO

SAYPO

An AI fitness platform built as four products that behave like one.

Start a projectLive site ↗

Type
Own product — multi-surface
SAYPO — interface overview
REST endpoints
144
Admin tabs
20
Platform
iOS + Android
Site pages
40 · EN/AR

A cross-platform iOS and Android app with GPS, native health integration and a Gemini-powered coach; a 20-tab operations dashboard; a 40-page bilingual site; and a modular backend running the AI, credits, and scheduled jobs behind all three.

What it had to be

A fitness product is only half an app. The visible half is what the athlete uses: track a run, log a session, get coached. The invisible half is everything the business needs to keep that running — content to manage, users to support, subscriptions to reconcile, AI costs to control, abuse to rate-limit. Most portfolio projects build the first half and stop. This was built as the whole business: the app people use, plus the panel someone runs it from, plus the subscription system that pays for both.

What I built

The mobile app — iOS and Android from one codebase. Capacitor and React, going deep into native rather than wrapping a website: health-store integration instead of asking users to re-enter what their phone already knows; GPS and live route mapping; native step tracking with an Android foreground service so tracking survives the app being backgrounded; offline-first local storage on device SQLite, so a session logs in a basement gym with no signal and reconciles later; push and local notifications; and bilingual EN/AR with RTL through a real i18n layer.

The AI coach. Gemini, grounded against a curated in-app fitness knowledge base rather than answering from open-ended world knowledge. In a health context an ungrounded model will confidently invent training advice, which is a liability rather than an embarrassment. The app also ships an explicit "not medical advice" screen as a first-class legal surface.

Subscriptions and tiers. Cross-platform in-app purchases through RevenueCat with a defined feature-tier model. Billing across the App Store and Play Store is one of the highest-bug-density areas in mobile — receipts, restores, upgrades, refunds — which is why it runs on dedicated infrastructure instead of hand-rolled receipt validation.

The operations dashboard. 20 tabs and 7 modals: users, content, analytics, credits, support tooling. Built as its own application on an isolated subdomain with role-gated access, so an admin compromise is not an app compromise.

The bilingual marketing site. 40 pages, EN/AR, static wherever possible — a marketing site has no business running a server to render a page that never changes.

The backend. Modular NestJS: 98 endpoints across 37 controllers and 17 modules. Beyond ordinary CRUD it carries the parts that only exist in products meant to actually run — AI learning so the coach responds to real training history, credits because AI calls cost money per request, API keys and rate limiting because an unmetered AI endpoint is an unbounded invoice, analytics, backups, content integrations, and six job handlers with a scheduler.

Observability. Sentry for errors and PostHog for product analytics, wired into both app and web. Shipping without these means finding out about crashes from user reviews.

The decisions that actually mattered

Stack