🔒 Security & Architecture

Built to be trusted.

What’s Vegan? answers a question people act on. That means the engineering underneath has one job before all others — never give a fabricated or careless answer — and to be resilient and secure while it does it. Here's how it's built, and what an independent review verified.

400+Automated tests across the app and backend, all passing.
0Secrets in the codebase · injection surfaces · personal data in logs.
1Deterministic authority decides every verdict — never freeform AI.

The safety core

The most important property in a food app is that a verdict is never invented. It's enforced by the architecture, not by trusting a model.

  • One deterministic authority. Every verdict comes from a pure, rule-based function over classified ingredients — re-derived on every path, so nothing upstream can assert a result.
  • AI classifies, it never decides. The model's only job is labelling individual ingredients. Its suggestions land in a separate place the grader never reads, gated by an automatic "never upgrade toward vegan on uncertainty" rule and human review before they can ever affect a result.
  • Untrusted input, handled as such. Label text read by the camera is treated as data, never as instructions, and parsing fails toward "let's look closer" rather than a confident wrong answer.
  • Honest when unsure. "Couldn't read the label" is a real answer. The app never shows a made-up product to fill a gap.

How a scan works

Three independent surfaces — the iOS app, the edge backend, and the data layer — that talk only over one documented, versioned contract. A scan runs cheap, dedicated steps and caches everything it learns.

1 · Identify
Cache-first
A known barcode returns instantly from the catalog — no AI, no waiting.
2 · Read
Vision
On a miss, a small focused vision pass reads the product or its ingredients.
3 · Classify
Dictionary-first
Each ingredient is matched against a deterministic lexicon; AI covers only the unknown tail — then it's learned.
4 · Grade
Pure rule
Classified ingredients become the verdict by a fixed rule. Nothing else decides.
5 · Learn
Cache
The result and any new ingredient are saved, so the next shopper's scan is faster.

When a product has no readable label, a research step requires at least two independent, agreeing sources before it will state a verdict — otherwise it honestly asks for an ingredients photo.

Security, in layers

No single control is load-bearing — each layer assumes the one outside it can fail.

🪪

Genuine-app identity, enforced

The costly AI endpoints require a hardware-backed proof from Apple's App Attest that a request came from a real install of the app — not a copyable identifier. Each expensive request is individually signed and single-use, and the app transparently re-establishes trust and retries if it's ever challenged, so a real device is never wrongly turned away.

🚦

Layered rate limiting

Expensive scans and cheap result-reads are metered in separate budgets, so ordinary use can never exhaust a shopper's scan allowance, and the service stays available under load.

🔒

Unforgeable storage access

Uploaded-photo links are server-minted random identifiers with a strict format gate — there's no path that reaches private data and nothing to guess. Private responses are never publicly cached.

🧬

Injection-resistant data layer

Every database query is parameterized, and a schema rule guarantees one canonical record per product. A careless write degrades gracefully instead of erroring a live scan.

🛡️

Admin that fails closed

Administrative access requires a secret held only in the platform's secure store, checked in constant time — a missing secret denies access rather than opening it.

🔑

No secrets at rest in source

The review found no credentials in the codebase; real secrets live in the platform's secret store and the device's secure enclave.

Resilient app, self-bounding infrastructure

On the phone

  • Built with compiler-enforced strict concurrency, so whole classes of bugs are impossible, not just tested against.
  • Barcodes recognized on-device; a local cache keeps results instant and never blanks on a flaky network.
  • A slow, out-of-date response can never overwrite a newer scan on screen.
  • Camera-denied and other edge states show honest prompts — never a fabricated product.

In the cloud

  • Runs at the edge, globally, with every latency-critical lookup served by a purpose-built index.
  • Gets cheaper with use: every resolved product and learned ingredient is cached for the next shopper.
  • A daily housekeeping sweep bounds operational data so the system stays healthy over time — and never touches live review data.

Independently reviewed

The architecture, backend, infrastructure, and the entire app were reviewed end-to-end with an adversarial, prove-it-wrong method — every change independently checked, and the findings verified against the running system rather than just the code.

Where we are

The safety core, data integrity, and the security controls above are live and verified today. We hold ourselves to the same standard we ask of the products we grade: be honest, show your work, and never guess.