Skip to content

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
Links
Product siteDocumentationSource on GitHub
NodeDR POS checkout with cart, GST breakup, loyalty points and payment options

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.

Read the full article: how NodeDR POS works →

NodeDR POS checkout with cart, GST breakup, loyalty points and payment optionsNodeDR POS inventory list with barcode, GST rate, cost, price and stock

Expertise this project shows

Related articles

Official project links

Have something in mind?

Let’s build something useful.

Tell me about the idea, product, or workflow you’re working through.

Tap to say hello