Work log: Polymathic — March 1, 2026
What shipped today
Social sharing infrastructure verified and hardened
Started the session by verifying the OG tags and JSON-LD structured data shipped yesterday (GH-28, GH-29) against LinkedIn Post Inspector and Google Rich Results Test. Both passed with minor gaps — LinkedIn flagged a missing author meta tag, Google noted an optional missing image field in JSON-LD for posts without cover images. Fixed both: added <meta name="author"> to meta-social.html and an og-default.png fallback to the JSON-LD template.
Newsletter automation pipeline (GH-27)
Built the full newsletter send automation. A pre-commit hook now detects staged posts with newsletter.ready_to_send: true, parses the send date from frontmatter, builds the email HTML via hugo --buildFuture, and schedules a Brevo campaign via newsletter-send.sh. The hook marks sent: true in the same commit to prevent duplicate campaigns. A GitHub Actions cron triggers Cloudflare Pages rebuilds twice daily (11:00 and 15:00 UTC) so future-dated blog posts go live on schedule even without a manual push. Fixed a Python quoting bug in the hook — heredoc (<< 'PYEOF') instead of inline python3 -c "..." to avoid shell escaping nightmares.
Newsletter page redesign (GH-35)
The /newsletter/ archive page had a one-off centered layout with left-border accents that didn’t match the rest of the site. Replaced with the site’s left-aligned editorial design system — teaser-article, teaser-title, meta-date classes, teaser-separator rules between entries. Now visually consistent with the blog listing page.
Image optimization — the big one (GH-36, GH-37)
Prepped and ground GH-32 (image optimization). Decomposed it into three sequential issues. Shipped the first two:
GH-36: Deleted 1,767 orphaned images (953 MB) from static/images/ — WordPress import leftovers and unused DALL-E generations not referenced by any post, template, or config file.
GH-37: Moved remaining post images from static/images/ and content/images/ to assets/images/ and wired up Hugo’s image processing pipeline. Created a shared resolve-image.html partial that replaces duplicated 28-line image resolution blocks across four templates (single.html, post-teaser.html, meta-social.html, json-ld.html). All local cover images now served as WebP at q80 quality. Discovered that content/images/ was a WordPress import artifact causing Hugo to auto-publish all 2,098 raw images as non-page resources — removed entirely.
Result: public/images/ went from ~1.8 GB (2,100+ raw files) to 82 MB (612 processed WebPs). Individual images dropped from 3 MB to ~100 KB. Page loads should be dramatically faster, especially on mobile.
Completed
- GH-27 — Add newsletter send automation as polymathic-h hook
- GH-34 — Add newsletter send trigger to pre-commit hook
- GH-35 — Remove left border on past newsletters on /newsletter/ page
- GH-36 — Delete orphaned images from static/images/
- GH-37 — Move post images to assets/ and add Hugo image processing pipeline
Carry-over
- GH-38 — Add responsive srcset and lazy loading to all image tags (prepped, labeled
ready-for-grind, depends on GH-37 which is now done) - Share buttons on posts (from growth plan Phase 1 step 4 — no issue created yet)
- Share CTA in newsletter email template (growth plan Phase 1 step 5)
- Updated inline signup CTA copy (growth plan Phase 3)
Risks
- The image pipeline push is large (~2,400 file changes). Cloudflare Pages build should handle it but first deploy after this push may be slow. Watch for build failures.
- Hugo’s image processing generates files in
resources/_gen/which is gitignored. First build on CF will process all 300+ images from scratch — could be slow or hit memory limits.
Flags and watch-outs
content/images/was a WordPress artifact nobody knew about. It contained duplicates of everything instatic/images/and Hugo was silently publishing all of them. This is now cleaned up, but worth noting in case any old hardcoded/images/paths were relying on it.- The
featured_imagefield oncontent/posts/why-customer-tools-are-organized-wrong.mdcontains a long text description instead of a filename. Theresolve-image.htmlpartial has a guard for this (file extension regex + 255-char limit), but the post should eventually be fixed. - GH-32 parent issue is still open — close it once GH-38 ships.
Next session
- Check Cloudflare Pages build succeeded after the image pipeline push — verify a post with a cover image loads correctly in production with WebP
/grind 38— responsive srcset and lazy loading (already prepped, ready to go)- Create issue for share buttons on posts and implement — highest-leverage remaining item from growth plan
- Tuesday: edition 12 newsletter goes out — verify the pre-commit hook automation works (first real test of GH-27)
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
Your biggest problems are the ones running fine
The most dangerous failures in any system — technical or organizational — aren't the ones throwing errors. They're the ones that appear to work perfectly. And they'll keep appearing to work perfectly right up until they don't.
The day all five of my AI projects stopped building and started cleaning
I want to talk about something that happened this week that I almost missed because it looked boring. Five separate software projects — all mine, all running semi-autonomously with AI pipelines — i...
The silence that ships
Three projects independently discovered the same bug pattern today — code that reports success when something important didn't happen. The most dangerous failures don't look like failures at all.