Salaka POS - Point-of-Sale SaaS
A modern, multilingual, multi-tenant point-of-sale SaaS for small Sri Lankan shops - fast offline-capable checkout, LankaQR and card payments, thermal receipt printing over Web USB, and a full back office (catalog, inventory, purchasing, loyalty, expenses, reports), plus an installable owner mobile dashboard. Built on Next.js and Supabase with row-level tenant isolation, in English, Sinhala, and Tamil.
Salaka POS is a modern, multilingual, multi-tenant point-of-sale platform built as a SaaS for small single-branch shops in Sri Lanka. It gives a shop fast checkout, offline-capable sales, LankaQR and card payments, and thermal receipt printing, alongside a complete back office - catalog, inventory, purchasing, suppliers, customers and loyalty, expenses, and a full reports suite - and it adds an installable mobile dashboard so an owner can watch sales from their phone. Everything is available in Sinhala, Tamil, and English, priced in rupees, and held to a Linear- and Stripe-level quality bar with strict typing and tested tenant isolation.
It is a single application serving two surfaces from one codebase. The main web app is the shop-floor point of sale and back office for cashiers, managers, and owners on a desktop or tablet, and a separate installable mobile dashboard lets owners check KPIs, charts, transactions, and a live sales feed remotely on their phones. Tenancy is path-based, with each shop living under its own slug, and every shop is isolated at the database level: each shop-scoped table enforces row-level security so a row is only visible to members of that shop, and every server-side mutation independently re-checks membership and role rather than trusting anything from the client.
The checkout is built for speed. Cashiers ring up items from a product grid, by search, or with a barcode scanner that is detected from the rapid keystroke bursts it produces, apply line and bill discounts, attach a customer, and earn or redeem loyalty points, then take payment as cash, card, LankaQR, store credit, or a split across several methods. Bills can be parked and recalled so several carts stay in flight at once, and cash drawers run as sessions that open with a starting balance and reconcile expected against counted cash at close. Receipts print to 58mm or 80mm thermal printers over Web USB, including a cash-drawer kick on cash payments, with a plain browser-print fallback that needs no drivers, and refunds return stock as they reverse a sale.
Because shop connectivity is not always reliable, the point of sale keeps working offline. The product and customer catalog is cached in the browser's local database, a service worker caches the application shell, and cash sales made while offline are queued locally with a client-generated identifier. When the connection returns, a sync engine sends the queued sales and the server de-duplicates them on that identifier, so a sale is never lost and never double-counted.
Behind the till sits a full back office. The catalog supports multilingual product names, variants with their own price and stock, a category tree, images, CSV import and export, and printable barcode labels. Inventory tracks stock with weighted-average costing and a complete movement history across purchases, sales, adjustments, wastage, and transfers. Purchasing runs suppliers with running balances and purchase orders through a draft, received, and paid lifecycle that updates stock and cost on receipt. Customers carry credit limits and loyalty balances, expenses are categorized and tracked, and a reports hub covers sales, tax filing figures, inventory valuation and reorder lists, receivables and loyalty, cash reconciliation, and a profit-and-loss and Z-report view, each exportable to CSV.
Access is governed by a permission matrix. Four roles - owner, manager, cashier, and inventory - map to a set of permission keys, and individual users can be granted or denied specific permissions on top of their role. Every mutating action is gated by that check on the server, and sensitive changes are written to a per-shop audit log that captures the before and after of each change.
Under the hood it is a Next.js App Router application in strict TypeScript, with React Server Components for data fetching and server actions for every mutation. Data lives in Supabase Postgres with row-level security and a versioned migration history, authentication is handled by Supabase, server state is managed with TanStack Query and the cart with a lightweight client store, forms are validated with Zod, and the interface is built on an accessible component library with Tailwind CSS and dark mode. Money is stored as exact decimals and formatted for the Sri Lankan locale, dates follow the local day-month-year convention, and bill numbers are generated per shop in Colombo time. A live sales feed is pushed over Supabase Realtime, web push is supported through VAPID, and invite emails are sent from a Supabase edge function.
Internationalization is first-class: the entire interface ships in English, Sinhala, and Tamil with full key parity, products and categories carry localized names, and the chosen language is remembered per user. End-to-end tests run in Playwright. Salaka POS is a genuinely complete retail product - fast and offline-capable at the till, thorough in the back office, secure across tenants, and localized for the shops it is built for - rather than a checkout demo.
Built with
More work
All projectsDurdans LIMS - Laboratory Information Management System
A Laboratory Information Management System for Durdans Hospital, Sri Lanka, built by a University of Moratuwa team in partnership with IFS - digitising the full clinical-lab pipeline from patient registration to signed report across a multi-branch network, with branch-isolated multi-tenancy, HL7/FHIR/ASTM interoperability, instrument integration, and PDPA compliance, held to a real enterprise standard.
View projectApexTick - Real-Time Ticket Reservation Platform
A distributed, real-time ticket reservation platform engineered to survive a high-contention flash sale - thousands of people rushing the same seats in seconds, where exactly one buyer must win each seat with zero double-booking. Built as a right-sized Spring Boot microservices system with Keycloak identity, an event-driven backbone, an API gateway, and load-tested proof of correctness.
View projectAI Number Plate Recognition & Smart Parking System
An end-to-end ANPR and smart-parking platform - YOLOv8 + Roboflow detection feeding a vision-LLM OCR engine with low-light image enhancement, real-time polygon-based slot occupancy, an ESP32-driven LED matrix and alarm, and a full Stripe booking-and-payment backend. My first hardware project, and a University of Moratuwa top project.
View project