Project 2

Production Monitoring Dashboard

Plant-wide production monitoring serving 50+ machines and 50+ daily users. Built solo, in production since 2021.

Role — Sole engineer.

Multi-protocol edge ingestion with write-time cache invalidation

Origin

Co-op project that grew from a Python script. Started by scraping a Fanuc robot's status page for one engineer. Tied in camera replays on faults, added operator downtime tracking, then PLC integration, then plant-wide rollout. Made the case for it as a co-op, delivered V1, joined full-time pre-graduation. Ran the project to 50+ machines.

Architecture

V1 polled machines from a front-office VM. Fragile — data gaps during network outages. V2 moved ingestion onto small Linux devices networked directly to equipment on the plant floor, including equipment on offline networks.

Edge Ingestion

Each machine speaks its native protocol. Each edge device runs a Python pipeline — connect via protocol library, normalize, sync to backend via write-ahead HTTP. Tag files give Python the flexibility to transform raw values into the right format. New equipment means a new tag file, not new code.

Write-Ahead HTTP

Plant floor networks are unreliable. Each outgoing HTTP request appends to a local file. A drain process sends it to the backend and removes it on success. Survives outages, reboots, and backend downtime without data loss.

Lifetime Counters and Raw Recording

Tried shift tallies, weekly counts, per-part counts. Every fixed aggregation broke when someone asked for a new window. Switched to monotonic lifetime counters: any window becomes count(end) - count(start). Fixed aggregations still exist for commonly queried logs — they rebuild from the counters, and any window stays arbitrarily queryable in the future. Raw data recording handles measurements like press temperatures where the values matter, not just the counts.

Read Scaling

Many clients poll at one-second intervals. Recomputing aggregations on read doesn't scale. Cache updates synchronously on writes — when a data point arrives, only the affected windows recompute. Polling clients read from the same cached result. Reads stay O(1) regardless of client count.

Stack

Backend went from Python to Go for static typing and single-binary deployment. PostgreSQL with TimescaleDB replaced an early MongoDB experiment. Python stayed at the edge. Continues to run in production via a ZeroTier overlay for administration.

Stack
  • Go
  • Python
  • PostgreSQL
  • TimescaleDB
  • Linux
  • ZeroTier

Project 3

Self-Extracting Binary Deployment for Kubernetes

A self-extracting Go binary that handles full Kubernetes deployment in one command. ~30 seconds from execution to running cluster. Works well for edge environments, customer-controlled infrastructure, and air-gapped deployments.

Role — Designed and implemented the pattern.

Problem

Existing deployment processes for restricted environments typically involve multiple manual steps — archive extraction, dependency installation, image loading, helm setup. Wanted something faster, cleaner, and operable in one command.

Pattern

A pack tool runs online and produces a single self-extracting binary that handles installation offline.

Pack: A manifest declares the helm charts, K3s version, and plugins. The pack CLI reads the manifest, automatically pulls the images defined in the helm charts, compresses an asset archive, and appends it to the install binary. Output is one deployment file.

Install: Operator runs ./install. Binary extracts its appended assets, installs K3s, loads container images into containerd from the archive, and applies the helm charts. containerd shares images between nodes.

Engineering Decisions

  • Declarative pack manifest. Users describe what they need; the tool creates one file that deploys it.
  • OCI image archive. Standard format, loaded directly into containerd without an intermediate registry.
  • Shared codebase for pack and install binaries. Pack CLI and install CLI are separate binaries built from the same Go codebase — shared primitives, distinct entry points.
  • Same install binary acts as a runtime CLI. Can execute without extracting, so the deployer and application tooling can ship in one artifact.
Stack
  • Go
  • K3s
  • Helm
  • containerd
  • Cobra
  • OCI image format

Project 4

Machine Shop Quote Creation Tool

Web app replacing a paper-and-pencil quoting process at a machine shop. Quote time: 1.5 hours → 30 minutes.

Built for a friend running his own shop. He was on paper — asked for help. Built a full quoting workflow with nested assemblies, mixed labor types (fixed and variable), material costing with markup, and a quote lifecycle from received through submitted. Calculations and fields auto-populate; a formatted PDF pops out and gets emailed to customers. Data in SQL, React frontend, deployed to a VPS.

Screenshots

Create quote flow with client and date selection
Create quote flow with client and date selection
Quote detail with nested assemblies, parts, labor breakdown, and markup
Quote detail with nested assemblies, parts, labor breakdown, and markup
Stack
  • Go
  • React
  • PostgreSQL
  • VPS

Other Things I've Built

A few side projects from over the years:

Plenty more — happy to get into any of them.

Skills & Stack

Languages
Go · Python · TypeScript · SQL
Infrastructure
Kubernetes (CKAD) · Docker · Helm · Linux · GitLab CI/CD
Data
PostgreSQL · TimescaleDB · Redis · SQLite
APIs
gRPC/Protobuf · REST
Frontend
Templ · HTMX · React
Domains
Edge systems · Restricted/constrained deployments · IoT/industrial monitoring · Distributed architecture

Education & Certifications

BS Electrical and Computer Engineering — The Ohio State University, 2019–2022 (GPA 3.92)

Certifications