An offline-first Android app that reports the carbohydrate grams for a selected food or drink and portion. Built on a hand-verified 633-item Turkish catalogue with a documented source ledger, a Supabase backend with row-level security, Play Billing entitlements verified server-side, and a CI-enforced feature-parity contract across Android, iOS and backend.
LokmaSay reports carbohydrate grams for a chosen food and amount. It does not calculate insulin or doses, does not set blood-glucose targets, and does not produce diagnosis, treatment or personalized health advice. That boundary is written into the project rules as an invariant (RULE-001) and is enforced in the UI copy audit, not just documented.
The catalogue's authority is the database, not a file in the repo. All 633 records were transferred by hand across 28 separate page reviews and converted into a source-evidence artifact; a second full pass re-audited every record against product identity and source section together. The v5 catalogue additionally assigns every product a language-independent image-match key with unique Turkish match terms and mandatory qualifiers, and the release gate stops on any term that resolves to zero or more than one product family.
A Gemini contract returns foodType plus aligned alternatives. The client does not run a catalogue-wide fuzzy match; an exact term resolves to a single family through an in-memory term → family / family → products index, and every candidate returned belongs to that one family. Below the confidence gates the app returns no result rather than a wrong one — , , apple juice and apple cookies are deliberately distinct families.
kırmızı elmaKırmızı ErikSupabase Postgres with row-level security, Deno edge functions, and a pgTAP contract suite (138 assertions across cancellation, catalogue, profile/AI quota and RLS) run against the remote project. Play Billing entitlements activate only after backend verification, with purchase-token idempotency and single-flight client behaviour defined in a written billing contract. The service-role key is never placed in the APK.
features.json; CI refuses a change to feature-bearing Android or Supabase files unless the inventory is regeneratedIn development. Android is feature-complete against the current inventory; the release gate is a separate data phase requiring a larger catalogue with usage-rights evidence, plus physical-device and TalkBack acceptance.
minSdk 26