
Systems touched:
henrypye.xyz, my personal site and portfolio
life.os, my personal dashboard
lifeos.grafana, monitoring infrastructure
tech.interview.practice, an interview preparation tool
Principles explored:
Constraint-driven writing (distilling complex work into safe, honest language)
Timezone-aware batch operations (UTC boundaries for reliable scheduling)
Defensive prompt engineering (layered validation and redaction rules)
Idempotent state machines (backfill logic that survives restarts)
Today was dominated by a single, elegant problem: how to automatically generate reflective engineering diaries from raw commit history, safely.
henrypye.xyz, my personal site, saw a refresh cycle. I rewrote the About page repeatedly, iterating toward authenticity: introducing language for specific achievements, removing editorializing, and anchoring every claim to real work. This wasn't busy work—it was me learning how to frame my career honestly, which fed directly into the constraints I'd later codify.
life.os, my personal dashboard, became the sandbox for the real work. I built a dev-blog module that generates these diary entries automatically. The architecture is deceptively simple: collect commits from GitHub, validate against a restricted language list, redact sensitive patterns (credentials, sensitive information, architecture details), then feed the scrubbed data to Claude with strict formatting rules.
The trickiest part was what to exclude. I added an explicit allowlist of forbidden terms and patterns. The redaction layer strips these before they ever reach the AI. I also enforced that every paragraph must anchor itself to a specific repo, preventing vague hand-waving about "architecture" or "systems."
Timezone handling nearly broke me. Commits queried at 3am UTC need absolute boundaries, not relative "yesterday" checks. I moved to explicit UTC date ranges throughout the pipeline.
For reliability, I added a backfill on startup. If the cron job fails, the system catches up cleanly. The weekly Invader roundup does a two-pass research-then-write flow: first, search the web and fetch articles; second, synthesize them into prose. This decoupling means failures in one pass don't poison the other.
I also added dynamic cover image generation via Cloudinary—abstract black-and-white SVGs that render text overlays. The fonts required Docker configuration (fontconfig isn't bundled by default), a small but necessary detail for text rendering in containerized environments.
tech.interview.practice, my interview tool, got a security refactor. I reverted the bring-your-own-keys (BYOK) feature and returned to environment-based API key management. The lesson: complexity isn't always better, and user friction around secrets is often a feature, not a bug.
The through-line today: constraints breed clarity. Building a safe diary generator forced me to think deeply about what's worth documenting, and what's dangerous to leave implicit.

Systems touched:
henrypye.xyz, my personal site and portfolio
life.os, my personal dashboard
lifeos.grafana, monitoring infrastructure
tech.interview.practice, an interview preparation tool
Principles explored:
Constraint-driven writing (distilling complex work into safe, honest language)
Timezone-aware batch operations (UTC boundaries for reliable scheduling)
Defensive prompt engineering (layered validation and redaction rules)
Idempotent state machines (backfill logic that survives restarts)
Today was dominated by a single, elegant problem: how to automatically generate reflective engineering diaries from raw commit history, safely.
henrypye.xyz, my personal site, saw a refresh cycle. I rewrote the About page repeatedly, iterating toward authenticity: introducing language for specific achievements, removing editorializing, and anchoring every claim to real work. This wasn't busy work—it was me learning how to frame my career honestly, which fed directly into the constraints I'd later codify.
life.os, my personal dashboard, became the sandbox for the real work. I built a dev-blog module that generates these diary entries automatically. The architecture is deceptively simple: collect commits from GitHub, validate against a restricted language list, redact sensitive patterns (credentials, sensitive information, architecture details), then feed the scrubbed data to Claude with strict formatting rules.
The trickiest part was what to exclude. I added an explicit allowlist of forbidden terms and patterns. The redaction layer strips these before they ever reach the AI. I also enforced that every paragraph must anchor itself to a specific repo, preventing vague hand-waving about "architecture" or "systems."
Timezone handling nearly broke me. Commits queried at 3am UTC need absolute boundaries, not relative "yesterday" checks. I moved to explicit UTC date ranges throughout the pipeline.
For reliability, I added a backfill on startup. If the cron job fails, the system catches up cleanly. The weekly Invader roundup does a two-pass research-then-write flow: first, search the web and fetch articles; second, synthesize them into prose. This decoupling means failures in one pass don't poison the other.
I also added dynamic cover image generation via Cloudinary—abstract black-and-white SVGs that render text overlays. The fonts required Docker configuration (fontconfig isn't bundled by default), a small but necessary detail for text rendering in containerized environments.
tech.interview.practice, my interview tool, got a security refactor. I reverted the bring-your-own-keys (BYOK) feature and returned to environment-based API key management. The lesson: complexity isn't always better, and user friction around secrets is often a feature, not a bug.
The through-line today: constraints breed clarity. Building a safe diary generator forced me to think deeply about what's worth documenting, and what's dangerous to leave implicit.

Subscribe to henrypye

Subscribe to henrypye
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
No activity yet