Tested end-to-end on PVVNL

Your UPPCL meter,
finally making sense.

Open-source analytics for UPPCL SMART meters — prepaid and postpaid. Your credentials are never stored or logged. The entire codebase is open — read every line yourself.

UPPCL Pro — home dashboard

What it does

The official UPPCL SMART portal stops at "today's balance." This goes further — and reshapes by meter type.

Balance & bills

Prepaid: live balance, a days-until-empty runway gauge, and a recharge recommender. Postpaid: amount due, a bill-cycle ring, and a next-bill projection from your real effective ₹/kWh.

📄

Official PDFs, in-app

Download your actual UPPCL bill, payment receipt, and arrears statement straight from the dashboard — no portal hop.

📊

Daily usage & cost

Per-day kWh, peak demand, apparent energy (kVAh), a derived power factor, estimated cost, and carbon — with CSV export.

📈

Anomaly detection

Flags days where consumption is >1.5σ above the 30-day average, with a side panel explaining the math.

🛡️

Power quality & meter health

Power-factor and peak-vs-sanctioned-load gauges that flag surcharge / max-demand penalty risk, plus the official meter reading and identity.

📞

Support & 1912

Live status of every complaint from your phone, the full JE/AE/XEN officer chain, billing-office details, and a "Report outage" panel. English + हिन्दी.

Screenshots

Dark and light themes — follows your OS preference. All data is real; values are redacted.

Quickstart

Node 20+ (or Bun 1.1+) required. No Python.

# self-host
git clone https://github.com/Harry-kp/uppcl-pro.git
cd uppcl-pro
bun install
bun run dev      # open localhost:3000
# or just use the hosted version
# (same code, deployed on Vercel)

open https://uppcl-pro.vercel.app

# sign in with your UPPCL credentials
# credentials are never stored or logged

Using Claude Code? Type /setup — skills are bundled in .claude/skills/.

DISCOM compatibility

Every user-specific identifier is discovered at runtime — nothing is hardcoded per DISCOM.

DISCOMRegionStatus
PVVNLWest UP (Noida, Agra, Ghaziabad…)✅ tested end-to-end
MVVNLCentral UP🟡 same API, unverified
PuVVNLEast UP🟡 same API, unverified
DVVNLSouth UP🟡 same API, unverified
KESCoKanpur🟡 same API, unverified

On a non-PVVNL DISCOM? File a verification issue if it works — I'll flip the table to ✅.

Privacy & transparency

Your credentials are never stored or logged. Here's exactly what happens.

🔒

HTTPS transit, no storage

Your credentials pass through our server over HTTPS to reach UPPCL's API. They exist in server memory only during the request — never written to disk, a database, or a log file.

🧠

No database, no tracking

The JWT from UPPCL is stored in sessionStorage — it lives only in your browser tab. Close the tab and it's gone. The server has no database, no analytics, no tracking of any kind.

📖

Fully open-source

Every line of code is on GitHub. The server is a stateless CORS proxy — read the ~90-line route handler yourself. Self-host with bun run dev for complete privacy.