Skip to content

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 · 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.

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