Case study · Retail point of sale and inventory
NodeDR POS: Retail point of sale and inventory
Retail point of sale with GST-correct pricing, customer credit and stock, working with no internet connection.
- My role
- Lead developer.
- Licence
- AGPL-3.0

Context
NodeDR POS is an offline-first, self-hosted point of sale and inventory system for Indian retail. It installs as a native program on Windows or Debian and Ubuntu, or runs from one Docker command.
Problem
Indian retail counters juggle billing, MRP pricing that already includes GST, customer dues, stock and loyalty across disconnected tools, usually behind a monthly fee and a hard internet dependency.
Users
Shopkeepers and counter staff in small retail businesses.
Operational workflow
Barcode-first checkout with a GST breakup on the receipt, returns that restock automatically, an udhaar ledger for customers who buy on credit, and loyalty points. A dashboard reports revenue trends, best sellers and top customers, with CSV export.
Engineering challenge
MRP in India already contains the tax, so the tax amount is calculated backwards from the shelf price and split into CGST and SGST. Getting rounding right across a whole bill matters because the receipt has to add up to what the customer actually pays.
Architecture
This is a focused, single-shop system. A Next.js frontend is the only browser-facing port; it proxies API requests to an Express service on the internal network. Both processes run in containers for a Docker install or as supervised services in the Windows and Debian installers. I kept the product small rather than trying to make the retail till into a multi-tenant platform.
Data model decisions
SQLite, accessed through Prisma, is the local system of record. That choice keeps a single-shop installation simple: no separate database server is needed to take a sale. Product, stock, sale, customer-credit and loyalty records live together so the counter does not depend on a network service outside the shop.
Backend
Express handles billing, stock and customer-credit operations, with Zod validation at the API edge. The external Stock API is documented separately for an e-commerce integration. Tax, rounding and receipt totals are calculated by the server rather than accepted as numbers from the browser.
Frontend
The checkout is designed around a barcode scanner and a cashier's short attention span. A custom hook reads scanner input; the interface shows the cart, tax breakup, payment options and loyalty without asking the cashier to navigate several screens. Receipts can be printed or saved as PDF, and barcode labels are generated in the browser.
Security
The product has admin and cashier roles, bcrypt-hashed passwords and an HttpOnly JWT cookie. The backend uses request validation, security headers and rate limiting. The database is local to the install rather than a public network endpoint.
Infrastructure
Native Windows and Debian installers, a Microsoft Store listing, or one-command Docker, all running on the shop's local network with no cloud account.
Reliability considerations
The shop can keep billing when the internet is down because the application and database are on the local machine or LAN. That is different from promising continued checkout if the shop's own server is down; the operator still needs a backup and a recovery plan. The repository documents how to back up and update the data volume.
Difficult tradeoffs
SQLite and a single-shop scope reduce installation and administration work. They also mean this is not the architecture for a chain that needs central inventory and simultaneous multi-branch writes. I kept that boundary explicit rather than stretching one product beyond its purpose.
What I personally worked on
I led its development, and its patterns for authentication, receipt rendering, ESC/POS printing and currency rounding became the base for OrderRestro.
Lessons learned
Tax arithmetic and hardware integration deserve early tests. They are easy to wave away as details, but they are the parts a cashier notices at the very first sale. The GST-inclusive pricing lesson later shaped OrderRestro's server-authoritative money calculations.
Technologies
- TypeScript
- Express
- Next.js
- SQLite
- Prisma
- Docker
- Windows installer
- Debian package
Screenshots
Captured from running instances.
NodeDR POS: frequently asked questions
- What is NodeDR POS?
- NodeDR POS is an offline-first, self-hosted point of sale and inventory system for Indian retail, with barcode-first checkout, GST breakup on receipts, returns that restock, customer credit and loyalty points.
- How does it handle MRP that already includes GST?
- The tax is calculated backwards from the shelf price and split into CGST and SGST, with rounding handled across the whole bill so the receipt adds up to what the customer pays.
- Can it run without internet?
- Yes. The application and database are on the shop's local machine or network, so billing continues when the internet is down.
- What platforms does it support?
- Native installers for Windows and Debian or Ubuntu, a Microsoft Store listing, or a single Docker command.
- Is it for chains?
- No. It is a single-shop system using SQLite. A chain needing central inventory and simultaneous multi-branch writes should use a multi-tenant product such as Rechvix.


Expertise this project shows
Related articles
- Calculating GST from an inclusive MRP in a retail POS
- Offline retail POS software for India: GST-inclusive MRP billing, udhaar and barcode checkout
- What is offline-first software? How it works and when to build it
- How to choose a POS system for a small business: a buyer's checklist
- Cloud POS vs on-premise POS: which is better for a shop or restaurant?
- GST invoice requirements: a field-by-field checklist for India
- Billing software with inventory: what to check so stock and accounts agree