

Test Accounts
*Visit /login to test different user roles. WebSocket features are optimized for local environments.
Ravine Coffee is a fullstack cafe management system built to digitize the entire in-store customer journey. As the Solo Fullstack Developer, I engineered an end-to-end solution where customers can scan a QR code at their table, browse the menu, and pay instantly via QRIS Midtrans. The system ensures that every order is synchronized in real-time between customers, cashiers, and kitchen staff, providing a seamless and paperless experience.
Combining TanStack Query for server state (caching & fetching) and Zustand for lightweight client state management. Ensures the UI remains responsive and synchronized during constant data updates.
Implemented a Data Snapshotting pattern on OrderItems. When an order is placed, product details (name, price) are copied to the transaction record, ensuring historical invoice accuracy even if products are later modified or deleted.
Ordering & Payment Workflow
Digital menu and ordering system via table-specific QR codes.
Automated payment workflow with real-time status updates via webhooks.
Instant order notification between cashier and kitchen screens using WebSockets.
Prisma-backed snapshot system to preserve transaction accuracy across product changes.
Sophisticated discount engine supporting fixed and percentage-based coupons.
Infinite scrolling and efficient caching for large cafe menus.
Dedicated interfaces for Customers, Cashiers, and Administrators.
Comprehensive state tracking for every order from OPENBILL to COMPLETED.
One of the primary engineering challenges was managing WebSockets on Serverless Infrastructure. Deploying to Vercel meant dealing with the stateless nature of serverless functions, which aren't natively designed for persistent connections. I addressed this by architecting the system to handle reconnection strategies and ensuring that Midtrans webhooks served as a reliable fallback for payment confirmation. Another major hurdle was securing WebSocket connections; ensuring that only authenticated Cashier and Kitchen roles could listen to sensitive broadcast events. Finally, I optimized the frontend using TanStack Query to prevent redundant re-renders when real-time order updates were received, maintaining a smooth 60fps experience even during peak activity.
Next.js, TypeScript, Express.js, Prisma ORM, Supabase, Midtrans QRIS, WebSockets, Zustand, TanStack Query, Vercel.