{"slug":"robet-site","total":60,"limit":100,"offset":0,"since":null,"commits":[{"hash":"bd5bc35","date":"2026-06-30 06:28:10 -0700","author":"Steve","subject":"deeper Booksy pull: full review TEXT for all 5 reviews (clicked into reviews tab) — real quotes now show in review cards (xss-escaped); 9/9 tests","body":""},{"hash":"6d5052d","date":"2026-06-30 05:51:27 -0700","author":"Steve","subject":"pull from Booksy: booking → his Booksy page, hero → his real shop photo (strong scrim for readability), 20 portfolio photos in gallery, 5★ reviews section; Lighthouse P91/A100/BP100/SEO100, 9/9 tests","body":""},{"hash":"75166d3","date":"2026-06-30 05:41:16 -0700","author":"Steve","subject":"pull from Booksy: 14 real cut photos (inspiration + review_photos) into gallery + wire Book button → Robert's Booksy page (Alumni Barbershop, Sherman Oaks). Standalone — no DW infra","body":""},{"hash":"a7ab1ca","date":"2026-06-30 05:29:57 -0700","author":"Steve","subject":"de-entangle friend build from DW infra: remove venturacorridor scheduler/embed entirely, booking → Robert's own scheduler link (empty→contact), CSP tightened to frame-src none, JSON-LD points to own site; canary already reverted to info@DW","body":""},{"hash":"0d21f3b","date":"2026-06-30 05:28:36 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-30T05:28:32 (5 files) — config.json public/app.js public/index.html server.js tests/api.test.mjs","body":""},{"hash":"a673808","date":"2026-06-30 05:16:22 -0700","author":"Steve","subject":"robert barber v2: gallery (drop photos in public/photos, /api/photos + placeholders), link-first booking (reliable), AgentAbrams corner credit, migrate email info@DW → robert@agentabrams.com (config + JSON-LD)","body":""},{"hash":"9b96ab4","date":"2026-06-30 04:37:25 -0700","author":"Steve","subject":"ledger: barber re-theme noted","body":""},{"hash":"c065dfb","date":"2026-06-30 04:37:03 -0700","author":"Steve","subject":"re-theme to ROBERT BARBER (business identified): hero BOOK A CUT + barber-pole SVG, services Cut/Fade/Beard&Shave, HairSalon JSON-LD, barber OG card, copy throughout; Lighthouse held 100s, 9/9 tests","body":""},{"hash":"2ffa1a4","date":"2026-06-30 04:30:22 -0700","author":"Steve","subject":"loop ledger: round3 items (7)+(4) done — ROUND 3 COMPLETE (8/8); loop paused","body":""},{"hash":"693c574","date":"2026-06-30 04:30:20 -0700","author":"Steve","subject":"round3 item (4): print stylesheet — black-on-white, hide interactive-only elements (nav/CTA/iframe/form), expand booking link to show URL; verified under print media","body":""},{"hash":"a6fa980","date":"2026-06-30 04:28:55 -0700","author":"Steve","subject":"round3 item (7): microcopy — unify to first-person singular (Robert) voice: 'Talk to me', 'I'll be in touch', 'my end' (was mixed me/us); matches hero + JSON-LD Person","body":""},{"hash":"bf8825d","date":"2026-06-30 04:01:19 -0700","author":"Steve","subject":"loop ledger: round3 item (6) done + deployed","body":""},{"hash":"52b5071","date":"2026-06-30 04:01:00 -0700","author":"Steve","subject":"round3 item (6): footer privacy note 'No cookies. No tracking. No analytics.' — verified true (0 set-cookie, 0 tracking refs) before claiming","body":""},{"hash":"9c3de8a","date":"2026-06-30 02:59:59 -0700","author":"Steve","subject":"loop ledger: round3 item (5) done + deployed","body":""},{"hash":"b4b22f4","date":"2026-06-30 02:59:57 -0700","author":"Steve","subject":"round3 item (5): graceful 500 error page — global handler serves styled 500.html for browser GETs (parity with 404), JSON for API; brutalist 500 page","body":""},{"hash":"46ee0e0","date":"2026-06-30 02:58:09 -0700","author":"Steve","subject":"loop ledger: round3 item (3) done + deployed","body":""},{"hash":"3014445","date":"2026-06-30 02:57:37 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-30T02:57:33 (1 files) — public/styles.css","body":""},{"hash":"6adadc3","date":"2026-06-30 02:29:54 -0700","author":"Steve","subject":"loop ledger: round3 item (8) done + deployed","body":""},{"hash":"9411ab2","date":"2026-06-30 02:29:40 -0700","author":"Steve","subject":"round3 item (8): Lighthouse self-audit (real, lh 12.8.2) — was P100/A96/BP100/SEO100; fixed only a11y fail: contact dt red #ff2e1f→#c20010 (3.28→5.63:1 AA) + preconnect venturacorridor; now 100/100/100/100","body":""},{"hash":"d256b7d","date":"2026-06-30 02:00:25 -0700","author":"Steve","subject":"loop ledger: round3 item (2) done + deployed","body":""},{"hash":"ae066fb","date":"2026-06-30 02:00:11 -0700","author":"Steve","subject":"round3 item (2): CLS — audit found 0 <img> tags (hero is reserved-height CSS bg); measured CLS 0.017→0.000 by pre-filling static heroSub (was empty→JS-hydrated, the sole shift source)","body":""},{"hash":"10dd446","date":"2026-06-30 01:32:18 -0700","author":"Steve","subject":"loop ledger: round3 item (1) done + deployed","body":""},{"hash":"dc71cfa","date":"2026-06-30 01:32:01 -0700","author":"Steve","subject":"round3 item (1): real WebKit+Firefox verify FOUND+FIXED a bug — /embed/appointments.js returns text/html (not JS), script-injection threw uncaught SyntaxError; switched to iframe of /book?embed=1 (no X-Frame-Options) + permanent 'open in new tab' escape link; verified 0 syntax errors across chromium/webkit/firefox","body":""},{"hash":"19cdcaa","date":"2026-06-30 00:59:12 -0700","author":"Steve","subject":"round 2 closed (7/8, #17 deferred-gated); round-3 DTD backlog committed (8 items, correctness-first)","body":""},{"hash":"094d2e9","date":"2026-06-30 00:56:58 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-30T00:56:54 (1 files) — OVERNIGHT-LOOP.md","body":""},{"hash":"32a72a3","date":"2026-06-30 00:28:31 -0700","author":"Steve","subject":"loop ledger: round2 item (6) done + deployed","body":""},{"hash":"6e8cd06","date":"2026-06-30 00:26:49 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-30T00:26:45 (2 files) — public/app.js public/styles.css","body":""},{"hash":"967b466","date":"2026-06-29 23:59:41 -0700","author":"Steve","subject":"loop ledger: round2 item (4) done + deployed","body":""},{"hash":"ab5c2bb","date":"2026-06-29 23:59:26 -0700","author":"Steve","subject":"round2 item (4): PWA-lite — site.webmanifest (standalone, brand colors) + 180/192/512 brutalist R icons + apple-touch-icon (raster fallback for iOS/Android install)","body":""},{"hash":"7a5ae6e","date":"2026-06-29 23:31:08 -0700","author":"Steve","subject":"loop ledger: round2 item (2) done + deployed","body":""},{"hash":"19f4d34","date":"2026-06-29 23:30:54 -0700","author":"Steve","subject":"round2 item (2): JSON-LD structured data (Person + ScheduleAction → booking URL) + validity test (9/9); CSP-exempt data block","body":""},{"hash":"de5f5ab","date":"2026-06-29 23:03:08 -0700","author":"Steve","subject":"loop ledger: round2 item (3) done + deployed","body":""},{"hash":"65be242","date":"2026-06-29 23:02:53 -0700","author":"Steve","subject":"round2 item (3): differentiated static caching — images max-age=86400, html/css/js no-cache + ETag (304 revalidation), updates stay instant without fingerprinting","body":""},{"hash":"c54f681","date":"2026-06-29 22:35:14 -0700","author":"Steve","subject":"loop ledger: round2 item (5) done + deployed","body":""},{"hash":"b3a76e0","date":"2026-06-29 22:35:00 -0700","author":"Steve","subject":"round2 item (5): contact + admin status messages as ARIA live-regions (role=status, aria-live=polite, aria-atomic) so screen readers announce success/error","body":""},{"hash":"e175b73","date":"2026-06-29 22:07:36 -0700","author":"Steve","subject":"loop ledger: round2 item (1) done + deployed","body":""},{"hash":"2b5ea41","date":"2026-06-29 22:07:21 -0700","author":"Steve","subject":"round2 item (1): a11y — skip-to-content link (reveals on focus, jumps to main) + prefers-reduced-motion (disable transitions/transforms/smooth-scroll)","body":""},{"hash":"4b3333d","date":"2026-06-29 21:38:51 -0700","author":"Steve","subject":"loop ledger: round2 item (7) done + deployed","body":""},{"hash":"4b3c114","date":"2026-06-29 21:38:37 -0700","author":"Steve","subject":"round2 item (7): server-side robustness — try/catch on contact+keys writes (graceful 500), global JSON error handler (honors status), process-level guards; +malformed-body test (8/8)","body":""},{"hash":"6e320db","date":"2026-06-29 21:09:53 -0700","author":"Steve","subject":"round-2 DTD backlog committed (8 deeper-polish items, correctness-first)","body":""},{"hash":"fda2646","date":"2026-06-29 21:07:00 -0700","author":"Steve","subject":"loop ledger: item (h) done — ROUND 1 complete (9/9)","body":""},{"hash":"f3aa79c","date":"2026-06-29 21:06:36 -0700","author":"Steve","subject":"overnight loop item (h): design critique applied — shorter mobile hero (content not buried), lighter mobile shadow, neutralize leftover wallcovering copy to generic booking language","body":""},{"hash":"694340e","date":"2026-06-29 20:37:54 -0700","author":"Steve","subject":"loop ledger: item (i) done + deployed","body":""},{"hash":"ba29b47","date":"2026-06-29 20:37:40 -0700","author":"Steve","subject":"overnight loop item (i): zero-dep test suite (node --test) — 7 tests covering brand/config/headers/SEO/404/contact-hardening/admin-auth, all green","body":""},{"hash":"cf3d24b","date":"2026-06-29 20:09:29 -0700","author":"Steve","subject":"loop ledger: item (g) done + deployed","body":""},{"hash":"80f29c7","date":"2026-06-29 20:09:16 -0700","author":"Steve","subject":"overnight loop item (g): admin UX — show/hide value toggle + live inline validation (disable Save until valid, name-format hint)","body":""},{"hash":"7e8855d","date":"2026-06-29 19:41:38 -0700","author":"Steve","subject":"loop ledger: item (d) done + deployed","body":""},{"hash":"31ca91f","date":"2026-06-29 19:41:24 -0700","author":"Steve","subject":"overnight loop item (d): SEO — OG/Twitter meta + 1200x630 OG card + SVG favicon + robots.txt + sitemap.xml + canonical","body":""},{"hash":"906d6de","date":"2026-06-29 19:13:23 -0700","author":"Steve","subject":"loop ledger: item (f) done + deployed","body":""},{"hash":"44d16c0","date":"2026-06-29 19:13:08 -0700","author":"Steve","subject":"overnight loop item (f): security headers (CSP/helmet-style) + custom 404 + externalize admin script for strict CSP","body":""},{"hash":"f55316d","date":"2026-06-29 18:44:37 -0700","author":"Steve","subject":"loop ledger: item (e) done + deployed","body":""},{"hash":"06d8277","date":"2026-06-29 18:44:24 -0700","author":"Steve","subject":"overnight loop item (e): contact-form hardening — honeypot + email validation + length caps + per-IP rate limit","body":""},{"hash":"5d4d51b","date":"2026-06-29 18:06:16 -0700","author":"Steve","subject":"loop ledger: item (c) done + deployed","body":""},{"hash":"ba41017","date":"2026-06-29 18:06:13 -0700","author":"Steve","subject":"overnight loop item (c): mobile polish — kill 320-720px horizontal overflow (min-width:0, wrap long email, responsive logo, overflow-x guard)","body":""},{"hash":"9085abc","date":"2026-06-29 17:37:20 -0700","author":"Steve","subject":"loop ledger: item (b) done + deployed","body":""},{"hash":"672fd87","date":"2026-06-29 17:37:02 -0700","author":"Steve","subject":"overnight loop item (b): hamburger focus-trap + ARIA + verified hero contrast","body":""},{"hash":"56165e8","date":"2026-06-29 17:09:27 -0700","author":"Steve","subject":"overnight loop: item (a) cross-browser smoke — chromium clean, ledger","body":""},{"hash":"64a50fe","date":"2026-06-29 17:02:48 -0700","author":"Steve","subject":"rebrand to ROBERT for robert.agentabrams.com go-live","body":""},{"hash":"f9c0545","date":"2026-06-29 15:07:31 -0700","author":"Steve","subject":"rebrand to Designer Wallcoverings appointments + deploy config","body":""},{"hash":"37f01e1","date":"2026-06-29 14:56:17 -0700","author":"Steve","subject":"initial scaffold: brutalist site + Smart Scheduling embed + API-key admin","body":""}]}