Backend & data
Collectors, APIs and schemas for time-series workloads. The query plan matters as much as the endpoint.
Go / Java · Spring Boot / Python · Django / Hono / PostgreSQL / ClickHouse / Kafka
Full-stack engineer & tech lead — industrial data systems.
I build the path from field device to operator screen: Go collectors speaking Modbus and MQTT, Kafka and ClickHouse for time-series, and interfaces that stay useful while the plant is running.
3.1M readings summarized in D1 Cloudflare edge · querying…
Small team, wide surface: I write the collector, model the data, ship the deploy and then answer for it in production.
Collectors, APIs and schemas for time-series workloads. The query plan matters as much as the endpoint.
Go / Java · Spring Boot / Python · Django / Hono / PostgreSQL / ClickHouse / Kafka
Built A3E's toolchain from zero: GitLab CE, Jenkins, SonarQube and OpenProject in containers on Proxmox. Same discipline now on AWS and Cloudflare.
Docker / GitLab CI / Jenkins / Proxmox / NGINX / AWS / GitHub Actions / Cloudflare
Heterogeneous field devices, one data model: power meters, protection relays and environmental sensors over Modbus, RF, serial and MQTT.
Modbus TCP/RTU / MQTT / TCP-RF / Serial / Go collectors
Operator interfaces for people who are not staring at the screen. Clear hierarchy, no ceremony, fast first paint.
React / Next.js / Vite / Tailwind / React Native / Kotlin
Anomaly scoring beside the data: a robust z-score over median absolute deviation, computed in the Worker that serves this page. No model server, no cold start.
Statistics / TypeScript / Workers / D1
Built from zero and led end to end — architecture, data model, deploy, support.
Real-time electrical monitoring for industrial plants. Multi-protocol Go collectors pull data from meters, protection relays and environmental sensors; readings move through MongoDB and Kafka into ClickHouse for time-series analytics.
5 engineers3 field protocolsAWS · NGINX
ISO 50001 energy management. Spring Boot backend with JWT authentication, encrypted sensitive fields and Swagger-documented APIs; statistical baseline calculation (R²) turns meter data into auditable savings.
ISO 50001Spring BootNext.js
This page. 3.1M generated readings summarized into D1, aggregated in SQL, cached at the edge and drawn on a canvas without a chart library. The API reports its own row count and latency.
CloudflareD1Hono · Vite
Forty-five days of plant telemetry, compressed into 86,400 D1 rows: twelve hours of raw minutes plus hourly rollups for the rest. Every response reports what it cost.
Querying the edge…
Robust z-score waits for data.
—
Long ranges read readings_hourly: a 30-day query touches 8,640 stored
rows, not 518,400 readings. Recent windows read readings through an
index on (metric, ts).
The Worker caches each query for 60–600 seconds. Run it twice and the second one never reaches D1.
One workflow, six gates. Nothing reaches this domain unless type checks, lint, tests, bundle budget and the production build pass first.
Push to main triggers
.github/workflows/ci.yml. Pull requests run the same job without
deploying.
pnpm check runs TypeScript, Biome, Vitest on the Workers runtime, the
Vite build and a bundle budget.
Static HTML, one CSS file and one small module. No framework runtime, no client router, no hydration.
wrangler d1 migrations apply --remote runs before the new Worker is
allowed to serve traffic.
One atomic wrangler deploy, with the commit SHA stamped into the page
and /api/health.
Every query returns Server-Timing; failures land in Workers Logs, not
in someone's inbox.
git push
└─▶ verify ─▶ build ─▶ migrate ─▶ deploy
│
browser ─▶ Worker (Hono) ─▶ edge cache ─▶ D1
│ ├─ readings (12 h)
└─ SQL aggregate ──▶ canvas
└─ readings_hourly (45 d)
| Service | Free allowance | Used here |
|---|---|---|
| Workers | 100k requests / day | HTML, API, cache |
| D1 | 5M reads · 100k writes / day | 86,400 rows stored |
| Edge cache | Included with Workers | 60–600 s per query |
| Total | $0 / month | No server, no idle cost |
I'm in Mexico (UTC−6), working with teams across the Americas. The fastest route is email.
leonoriega100@gmail.com