Adjay Mistry-Katz

Enterprise AI Solutions Consultant · ServiceNow Certified Technical Architect

I advise enterprise customers on AI adoption by day. The rest of the time I design, build, and run production AI systems end to end: two multi-platform consumer products and the eval platform that measures them — shipped solo, in daily use by real users. This page is the architecture tour; the CV has the career.

adjay@mistry-family.co.uk · London

Multi-platform product · Claude throughout

Vega — an AI fitness platform

A fitness platform built for friends and family: React web app, native SwiftUI iOS app, Android client, Apple Watch workout scheduling, and home-screen widgets — all thin fronts over one PHP API and MySQL database. Claude is integrated across roughly nineteen surfaces: a streaming coach that queries Apple Health through client-executed tool use, post-session debriefs, multi-week training plan generation, and vision-based schedule import.

  • 4 clients · 1 backend
  • Swift · Kotlin · React · PHP
  • ~19 AI surfaces
  • SSE streaming proxy
  • HealthKit + WorkoutKit
  • TestFlight via Xcode Cloud
Vega's training plan generator: race setup for a marathon, with a panel of target paces computed by the app from the runner's current PB
The plan generator. Target paces are computed deterministically by the app (Daniels VDOT) and injected into the prompt verbatim — structure is the model's job, arithmetic isn't.

One backend, four clients, and the mirror rule

Four clients in three languages can't share a library, but some logic has to live on every client — readiness scoring constants, run-split labelling, the debrief instructions. The answer is a documented mirror rule: every deliberately ported piece of code names its twin on the other platform, and touching one side means finding and changing the other. Convention as architecture — the cheapest consistency mechanism that survives a solo maintainer, chosen over codegen or a shared spec because the mirrored surface is small and the docs live next to the code.

A run debrief showing planned versus actual distance, time and pace for each split of an interval session, with shoe wear tracked below
A logged interval session: planned vs actual per split, synced from the Watch through HealthKit, with shoe wear tracked per pair. Split labelling and expansion logic is mirrored code — the web and iOS clients must agree on it.

Tiered model routing

Every call defaults to Haiku. Plan generation — thousands of tokens of structured output — routes to Sonnet; screenshot import uses vision-capable Sonnet; chat exposes explicit Haiku/Sonnet/Opus escalation that resets after every message, with live token and cost readouts under each reply, so spending more is always a visible choice. Routing decisions are corrected by evidence: when Haiku kept confusing similar product model names in one feature, that single surface moved up a tier — and same-input calls were deduplicated so the sampled answer stays consistent.

Centrally governed prompts

Every AI surface registers in one prompt registry: a default instruction, a per-user override, and data toggles controlling exactly which context blocks get injected — goals, schedule, training history, plan progress. The settings UI renders governance cards automatically from the registry, and a preview button shows the exact assembled prompt the model will see. Domain knowledge ships as token-efficient JSON specs — running, strength, and cycling methodology — rather than prose, so one knowledge base serves every generator.

Vega's weekly check-in: a verdict of 'slightly behind' with observations about session compliance and prescribed adjustments for the coming week
The weekly check-in, built from governed prompts over live training data: the coach reads planned-vs-actual volume and compliance, judges execution, and prescribes the coming week's adjustments.

Prompt caching, and its limitation

Chat resends its large system block every turn, so it's marked for ephemeral prompt caching. Per-message cost accounting made the limitation visible: the system prompt is assembled from live user data, so any change to the injected context invalidates the cached prefix, and infrequent surfaces fall outside the cache window entirely. The wins are real inside an active conversation and near zero elsewhere — the restructure, a stable cacheable core with volatile context trailing it, is queued behind measurement in the eval platform.