Change Log Explorer
Browse the history of completed work on this site. Expandable cards with PR links, plan files, checklists, and timeline of each item's journey.
Streamline blog post build/deploy pipeline
Added a `detect-changes` job to `deploy.yml` that classifies pushes as content-only or full-build. Content-only deploys skip Playwright tests, unit tests, Sentry source maps, security audit, and bundle size checks. Deployed in PR #249. Full pipeline: ~10min → Content-only: ~2min.
Rework TabList Mobile Selector
Feb 2: INP Performance Optimization
Reduced Interaction to Next Paint from 493ms (poor) to <50ms (good). Throttled Kanban drag handlers, deferred analytics to idle time, debounced K8s form inputs, and memoized heatmap computations.
K8s Resource Right-Sizer
K8s CPU/memory rightsizing calculator with percentile-based recommendations, risk slider, savings estimates, and YAML export. Includes combobox inputs with tooltips and dropdown presets for easy exploration.
Jan 28: Hero GitHub Button
Added GitHub button to hero section alongside the Email button: - Solid variant for visual hierarchy - Renamed "Get In Touch" to "Email" for clarity - Updated tests for new button layout Commits: b98efed, 0e53f51, acf7603, bd55d64
GitHub Actions Billing Dashboard
Track Actions minutes/spend in analytics dashboard. Phase 0 (API validation) complete - uses new Enhanced Billing endpoint. See docs/plans/60-github-actions-billing-dashboard.md
Jan 28: SEO Schema Improvements
Enhanced structured data for better search visibility: - Added ProfilePage JSON-LD schema to homepage - Added BreadcrumbList schema to blog posts - Fixed LinkedIn URL in social links - Added author.sameAs to BlogPosting schema Plan: [docs/plans/61-seo-profilepage-schema.md](/docs/plans/61-seo-profilepage-schema.md)
Jan 28: Blog Post Date Rename
Renamed all blog post files and frontmatter dates from 2025 to 2026 to reflect correct publication year.
Jan 27: The 404s Came Back
Published sequel to the original 404 debugging post, covering: - Mysterious traffic from CI/CD pipelines - HeadlessChrome user agent detection - Analytics filtering for bot traffic Also improved Top Pages table readability on mobile (PR #210). Related: [Blog post](/blog/2026-01-27-the-404s-came-back)
Jan 27: SEO Pre-render All Routes
Pre-rendered all routes at build time to ensure Googlebot can crawl them without JavaScript execution. SPAs on GitHub Pages return 404 for direct URL access without pre-rendering. Commit: 4eee9a8
Jan 25: Dotfiles for AI-Assisted Development
Published blog post covering dotfiles patterns for AI-assisted development: - CLAUDE.md project instructions - Global vs project-specific rules - Session notes for context persistence - Commit message conventions with flags Related: [Blog post](/blog/2026-01-25-dotfiles-for-ai-assisted-development)
Jan 25: Employment Update
Updated employment information to reflect new role as Technical Incident Manager at Nvidia.
Kanban System Durability Improvements
New Board Creation
Add ability to create new kanban boards from the UI. Board selector dropdown to switch between boards, plus 'New Board' button to create fresh boards. **Architecture Decision**: Dynamic board discovery (Option A from plan). Worker scans `content/kanban/` to discover boards, no hardcoded allowlist. **Codex Review Complete** (2026-01-23): - Race condition handling with retry logic on 409 - Markdown fallback for new boards before precompile - Column ID validation with `SAFE_ID` - Optimistic UI with `precompiled: false` indicator See `docs/plans/58-new-board-creation.md` for full implementation plan.
Migrate Kanban to Markdown Files
Replace monolithic roadmap-board.json with individual markdown files per card. Adopt Backlog.md pattern or Astro Content Collections approach. Problem: 1665-line JSON file is error-prone for manual editing (trailing commas, bracket mismatches). Options evaluated: - Backlog.md (ready-made, Claude Code compatible) - Astro Content Collections pattern (gray-matter + Zod) - YAML files - TypeScript data files
Phase 2: Markdown-Only Saves
Eliminate dual maintenance by making markdown the single source of truth. Current state: JSON files are edited by save workflow, markdown files power ChangelogExplorer. Target state: Save workflow writes .md files directly via GitHub API, precompile runs on every push. Benefits: - Single source of truth (no sync issues) - Better git diffs for card changes - Easier manual editing when needed - CLI tools work with same format
Jan 23: Kanban Phase 2 Complete
## Phase 2: Markdown-Only Saves Completed the migration to make markdown the single source of truth for kanban boards. ### Key Changes - **Eliminated JSON files**: Removed `roadmap-board.json`, `house-board.json`, and `roadmap-archive.json` - **Worker writes directly to markdown**: Save flow now commits `.md` files via GitHub Trees API - **Commit SHA conflict detection**: Replaced timestamp-based detection with atomic commit SHA comparison - **Precompiled JS fallback**: Board loads from worker API (primary) or generated JS (offline fallback) ### Bug Fixes - Fixed UTF-8 encoding corruption for non-ASCII characters (arrows, emojis) - Fixed duplicate history entries during drag operations (moved tracking from `handleDragOver` to `handleDragEnd`) - Fixed Cloudflare Workers 50 subrequest limit by using inline content in tree items - Fixed open redirect vulnerability in OAuth return_to validation ### Architecture ``` Save: UI → Worker → GitHub Trees API → content/kanban/*.md ↓ repository_dispatch → precompile-content.yml ↓ src/generated/kanban/*.js Load: UI → Worker API (primary) → precompiled JS (fallback) ``` Related PRs: #195, #198
Analytics Bot & CI Traffic Tagging
Tag suspicious traffic with custom dimension instead of filtering. Enables analysis of bot patterns while keeping data. Implemented in `src/lib/analytics/clientTrafficClassifier.ts`: - Known bot user agents (Googlebot, Bingbot, HeadlessChrome, etc.) - CI/automation user agents (GitHub Actions runners, Playwright) - Known probe paths (wp-admin, .env, xmlrpc.php, etc.) - Sessions tagged on first pageview with GA4 custom dimension
Analytics Event Tracking
Add GA4 events for interactive tool usage. Track calculator submissions, tab switches, copy-to-clipboard actions. Implemented in `src/lib/trackToolEvent.ts` with events firing in: - SLO Calculator: tab_switch, calculate, period_change - CLI Playground: command_run, tool_select, mode_switch, preset_select, share_copy - On-Call Coverage: model_select
Lighthouse: A11y & SEO Focus
Lab Lighthouse provides unique value for accessibility audits and SEO checks that field CWV data can't capture. Reframed the workflow to focus on these strengths. Implemented in `.github/workflows/lighthouse.yml`: - Path-based triggers (only runs on UI changes to src/pages, components, CSS) - Multi-page testing with thresholds: A11y ≥95, SEO ≥90, Best Practices ≥90 - Results stored in lighthouse-metrics branch for historical tracking
Tailwind CSS v4 Upgrade
Migrate to v4: CSS-based config, Vite plugin, updated utilities. ~116 class renames across 59 files. Completed Jan 21. See blog post: "Tailwind v4 Upgrade: The Performance Tradeoff"
react-hook-form & @hookform/resolvers Update
Updated react-hook-form from 7.53.0 to 7.71.1 and @hookform/resolvers from 3.10.0 to 5.2.2. The resolvers package had a peer dependency requiring react-hook-form >=7.55.0.
Animated Mermaid Diagrams
Added animated walkthrough mode to incident-command-diagrams with: - Step-by-step animation with play/pause/skip/back controls - Decision nodes that pause for user to choose a path (branching logic) - Link nodes for cross-diagram navigation and external tool links - Side-by-side layout with sticky context panel - Auto-scroll to center active node in viewport - Progress bar and step counter - Lazy-loaded Mermaid rendering with theme support
CLI Tool Playground
Interactive in-browser demos for CLI tools. Pure JS implementations (no WASM). Features: - Tool selector: kubectl, jq, grep, sed, awk - Learn mode with goals, hints, and command chips - Playground mode for freeform experimentation - Command explainer with flag breakdowns and 'Try next' suggestions - Shareable URL state (tool, mode, input, command) - 5 presets per tool covering common use cases kubectl simulator: - 5 triage scenarios (CrashLoopBackOff, ImagePullBackOff, Service Mismatch, Rollout Regression, Node Pressure) - Full K8s resource schema (pods, deployments, services, nodes, events) - Supports: get, describe, logs, rollout, top, events - Session state mutation for rollback commands Security fixes: - Replaced Function() with safe regex parser (XSS) - URL param validation with fallbacks - Race condition guards for async results
Error Budget Burndown
Visualize how quickly you're consuming error budget. Input SLO target + incident history to see burn rate and projected exhaustion date.
Programmatic OG Image Generation
Generate Open Graph images at build time for project pages using satori + @resvg/resvg-js. Implemented: - Build-time generation via scripts/generate-og-images.mjs - Build-time validation via scripts/validate-projects.mjs - Dark theme template with icon, title, description, tags - Inter font (regular + bold) for typography - Added to build pipeline in package.json - Extracted project metadata to projects-meta.json - Simplified projects.ts by removing inline metadata - Fail-fast guards for CI (exits 1 on generation or validation failures)
SLO Calculator SEO
Added JSON-LD structured data and keyword optimization for SLO Calculator project page. Implemented: - WebApplication JSON-LD schema for active projects - BreadcrumbList JSON-LD schema for navigation - Keywords and ogImage fields in ProjectMeta type - SEO-optimized keywords for SLO Calculator - resolveOgImage helper for absolute URL handling OG image generation moved to separate task (Programmatic OG Image Generation).
SLO Tool UX Improvements
Polished the SLO Calculator with better defaults and new burn rate simulator. Changes: - Realistic default response times (26m MTTR) - Collapsible Response Times section (shows Alert latency by default) - Removed redundant burndown charts from Achievable/Target tabs - Added interactive Burn Rate Simulator slider (0.1x-5x) - Explanatory text for the 'ideal' line concept - Fixed slider resync when inputs change (Codex finding) - Fixed edge case when zero incidents (Codex finding)
Grafana Dashboard JSON Builder
Visual editor for Grafana dashboards. Drag-and-drop panel layout, panel type picker, export schema v38+ JSON.
Log Pattern Extractor
Detect recurring log patterns from raw lines. Auto-group by template, field type inference, export to regex/grok/logstash format.
Retention Cost Estimator
Estimate observability costs across providers (Datadog, Grafana Cloud, New Relic). Side-by-side comparison, retention tradeoffs.
Unified SLO Calculator
Consolidated SLO Calculator and Error Budget Burndown into one project with three tabs: - What can I achieve? (response time inputs directly visible) - Can I meet this SLO? (collapsible config) - Budget Burndown (full chart view) Removed 2,700+ lines of redundant code. Collapsible configuration for target/burndown tabs, direct inputs for achievable tab.
SLO Calculator Burndown Integration
Add 'SLO Burndown' tab to SLO Uptime Calculator. Reuse BurndownChart from Error Budget Burndown, generate simulated incidents from 'incidents per month' input.
Pre-commit Hooks (Husky + lint-staged)
Add Husky + lint-staged for pre-commit hooks. Runs ESLint with auto-fix on staged TS/JS files before every commit.
Kanban External Change Detection
Detect when board is updated externally (e.g., by Claude commits). Check on tab focus + every 15s while visible. Show toast with reload button to prevent save conflicts.
Change Log Explorer Project
Visualize completed work from kanban changelog and archive. Rich expandable cards with PR links, plan file content, and completion history.
Kanban URL Simplification
Remove URL state persistence, keep just `?board=roadmap`. Add deep linking with `?card=id` to open specific cards on load.
Preview Deployments
Deploy PRs to unique preview URLs via Cloudflare Pages. Enables visual review before merge. Preview URL: https://personal-website-adg.pages.dev Branch pattern: <branch>.personal-website-adg.pages.dev
Kanban Card Comments
Add giscus discussion threads to kanban cards. Reuse existing blog Comments pattern with theme matching. Also fixed blog Comments to use ThemeContext.
Sentry Error Tracking Enhancement
Source maps for readable stack traces, React error boundaries, release tracking, and improved debugging context. Codex Review of PR #130: - High (fixed): Sentry lazy loading inconsistency - ErrorBoundary imported but Sentry.init deferred. Fixed: now initializes synchronously before render. - Medium (fixed): Source maps publicly served exposing source code. Fixed: using hidden sourcemaps + delete after Sentry upload.
Analytics Data Deduplication
Deduplicate time-series data in useAnalyticsData hook. ga4-history.json has multiple entries per date from automated collection.
Kanban Board Save Feature
GitHub OAuth login, Cloudflare Worker proxy, save to GitHub via Actions. Includes conflict detection, unsaved changes warning.
React Performance Optimizations
Analytics CLS 0.71→0.10, scroll throttling, React.memo, lazy-loaded charts, skeleton loaders
Dynamic PR Status Indicator
Live CI status for In Review cards via GitHub API, merged icon for changelog PRs
Framer Motion Animations
Stagger animations for grids, scroll reveals, tab transitions, mobile nav stagger. Respects prefers-reduced-motion.
Jan 14: Kanban & UX
Kanban board with drag-and-drop, card colors, House Projects board, performance budgets, ARIA live regions, deploy notifications
Renovate Automation
Decided against: overhead not justified for actively-maintained personal project. Manual npm update works fine.
Jan 12: Projects Page Launch
SLO Calculator, Status Page Generator, registry pattern
Jan 11: MDX Precompilation
Blog LCP 5.6s → 3.1s (45% faster)
Jan 8: Blog Phase 4 & 5
Comments, syntax highlighting, RSS, structured data
Jan 6-7: Node.js v24 + Perf
55 → 98 Lighthouse, system fonts, Radix cleanup