drunkwiz

Receipt, itemised

All projects

Results first. Each one with a real screen, what I built, the decision that shaped it, and a small demo you can try.

The ledger
ResultProjectEventStack
Track winnerLead TimeForgeHacks Online 2026, Business + AI trackPython · React · Qwen · Gemini
2nd placeRecallAmerican Express AI Hackathon 2026LLM + verifier · rules engine
FinalistVoucher KakiSimplifyNext IGNITE Agentic AI Hackathon 2026React · Leaflet · OneMap
SubmittedAgentShopperNUS LifeHack 2026, Rezolve AI challengePython · Streamlit · OpenAI
SubmittedPinchBuild With AI: Basics 2026 (Devpost)React · Express · Gemini
SubmittedChainCheckWarriorHacks 2.0, 2026Python · React · Gemini
SubmittedClauseML Build Challenge 3, 2026 (Devpost)Python · React · pdf.js · Gemini
SubmittedFridge RescueRevenueCat Shipaton 2026Expo · React Native · Claude
SubmittedCareLoop SGQloo Agentic Hackathon 2026 (powered by Qloo Taste AI)Python · FastAPI · React · Qloo
SubmittedGlowlineYouCam API Skin AI & eCommerce VTO Hackathon (Devpost), Skin AI trackTypeScript · Fastify · YouCam API
SubmittedSettlePayPal hackathon on Devpost, 2026Python · FastAPI · React · PayPal APIs
Shippedgit seanceSide projectPython · Gemma 3 · Ollama

1 / 12 Lead Time

Track winnerForgeHacks 2026

ForgeHacks Online 2026 · Business + AI track · Solo build

Lead Time

Tells small food businesses which overseas food trends are heading to Singapore, and whether their kitchen can make them.

What I built

  • Arrival forecasts for 22 foods across 7 markets, from Google Trends
  • A rewindable back-test that publishes its own misses: 1 of 4 forecasts landed
  • Launch plans with price, stock and posting dates; every model answer schema-checked
  • Python stdlib
  • React
  • Vite
  • Qwen
  • Gemini
  • pytrends
  • Docker
Lead Time overview for an example dessert café: 22 foods on the radar, and sea salt coffee flagged as coming soon with a US-versus-Singapore trend chart.
Live screen · hover to scroll

Food trends usually blow up overseas first. Lead Time watches weekly search interest for 22 foods across seven markets, works out how long each one has historically taken to reach Singapore, and tells a small food business which trends are heading its way. For each food it gives a verdict (Go, Go but late, Wait and watch, or Skip), checks whether the kitchen can actually make it, and then helps with the launch: a suggested price and margin, when to bulk order, a launch offer with its break-even, and a dated posting plan.

It grades its own forecasts

Every calculation takes an "as of" date, and a test makes sure no future data leaks in, so the app can be rewound to any past week and checked against what really happened. The results aren't flattering, and the app shows them anyway. Of 4 arrival forecasts that could be strictly checked, 1 fell inside its window. For Korean yogurt ice cream, the window was 19 weeks too early. When past arrivals are too uneven, it says "Wait and watch" instead of inventing a date.

The model doesn't get the last word

An open model judges what the kitchen can make and drafts the launch copy, but every answer is schema-checked. Anything with dates, links, quantities or popularity claims the data doesn't support is rejected and rewritten. All the numbers come from plain Python, and if every model is down, labelled offline rules take over.

Runs on a free server, so the first load can take up to a minute.

2nd placeAmex AI Hackathon

American Express AI Hackathon 2026

Recall

Helps card members recognise charges they’ve forgotten, without ever being sure on their behalf.

What I built

  • Rebuilds the trip behind an unfamiliar charge from the member’s own history
  • Every claim cites a real transaction and is checked by a second model family
  • Rules code makes every decision that touches money; silence is a valid answer
  • LLM proposer
  • Cross-family verifier
  • Rules engine
✎ Illustration · no public demo

When a card member doesn't recognise a charge and the merchant shares nothing about it, Recall rebuilds the memory from their own card history: the flight, the hotel, the trip that charge belongs to. It picks up where merchant-supplied details run out, which is most of the long tail of small shops.

The model is never allowed to be sure

The worst thing Recall could do is talk someone out of reporting real fraud. So the model only proposes. Every claim has to cite a real transaction, a second model from a different family checks it, and plain rules code makes every decision that touches money. When the history is too thin, Recall shows the raw details and says nothing at all. Silence is always an acceptable answer.

FinalistSimplifyNext IGNITE

SimplifyNext IGNITE Agentic AI Hackathon 2026 · Team of four

Voucher Kaki

Finds CDC-voucher eateries near you, typed or spoken, in four languages.

What I built

  • Search in English, 中文, Bahasa Melayu and தமிழ், by text or voice
  • Ranking by relevance and walking distance, with a lift for local-owned shops
  • Says what it gave up whenever it has to widen a search
  • React
  • Vite
  • Leaflet
  • OneMap
  • Web Speech
  • Vercel
Voucher Kaki on a phone: a chicken rice search near Yishun, with filters and the nearest local-owned hawker stalls that take Heartland vouchers.
Live screen · hover to scroll

Say or type what you feel like eating, in English, 中文, Bahasa Melayu or தமிழ், and Voucher Kaki finds CDC-voucher eateries near you. Results are ranked by relevance and walking distance, with a deliberate nudge toward independent shops over chains. When it has to widen the search to fill the list, it tells you what it gave up instead of quietly showing worse matches.

The best decision was a deletion

We built Google ratings into every result, then took them out. Many of the small shops in our data have no Google listing at all, so a ratings line would put a 4.5 with 800 reviews next to a blank. Someone choosing lunch on a phone picks the number. The whole point of the app is to surface the places people overlook, and a half-empty ratings column would have pushed them straight back to the famous ones.

ShippedNUS LifeHack 2026

NUS LifeHack 2026 · Rezolve AI challenge · Team of three, I led engineering and AI reasoning

AgentShopper

Makes a product catalogue readable to AI shopping assistants, then proves it worked.

What I built

  • Reads CSV, Excel, Shopify JSON and scanned PDFs into verified facts
  • Searches the same catalogue before and after, side by side
  • Every generated claim cites a fact; budgets are enforced in code
  • Python
  • Streamlit
  • GPT-4o mini
  • OpenAI embeddings
  • NumPy
  • pdfplumber
AgentShopper before-and-after search: three products go from not surfaced at all to ranks 1, 2 and 3, each answer citing product facts.
Screen from the repo

People are starting to shop by asking an AI assistant instead of typing into a search box. A question like “lightweight shoes for a half marathon in humid weather, under S$200” needs facts most product pages never state, so those products quietly never get recommended. AgentShopper takes a catalogue file (CSV, Excel, Shopify JSON or even a scanned PDF), scores how ready it is for AI shoppers, lists exactly which facts are missing, and writes content for each product: who it suits, who it doesn’t, and how it compares with the real products beside it.

It has to prove it worked

Instead of claiming the new content is better, the app searches the catalogue twice, once with the original content and once with the new, over exactly the same products, and puts the two result lists side by side. Hard requirements like a S$200 budget are enforced in code, so the AI can’t talk a S$219 shoe into the results.

A made-up spec can’t get in

Every fact the AI extracts has to appear word for word in that product’s own text, or it’s thrown away. Every claim in the written content has to cite a real fact, a second, stricter pass checks the evidence actually supports it, and anything that fails is flagged for human review instead of published. If a product has no verified facts at all, the app writes nothing and says so.

The two built-in demo catalogues, running shoes and facial skincare, work without uploading anything. The app sleeps when idle; press its wake-up button and give it a minute.

ShippedBuild With AI 2026

Build With AI: Basics 2026 on Devpost · Solo build

Pinch

Interviews your grandparent while they cook and never guesses an amount.

What I built

  • Records each step and asks at most one follow-up, out loud
  • Server code traces every amount on the card to the cook’s own words
  • A printable recipe card with an honest “Still unknown” list
  • React
  • Vite
  • Node
  • Express
  • Gemini
  • Web Audio
  • Vitest
A Pinch recipe card for Sunday pancakes: amounts marked as clarified by the cook, her exact words quoted, and butter listed under Still unknown.
Screen from the repo · hover to scroll

Family recipes often live only in someone’s head, written down as “a pinch” or “until it smells right”. Most recipe apps record first and sort it out afterwards, and by the time they notice an amount is vague, the cook has left the kitchen. Pinch asks during the cooking. After each step, it either stays quiet because the step is clear, or asks one follow-up question, out loud and in big text. At the end you get a printable, notebook-style card with her words, her reasons, and an honest “Still unknown” list.

It never guesses an amount

Gemini decides what to ask. Plain server code checks every amount, number and quote on the card against what the cook actually said. Anything it can’t trace back to her words becomes “amount unknown” and goes on the Still unknown list, so the card never invents a measurement she didn’t give.

Questions are rationed on purpose

Nobody wants to be interrupted every ten seconds while cooking. Pinch allows at most one question per step and three per session, and that limit is enforced by the app, not left to the model. If the AI service is down, it falls back to notes mode, which still saves her exact words without filling anything in.

Runs on a free server, so the first load can take up to a minute. The built-in demo works without a microphone.

ShippedWarriorHacks 2.0

WarriorHacks 2.0, 2026 · Solo build

ChainCheck

Checks an investment offer against the scam playbook and never calls anything safe.

What I built

  • In-browser OCR, so screenshots never leave the phone
  • Rule-based verdict and playbook stage; the model can only add flags
  • Prompt-injection tests against a hijacked fake model
  • Python
  • React
  • Vite
  • Gemini
  • OCR
  • pytest
ChainCheck home: paste an investment offer or add screenshots, read on the device, to check it against the scam playbook.
Live screen · hover to scroll

Investment scams were the biggest single source of scam losses in Singapore in the first half of 2026. They rarely start with an obvious lie. They start with a friendly “personal manager”, a group chat full of people posting profits, and a small first deposit. ChainCheck takes what the offer showed you, as pasted text or screenshots, and checks it: is the firm on the MAS register, is the website a week old, do the promised returns make sense over a year, is there a fee to get your own money out. Then it shows which stage of the playbook you’re in and what usually comes next.

The model reads. Code decides.

Gemini only pulls names, links and numbers out of the text into a fixed shape. Code pulls the hard facts out itself too and merges them in, so the model can add things but never remove them. Every check, the verdict and the stage are plain rules with their thresholds in one file. A pasted message that tries to talk to the AI (“ignore your instructions”) is itself a red flag, and the tests run it against a hijacked fake model to prove the verdict doesn’t move.

It never says safe

There’s no green tick. Any red or amber flag means stop, and the best possible result is “no red flags found, verify these yourself before you pay”. Screenshots are read in the browser, so they never leave your phone.

The MAS register on the demo uses invented firms and is labelled as demo data on screen, so a real firm is never called unlicensed. Free server, so the first load can take up to a minute.

ShippedML Build Challenge 3

ML Build Challenge 3, 2026 on Devpost · Solo build

Clause

Drafts a health insurance appeal where every sentence quotes the plan it rests on.

What I built

  • Plans and regulations split into numbered, page-located clauses
  • A verifier that greys out any sentence whose quote doesn’t hold
  • Deadline and notice checks written as code from the regulations
  • Python
  • React
  • Vite
  • pdf.js
  • pdfplumber
  • Gemini Flash
Clause home in the new design: Got a denial letter? You can fight it. A drafted appeal sentence sits beside the plan page it quotes.
Screen from the repo

When a US health insurer denies a claim, the answer is usually buried somewhere in a long plan document and a set of federal rules, and the appeal clock is already running. Clause reads your own plan and denial letter. It works out your appeal deadline, checks whether the denial notice included everything the law says it must, checks your bill against the plan, and drafts the appeal letter.

Every sentence has to point

Every plan, letter and regulation is split into numbered clauses with their page and position. The model may only make claims that quote one of them. Code then checks each quote: the clause exists, the words are really in it, the quote is long enough to mean something, and every number in the claim appears in the quote. A sentence that fails is greyed out with the reason. Click any sentence that passed and the source page opens with the words highlighted.

Rules are code, not model

Deadlines and notice checks follow the regulations directly, and the rules cite the regulation text, which goes through the same checker. The README also says what this can’t prove: a real quote doesn’t always mean the claim follows from it.

The plan documents and regulations are real. The denial letters are synthetic and say so on every page. Free server, so the first load can take up to a minute.

ShippedRevenueCat Shipaton

RevenueCat Shipaton 2026 · Solo build

Fridge Rescue

A food-waste app where the food you save feeds a pixel pet, and surplus goes to a food bank.

What I built

  • One recipe from everything that’s about to expire
  • Donation rules: unopened, shelf-stable, more than 60 days left
  • Receipt scanning with Claude, cleaned up by tested pure functions
  • Expo
  • React Native
  • TypeScript
  • Claude
  • RevenueCat
  • OpenStreetMap
Fridge Rescue home screen: Sprout the pixel pet, a rescue card for food about to expire, and a donate card.
Screen from the repo · hover to scroll

Most food waste at home isn’t one big mistake. It’s the yoghurt found three days late, and the fourth tin of chickpeas bought because you forgot the other three. Fridge Rescue treats those as two problems. Perishables close to their date go into one recipe that uses all of them. Unopened, long-life surplus goes into a donation box, with the nearest drop-off point. Sprout, a pixel pet on the home screen, thrives when you rescue food and wilts when it goes in the bin.

A food bank can’t take Thursday’s yoghurt

Food banks need weeks to sort and hand out donations, so only shelf-stable, unopened food with more than 60 days left can ever be suggested. On top of that it needs a sign you won’t eat it: more than two of the same thing, a duplicate, or a month untouched. Expired food is never put in a recipe, and the app asks “did you eat it?” before counting anything as wasted.

A reason to open it before food goes off

The app only works if you check it in time, so the game is built around that one habit: a waste-free streak, a pet that grows, outfits you earn and can’t buy, and a weekly challenge. Adding food stays free, with typed or pasted lists parsed on the phone with no AI.

The Android APK and a 1:34 demo video are linked from the repo. In the browser, the purchase screen is a preview.

ShippedQloo Agentic Hackathon

Qloo Agentic Hackathon 2026 (powered by Qloo Taste AI)

CareLoop SG

Plans good days for seniors with high blood pressure around what they love, and stays quiet until something’s wrong.

What I built

  • Qloo’s taste graph links a senior’s favourite singers and films to nearby kopitiams and outings
  • Every suggestion passes code checks for blood pressure, medicine leaflets and haze
  • Who gets told, and how urgently, is a fixed ladder of rules the model can’t touch
  • Python
  • FastAPI
  • React
  • TypeScript
  • Qloo
  • Gemini
CareLoop SG: “Good days, planned around him.” A senior’s phone shows a haze-day plan with indoor picks from Qloo.
Screen from the repo

Seniors with high blood pressure spend most of their time between doctor visits, and that’s when small problems slip past. CareLoop SG gives each senior one big button for a daily check-in, in English, Singlish or Mandarin, and stays quiet until something is wrong for that particular senior. Then it hands over to their family, or to their Active Ageing Centre if they have none, with the evidence.

Good days, planned around him

For the Qloo hackathon, CareLoop plans days around what each senior enjoys. Qloo’s taste graph connects a favourite 1960s singer or film to nearby kopitiams, music and outings. Then every suggestion goes through plain-code checks: salty dishes are dropped for high blood pressure, pomelo for anyone on amlodipine, and outdoor plans on haze or rain days.

Rules pick the rung

The model understands check-ins and writes the words. Deciding who to contact, and how urgently, is a fixed ladder of rules. Qloo only ever shapes suggestions, never the escalation, and a red flag skips straight past all of it.

The demo uses synthetic seniors and opens on 24 Oct. The health tables are marked as placeholders until a clinician signs them off. Free server, so the first load can take up to a minute.

ShippedYouCam Skin AI

YouCam API Skin AI & eCommerce VTO Hackathon (Devpost), Skin AI track

Glowline

Tells you whether a skincare product is actually working, from your own photos.

What I built

  • Repeat check-ins through YouCam’s Skin AI, measured exactly the same way every time
  • Measures its own noise floor, and calls anything below it “no change”
  • Under 60% logged use, the verdict is “we can’t tell yet”, not “it failed”
  • TypeScript
  • Node
  • Fastify
  • YouCam API
Glowline dashboard: 5 of 5 concerns are moving your way, with a verdict score, check-in history and an adherence grid.
Screen from the repo · hover to scroll

A serum costs $30 to $120 and takes 4 to 12 weeks to show anything. By the time the bottle is nearly empty, you have no baseline, no way to tell a real change from different lighting, and no way to tell “it isn’t working” from “I kept forgetting to use it”. Glowline is built for that moment: deciding whether to buy the same bottle again.

You versus you

Your first check-in is the baseline. Every check-in after it runs the same YouCam skin analysis with the same settings, and Glowline warns if the measurement ever changes, because scores from different methods can’t be compared. It measures its own noise from your repeat photos, and anything smaller than that is reported as no change.

Five honest verdicts

Keep going, power through, change one variable, fix adherence, or come back. Under 60% logged use, the verdict is about your routine, not the product. With fewer than 3 check-ins or under 14 days of history, it says it can’t judge yet, and which of those is the reason.

Each concern has its own response window, so a retinol isn’t judged on day three. Free server, so the first load can take up to a minute.

ShippedPayPal hackathon

PayPal hackathon on Devpost, 2026

Settle

Resolves small online-shop complaints end to end. The model writes the reply; code decides every dollar.

What I built

  • The shop’s refund policy checked against the real order, in whole cents
  • Hard caps no rule can override: a breach goes to a person, never a bigger refund
  • A red-team arena that fires prompt-injection attacks at the live pipeline
  • Python
  • FastAPI
  • React
  • TypeScript
  • PayPal APIs
  • MCP
Settle landing page: Autonomous PayPal refunds, governed by pure code.
Screen from the repo

A customer says their mug arrived cracked. Settle reads the complaint, checks the shop’s refund policy against the real PayPal order, and offers an exact amount in the customer’s own currency, including options like keeping the item for a partial refund, which saves the shop the return shipping.

The model judges, code decides money

The model may only sort the complaint into a case, pull out the facts and write the reply. Every amount comes from a policy engine that is pure, integer-only and model-free. If the reply mentions an amount that disagrees with the decision, it’s regenerated once, then replaced by a template.

Caps no rule can override

A per-refund maximum, a daily maximum, never more than was paid, and never past the order-age window. Breaching any of them sends the case for approval. A red-team arena in the merchant console shows what each attacker demanded next to what code actually paid out.

Runs fully offline with a fake PayPal and a deterministic local model, set up in under ten minutes.

ShippedSide project

Side project, Oct 2026

git seance

Finds the functions your repo deleted and lets one tell its story, through a model on your own laptop.

What I built

  • Walks git history for functions that were deleted and never came back
  • Runs Gemma 3 locally through Ollama, so private history never leaves the machine
  • An offline “planchette” mode that only arranges the real facts
  • Python
  • Gemma 3
  • Ollama
  • git
A terminal running git seance on the requests library: the deleted function set_http_proxy describes the commit that removed it.
Real run from the repo

Every repo has a graveyard: functions that were deleted and never came back. git seance walks the history, finds them, and lets one speak, with who wrote it, when, and the commit that killed it.

Your history stays on your laptop

Commit messages are a team’s private diary, so the medium is an open-weight model running locally: Gemma 3 through Ollama. No API key, no account, and it works on a private repo on a plane. With no model running, an offline planchette mode still lays out the real facts.

One file

It’s a single Python file using only the standard library, with nothing to pip install. The demo is a real run on the requests library, on a laptop CPU.

How I like to build