This Site — Dev Log¶
The portfolio itself. MkDocs static site on Netlify, fed by pre-generated JSON from multiple pipelines.
Current — Netlify data architecture
Decoupling pre-generated JSON files from Netlify site builds. Deploys cost 15 credits each and were triggering on every data commit. Moved to Supabase Storage (private bucket sf6-reports) + Netlify Function proxy (netlify/functions/sf6-report.js) so data updates without a rebuild — no [netlify skip] needed since the workflow no longer commits report JSON at all.
2026-07-02— Supabase Storage private bucket created; Netlify env vars (SUPABASE_URL,SUPABASE_SECRET_KEY) and matching GitHub Actions secrets set2026-07-02—netlify/functions/sf6-report.jsadded: raw-fetch proxy (no SDK dependency), reads?cfn=, fetches from Storage with the secret key, 5-min cache header2026-07-02—tools/generate_sf6_reports.pyswitched from writing local JSON to uploading viaurllib(upsert);sf6_reports.ymlworkflow no longer commits/pushes2026-07-02—sf6-report-echarts.jsfetch URL swapped to the Function endpoint2026-07-02— Verified: workflow uploads all 14 reports to Storage successfully (HTTP 200)2026-07-04— Migration live and verified. The earlier "native 404" was a wrong-domain test — the site serves fromresilient-hotteok-8d3a22.netlify.app, notzach-king-analytics.netlify.app(the latter is only thesite_urlcanonical hint). Function returns real report JSON end-to-end2026-07-04— Function now maps Supabase's missing-object response (HTTP 400) to a clean404 "Report not found"instead of502 "Upstream error"2026-07-04— Data cadence increased from Mon/Wed/Fri to 3×/day (4am / noon / 8pm ET):buckler-scrape(street_fighter repo) thensf6-reportsreport-gen 30 min later. No Netlify rebuild triggered2026-07-04— Deleted the 14 committed report JSON files indocs/assets/data/sf6-reports/; site serves from Storage now (recoverable from git history + live Storage copies)2026-07-04— New tracked player wyntrethethird added totools/generate_sf6_reports.pyCFNS(15 players). Full pipeline verified end-to-end: scrape → DB → report-gen → Storage → Function returns real JSON (HTTP 200, 131 KB, 300 matches). Note the generator'sCFNSlist is keyed by lowercase CFN name, separate from thestreet_fighterrepo's ID-keyed player list — both must be updated to add a player2026-07-04— Three more players added (roster now 18): FallenDawn, bugguy, insanity. All verified end-to-end via the Function (HTTP 200 — 31 KB / 92 KB / 119 KB). Procedure now documented in thestreet_fighterRUNBOOK ("Add a player to the flow")
Follow-ups: reconcile serving domain vs site_url before connecting zachkingdata.com; re-anchor crons +1hr when EST begins (or accept the shift).
Lab redesign — June 2026
2026-06-08— Lab redesigned: compact.lab-cardgrid, dashed border, problem/solution sprint framing, dev log sub-pages
Polish & launch — June 2026
2026-06-06— Pre-launch: nav (11 pages), dark/light, mobile 375px, SF6 report, finance decrypt verified2026-06-05— Resume: Director bullet rewritten, jargon removed, AI chips updated2026-06-05— Work index bridge sentence; Fitness Tracker case study brought to template standard2026-06-03— Mobile nav: Flask logo centered, repo bar removed, drawer layout fixed2026-06-01— Dark mode set as default; hero scroll indicator added
Build — May 2026
2026-05-22— Full visual polish: h3 hierarchy, mermaid scaling, 20+ CSS var conversions, light mode audit2026-05-22— Case study template finalized: TL;DR → Personal Statement → How It Works → Under the Hood2026-05-22— Resume: skills chips, timeline HTML, LinkedIn link; Playfair Display + Space Grotesk fonts2026-05-21— Contact and resume pages rewritten; download buttons removed2026-05-20— Personal Finance case study full rewrite; mermaid flow diagrams added2026-05-19— Work index intro rewritten; SF6, PF, Recipe Studio card copy updated2026-05-07— Initial build: nav restructure, hero, about section, CTAs