Sr.UI/UX Designer – Tung Lam

menu icon
Logo
Available for work
Hanoi, Vietnam 🇻🇳
Munchi app icon
Hobby Project · iOS App

Munchi

Snap a photo of your meal and let AI log the calories. No search bar, no typing out every ingredient. A personal iOS nutrition diary I vibecoded solo in about two weeks, and now use every day.

iOS 17+ · SwiftUI + SwiftData 4 swappable AI providers Solo, vibecoded with Claude Code Built May 2026
At a glance
Status
Personal build, running on my own iPhone
Platform
iOS 17+, SwiftUI + SwiftData
AI stack
Gemini, Groq, Claude, OpenRouter
Built with
Solo, vibecoded with Claude Code
Timeframe
About 2 weeks (May 2026)
Version
1.0, build 1
Why I built this

A food diary, not a food dictionary

Most calorie-counting apps are built for the US market: an English food database and a search-then-select flow for every ingredient. For Vietnamese dishes, a bowl of bun bo or a plate of com tam with a dozen components, looking up each item just to add up the calories is enough friction that most people quit within a few days. Munchi (working title: "Ngoam Ngoam," the Vietnamese word for the sound of chewing) started from that exact personal need: a food diary where logging a meal is faster than eating it.

The real product bet wasn't which AI to use. It was removing the search bar entirely. A single photo replaces typing, scrolling, and picking items one by one. Core design decision
Core features

Four tabs, one loop: eat, log, look back

The bottom tab bar is a custom shape with a concave notch for a floating "+" button. Every meal starts with one tap, no matter which tab you're on.

Diary (Nhật ký)

Dashboard: calorie ring, macro cards, an intake/burn bar, and the day's meals and supplements.

Journey (Hành trình)

30/90/180 day weight chart, steps and active calories synced from Apple Health, weekly intake vs. burn balance.

History (Lịch sử)

Calendar view with a total calorie count per day. Quick to check back a week or a month.

Profile (Hồ sơ)

TDEE, calorie goal, AI model choice, supplement tracker, and light/dark appearance.

01
Barcode scannerLooks up packaged products through Open Food Facts and pre-fills the nutrition facts.
02
Exercise logLogs a workout and offsets it against the day's calorie budget.
03
Daily goal overrideOverrides the calorie target for just today, without touching the base configuration.
04
3-step onboardingBasic info, then goal and activity level, then a calorie target (AI-calculated or self-set).
05
Micronutrient trackingAlso tracks fiber, sugar, sodium, calcium, iron, and vitamins A, B, and C.
06
Adaptive light/darkEvery color token follows the system setting, or can be set by hand in Profile.
AI architecture

One feature, four swappable AI providers

Photograph the meal. AI returns a list of dishes with estimated calories and macros. The user edits each card before saving. Instead of locking into one API, Munchi lets the user pick a provider in Profile: switch when one runs out of quota, when speed matters more, or when a free model will do.

ProviderTypical modelVisionCostNotes
Claude claude-haiku-4-5 Yes Paid The most accurate at recognizing Vietnamese dishes of the four
Gemini gemini-2.0-flash Yes Free tier The default. Fast, and enough for daily use
Groq LLaMA vision Yes Free tier The fastest inference. Used when a quick reply matters
OpenRouter Llama 3.2 11B Vision, Qwen2.5 VL Yes Has free models An aggregator that checks which models are actually available, right inside the app
AI only produces a draft, not the final word. Every dish it recognizes becomes its own editable card: rename it, adjust the portion, or delete it, all before the meal is saved to the diary. Design principle for the AI flow
Demo

Watch it log a meal

Photo to logged meal, start to finish

Design system

Its own color tokens, the same semantic structure

Munchi has its own brand palette (a burnt orange, #D64C30, different from this portfolio's teal) but follows the same semantic token structure: background, text, border, status. Each token has a light and dark pair, so there's no hex code hardcoded somewhere in the code.

Brand#D64C30
Protein#0687FF
Carbs#FC6C00
Fat#D64C30
Success#417D0E
Warning#FC6C00
Danger#DC2626
Info#0687FF
Typography

SF Pro through the system font stack, no webfont to load. Text sizes follow a display/title/body/label/caption scale, with tabular numbers for every calorie count.

Signature component

The bottom tab bar is drawn with a custom Shape that has a concave notch in the middle. The "+" button floats above that notch, with its own shadow for light and dark mode.

Engineering practice

Vibecoded, then reviewed like real production code

Munchi was built solo with Claude Code, but "vibecoded" here doesn't mean stopping at prompting features into existence. Once the core app worked, an automated code review pass scanned the whole codebase before the next round of changes went in.

Data model & onboarding

8 SwiftData models (FoodEntry, UserProfile, WeightEntry, and more), a 3-step onboarding flow that calculates TDEE.

Core loop

Dashboard, add meal, and history, built before AI was wired in, to make sure the manual flow was solid first.

AI integration

4 providers for photo-to-dish recognition, barcode lookup through Open Food Facts, Apple Health sync.

Automated code review

Scanned 11 key files, sorted findings into critical/warning/info, and fixed whatever was safe to fix automatically.

15Issues found
4Critical (crash or performance risk)
9/10Fixed automatically in one pass
1Deliberately skipped: a high-risk refactor left for a human call
Deploy & production

What "production" means for a one-person app

No App Store, no CI. Just the real setup behind the build that runs on my phone every day.

com.lamdmt.Munchi iOS 17+ Automatic signing v1.0, build 1

Build

xcodebuild against iPhone 16 Pro & 17 Pro simulators

Review

Claude Code review pass before the next round of edits

Sign & install

Automatic signing, straight onto my own iPhone

Daily use

The real production environment, right now

SecretsDefault Gemini key bundled, other 3 providers bring your own key
Bundled + BYO
Code signingPersonal Apple Developer account, no manual profiles
Automatic
HealthKitSteps & active energy only
Read-only
Camera & PhotosMeal photos and barcode scanning only
Scoped
Data storageSwiftData, on-device
Local
CloudKit syncModel configured for it, iCloud capability not turned on yet
Coded, off
CI/CDVerified locally before every change
None
DistributionInstalled via Xcode onto my own iPhone
Not published
What shipped

A full app, not a demo

From onboarding to AI meal logging to activity tracking, plus a token-based design system of its own: Munchi covers a full personal product used daily, not a prototype that stops at the happy path.

5Tabs & flows (Diary, Journey, History, Profile, Add Meal)
8SwiftData models
4Swappable AI providers
100%Vietnamese UI, adaptive light/dark
Lessons & what's next

What stuck, and what's left

01. Photo-first beats search-first

The most important product decision wasn't which AI to use. It was removing the search bar. A photo replaces typing, scrolling, and picking items one by one, and that's the actual reason logging a meal stuck as a daily habit.

02. Multiple AI providers is a resilience feature

Letting Claude, Gemini, Groq, and OpenRouter be swapped isn't a novelty. It means a feature used every day never gets blocked by one API running out of quota, going slow, or costing too much.

03. An automated review catches what a solo pass misses

The post-build review pass found exactly the mistakes that happen when coding alone and fast: repeated JSON decoding, retain cycles in async tasks, force-unwraps that could crash. Caught before anyone used it, not after.

Next up
  • Turn on the iCloud capability so CloudKit sync actually runs across two phones.
  • Install it on a friend's phone through TestFlight and see if the AI flow holds up outside my own eating habits.
  • Come back to the one skipped refactor: the duplicated food-editing form between the photo review screen and the meal detail screen.