~ portfolio

Satvik Sawhney

software engineer

loading000%
case studylive

Sarthi.

Voice-and-photo life coach · a ChatGPT app over MCP · nothing estimated is saved without your tap

“‘Had two rotis and a long walk, spent 340 on lunch.’ One sentence, four trackers updated — and not one guess saved without asking.”
01the problem

Life-tracking apps die from friction: every entry is a form. An LLM removes the friction but adds a worse problem — it will happily invent a calorie count or a price and save it as fact.

02the approach

Let the model parse, never let it commit. Anything estimated becomes a confirm card. In the ChatGPT version, confirming is a tool only the app UI can call: each card carries an HMAC token the model never sees, so the model can't confirm on the user's behalf.

03decisions i made

The choices that mattered, with the reasoning at the time.

  1. Confirm is app-only

    Seven MCP tools, but confirm_entry can only be called from the MCP Apps panel. The model can propose all it likes; only a person's tap writes.

    decision · 01
  2. Verifiers can only demote

    Code checks each number against the user's own words. A second model pass may downgrade a value to "estimate", never upgrade one to "fact".

    decision · 02
04what happened

3rd place at the OpenAI DevDay Community Hackathon 2026. Snapshot undo, idempotent writes, a 38-table schema that runs on SQLite or Postgres, 348 tests, and an eval that asserts zero silent wrong writes.

OpenAI DevDay Community Hackathon
3rd
silent wrong writes (eval)
0
tests
348
stack
Next.js 16TypeScriptMCPOpenAI Apps SDKDrizzleVercel AI SDK
Sarthi — Satvik Sawhney