Bill Express
Full-stack India-GST POS — Express + SQLite, inventory, customers, B2B/B2C invoices. Not a browser-only jsPDF freelancer tool.
SYS.STATUS: v1.0.0 shipped — local GST POS with inventory, customers, REST API
Bill Express is a full-stack Point of Sale for small retail: dashboard analytics, product inventory with HSN codes and GST rates, customer directory with GSTIN, and B2B/B2C invoice generation with SGST/CGST/IGST splits. Canceled invoices restore product stock.
This page replaces portfolio copy that wrongly described a browser-only jsPDF freelancer invoice with zero backend.
What it is (scope)
| Surface | What you do there |
|---|---|
| Dashboard | Gross sales, top products, low-stock alerts (Recharts) |
| Products | CRUD — HSN, ex-GST pricing, GST %, stock levels |
| Customers | Directory with GSTIN, lifetime value metrics |
| Invoices | B2B/B2C billing, discounts, tax split, print/save |
| REST API | /api/products, /api/dashboard/analytics, and related routes |
Stack: React 19, TypeScript 5.8, Vite 6, Tailwind CSS 4, Express, better-sqlite3, react-hook-form, Recharts, Pino, express-rate-limit, Vitest + supertest.
npm run dev runs Express + Vite together on port 3000.
Who I built it for
- Small retail shops in India needing local POS with honest GST modeling
- Developers wanting a forkable full-stack POS reference (MIT licensed)
- Single-location operators — not multi-branch cloud franchises
Not for: one-off freelancer PDF invoices in the browser, multi-store sync without custom infra, or production deploy with the dev auth bypass file still present.
Fuckups & learnings
- Wrong product story on my portfolio. jsPDF, 50ms vector export, zero server — stale fiction. The repo has Express, SQLite, and REST endpoints.
testingcredentialsis a deployment hazard. Repo ships a dev auth bypass file for local evaluation. README requires deletion before production; useADMIN_USERNAME/ADMIN_PASSWORDinstead.- Stock restore on cancel was missing early. POS inventory must roll back when invoices cancel — caught by API tests.
- GST split needs automated tests. Intra-state CGST+SGST vs inter-state IGST rounding errors show up in audits, not demos.
Honest limitations
| Limitation | Reality |
|---|---|
| Single-node SQLite | One machine; no built-in multi-store cloud sync |
| India-GST focus | HSN/SGST/CGST/IGST modeled; not generic global tax |
| Dev auth bypass file | Delete testingcredentials before any real deployment |
| Not jsPDF-in-browser | Full-stack invoice flow, not a static PDF toy |
Deep-dive transmissions
Read in order for the full story:
- Why Bill Express — local POS for small retail, not a freelancer PDF toy — origin, scope, portfolio drift confession
Run it locally
git clone https://github.com/dhaatrik/bill-express.git
cd bill-express
npm install
npm run dev
# http://localhost:3000 — delete testingcredentials before production
Tests: npm run test — Vitest + supertest. CI on push.
Closing transmission
Products, customers, GST lines, stock movement — daily shop ops in one local stack. If you want the jsPDF lie I had to unwind, start with why-and-what.