Skip to content
Fig. 00 — Flykitt Platform · Sheet IndexiOS · Live

Selected work · jet lag platform

Flykitt · a travel performance platform and its storefront

Four years owning the backend architecture of a science-driven travel performance product, developed with Navy SEALs and fighter pilots. Customers included the LA Dodgers and Inter Miami. Multi-AZ AWS foundations, multi-protocol APIs, multi-tenant identity, and a commerce stack that pays for all of it.

Exhibits 01 to 06 · Production iOS capturesCaptured Jul 2026 · Production App
Case sheetFile 02 / 04 · Flykitt
Role

Senior Full-Stack Engineer / Backend Architect

Timeline

Aug 2021 to 2025

Contribution split · I implemented
70%
infrastructure
30%
product

flykitt platform · api, pipelines, aws, terraform

StackShow 7 items
Node.js · TypeScript · AWS · Terraform · Auth0 · Stripe · Shopify · React Router 7 · React Native · Cloudflare Workers

Context

Flykitt sells arrival performance. A system of supplements, an app, and protocols that get travelers (athletes, executives, military) off a long-haul flight functional. I joined in 2021 as the platform's backend architect and stayed four years, through the storefront rebuild, the subscription launch, and the AI product lines.

Problem

The clientele made reliability non-negotiable: when a professional sports team lands at 2am before a match, the protocol has to be there. At the same time the business ran on a physical-product storefront and a subscription tier, so the same small engineering team owned revenue infrastructure, identity, mobile APIs, and ops. The architecture had to make that ownership tractable.

The reliability constraintnon-negotiable
02:00

Wheels down · protocol live

A professional sports team lands before a match. The plan on the right has to be waiting on every phone. There is no retry window on an arrival.

Flykitt in-app plan, 6pm Inflammation Defense through 5am Metabolic Reset, optimized for a circadian shift
The protocol · in-app plan · production UI

One small team owned all four surfaces

Revenue infrastructure
storefront · subscription tier
Identity
accounts · auth
Mobile APIs
ios app surface
Ops
infra · on-call

Architecture

Under the app and the storefront is a distributed system. A Fastify API takes every mobile request; a separate orders API takes every shop order; behind both, an SNS to SQS spine fans work into a swarm of workers, each with its own queue and its own dead letter line. Programs are built by an algorithm worker, drawn into a protocol pdf by the files service, and handed to the warehouse api for a physical custom pack. Auth0 sits in front of every surface with one tenant per client; a notification service speaks to Slack, SES, and Firebase Cloud Messaging. AWS X-Ray stitches the trace across all of it. What follows breaks the system into three views.

Fig. 01the platform · clients, apis, async spine, data, integrations
CLIENTSIDENTITY · EDGEAPIS · FASTIFY ON LAMBDAASYNC SPINEWORKERS · ONE QUEUE EACHDATA · OBSERVABILITYINTEGRATIONS · SAASios apptravelersweb storefrontshop · accountops toolsretool · n8n · support agentsauth0oauth2 · oidc · mfa · m2mapi gatewayaws · albflykitt apifastify · prisma · x-rayorders apishop ordersnotification svcapp · slack · email · fcmmcp serverwraps flykitt apisns topicsalgo · fulfill · fcm · slacksqs queues+ dlq per subscriberworkers × 6algo · files · production · warehouse · push · slackrds mysqlprisma · 40 modelss34 buckets · presignedsecrets managerdb creds · rotatedcloudwatchx-ray · logs · alarmsciriumflight statuspayments · commercestripe · apple · shopifyfirebasefcm · apnsslackaws sesklaviyomarketing eventsverifym2mjwtpublishfan-outprismawritebackwebhookwebhooksfcm pushpostpublish once · consume many · dlq per subscriber · idempotent on message id

one api tier at the front, a swarm of workers behind it, external saas at the edges.

The front is deliberately monolithic. One Fastify app with thirty route modules on Lambda is easier to trace, deploy, and reason about than a service per domain when the team is small. Every request lands at the API Gateway, is verified once against Auth0, then handled by a route module in the same process. The seams live behind that front: each async handoff crosses an SNS topic and lands in a dedicated SQS queue with its own dead letter line, and AWS X-Ray follows the trace across the boundary.

Fig. 02program generation · async fan-out into files, warehouse, push
travelerflykitt apipost /programsns topicinit-flykitt-algosqs+ dlqalgorithm workerlambda · openai / anthropicfiles serviceprotocol pdfwarehouse apicustom pack shippedrds mysqlpersist inputss3 · planssigned pdfsns topicfirebase-notifysqs+ dlqpush workersns → fcm bridgefirebase · apnsnotificationios appplan readypublishfan-outhandoffpersistuploadpublish notifyapnsdeliveredeach hop retriable · dlq per subscriber · idempotent on message id

submission returns immediately; the pipeline runs on worker time. each hop is retriable.

The mobile POST returns as soon as the API has persisted the inputs and published to the topic. The pipeline runs on worker time, not on request time. Every worker has its own SQS queue plus dead letter queue and is idempotent on the program id, so a replay by the queue cannot double bill or double ship. When the algorithm finishes, a second SNS topic wakes the push worker, which delivers an APNS payload through Firebase Cloud Messaging. The phone updates without polling.

Fig. 03live flight tracking · cirium webhooks into ios live activity
ios applive activityflykitt api/liveactivity/registerliveactivitytracked flightsciriumflight data · alertsflykitt api/webhook/flight-statustranslator13 event kindsfirebase · apnslive activity pushios applive activity updateregisterpersistwatch flightwebhook · 13 eventslive activity pushdeliveredterminal events (landed · cancelled) unregister the alert on the way through

apns live activity updates without a poll; the api owns the translation.

The support tooling surface uses the same API but a different front door. An MCP server wraps the Flykitt API for triage agents; an M2M gated read only SQL executor and an OpenAI Assistants proxy round out the toolkit for the human on the other end. Every tool speaks the same auth (M2M tokens through Auth0) and hits the same domain. No shadow admin API, no bypass path.

§04

The product in production

Six exhibits · Annotated iOS captures · Scroll

Six production screens from the iOS app, each shown as captured and annotated to the backend systems behind it: the itinerary, flight-status, protocol, aggregation, and rewards services the platform runs. The screens are the work of the Flykitt design team; the systems they read from are the scope of this case study.

Fig. 01 — Trip globe · HomeiOS · Live
Flykitt home screen showing a satellite globe with an orange flight arc across North America

Exhibit 01 / 06 · Flykitt, jet-lag platform

Home · the trip globe

The home screen renders the traveler's active route on a live globe, backed by the itinerary service. Programs, product surfaces, and trip creation all hang off this view.

01trip globeactive route drawn from the itinerary api
02program feedactive + upcoming programs · rest api
03commerce surfacesshop + product messaging hooks

Exhibit 02 / 06 · Flykitt, jet-lag platform

Real-time flight tracking

Each segment is tracked for delays, gate changes, and itinerary diffs. When the schedule moves, the app prompts a program recompute so the jet-lag protocol stays aligned.

01delay detectionstatus polling · schedule change diffing
02gate & terminal dataper-segment airport metadata
03program recomputeitinerary change → protocol update

Exhibit 03 / 06 · Flykitt, jet-lag platform

Trip summary & share card

Every completed program resolves to an outcome: jet lag prevented, distance flown, time in the air. The share card is composed from that same trip record.

01jet-lag outcomecomputed per program from the protocol model
02distance & flight timegreat-circle math + schedule data
03share pipelinestory-format asset from trip data

Exhibit 04 / 06 · Flykitt, jet-lag platform

The traveler passport

A lifetime ledger of the traveler's flying (zones crossed, miles, flight time, countries) rolled up from every program on record, down to a generated machine-readable strip.

01lifetime aggregateszones · miles · flight time · countries
02world mapflight history plotted per traveler
03mrz footermachine-readable strip generated per member

Exhibit 05 / 06 · Flykitt, jet-lag platform

Program analytics

Past programs are scored: recovery days saved, eastward vs. westward crossings, sleep captured in flight. All of it derives from the same flight and protocol records.

01recovery metricsdays saved · per-trip reduction
02zone accountingeastward / westward crossings per trip
03in-flight sleepaggregated across programs

Exhibit 06 / 06 · Flykitt, jet-lag platform

Rewards & referrals

Referral credits and video rewards run on a per-user ledger. Issuance, redemption limits, and remaining counts served through the rewards API.

01referral creditsgive $20 · get $10 issuance flow
02redemption limitsper-user remaining counts
03reward ledgercredit + payout records via api
Scope: Backend · API · Cloud Architecture · UI by the Flykitt design teamCaptured Jul 2026 · Production App

Key decisions

  1. One identity layer for every tenant and surface.

    App, storefront, coaches, and teams all authenticate differently, and machine-to-machine callers (support tooling, automations, partner APIs) needed a separate class of credential. A single Auth0 multi-tenant layer with RBAC, MFA, and OAuth2/OIDC for humans plus a first-class M2M grant for services absorbed that variety instead of scattering it across handlers.

    Impact·Millions of authentication events a month with zero identity-related downtime; one place to reason about who can see what.

  2. Async by default: one SNS topic per event, one SQS queue per worker, one DLQ per queue.

    The mobile POST cannot wait on the algorithm, the protocol PDF, or the warehouse hop. Publishing to SNS and fanning out to per-worker SQS queues keeps the request path light, isolates failure per subscriber, and lets every hop retry (and eventually dead-letter) without dragging the others down. Handlers stay idempotent on the message id so an at-least-once queue can be replayed safely.

    Impact·Program submission acks in milliseconds; the algo, files, warehouse, and push chains run on worker time and recover independently.

  3. Inbound webhooks treated as a distributed system.

    Stripe subscription state, Apple StoreKit notifications, Shopify order events, and Cirium flight alerts all arrive as at-least-once webhooks from callers outside the trust boundary. Every receiver verifies the signature, deduplicates against a processing lock keyed by event id, and enqueues the effect asynchronously. Retries and idempotency were designed in on day one, not patched in after the first double-charge.

    Impact·900+ Pro subscribers in four months (~$100K ARR) without a billing incident, and terminal flight events land in Live Activity without duplicate pushes.

  4. Buy the storefront platform; own the storefront experience.

    Shopify's Storefront API carries catalog, cart, and PCI-scoped checkout compliance; a custom React Router 7 frontend carries the brand and the performance budget. Optimistic cart updates and real-time inventory sync kept it at 95+ Lighthouse.

    Impact·3× year-over-year conversion lift and a major share of revenue growth.

  5. Expose the API to support tooling through an MCP server, not a shadow admin API.

    Support agents, triage automations, and human operators all need read access across programs, orders, subscriptions, and identity. A separate admin API duplicates the domain and forks the auth model, which is how those systems drift into divergent behavior and privilege leaks. An MCP server that wraps the Flykitt API, paired with an M2M-gated read-only SQL executor and an OpenAI Assistants proxy, reuses one auth layer and one source of truth for permissions.

    Impact·One place to reason about blast radius; support tooling upgrades ride the same deploys as the product; no bypass path to audit.

  6. Cirium events translated to Live Activity payloads in the API, not on the phone.

    Cirium emits about thirteen flight-status event kinds (en route, landed, diverted, gate change, baggage, more). Doing the mapping on the client fragments it across app versions and cannot be updated without a release. Handling it inside the webhook keeps the translation versioned with the domain model and reduces the phone to a pure renderer of ready-to-display payloads over APNS.

    Impact·Live Activity updates land without a poll; changing the mapping is a server deploy, not an app release.

  7. AI workloads at the edge, not in the VPC.

    The LLM product lines (menu intelligence, support agents) are bursty, session-oriented, and latency-sensitive. They fit Cloudflare Workers and Durable Objects better than the AWS service tier they would otherwise burden. Keeping them out of the core VPC also keeps their failure domain (rate limits, provider outages, cost spikes) off the platform's critical path.

    Impact·Two shipped AI products with their own case studies, isolated from the core platform's failure domain.