H

Case study

BalCal — Pharmacy Payment Tracker

An Electron desktop app that parses bank statements and tracks pharmacy payments. Cross-platform builds with auto-updates.

  • Electron
  • React
  • SQLite
  • TypeScript

Problem it solved

A pharmacy needed to reconcile payments from bank statements against their records. The process was manual — downloading CSV exports, scanning rows, matching amounts, and tracking outstanding balances in spreadsheets. It was slow, error-prone, and nobody wanted to do it.

What I built

A desktop application that automates the entire workflow. The pharmacist drops in a bank statement file, the app parses it, matches payments to records, and shows a clear dashboard of what's been paid, what's pending, and what needs attention.

Key features:

  • CSV and Excel file parsing — handles the common export formats from Indian banks
  • Payment data management — structured storage of all transactions with search and filtering
  • Automatic matching — links bank entries to known payment records
  • Offline-first — all data stored locally in SQLite, no internet required
  • Cross-platform — builds for both Windows and macOS
  • Auto-updates — new versions deployed via GitHub releases, downloaded automatically

Technical decisions

Electron with React

The client needed a desktop app — not a web app they'd have to keep open in a browser. Electron gave me a real installable application with native file system access for importing bank statements, while React handled the UI. The trade-off is bundle size, but for a business tool that lives on a desktop, that's acceptable.

SQLite for local storage

All data lives in a local SQLite database via better-sqlite3. No server, no cloud, no accounts. The pharmacist owns their data completely. This also means the app works without internet, which matters in the environments where it's used.

GitHub releases for distribution

New versions are built with Electron Forge and published as GitHub releases. The app checks for updates on launch and installs them automatically. Simple, free, and reliable.

Outcome

The app is version 1.0.0 and in daily use. Payment reconciliation that used to take hours of manual spreadsheet work now takes minutes.