TailwindCSS v4 changed the setup flow. AI coding agents still reach for old config files and deprecated commands, so developers need to check the official docs before accepting setup code.

Overview
Baguette POS started because I watched a café owner in Phnom Penh scribble orders on sticky notes during a lunch rush, lose track of a table's bill, and then spend an hour after closing reconciling the day's cash. Existing POS systems were either too expensive, required proprietary hardware, or were built for Western markets with no support for dual-currency payments (USD and Cambodian Riel are used interchangeably in Cambodia).
I designed and built the POS app, marketing site, and backend. The goal was simple: a restaurant owner should be able to set it up on any tablet or laptop in minutes, without buying proprietary hardware. The product fits into the broader local-business work I describe in the Sokha Tech case study.
Building for Speed Under Pressure
The main constraint was speed. During a lunch rush, cashiers need to punch in a multi-item order in seconds. I optimized the menu grid for large touch targets and made the cart update without full component tree re-renders, reducing interaction latency by about 40%. I also added fuzzy search so staff can type a few letters and find an item quickly.

Baguette POS cashier interface with visual menu grid and cart sidebar
Table Management
For dine-in restaurants, keeping track of which table has what order is critical. I built a drag-and-drop floor plan where managers can arrange their layout to match the actual restaurant. Tables are color-coded by status and update in real-time across devices, so when a waiter checks in a table from their tablet, the cashier sees it immediately.

Visual table management with floor plan and status indicators
Solving the Dual-Currency Problem
This was the most interesting technical challenge. In Cambodia, prices are often listed in USD but customers pay in a mix of USD and Riel. A $4.50 meal might be paid with a $5 bill, with change given in Riel at the day's exchange rate. I built a purpose-built payment calculator that handles both currencies simultaneously, with quick denomination buttons and automatic change calculation. The bill summary shows totals in both currencies with tax breakdowns (SST, Service Tax) factored in.

Bill dialog showing cart items, tax breakdown, and payment method selection

Cash payment interface with dual-currency input and automatic change calculation
Real-Time Availability
Restaurant owners kept mentioning the same problem: customers order something, wait 10 minutes, and then get told it sold out. I built an availability toggle that lets staff mark items as unavailable for today, until a specific date, or indefinitely. Changes sync right away so customers do not order items the kitchen cannot serve.

Food availability management with calendar-based unavailability scheduling
Payment History & Reporting
Restaurant owners need to know how their day went without digging through spreadsheets. The payment history view lets them filter by date range, payment method, and search terms to quickly find any transaction. Each record shows the amount, method, terminal, and table: enough detail for end-of-day reconciliation without overwhelming the user.

Payment history with filters, date range, and payment method breakdown
Tech Stack
- React + Vite: Chose Vite for the fast HMR during development and optimized builds for production
- TypeScript: End-to-end type safety for payment logic, where bugs mean real money problems
- Tailwind CSS: Responsive, touch-friendly UI that works across tablets and desktops
- Monorepo Architecture: Shared packages between the marketing site and POS app for consistency
What I Learned
Building for a dual-currency market taught me that "obvious" UX assumptions do not always transfer. The payment flow changed several times after I watched cashiers use the system. My first version looked intuitive on paper but added friction in practice. The final design, with denomination buttons and automatic change calculation, came from watching cashiers handle cash.
Related Projects
The Eco Garden Cat Project
A bilingual cat welfare platform for a real colony in Cambodia, with TNVR tracking, KHQR donations, public ledgers, adoption inquiries, volunteer sign-ups, and an admin CMS.
Personal Portfolio (2026)
A developer portfolio with cursor-driven motion, MDX project pages, blog comments, structured data, and a fast Next.js 15 build.
Related Writing
A guide to asynchronously load Google Fonts in Gatsby using gatsby-plugin-web-font-loader

Hide controls when users cannot use them. Disable controls when users need to understand that an action exists but is not available yet.


