A full-stack Point-of-Sale system paired with a public customer website, built for Matcha Nomad — a matcha drinks and desserts business in the Philippines. The system runs as both a live website (www.matchanomad.com) and an installable Android APK for staff use in-store.
Key Features 🧾 Point-of-Sale (Admin App) Product catalog with 3 categories — Matcha, Coffee Series, Desserts Add-ons per item (e.g. pearls, espresso shot) Cart management — quantity, remove, clear Payment flow — Cash (with change calculator + quick-bill buttons), GCash, Maya, BPI Queue number / name — cashier assigns a pickup number or name, printed on receipt E-wallet reference number — optional field for GCash/Maya/BPI transactions Auto-incremented order numbers (Firestore atomic transaction) On-screen receipt preview after every order 🖨️ Bluetooth Thermal Printing (Android) Custom Capacitor Java plugin — connects to thermal printers via Bluetooth Classic SPP ESC/POS command builder written from scratch in TypeScript Queue number prints double-width between dividers for easy staff readout Graceful fallback to browser print on web 🌐 Customer Website Parallax hero section with product photo Animated grain texture overlay + cream color palette Menu tabs — Matcha / Coffee / Dessert with emoji thumbnails “What’s New” announcement cards (admin-managed) Clickable location card → opens Google Maps Business hours + social media links (Instagram, Facebook, TikTok) All content editable by admin through the Settings page (no code changes needed) ⚙️ Admin Dashboard & Settings Role-based access — admin (full access) vs cashier (POS only) Products CRUD — add/edit/delete menu items with photo upload (base64, compressed) Site Settings page — edit location, hours, map link, social links, announcement cards live Sales dashboard — daily summary, revenue totals, order history Inventory tracking with low-stock alerts 📱 Cross-Platform Behavior On web (matchanomad.com) → shows customer-facing public site with Staff Login hidden On Android APK → skips customer site, opens directly to POS login screen Works offline — Firestore’s persistent local cache keeps POS functional without internet 🔒 Security Firestore security rules — public read for menu/settings, authenticated write only Admin-only writes enforced server-side .env credentials never committed to Git Role stored in Firestore user document, verified on every protected route