[jm]Japheth Miller
← All projects
03
2023—now · live · in production
my SaaS

Ottomated — Utility intelligence app

A real-time utility analytics platform that turns raw meter data into actionable cost & carbon insight for facility teams.

Next.js 14tRPCPostgresTimescaleDBTailwind
Client
Ottomated, Inc. (self-funded)
Role
Founder · design + full-stack
Timeline
18 months · ongoing
Year
2023—now
Ottomated — Utility intelligence app
ottomated-app
fig. 01 · ottomated — utility intelligence app, in production.
app.ottomated.io / properties / crystal-gardens
fig. 02 · property detail — metrics & cycle data
fig. 02 · property detail — metrics & cycle data
app.ottomated.io / portfolio
fig. 03 · portfolio view — all properties at a glance
fig. 03 · portfolio view — all properties at a glance

I designed and built Ottomated end-to-end — a multi-tenant SaaS that ingests meter telemetry and renders it as clean dashboards facility teams will actually open. Started as a weekend project to scratch my own itch; now runs in production for paying customers.

The brief

Commercial-building utility data is a mess. Meter exports are CSVs from the 90s, billing PDFs are unsearchable, and every vendor portal looks like it was built in 2008. I wanted one tool that took whatever the building threw at it — bills, BMS exports, CSV drops — and produced a dashboard a non-technical building manager would understand.

Constraints
  1. 01Self-funded — every line had to earn its keep.
  2. 02Multi-tenant from day one (orgs, sites, users, role-based access).
  3. 03Time-series data at minute granularity, retained for 5+ years.
  4. 04Had to handle messy real-world ingest — no two utilities export the same way.
Approach
1.

Picked a boring stack on purpose: Next.js + Postgres + TimescaleDB. tRPC for end-to-end type safety. Drizzle ORM. No Redis until I needed it (I did).

2.

Built the ingest pipeline first — a worker that accepts CSV/XLSX/PDF/EDI and normalizes to a single canonical schema. That was 60% of the work and the part nobody sees.

3.

Designed the dashboard around two questions: 'what changed this week?' and 'where am I leaking money?' Everything else got cut.

4.

Shipped the first paying customer in week 11. Used their feedback to drive everything for the next six months.

What we shipped
Ingest pipeline

CSV / XLSX / PDF / EDI 867 normalizer with per-source adapters. Failure replay + dead-letter queue.

Real-time dashboard

Per-site consumption, demand peaks, anomaly flags. Server components + streaming. Sub-100ms paint.

Reports & exports

Scheduled PDF reports per site. Carbon accounting per Scope 2 location-based method.

Billing & access

Stripe-backed seat + site billing. SSO via WorkOS. Audit log on every mutation.

Outcome

What it did, in numbers.

1.2M
meter reads ingested daily
$340k
demand savings flagged YTD
47
paying organizations
99.94%
ingest pipeline uptime
I stopped opening five tabs to figure out what my buildings did last week. That's the whole pitch.
Operations Director · Mid-Atlantic property group
What I’d do again
  • Type-safety end-to-end is worth the setup tax. tRPC + Drizzle let me ship features in hours, not days, after month three.
  • Don't build a queue until you need a queue. Then build a queue. (I waited too long, then built one too elaborate.)
  • The first painful customer is more valuable than the first ten happy ones. They tell you what you actually built.
next project →
Ottomated.io — Marketing site
Have one of these?
Tell me about it.