
Toastmasters, Coffee, and Feature Shipping: The 30-Minute Build
This morning started with speech prep. It ended with a production deployment.
I’m giving a talk to my Toastmasters club (Pitchmasters) about the proper creation of our Updates blog and CMS this week. While outlining the story, I had one of those clarity moments: my Updates posts fall into distinct types, but nothing in the system captured that.
Some posts are observations (“Look at this brand trend”). Some are reflections (“Here’s what I learned”). Some are build updates (“Here’s what we shipped”). Nothing fancy—just a simple way to signal intent.
So I messaged Claude: “We should add post types.”
30 minutes later: Feature scoped, migration written, database updated, Hub UI enhanced, Hugo templates updated with visual badges, bidirectional sync confirmed, production deployed.
The Build Sequence
1. Scoping (5 minutes)
We defined three initial post types:
- Build 🔧: Technical updates, feature launches, infrastructure work
- Reflect 💡: Personal insights, lessons learned, strategy thoughts
- Announce 📢: Platform news, product launches, major milestones
Simple, clear, immediately useful. No overthinking. Each type gets a distinct icon and color for visual differentiation.
2. Database Migration (3 minutes)
-- Add post_type column to updates table
ALTER TABLE updates
ADD COLUMN post_type text
CHECK (post_type IN ('build', 'reflect', 'announce'));
-- Backfill existing posts based on content analysis
UPDATE updates SET post_type = 'build'
WHERE slug IN ('building-updates-cms', 'monorepo-migration-complete',
'pwa-launch-offline-ready', 'dark-mode-launch', ...);
UPDATE updates SET post_type = 'announce'
WHERE slug IN ('welcome-to-updates', 'domain-migration-brandmine-ai', ...);
UPDATE updates SET post_type = 'reflect'
WHERE slug IN ('backlog-breakthrough', 'why-we-chose-supabase', ...);
Clean DDL, constraint validation, thoughtful backfill. Production-ready from the start.
3. Hub Integration (10 minutes)
Added postType field to the Updates form with a dropdown selector. Used the same enumeration pattern as our existing taxonomy fields (markets, sectors). Immediate visual feedback in the edit view.
4. Hugo Sync (8 minutes)
Updated both sync scripts:
sync-updates-to-supabase.js- ReadspostTypefrom YAML front mattersync-updates-from-supabase.js- Writespost_typefrom database to Hugo files
Ran sync-from to pull the backfilled types into Hugo. All 13 existing posts now properly categorized.
5. Hugo Visual Design (6 minutes)
Added subtle, discrete badges to the Hugo Updates list page:
- Semi-transparent with backdrop blur (glassmorphism)
- Lucide SVG icons (Wrench, Lightbulb, Megaphone)
- 10% opacity backgrounds that blend with hero images
- Micro-interactions (slight lift on hover)
- Full dark mode support
2025 minimalism: information without noise.
6. Visual Validation (4 minutes)
Opened Hub → Updates list. Scanned the new post type column. Every post showing correct classification. Filter working. Form validation solid.
Opened Hugo site → /updates/. Badges rendering perfectly. Light mode clean. Dark mode adapts automatically.
Done.
Why This Speed?
Three architectural decisions enabled this:
1. Database-First Design
Our Updates CMS uses Supabase as the source of truth. Hugo files are generated artifacts. When we add a field, we:
- Add column to database
- Update sync scripts
- Visual validation in Hub
No wrestling with static file formats or manual front matter editing across dozens of files.
2. Enumerated Types at Every Layer
PostgreSQL CHECK constraint, TypeScript enum, React Admin choices array—same values, type-safe from database to UI. Add a new post type? Change it in one place, compile-time verification everywhere else.
3. Bidirectional Sync Scripts
We built robust sync between Hugo and Supabase months ago. Adding a new field means updating the mapping logic in two functions. The infrastructure handles validation, error checking, and backups automatically.
The Toastmasters Connection
Why was I building this during speech prep?
Because the best documentation is a live demo.
I can tell Pitchmasters “we built a CMS” (they’ll nod politely). Or I can show them: “I had an idea this morning, deployed it before coffee, here’s the commit history.”
Good tools make shipping easy. Easy shipping creates evidence. Evidence tells better stories than slides.
What This Unlocks
Post types aren’t just metadata. They enable:
Filtered Views
Show only build updates on a technical changelog. Surface observations for trend researchers. Group reflections into a founder’s journey narrative.
Visual Differentiation
Already implemented: subtle badges on Hugo cards with distinct colors and icons. Build posts (blue wrench), Reflect posts (amber lightbulb), Announce posts (teal megaphone). Clean, minimal, informative.
Content Intelligence
Track what we’re publishing: Are we heavy on builds, light on observations? Is the content mix aligned with audience needs?
Future Features
RSS feeds per post type. Email digest segmentation. “More like this” recommendations based on type + taxonomy.
Lessons from 30 Minutes
Constraint Breeds Clarity
Limited time forces you to scope tightly. We didn’t build a complex multi-dimensional content classification system. We added three words to a dropdown.
Infrastructure Compounds
Every previous technical decision (database schema design, sync script architecture, TypeScript type safety) made this fast. Good foundations don’t just prevent problems—they accelerate growth.
Ship Fast, Validate Faster
We could have spent 3 hours planning the perfect post type system. Instead we shipped in 30 minutes and validated with real data. Now we know if it’s useful.
The Meta Layer
This blog post? Written in the Updates CMS, classified as postType: build, synced to Hugo automatically, deployed to three languages. It has a blue wrench badge on the Updates page because it’s a build post.
Time to publish: 6 minutes from “Save Draft” to “Check Live Site.”
That’s the real achievement. Not the feature. The machinery that makes features this easy.
Complete Implementation Details:
- ADR: 0041-updates-post-type-categorization.md
- Technical Brief: 2025-12-13-hugo-post-type-badges-complete.md
- Migration SQL: 20251213_add_post_type_to_updates.sql
Pitchmasters speech countdown: 3 days. Now I have a better story to tell.
