The Great Christmas Daiquiri Disaster of ’25
Background
I did a couple of Ed Donner’s great Udemy courses earlier in the year:
To hone my skills after finishing the courses and having just finished a long term government contract, I have been working towards completing a ‘little’ educational side project using agenticAI (OpenAI Agents SDK) to return corporate financial information from SEC reports (10-K, 10-Q and 20-F mainly) together with various web searches and supporting visualisations to produce synthesised, fully cited reports which might form the basis of a more complete financial analysis of a particular company. Key components are financial statements, risk report, financial metrics, financial analysis (including segment analyses) and a comprehensive report which pulls all the specialised reports together with appropriate interactive graphs.
Data is stored in Sqlite and ChromaDB Knowledge Base with additional web search availability to answer more general questions about comparative performance etc.
This analysis does not replace full corporate financial analysis, as it just synthesises and aggregates data into a user-friendly format. It is intended to be an assistant to a human analyst, not a replacement. I have seen youtube videos where OpenAI seems to be working with some UK clients to achieve a more complete solution, but that certainly is not the goal here. You would have to overlay this basic analysis with the philosophy and strategy, risk preference etc etc of the investor to take it any further.
So back to the great Christmas Daiquiri Disaster of ’25, which is the subject of this post:
The Problem
We have the frozen strawberries and it’s a hot Australian Christmas Day, so clearly we need to provide frozen daiquiris for all our friends - plenty of limes, grab the Bacardi and we are sorted! But alas, no white rum of any sort in the liquor cabinet. I know, I know, that is not possible, there is always white rum in the liquor cabinet. But I couldn’t see any - so we had to go with some strange coconut concoction.
The lady of the house suggested that, as a matter of some priority, I put together a spreadsheet so this disastrous situation never arises again. Clearly a great idea in concept, but a spreadsheet? Please… that is so last year..
No, Claude and I will build an AI-powered liquor cabinet app!!
It will:
1. Know what I have in the cabinet - without manual data entry
2. Suggest what I can make - based on actual inventory
3. Provide what is needed for a specific cocktail showing what I still need to buy
4. Work hands-free - because my hands are often busy in the kitchen, or holding another drink (mostly the latter)
5. Run on my tablet - a screen easily used in the kitchen/bar
And I wanted to build it cheaply enough to share with friends (ie no cost).
And then we will write it all up in Quarto on Posit’s new-ish Positron IDE as a blog post, because it handles both R and Python and the blog will tend in future (not here) to have more of a data science theme.
What we built (well Claude with my close supervision 😄 ) :
Liquor Cabinet - an AI-powered inventory and cocktail suggestion app with seven core features:
| Feature | What It Does |
|---|---|
| AI Bottle ID | Photograph a bottle → Claude Vision identifies it |
| Inventory Management | Track bottles by category with quantity controls |
| Recipe Suggestions | AI recommends cocktails based on what you have. |
| Recipe Search | Look up any cocktail by name |
| Voice Search | 🎤 Hands-free search in the kitchen |
| Kitchen Mode | Large-format display optimised for kitchen tablets |
| Multi-user | Friends get their own private cabinets |
and we did have white rum after all…

so yes we can make frozen daiquiris!
New Year’s Eve here we come…

and we can make a whole lot more cocktails as well.

The Tech Stack
I chose tools that would be free (or nearly free) at small scale:
| Component | Choice | Why |
|---|---|---|
| Frontend | Next.js 15 + TypeScript + Tailwind v4 | Modern React, great developer experience |
| Database | Supabase (PostgreSQL) | Generous free tier, built-in auth |
| AI | Claude Haiku 4.5 | Vision capable, extremely cost-effective |
| Hosting | Vercel | Free for hobby projects |
| Voice | Web Speech API | Native browser support, no extra cost |
| Auth | Google OAuth via Supabase | One-click sign-in |
The Interesting Bits
Claude Vision for Bottle Identification
The core magic is Claude’s vision capability. When you photograph a bottle, the app sends the image to Claude Haiku with a prompt asking it to identify:
- Brand name
- Spirit type (whisky, gin, vodka, etc.)
- Volume (if visible)
- Notes
The recipes - its AI, so if you don’t like the original suggestions, refresh and you will likely get some different ideas.
Key learning: Claude Haiku occasionally wraps responses in markdown code blocks even when you ask for plain JSON. Claude added a simple cleanup function to strip these.
Cost Optimisation: Sonnet → Haiku
It was originally built with Claude Sonnet for development (better at following complex instructions). Once everything worked, we switched to Haiku for production.
The result: 90% cost reduction with no noticeable quality loss for this use case.
| Model | Cost per bottle ID | Monthly (5 users, ~50 IDs) |
|---|---|---|
| Sonnet | ~$0.01 | ~$0.50 |
| Haiku | ~$0.001 | ~$0.05 |
For simple, structured tasks like “identify this bottle”, Haiku is more than capable.
Voice Input with Web Speech API
The Web Speech API is surprisingly capable - and completely free. The key considerations:
- Australian English - I set
recognition.lang = 'en-AU'for better accuracy with local accents, so if you are not Australian, you may want to practice your accent (or change the config setting) - Continuous mode - Keep listening until the user stops talking
- Error handling - Browsers handle microphone permissions differently
Gotcha: The Web Speech API requires HTTPS in production. Vercel handles this automatically.
Kitchen Mode for Smart Displays
The Nest Hub Max has a 10” screen and runs a Chrome-based browser. We created a dedicated “Kitchen Mode” with:
- Large touch targets - Easy to tap with wet hands
- High contrast - Readable from across the kitchen
- Simplified navigation - Just the essentials
- Auto-refresh - Stays current without interaction
…and then found that Google Home does not support Home actions which just open a website app, so might have to use your tablet instead. There is a toggle to switch on kitchen mode.
Multi-User with Row Level Security
Supabase’s Row Level Security (RLS) makes multi-user trivially easy. Just sign in with your Google account. Each bottle record has a user_id column, and a simple policy ensures users only see their own data.
No application-level filtering needed - the database handles it.
The Numbers
Here’s what this actually costs to run:
| Service | Monthly Cost |
|---|---|
| Vercel hosting | Free |
| Supabase (database + auth) | Free |
| Claude API (~50 bottle IDs) | ~$0.05 |
| Total for 5 users | < $0.10 |
That’s not a typo. The entire app runs for less than ten cents per month, on my account, until the limits are breached.
Lessons Learned
1. Start with the expensive model, then optimise
Building with Sonnet first meant I could iterate quickly without worrying about prompt engineering for a weaker model. Once the logic was solid, switching to Haiku was straightforward.
2. Handle AI response quirks defensively
Even with clear instructions, LLMs sometimes format responses unexpectedly. Always sanitise and validate AI outputs before using them.
3. Design for your actual use case
Kitchen Mode wasn’t in the original spec. but quickly became clear we needed it - and now it’s a favourite feature.
4. Free tiers are genuinely useful
Between Vercel, Supabase, and the Web Speech API, the only cost is Claude API calls. Modern infrastructure makes hobby projects almost free to run. But remember it is a hobby project, so just working with free tier limits!
Try It Yourself
- Live app: cblanalytics.com/liquor-cabinet
- Source code: github.com/spinbris/liquor-cabinet
As mentioned the app uses Google Sign-In, so you’ll get your own private cabinet. The idea is that you log into the app on your smart phone, then add bottles in the app which uses your phone’s camera. The app then searches for description and details using Claude Vision, then adds to the inventory.
You can then review your inventory, recipes and possibilities on your phone, tablet or wherever! 😃. Add a few bottles from within the app on your phone, and see what other cocktails you could make, or how much shopping you need to do.
Originally, I thought I might be able to do a bit of supply chain optimisation, hooking into the bottle shop api, but no luck there yet.
Building with Claude as a Development Partner
(Desktop, VS Code extension and CLI)
One meta-note: this entire project was built collaboratively with Claude as a development partner. I used a “Four Hats” workflow (made up by me and I have zero formal tech training, so not intended as a recommendation), to ensure approvals required at each stage:
- Planner (Claude) - Proposes designs and code
- Approver (Me) - Reviews and greenlights
- Builder (Claude) - Implements exactly what was approved
- Reviewer (Both) - Verifies the build
This structured approach kept development moving quickly while maintaining quality. Claude can tend to run off the rails and create havoc/regressions if not using a fairly tight workflow. I have heard some of the Google DeepMind gurus saying that it may well be OK to give the llm a computer and let them go for it, but that probably just explains why I am not a Google DeepMind guru. We also found it useful to get one of the Claudes to review the whole codebase from time to time. The prompt improver in Claude Console was also useful.
The app went from idea to production in a only few focused sessions. As the cricket was not really worth watching on Boxing Day, this was actually a fun alternative.
For next post I will go back to the financial analysis agenticAI project, which is more complex and challenging, and yet not nearly as rewarding in terms of daiquiri rewards…