Enterprise Systems
Pharmacy management software with batch and expiry tracking, billing and OPD: KinetiRx
KinetiRx is self-hosted pharmacy and clinic software with batch and expiry tracking, GST billing, patients, dues, OPD scheduling and cash-drawer reconciliation on a database you control.
By Raktim Ranjit · Published · 6 min read
Short answer: KinetiRx runs an independent pharmacy or small clinic: point-of-sale billing, medicine stock tracked by batch and expiry, patient records, OPD scheduling, a credit ledger, daily cash-drawer reconciliation, expenses and staff accounts, all on a PostgreSQL database the owner controls.
Why is pharmacy stock different from ordinary retail stock?
A medicine is not a single undifferentiated quantity. The batch, expiry date, rack and dispensing unit decide what a counter worker can sell. A generic product count misses the information a real counter needs, and the interface has to show those details without slowing a queue.
What does KinetiRx include?
- Medicines dispensed by strip or loose unit, with GST invoicing.
- Stock per batch with expiry alerts, plus rack location.
- Patient records and OPD scheduling beside the pharmacy workflow for small clinics.
- A credit ledger for patient dues.
- End-of-day cash-drawer reconciliation across cash, UPI and card, plus expenses.
- Live Sync, so a second counter sees new sales and stock changes without a refresh.
- Optional purchase-bill OCR through a Gemini integration; manual entry always works.
How does a sale connect to the day's cash?
A medicine sale changes stock, a patient purchase may leave a due balance, and the drawer must still reconcile at the end of the day. Sales, dues and drawer entries are related operational records, so a day's cash position can be explained from transactions instead of guessed from a total field.
How is it built and secured?
A React single-page application served by nginx, which reverse-proxies the API to a Go and Gin backend on the internal compose network, so the browser sees one origin. The backend is the sole source of truth for authorisation: every route except health check and login validates a JWT and the employee's role and permissions on the server.
- Passwords are bcrypt-hashed and nothing sensitive is logged.
- PostgreSQL is never published to the host in the supported deployments.
- The first-run account endpoint succeeds once and is rejected permanently as soon as any employee exists.
- A master security PIN, separate from login passwords, gates system reset with a five-attempt lockout.
How do I run it?
With Docker Compose or a one-click CasaOS and ZimaOS install. An optional MCP server lets an MCP-aware assistant operate a running instance through tool calls, kept behind a compose profile because it speaks over stdio and not a network port.
What does self-hosting cost the owner?
Control of records and deployment, in exchange for responsibility for local backups and upgrades. The approach to proving a backup works is in Restore drills for PostgreSQL business software. The full KinetiRx case study covers the architecture and trade-offs.
References
Author
Raktim Ranjit is a software engineer and the founder of NodeDR Infotech. He builds and maintains the software described here.