{"slug":"build-pages","total":93,"limit":100,"offset":0,"since":null,"commits":[{"hash":"0e2d436","date":"2026-07-28 09:13:19 -0700","author":"steve@designerwallcoverings.com","subject":"discovery: exclude _-prefixed scratch/archive dirs + v1.1.1","body":""},{"hash":"c032224","date":"2026-07-28 09:10:49 -0700","author":"steve@designerwallcoverings.com","subject":"chore: lint+refactor pass (clean, no code changes) + v1.1.0 (session close)","body":""},{"hash":"a16bd03","date":"2026-07-28 07:54:53 -0700","author":"steve@designerwallcoverings.com","subject":"auto-discover every ~/Projects git repo (541) with a background warmer + TTL cache: git scans run off the request path so home stays ~80ms; curated projects stay featured-first","body":""},{"hash":"0a57042","date":"2026-07-28 07:38:59 -0700","author":"steve@designerwallcoverings.com","subject":"deploy.conf: tailnet-proxy model; live at build-pages.agentabrams.com","body":""},{"hash":"46c7d22","date":"2026-07-28 07:37:51 -0700","author":"steve@designerwallcoverings.com","subject":"server: honor HOST env (default 127.0.0.1) so it can bind tailnet-reachable for the Kamatera vhost","body":""},{"hash":"c96a3d6","date":"2026-07-28 07:32:39 -0700","author":"steve@designerwallcoverings.com","subject":"move build-pages target domain → build-pages.agentabrams.com (projects.agentabrams.com reassigned to the project viewer)","body":""},{"hash":"ff6ee37","date":"2026-05-31 16:32:26 -0700","author":"SteveStudio2","subject":"Add per-site favicon (kills /favicon.ico 404)","body":""},{"hash":"c5fae60","date":"2026-05-19 17:31:43 -0700","author":"SteveStudio2","subject":"smoke: 6 snapshot-path 404-guard checks (.bak / .bak.N / .pre- / .orig / .rej / ~)","body":"Guard middleware lives in server.js and runs before express.static. Until now\nno smoke check covered it, so a regression that disabled the guard would have\nshipped silently. 158 checks pass against a live server on :9700.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"07bd1a8","date":"2026-05-19 17:27:42 -0700","author":"SteveStudio2","subject":"server: 404-guard for *.bak / *.pre-* snapshot paths before static mount","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"50c56b7","date":"2026-05-19 17:27:23 -0700","author":"SteveStudio2","subject":"gitignore: exclude *.bak / *.pre-* / *.orig snapshot files","body":"Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"3d15f85","date":"2026-05-13 21:13:19 -0700","author":"SteveStudio2","subject":"home: linkify 'latest YYYY-MM-DD' to its commit detail page + 1 smoke","body":""},{"hash":"f1d86db","date":"2026-05-13 20:48:18 -0700","author":"SteveStudio2","subject":"home: per-project today-PT chip on each project card + 1 smoke","body":""},{"hash":"83730dd","date":"2026-05-13 20:44:10 -0700","author":"SteveStudio2","subject":"home: trend delta arrow (↑/↓/—) between today and yesterday + 1 smoke","body":""},{"hash":"7aefa06","date":"2026-05-13 20:43:02 -0700","author":"SteveStudio2","subject":"smoke: track 'last 24h' line instead of removed 'velocity:' label","body":""},{"hash":"ca0922f","date":"2026-05-13 20:40:57 -0700","author":"SteveStudio2","subject":"home: today vs yesterday side-by-side counts (Steve's PT calendar days) + 1 smoke","body":""},{"hash":"b57cacd","date":"2026-05-13 20:37:02 -0700","author":"SteveStudio2","subject":"refactor: extract startOfDayInTz + todayInTz helpers — DRY the tz math across /api/fleet/today + home","body":""},{"hash":"b709184","date":"2026-05-13 20:12:06 -0700","author":"SteveStudio2","subject":"home: today-PT counter (Steve's calendar day, not rolling-24h) + 1 smoke","body":""},{"hash":"1db956d","date":"2026-05-13 20:07:53 -0700","author":"SteveStudio2","subject":"api/fleet/today: default to America/Los_Angeles (Steve's tz), ?tz= override — UTC at PT-evening was misleading","body":""},{"hash":"e0c1cd7","date":"2026-05-13 20:03:55 -0700","author":"SteveStudio2","subject":"api: /api/fleet/today — calendar-day commit slice (different from rolling-24h since=) + 2 smoke","body":""},{"hash":"e19ef88","date":"2026-05-13 20:00:09 -0700","author":"SteveStudio2","subject":"home: Deepest rationale rail (top 5 commits by body length) + 1 smoke","body":""},{"hash":"5ffc20a","date":"2026-05-13 19:56:54 -0700","author":"SteveStudio2","subject":"api: /api/fleet/longest — top commits by body length (the design-rationale essays) + 2 smoke","body":""},{"hash":"fafcc17","date":"2026-05-13 19:52:51 -0700","author":"SteveStudio2","subject":"Makefile: add 'make stats' target — pretty-print fleet stats from /api/fleet/all","body":""},{"hash":"9419dd0","date":"2026-05-13 19:48:41 -0700","author":"SteveStudio2","subject":"favicon: /favicon.svg + /favicon.ico routes serve real brand mark (referenced by OpenSearch) + 3 smoke","body":""},{"hash":"89a5046","date":"2026-05-13 19:44:52 -0700","author":"SteveStudio2","subject":"opensearch: /opensearch.xml descriptor + autodiscovery <link rel=search> in shell + 4 smoke","body":""},{"hash":"eff2d00","date":"2026-05-13 19:40:53 -0700","author":"SteveStudio2","subject":"static pages: Cache-Control max-age=3600 SWR=86400 on /about /privacy /terms + 1 smoke","body":""},{"hash":"451c6ad","date":"2026-05-13 19:36:36 -0700","author":"SteveStudio2","subject":"alias: /search?q= 302→/?q= (convention path) + 2 smoke","body":""},{"hash":"3af9a44","date":"2026-05-13 19:33:07 -0700","author":"SteveStudio2","subject":"ui: /privacy + /terms boilerplate (no-tracking + as-is) — sitemap + footer + 6 smoke","body":""},{"hash":"e4c31da","date":"2026-05-13 19:29:06 -0700","author":"SteveStudio2","subject":"ui: /about page explaining build-pages + sitemap + footer link + 3 smoke","body":""},{"hash":"e8b65d2","date":"2026-05-13 19:24:52 -0700","author":"SteveStudio2","subject":"api: /api/fleet/buckets — daily commit buckets with ISO labels (fleet + per-project) + 3 smoke","body":""},{"hash":"fdee564","date":"2026-05-13 19:21:18 -0700","author":"SteveStudio2","subject":"refactor: extract sparkline(commits, days) helper — DRY across home + /p/:slug","body":""},{"hash":"59b1208","date":"2026-05-13 19:17:39 -0700","author":"SteveStudio2","subject":"p/:slug: per-project 7-day sparkline in meta line","body":""},{"hash":"b6fe68d","date":"2026-05-13 19:13:57 -0700","author":"SteveStudio2","subject":"home: 7-day velocity sparkline (Unicode block-chars, scales to max bucket) + 1 smoke","body":""},{"hash":"b806ffd","date":"2026-05-13 19:10:00 -0700","author":"SteveStudio2","subject":"api/fleet/authors + Authors chip rail on /p/:slug — uses canonAuthor() for alias collapse + 2 smoke","body":""},{"hash":"c7c7763","date":"2026-05-13 19:05:51 -0700","author":"SteveStudio2","subject":"api: canonAuthor() collapses 'SteveStudio2'/'Steve Abrams'/etc into 'Steve' — authors[] no longer fragmented","body":""},{"hash":"4acf48a","date":"2026-05-13 19:02:39 -0700","author":"SteveStudio2","subject":"api: /api/projects/:slug now includes authors[] breakdown","body":""},{"hash":"66f4335","date":"2026-05-13 18:58:48 -0700","author":"SteveStudio2","subject":"smoke: X-Response-Time + rendered-in footer assertions on /p/butlr + 2 smoke","body":""},{"hash":"2047a04","date":"2026-05-13 18:54:56 -0700","author":"SteveStudio2","subject":"p/:slug: 'rendered in Xms' footer (parity with home)","body":""},{"hash":"f752648","date":"2026-05-13 18:51:10 -0700","author":"SteveStudio2","subject":"perf: X-Response-Time header on every response (via writeHead hook) + 1 smoke","body":""},{"hash":"77e85e8","date":"2026-05-13 18:46:46 -0700","author":"SteveStudio2","subject":"home: 'rendered in Xms' footer — request-time visibility (typically ~15-25ms warm)","body":""},{"hash":"7fbdfa0","date":"2026-05-13 18:42:15 -0700","author":"SteveStudio2","subject":"ui: commit-list <li id=\"hash\"> deep-link anchors + :target highlight CSS + 1 smoke","body":""},{"hash":"035207b","date":"2026-05-13 18:38:33 -0700","author":"SteveStudio2","subject":"smoke: 3 ?since= assertions across /api/search + /api/projects/:slug/commits","body":""},{"hash":"4a5298c","date":"2026-05-13 18:34:39 -0700","author":"SteveStudio2","subject":"refactor: parseSince() helper — apply ?since= filter to /api/search + /api/projects/:slug/commits","body":""},{"hash":"d965741","date":"2026-05-13 18:30:14 -0700","author":"SteveStudio2","subject":"api/recent: ?since= filter (24h|7d|YYYY-MM-DD) + 2 smoke","body":""},{"hash":"552db5e","date":"2026-05-13 18:26:02 -0700","author":"SteveStudio2","subject":"home: color-coded host load badge (green <8, yellow <20, red ≥20) + 1 smoke","body":""},{"hash":"bae5063","date":"2026-05-13 18:06:00 -0700","author":"SteveStudio2","subject":"api/health: include loadavg {1m,5m,15m} for host-overload monitoring + 1 smoke","body":""},{"hash":"a633cb5","date":"2026-05-13 17:50:55 -0700","author":"SteveStudio2","subject":"ui: commit-detail prev/next history nav — walk forward/backward through a project's commits + 1 smoke","body":""},{"hash":"0c0d61c","date":"2026-05-13 17:47:05 -0700","author":"SteveStudio2","subject":"ui: prev/next project nav on /p/:slug — wraps at registry ends + 1 smoke","body":""},{"hash":"b6ddd07","date":"2026-05-13 17:43:03 -0700","author":"SteveStudio2","subject":"api: /api/fleet/all one-shot aggregate (projects + velocity + recent + top skills/agents) + 4 smoke","body":""},{"hash":"982149f","date":"2026-05-13 17:15:45 -0700","author":"SteveStudio2","subject":"p/:slug: per-project velocity (last 24h + last 7d) in meta line","body":""},{"hash":"ba6940a","date":"2026-05-13 17:11:47 -0700","author":"SteveStudio2","subject":"api: /api/fleet/velocity — rolling-window commit counts (last_24h + last_7d + by_project) + 4 smoke","body":""},{"hash":"1af9c2a","date":"2026-05-13 17:07:53 -0700","author":"SteveStudio2","subject":"home: velocity counter (commits in last 24h + last 7d) — 200-tick milestone","body":""},{"hash":"83d2712","date":"2026-05-13 17:03:40 -0700","author":"SteveStudio2","subject":"home: top skills + agents rail (fleet-wide tallies surfaced as chips)","body":""},{"hash":"232a253","date":"2026-05-13 17:00:24 -0700","author":"SteveStudio2","subject":"api: /api/fleet/{agents,skills} — cross-project aggregated facet tallies + 4 smoke","body":""},{"hash":"8fd3a31","date":"2026-05-13 15:19:24 -0700","author":"SteveStudio2","subject":"home: auto-refresh 'Recent across the fleet' rail every 60s via /api/recent","body":""},{"hash":"98d376b","date":"2026-05-13 15:11:10 -0700","author":"SteveStudio2","subject":"security: Permissions-Policy header (geolocation/microphone/camera/payment all denied) + 1 smoke","body":""},{"hash":"d4bc9ad","date":"2026-05-13 15:04:37 -0700","author":"SteveStudio2","subject":"seo: theme-color meta (light + dark variants matching CSS palette) + 1 smoke","body":""},{"hash":"c814a15","date":"2026-05-13 15:00:29 -0700","author":"SteveStudio2","subject":"Makefile: audit target","body":""},{"hash":"29d618d","date":"2026-05-13 14:53:09 -0700","author":"SteveStudio2","subject":"ui: visible export affordances — fleet.csv in footer + commits.csv/feed.atom/json on each project page + 2 smoke","body":""},{"hash":"f2d7363","date":"2026-05-13 14:48:54 -0700","author":"SteveStudio2","subject":"csv: /fleet.csv — every commit across every project in one file + 3 smoke","body":""},{"hash":"fedcbfa","date":"2026-05-13 14:44:53 -0700","author":"SteveStudio2","subject":"csv: /p/:slug/commits.csv spreadsheet export (RFC-4180 quoting) + 4 smoke","body":""},{"hash":"0cb94e6","date":"2026-05-13 14:40:48 -0700","author":"SteveStudio2","subject":"api: per-project facet endpoints (/agents, /skills, /ideas) + 6 smoke","body":""},{"hash":"afcaaa3","date":"2026-05-13 14:36:47 -0700","author":"SteveStudio2","subject":"home: 'Recent across the fleet' rail — server-rendered top 10 commits date-sorted (no JS required) + 1 smoke","body":""},{"hash":"86268fd","date":"2026-05-13 14:32:46 -0700","author":"SteveStudio2","subject":"api/recent: fleet-wide most-recent commits, date-sorted + 3 smoke","body":""},{"hash":"d1c2c50","date":"2026-05-13 14:29:09 -0700","author":"SteveStudio2","subject":"commit page: diff +/- syntax highlighting (green add, red remove, muted file headers) + smoke","body":""},{"hash":"f727cc7","date":"2026-05-13 14:25:13 -0700","author":"SteveStudio2","subject":"smoke: /healthz <50ms perf budget (regression guard for a no-DB literal)","body":""},{"hash":"a8b4a3e","date":"2026-05-13 14:20:46 -0700","author":"SteveStudio2","subject":"seo: BreadcrumbList JSON-LD on commit detail page + 2 smoke","body":""},{"hash":"734d442","date":"2026-05-13 14:17:36 -0700","author":"SteveStudio2","subject":"seo: SoftwareSourceCode JSON-LD on each project page + 1 smoke","body":""},{"hash":"70698d8","date":"2026-05-13 14:13:56 -0700","author":"SteveStudio2","subject":"ui: footer links to /api + /sitemap.xml (asim/sod parity) + 2 smoke","body":""},{"hash":"929b3db","date":"2026-05-13 14:00:05 -0700","author":"SteveStudio2","subject":"api: /api discovery doc listing all 13 endpoints + 3 smoke","body":""},{"hash":"e2faa47","date":"2026-05-13 13:56:51 -0700","author":"SteveStudio2","subject":"search: fleet search ?q= deep-link — hydrate input + replaceState + fire-on-load + 1 smoke","body":""},{"hash":"4287f44","date":"2026-05-13 13:53:39 -0700","author":"SteveStudio2","subject":"ui: fleet search now shows by_project breakdown — '26 hits — AsSeenInMovies 13 · Stars of Design 12 · build-pages 1 (showing 20)'","body":""},{"hash":"aafba88","date":"2026-05-13 13:50:04 -0700","author":"SteveStudio2","subject":"api/search: round-robin merge + by_project breakdown (no single project monopolizes the page)","body":""},{"hash":"9494934","date":"2026-05-13 13:45:51 -0700","author":"SteveStudio2","subject":"ui: fleet-wide search input on home (wired to /api/search, 150ms debounce) + 1 smoke","body":""},{"hash":"eb2ab40","date":"2026-05-13 13:41:43 -0700","author":"SteveStudio2","subject":"api: /api/search?q= — cross-project commit search (min 2 chars, limit 1-200) + 4 smoke","body":""},{"hash":"0158ff5","date":"2026-05-13 13:38:42 -0700","author":"SteveStudio2","subject":"404: branded page on unknown routes (fleet parity) + 3 smoke","body":""},{"hash":"254d1d0","date":"2026-05-13 13:34:44 -0700","author":"SteveStudio2","subject":"api: /api/projects/:slug/commits — paginated raw JSON (limit + offset) + 4 smoke","body":""},{"hash":"c196cfd","date":"2026-05-13 13:30:50 -0700","author":"SteveStudio2","subject":"feed: Atom 1.0 per project (/p/:slug/feed.atom) + autodiscovery <link> + 4 smoke","body":""},{"hash":"cb50486","date":"2026-05-13 13:27:27 -0700","author":"SteveStudio2","subject":"smoke: gzip /p/butlr + Vary: Accept-Encoding (compression regression guard)","body":""},{"hash":"2218b5e","date":"2026-05-13 13:23:42 -0700","author":"SteveStudio2","subject":"seo: WebSite + ItemList JSON-LD on home + 2 smoke","body":""},{"hash":"230a1f7","date":"2026-05-13 13:20:01 -0700","author":"SteveStudio2","subject":"seo: /sitemap.xml lists home + 4 project pages + Last-Modified; robots.txt advertises it + 5 smoke","body":""},{"hash":"5c8c27d","date":"2026-05-13 13:16:29 -0700","author":"SteveStudio2","subject":"seo: canonical + og:title/desc/url + twitter:card on every shell-rendered page + 2 smoke","body":""},{"hash":"e8ee572","date":"2026-05-13 13:12:29 -0700","author":"SteveStudio2","subject":"smoke: assert home renders fleet totals line","body":""},{"hash":"822388f","date":"2026-05-13 13:08:58 -0700","author":"SteveStudio2","subject":"home: pull counts from shared bundle cache + show fleet totals (projects/commits/ideas)","body":""},{"hash":"5273463","date":"2026-05-13 13:05:02 -0700","author":"SteveStudio2","subject":"api: /api/projects/:slug detail endpoint (commit count, top agents/skills, head SHA) + 4 smoke","body":""},{"hash":"91732aa","date":"2026-05-13 13:01:35 -0700","author":"SteveStudio2","subject":"smoke: warm /p/butlr render <250ms perf budget (cache regression guard)","body":""},{"hash":"b4e3a28","date":"2026-05-13 12:57:56 -0700","author":"SteveStudio2","subject":"perf: cache commit bundle per-repo, keyed on HEAD SHA — page hit 80ms→17ms warm","body":""},{"hash":"f8e102d","date":"2026-05-13 12:54:38 -0700","author":"SteveStudio2","subject":"smoke: assert /p/:slug?q= hydrates search input on server-render","body":""},{"hash":"9cd86d6","date":"2026-05-13 12:50:47 -0700","author":"SteveStudio2","subject":"search: ?q= deep-link — input hydrates from URL + replaceState keeps URL in sync","body":""},{"hash":"99da4a9","date":"2026-05-13 12:47:13 -0700","author":"SteveStudio2","subject":"registry: add asseeninmovies + starsofdesign + build-pages (self-doc) — now 4 journals","body":""},{"hash":"7ebd20c","date":"2026-05-13 12:39:49 -0700","author":"SteveStudio2","subject":"Makefile + .deploy.conf + /robots.txt + 2 smoke (parity with asim/sod)","body":""},{"hash":"6e35230","date":"2026-05-13 12:36:28 -0700","author":"SteveStudio2","subject":"smoke: 23-assertion harness covering healthz, /api/health, /api/version, /api/projects, butlr page, 404","body":""},{"hash":"27818e5","date":"2026-05-13 12:32:09 -0700","author":"SteveStudio2","subject":"api: add /api/health + /api/version (joins fleet-status digest)","body":""},{"hash":"cd73726","date":"2026-05-13 11:29:53 -0700","author":"SteveStudio2","subject":"initial scaffold — build-pages live git-as-DB doc site (port 9700, Butlr first)","body":""}]}