LN/

Full-stack · industrial data

Tech lead @ A3E

Local time in Mexico:

LeoNoriega

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.

Live · active power · last 60 min —

3.1M readings summarized in D1 Cloudflare edge · querying…

What I actually do

Small team, wide surface: I write the collector, model the data, ship the deploy and then answer for it in production.

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

DevOps & platform

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

Industrial IoT

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

Frontend

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

Applied ML

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

Selected systems

Built from zero and led end to end — architecture, data model, deploy, support.

Mi3

2024 — now · Tech lead

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

a3e-monitori3.com.mx (opens in a new tab)

Gevensi

2024 — now · Backend & data

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

a3e-gevensi.com.mx (opens in a new tab)

Edge telemetry lab

2026 · Design & build

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

Try the live query

Query 3.1 million readings

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.

Window

Querying the edge…

Round trip
—
Database
—
Rows aggregated
—
Buckets
—
Resolution
—
Source
—
Edge cache
—

Robust z-score waits for data.

SQL this request ran
—

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.

From commit to edge

One workflow, six gates. Nothing reaches this domain unless type checks, lint, tests, bundle budget and the production build pass first.

  1. Commit

    Push to main triggers .github/workflows/ci.yml. Pull requests run the same job without deploying.

  2. Verify

    pnpm check runs TypeScript, Biome, Vitest on the Workers runtime, the Vite build and a bundle budget.

  3. Build

    Static HTML, one CSS file and one small module. No framework runtime, no client router, no hydration.

  4. Migrate

    wrangler d1 migrations apply --remote runs before the new Worker is allowed to serve traffic.

  5. Deploy

    One atomic wrangler deploy, with the commit SHA stamped into the page and /api/health.

  6. Observe

    Every query returns Server-Timing; failures land in Workers Logs, not in someone's inbox.

The whole system, including the part that deploys it
git push
  └─▶ verify ─▶ build ─▶ migrate ─▶ deploy
                                      │
browser ─▶ Worker (Hono) ─▶ edge cache ─▶ D1
                 │                        ├─ readings (12 h)
                 └─ SQL aggregate ──▶ canvas
                                          └─ readings_hourly (45 d)

What it costs

ServiceFree allowanceUsed here
Workers100k requests / dayHTML, API, cache
D15M reads · 100k writes / day86,400 rows stored
Edge cacheIncluded with Workers60–600 s per query
Total$0 / monthNo server, no idle cost

Talk to me about industrial data.

I'm in Mexico (UTC−6), working with teams across the Americas. The fastest route is email.

leonoriega100@gmail.com