Changelog

Build Log.
Public.

Everything that shipped, when it shipped, why it shipped. Updated after every production deploy. If you want to see how the platform is being directed by agents in real time, this is the record.

2026-05-16 · Wave 48

Vercel Web Analytics + Speed Insights site-wide

Free, privacy-friendly, no cookie banner. Zero-config since the site is on Vercel.

Added

  • /_vercel/insights/script.js: Web Analytics page-view tracking. No cookies, no PII, no GDPR banner needed. Tracks page paths, referrers, UTM params, device categories.
  • /_vercel/speed-insights/script.js: Core Web Vitals (LCP, INP, CLS) collected on real visits. Surfaces actual performance from real devices, not lab tests.
  • Included on all 29 indexable HTML pages. Excluded from offline.html (no network anyway).

Why

  • Plausible would have cost $9+/mo for the same data. Google Analytics is free but adds a cookie banner and 40KB of script weight. Vercel Analytics delivers conversion attribution + Core Web Vitals at zero cost and zero privacy tax.

2026-05-16 · Wave 47

Drop Discord references — Slack is the canonical channel

All "Discord" references swapped to "Slack" to match the actual Crew Pass deliverable.

Changed

  • community.html: meta description, OG description, body copy "Not another passive Slack", section heading "Slack Channels".
  • pricing.html: Crew Pass tier checklist now reads "Full Slack community" (was "Full Discord community"). Tier perk description swapped.
  • docs.html: "Community access (Slack)" and "Full Slack community" in tier breakdowns.

Removed

  • roadmap.html: "Discord invite URL wired in" blocker item dropped entirely. Discord is no longer a planned platform.

Why

  • The Schema.org Product descriptions and tier deliverables already named Slack ("Slack workspace" in Crew Pass). The Discord references were stragglers from an earlier iteration. The site now tells one consistent story: Crew Pass gives you the Slack workspace.

2026-05-16 · Wave 46

Apple PWA meta tags for full iOS install support

Adding Express Intent to iOS home screen now opens as a standalone app, not a Safari shell.

Added

  • apple-mobile-web-app-capable + mobile-web-app-capable: iOS and Android treat the home-screen icon as a full app launch.
  • apple-mobile-web-app-status-bar-style: black-translucent so the iOS status bar matches the brand-dark hero.
  • apple-mobile-web-app-title: Express Intent shows under the icon on the home screen instead of the URL.
  • Coverage: all 30 HTML pages including offline.html and intake-router.html.

2026-05-16 · Wave 45

Booking flow live-region announcements

Screen readers now hear error and success messages during checkout.

Fixed

  • booking/index.html, booking/schedule.html: #err got role="alert" aria-live="assertive" so payment errors are announced immediately. #ok got role="status" aria-live="polite" for "Redirecting to Stripe" messages.

Why

  • Without live-region attributes, screen reader users hit "Pay", saw nothing happen, and didn't know an error message had appeared below the button. Now both error and success states are announced in real time.

2026-05-16 · Wave 44

Service worker with offline fallback page

Lowest-risk SW pattern: precaches only /offline.html, network-first for everything else.

Added

  • offline.html: branded "Lost Signal" fallback page with auto-reconnect logic. Polls navigator.onLine every 5 seconds and reloads when connectivity returns.
  • sw.js: network-first service worker. Caches only /offline.html. Returns offline page on fetch failure for navigation requests. No precaching of dynamic content (avoids stale-content bugs).
  • sw-register.js: safe-by-default registration. Skips on non-secure contexts. Silent on failure (SW is non-critical, never blocks page load).
  • vercel.json: /sw.js served with Cache-Control: no-cache, no-store + Service-Worker-Allowed: /. SW updates apply on next page load.

Why

  • PWA install ("Add to Home Screen") works without a service worker, but visitors who lose network mid-session get a generic browser error. With this SW, they get a branded offline page that auto-recovers when the connection comes back.
  • Risk minimization: the SW does NOT precache CSS/JS/HTML beyond offline.html. If we ship a broken site, users don't have to clear their service worker to recover. The next page load fetches fresh content.

2026-05-16 · Wave 43

Booking flow parity: preconnect + a11y.css

Earlier site-wide perf and a11y waves missed the /booking subtree. Patched.

Fixed

  • booking/index.html, booking/schedule.html, booking/success.html: now load preconnect for cdn.tailwindcss.com and link the site-wide /a11y.css for visible focus rings.
  • The earlier batch-insert waves used *.html at the project root and missed the subdirectory.

2026-05-16 · Wave 42

og:image dimension hints (1200x630 PNG)

Social previews load without layout shift. Slack, Discord, Threads, LinkedIn render faster.

Added

  • og:image:width="1200" + og:image:height="630" + og:image:type="image/png" on all 28 public pages with og:image.
  • All /api/og output is 1200x630 PNG; dimension hints let consumers reserve the correct aspect-ratio box before the image loads.

Why

  • Slack, Discord, Threads, and LinkedIn all rebuild the link preview when an image arrives at a different size than they expected. Declaring dimensions upfront kills the relayout flash.

2026-05-16 · Wave 41

JSON Feed (feed.json) — third syndication format

JSON Feed 1.1 alongside RSS and Atom. Trivial for AI/LLM consumption.

Added

  • feed.json: JSON Feed 1.1 spec. Same content as the RSS and Atom feeds, but in flat JSON (no XML parsing required by consumers).
  • Site-wide auto-discovery: <link rel="alternate" type="application/feed+json"> on all 29 pages.
  • Edge cache + content-type: 1-hour cache, application/feed+json; charset=utf-8.
  • Sitemap: /feed.json at priority 0.4.

Why

  • NetNewsWire 6+, Reeder 5+, FeedLand all prefer JSON Feed. More importantly, an AI agent can consume the entire build log with a single fetch and one JSON.parse call. The XML feeds remain for backward compat.

2026-05-16 · Wave 40

og:site_name + og:locale across every public page

28 of 29 pages now declare og:site_name and og:locale.

Added

  • og:site_name="Express Intent" on all public pages. Facebook, LinkedIn, Threads display this above the link preview headline.
  • og:locale="en_US" for content-language signaling. Helps locale-aware indexers and translation tools.
  • Only dashboard.html (auth-gated) lacks these; it's not for indexing.

2026-05-16 · Wave 39

Honest community CTAs (button copy matches destination)

Renamed two community.html buttons that said "Join Discord" but landed visitors on /pricing.html.

Fixed

  • community.html: hero and footer CTAs labeled "Join Discord" but their href pointed to pricing.html. Clicking it took visitors to the pricing page, not to Discord (the invite URL is still pending). Renamed to "Get Crew Pass to Join". Same destination, accurate label.
  • Audited every page for similar mismatches. No other bait-and-switch CTAs on index, pricing, operator, workshops, or anywhere else.

Why

  • A button labeled "Join Discord" promises a Discord invite. Landing on a pricing page instead damages trust on the first click. The new copy "Get Crew Pass to Join" tells the truth: Discord access is a Crew Pass perk, and the pricing page is where you buy it.

2026-05-16 · Wave 38

LearningResource + CollectionPage on educational pages

Schema.org metadata that matches what each page actually is. Better search-engine understanding of catalog vs documentation vs program.

Added

  • LearningResource on docs.html: educationalLevel, audience, EducationalRole, isAccessibleForFree. Tells search engines docs.html is documentation, not a sales page.
  • CollectionPage on tools.html: 787 items, ItemList mainEntity. Eligible for Google's CollectionPage carousel.
  • CollectionPage on prompts.html: 203 items, CC0 license declared, isAccessibleForFree. Discoverable as a free prompt directory.
  • CollectionPage on skills.html: ItemList mainEntity. Plug-and-play workflows.

Why

  • BreadcrumbList alone tells Google where a page sits in the hierarchy. CollectionPage and LearningResource tell Google what the page actually IS. The distinction matters for catalog/documentation rich results.

2026-05-16 · Wave 37

Deploy SHA propagation via build-info.json

/api/health now actually shows the commit SHA. /api/build-info dedicated endpoint for monitoring. bin/deploy wraps vercel.

Fixed

  • VERCEL_GIT_COMMIT_SHA was unset on CLI deploys. /api/health was returning sha: unknown. Now bin/deploy writes build-info.json at deploy time with git rev-parse HEAD, and /api/health reads from it as a fallback.

Added

  • /api/build-info: dedicated endpoint returning {sha, branch, deployedAt, subject}. Cached 60s. HEAD-supported.
  • bin/deploy: wraps vercel --prod --yes. Writes git SHA, branch, commit subject, and ISO timestamp to build-info.json before the upload.
  • /status.html now shows full deploy line: region, timestamp, SHA, env, and shipped-at.

2026-05-16 · Wave 36

/api/health: HEAD support + deploy SHA

Uptime monitors that probe with HEAD now succeed. /status.html shows the live commit SHA.

Fixed

  • HEAD on /api/health: was returning 405 (Method Not Allowed). Now returns 200 with empty body. Sets Allow: GET, HEAD header on other methods. Most uptime monitoring services (UptimeRobot, BetterStack, Hyperping) probe with HEAD by default.

Added

  • deploy.sha + deploy.env fields in /api/health JSON. Lets me verify which commit is live without checking Vercel UI.
  • /status.html now renders the deploy SHA inline: region iad1 / 2026-05-16T03:00:00Z / deploy 504e06f (production).

2026-05-16 · Wave 35

PWA install richness: shortcuts, categories, scope

manifest.json upgraded for "Add to Home Screen". Four long-press shortcuts to Pricing, Book, Tools, Prompts.

Added

  • shortcuts array: 4 quick actions accessible from long-press of the home screen icon (Pricing, Book a Build Call, AI Tools Directory, Prompt Library). Each tags utm_source=pwa_shortcut for attribution.
  • categories: ["education", "productivity", "business"]. PWA discovery on Edge, Chrome app stores.
  • scope: / explicit. start_url now tags utm_source=pwa so I can measure install-driven traffic.
  • orientation: portrait-primary for mobile install.
  • lang + dir: en-US + ltr declared explicitly.

Why

  • "Add Express Intent to home screen" already worked, but the install prompt looked thin. Shortcuts let installers jump straight to a tier or the tool directory, which matches how returning visitors actually use the site.

2026-05-16 · Wave 34

PNG favicon set for older browser compat

SVG favicon stays primary, PNG fallbacks for Safari 14-, IE11-era contexts, and PWA install icons.

Added

  • PNG favicon set rasterized from favicon.svg via rsvg-convert: 16x16, 32x32, 48x48.
  • Apple-touch PNG: 180x180 PNG from apple-touch-icon.svg. Older iOS versions and Android Chrome's "Add to Home" prefer PNG for the homescreen tile.
  • Android Chrome PWA icons: 192x192 and 512x512 PNG. Required by PWA spec for splash screens and the Add-to-Home-Screen prompt.
  • manifest.json now lists all 7 icon variants. SVG first (sharper, scalable), PNG fallbacks for non-SVG-favicon browsers.
  • Site-wide link tags on all 29 pages: PNG <link rel="icon"> entries at 32/16/48 plus 180 apple-touch.

Why

  • Safari 14 and earlier, plus some Windows browsers, silently fail to render SVG favicons. They show the default globe instead. PNG fallbacks recover those impressions, and the SVG keeps being used everywhere it's supported (sharper on retina).

2026-05-16 · Wave 33

OG image coverage on every public page

Six legal/info pages now ship branded preview cards for Threads, X, LinkedIn.

Added

  • og:title + og:description + og:image + twitter:card on: 404, credits, privacy, refunds, terms, sitemap-human.
  • Each og:image points to /api/og (Edge runtime) with unique title, subtitle, and label. Generated on-demand, edge-cached.
  • Coverage now 28 of 29. Only dashboard.html (auth-gated, low share value) is excluded.

Why

  • Without og:image, social platforms render a default text-only preview or pluck a random image from the page. With branded /api/og output, every share looks like Express Intent shipped it.

2026-05-16 · Wave 32

Meta description audit + intake-router SEO patch

SERP CTR-tax recovered on five undersize pages. intake-router goes from zero meta to full OG.

Fixed

  • intake-router.html: had no <meta name="description"> and no Open Graph tags at all. Added description, og:title, og:description, og:url, og:image (via /api/og), and twitter:card.
  • terms.html: 36 → 149 chars. Now covers purchase, refund, content licensing, and IP.
  • sitemap-human.html: 42 → 153 chars. Says it's the human-readable index and lists the six organization buckets.
  • changelog.html: 56 → 138 chars. Mentions RSS and Atom for feed-reader discoverability.
  • refunds.html: 67 → 178 chars. Distinguishes one-time vs subscription refund logic; matches the actual policy text on the page.

Why

  • Google truncates around 155-160 chars. Anything shorter wastes the SERP listing surface; anything bare drops the snippet entirely. These five pages were leaving CTR on the table.

2026-05-16 · Wave 31

Atom feed alongside RSS

Same content, second syndication format. Site-wide auto-discovery on both.

Added

  • atom.xml: Atom 1.0 feed with the same entries as /feed.xml. Some readers prefer Atom for its stricter spec (proper datetime format, unambiguous entry IDs via tag: URI scheme).
  • Site-wide alternate links: every page now advertises both application/rss+xml (/feed.xml) and application/atom+xml (/atom.xml). Readers pick whichever they support best.
  • Cache + content-type headers: atom.xml mirrors feed.xml policy. 1-hour public cache, application/atom+xml; charset=utf-8.
  • Sitemap entry: /atom.xml at priority 0.4. Sitemap dates bumped to 2026-05-16.

2026-05-15 · Wave 30

BreadcrumbList coverage on 17 more pages

Schema.org breadcrumb trails site-wide. Google rich results eligible.

Added

  • BreadcrumbList JSON-LD on: about, changelog, community, credits, docs, lead-magnet, privacy, prompts, refunds, resources, roadmap, sitemap-human, skills, status, terms, tools, workshops.
  • Total coverage now: 25 of 29 pages. The 4 without are 404 (error page), index (root), intake-router (one-off router), and dashboard (auth-gated).

Why

  • BreadcrumbList is one of the simplest rich results Google supports. Cost is 4 lines per page. Returns "Home › Page" in SERP listings, which lifts CTR.

2026-05-15 · Wave 29

Current-page indicator in navigation

Every nav now marks the active link with aria-current="page" and a visible underline.

Added

  • nav-current.js: 45-line module included site-wide. Scans nav a[href], normalizes paths, marks the link matching location.pathname. Sets aria-current="page" (a11y) and adds .ei-current class (visual underline).
  • a11y.css rule: nav a[aria-current="page"]::after draws a 2px accent underline. Reduced-motion safe, no animation.
  • Normalization handles: trailing-slash stripping, /index.html equivalence with /, hash-only and mailto/tel skipping.

Why

  • Screen-reader users can hear which page they're on without inspecting the URL. Sighted users get a visual anchor in nav. Both audiences ship the same accessibility tax for free.

2026-05-15 · Wave 28

Performance + structured-data polish

Preconnect hints, Organization ContactPoint, Course schema, image lazy-loading completeness.

Added

  • Preconnect for cdn.tailwindcss.com on all 28 pages that load Tailwind. Warm TLS handshake during HTML parse cuts first-paint latency by 50 to 200ms on cold loads.
  • Organization ContactPoint: customer support email, areaServed, availableLanguage. Makes the Organization JSON-LD eligible for Google knowledge panel features.
  • Course schema for the CAIAO 12-week cohort on pricing.html. courseCode, educationalLevel, CourseInstance with courseMode=Online and courseWorkload=PT60H. Eligible for Google Course rich results.
  • founder.jobTitle and founder.sameAs inside Organization JSON-LD. Better entity linking between Express Intent and Enoch Odu Studios.

Fixed

  • OpenAI logo on index: missing loading="lazy" and decoding="async". Added explicit width="20" height="20" attributes to lock CLS at zero.

2026-05-15 · Wave 27

Site-wide RSS auto-discovery + feed cache headers

Every page now advertises the feed. Edge caching for /feed.xml and /sitemap.xml.

Changed

  • RSS auto-discovery on all 29 HTML pages: <link rel="alternate" type="application/rss+xml"> in every <head>. Any feed reader subscribing to any Express Intent URL will find the changelog feed automatically. Before this, only the changelog page itself advertised it.
  • Cache-Control for /feed.xml: public, max-age=3600, s-maxage=3600. Feed readers poll politely; the CDN absorbs the load.
  • Cache-Control for /sitemap.xml: public, max-age=21600 (6 hours). Crawlers re-fetch on their own cadence anyway.
  • Explicit Content-Type for feed.xml: application/rss+xml; charset=utf-8. Strict feed readers (NetNewsWire on older macOS) reject text/xml.

2026-05-15 · Wave 26

RSS feed for the build log

Subscribe in any reader, NetNewsWire, Feedly, Reeder, Inoreader.

Added

  • feed.xml: RSS 2.0 with every wave to date. Standard channel metadata, per-item guid, pubDate, link, description. Lives at /feed.xml.
  • Auto-discovery: <link rel="alternate" type="application/rss+xml"> in the changelog head. Paste this page URL into a feed reader and it subscribes to the RSS automatically.
  • Visible subscribe link: the changelog footer now shows a Subscribe via RSS action for people who already use a reader.
  • Sitemap: /feed.xml listed at priority 0.4 so crawlers see the canonical syndication URL.

Why

  • Developer audiences live in feed readers. Forcing repeat page visits to track build progress is friction nobody asked for.

2026-05-15 · Wave 25

AI-crawler-friendly robots + IndieWeb identity

Changed

  • robots.txt: now explicitly allows GPTBot, ChatGPT-User, ClaudeBot, anthropic-ai, PerplexityBot, Google-Extended (with the same /admin /booking /dashboard /api exclusions). The site is public learning content; we want it findable by AI assistants when someone asks "how do I direct an AI agent."
  • rel=me on index and about: IndieWeb identity verification linking the site to threads.com/@enochodustudios and enochodustudios.com. Lets Mastodon/Threads/IndieWeb tools verify the identity chain.
  • generator meta tag: "Express Intent, directed by Enoch Odu and 4 AI agents." Honest about how the site is built.

2026-05-15 · Wave 24

BreadcrumbList expansion

Added

  • Schema.org BreadcrumbList added to first-steps, faq, vs, case-studies, pricing. Combined with Wave 23's three (glossary, how-agents-work, operator), 8 content pages now have breadcrumb schema for Google search results.

2026-05-15 · Wave 23

security.txt + humans.txt + BreadcrumbList

Added

  • /.well-known/security.txt: RFC 9116 security disclosure policy. Tells researchers how to report vulnerabilities. Expires 2027-05-15.
  • /humans.txt: the friendly file. Names the founder, the 4 AI agent operators, the open-source dependencies, and the stack.
  • Schema.org BreadcrumbList on glossary, how-agents-work, operator. Helps Google show breadcrumb navigation under search results.
  • ARIA labels on the two outbound action buttons on booking/success.html so screen readers announce intent (back to home vs. DM on Threads opens in new tab).

2026-05-15 · Wave 22

a11y.css site-wide

Changed

  • a11y.css now loaded on every published HTML page (24 pages total). Tab navigation now shows a visible 2px green focus ring on every link, button, and form field. prefers-reduced-motion users get instant transitions instead of fade-ups.

2026-05-15 · Wave 21

Focus rings + script defer + lead-magnet OG

Added

  • /a11y.css: site-wide focus-visible rings (2px green outline with 2-3px offset on links/buttons, inset on form fields), prefers-reduced-motion media query that disables all CSS animations and smooth scrolling. Wired into the 4 highest-traffic pages.
  • defer attribute on prompts-library.js (374 KB) and tools-data.js (302 KB) so they no longer render-block their pages.
  • Lead-magnet OG meta: was missing entirely; now uses the dynamic /api/og endpoint with custom copy.

2026-05-15 · Wave 20

Dynamic OG rolled out site-wide

Every shareable page now has a custom social card

Changed

  • 13 more pages now use /api/og with page-specific copy: home, about, glossary, faq, workshops, community, tools, prompts, skills, lead-magnet, case-studies, changelog, roadmap, status. Combined with Wave 19's 5 pages, all 18 high-traffic sharable pages have custom social cards.
  • Every share preview on Twitter, LinkedIn, Threads, Facebook, Discord, Slack now shows the page title and subtitle in brand styling instead of the generic site logo.

2026-05-15 · Wave 19

Dynamic OG images per page

Custom social previews without manual asset work

Added

  • /api/og: Vercel Edge function using @vercel/og. Accepts title, subtitle, label query params. Returns a 1200x630 PNG with the brand stack (green accent, dark background, monospace label). No image assets to maintain.
  • Per-page dynamic OG meta on 5 high-traffic pages: pricing, operator, how-agents-work, vs, first-steps. Each share now shows page-specific copy instead of the generic site image.
  • @vercel/og + react added to package.json deps.

2026-05-15 · Wave 18

A11y polish + image lazy-load + meta tightening

Fixed

  • Welcome modal on index.html now has role=dialog, aria-modal, aria-labelledby on the heading, and aria-label on the close button. Screen readers announce it as a modal dialog now.
  • loading=lazy + decoding=async added to the supported-stack logo images on index.html (7 images at 20x20, served via CDN). Saves first-paint network on mobile where they are below the fold.

Changed

  • Meta descriptions tightened on docs.html, resources.html, skills.html. The previous descriptions had a stray comma left over from the em-dash purge and were generic. Now they describe the actual page contents and audience.

2026-05-15 · Wave 17

Searchable FAQ + robots tighten

One place to answer everything

Added

  • /faq.html: 20 consolidated FAQ entries with full-text search and 6 tag filters (pricing, refunds, program, audience, tools, data). Each card is keyboard-toggleable. Includes the deep Wave 6 objection-handling entries plus the original pricing FAQ plus several new identity-and-data questions.

Changed

  • /robots.txt now explicitly disallows /api/ and /dashboard.html in addition to /admin/ and /booking/. Adds Crawl-delay: 1 to be polite.
  • /faq.html added to sitemap.xml at priority 0.8.

2026-05-15 · Wave 16

Hamburger ARIA pass + human sitemap

Fixed

  • Hamburger menus on workshops, community, tools, prompts, skills converted from div to button with full ARIA (aria-label, aria-expanded, aria-controls). All hamburger menus on the site now keyboard accessible (waves 15 + 16 combined).

Added

  • /sitemap-human.html, human-readable site index grouped by intent (Start Here / Buy / Learn / Libraries / After You Buy / Transparency / Legal). Complements the existing /sitemap.xml for crawlers.
  • Schema.org Article markup on /changelog.html so the build log is eligible for Google news / article rich results.

2026-05-15 · Wave 15

Exit-intent + ARIA

Capture the leaving visitor, keyboard-friendly nav

Added

  • /exit-intent.js: shows a one-time-per-session "Take the 10 prompts with you" modal when the cursor leaves the viewport from the top (desktop) or scrolls back to near the top after a meaningful scroll (mobile). Includes a 10-second desktop arming delay and 15-second mobile delay. Escape closes. Click outside closes. Stored in sessionStorage so it does not nag.
  • Wired exit-intent into index.html and pricing.html.

Fixed

  • Hamburger menu buttons on index and pricing are now real <button> elements with aria-label, aria-expanded, aria-controls, and dynamic label switching ("Open menu" / "Close menu"). Was a plain div before; keyboard-inaccessible.

2026-05-15 · Wave 14

Public roadmap + glossary deep-linking

Transparency about what is queued

Added

  • /roadmap.html, 3-column kanban-style public roadmap (Shipped / In Progress / Queued). Each in-progress card includes its blocker. Visitors can email to push items up the queue; paid customer requests jump.
  • Glossary anchor IDs on key terms (Agent, CLAUDE.md, MCP, EPEV, RAG) so other pages can deep-link via /glossary.html#term-mcp instead of scrolling.
  • Start link in operator and about nav rows pointing to /first-steps for new visitors landing on those pages first.

2026-05-15 · Wave 13

Lead capture pipeline + First Steps in nav

Stops leads from being trapped in localStorage

Added

  • /api/leads endpoint: validates email, CSRF-protected, idempotent Stripe Customer pre-creation so leads land in the Stripe dashboard alongside paid customers. Source-tagged for attribution.
  • Homepage lead magnet form now POSTs to /api/leads in addition to writing to localStorage. When Resend lands, swap the console-log step for a Resend Audiences subscribe call.
  • First Steps link propagated to Resources dropdowns on pricing, community, workshops, tools, prompts.

2026-05-15 · Wave 12

First Steps onboarding

Zero to first shipped agent in 30 minutes

Added

  • /first-steps.html, a 5-step starter path. Read explainer (5 min) -> skim glossary (3 min) -> copy a prompt that maps to a real problem (7 min) -> pick a tool (5 min) -> book the build call. Schema.org HowTo markup with totalTime PT30M for rich-result eligibility.
  • First Steps link added to the home page Resources dropdown (top of the list).

2026-05-15 · Wave 11

Nav saturation + Recently Shipped widget

Discoverability for new content pages

Added

  • "Recently Shipped" widget on the homepage: 3-card grid showing the most recent waves, each linking to the full changelog. Build-in-public proof visible without leaving the home page.
  • vs Alternatives + Status links added to Resources dropdowns on index, pricing, community, workshops, tools, prompts.
  • vs link in operator.html and about.html nav rows.

2026-05-15 · Wave 10

Comparison page + money-back trust

Help operators decide vs alternatives

Added

  • /vs.html, 5 honest comparisons: Express Intent vs YouTube, vs Maven cohorts, vs traditional bootcamps, vs hiring a dev team, vs "wait until AI is better." Each comparison ends with "pick the other one if..." rather than always recommending us.
  • 14-day money-back guarantee badge visible above the Final CTA on pricing.html and the hero on vs.html.
  • Mobile hero CTAs above the fold on community.html (Join Crew Pass + Book Call buttons that appear only on small screens).
  • /vs.html added to sitemap.xml.

2026-05-15 · Wave 9

Live status page + WebSite search schema

Transparency about what is wired up

Added

  • /status.html, live service status page consuming /api/health. Shows configured vs pending for Stripe, Resend, Zoom, Twilio, Telegram, Slack, admin auth. Updates on every page load. No third-party uptime service required.
  • Schema.org WebSite + SearchAction on home page so Google can show a site search box in branded search results.
  • /status.html and /how-agents-work.html added to sitemap.xml.

2026-05-15 · Wave 8

Workshops schema + nav links on operator and about

Added

  • Schema.org ItemList on /workshops.html with 18 Course entries, each name + description. Eligible for Google rich-result presentation.
  • How It Works + Glossary nav links on operator.html and about.html (these pages have no Resources dropdown).
  • Changelog catchup for Wave 6 + Wave 7 entries.

2026-05-15 · Wave 7

Nav propagation + uptime probe

Discoverability across the site

Added

  • How Agents Work, Glossary, Changelog now show in the Resources dropdown on pricing, community, workshops, tools, prompts (in addition to index).
  • /api/health uptime probe. Returns 200 with timestamp + boolean integration status. Safe to expose publicly; no secret values leak.
  • Schema.org DefinedTermSet on /glossary.html for Google rich-result eligibility.
  • Schema.org HowTo on /how-agents-work.html with the 4-step agent loop (reason, act, observe, decide).

2026-05-15 · Wave 6

Explainer page + deeper FAQ + testimonial honesty

Closes the non-technical audience gap

Added

  • /how-agents-work.html: plain-English explainer of the agent loop, chatbot-vs-agent comparison, tools table, what to learn in order, what this is not.
  • 8 deeper FAQ entries on pricing.html closing real objections: production-agent definition, terminal-free starting point, vs YouTube/Maven, seat-limit honesty, tool obsolescence, identity reassurance, installments, data handling.

Fixed

  • FAQ accordion max-height doubled so the longer answers do not clip.
  • Placeholder testimonials on index.html no longer say "[Founder name]"; now read "Operator, name on request" as an honest pending state.
  • Resources dropdown trigger has aria-label + tabindex + aria-hidden on the chevron SVG for keyboard and screen-reader users.

2026-05-15 · Wave 5

Glossary + Changelog

Public learning surfaces + build-in-public record

Added

  • /glossary.html, plain-English definitions for 22 AI agent terms (CLAUDE.md, MCP, RAG, EPEV, tool calling, more). Designed to keep non-technical visitors from bouncing on jargon.
  • /changelog.html, this page. Public build log updated after every production deploy.

2026-05-15 · Wave 4

Infrastructure hygiene

Favicons, version control, mobile hero CTAs, credits page

Added

  • Favicon set: favicon.svg, apple-touch-icon.svg, manifest.json, theme-color meta. Site is now installable as a PWA.
  • Favicon links on 23 HTML pages. Every page was generating a 404 on browser-requested favicons before.
  • Mobile hero CTAs above the fold on / and /pricing.html. Mobile visitors no longer have to scroll to see a buy button.
  • Skip-to-content link on index.html for keyboard and screen-reader users.
  • /credits.html, open-source acknowledgments + trademark attributions.
  • Project-local git repo. Site went from "Vercel deploys are the only history" to a real commit tree.

Changed

  • sitemap.xml expanded from 12 URLs to 18 (added case-studies, lead-magnet, credits, privacy, terms, refunds, intake-router).

2026-05-15 · Wave 3.5

Mobile navigation rescue

Four pages had zero mobile nav before this

Added

  • /mobile-nav.js, self-contained module that injects hamburger + drawer with 48x48 touch target into pages that did not have one.
  • Mobile nav now works on operator.html, about.html, booking/index.html, and dashboard.html. These pages had no way to navigate from mobile before.

Changed

  • Hamburger touch target enlarged from 28x23 to 48x48 across 8 pages (meets Apple/WCAG AA).
  • Pricing comparison table wrapped in overflow-x-auto so mobile users swipe inside the table instead of triggering page-level horizontal scroll.

2026-05-15 · Wave 3

Lead magnet, legal links, comma cleanup

Stops the form from being theatre

Added

  • /lead-magnet.html, a 10-prompt printable PDF that the homepage form now actually delivers (previously the form promised a PDF that never sent).
  • Privacy, Terms, Refunds links in the footer of all 11 root pages.

Fixed

  • Homepage lead-magnet form copy now matches reality. The "PDF arrives in 60 seconds" promise was replaced with honest "page opens in new tab, save as PDF" language.

2026-05-15 · Wave 2

Customer dashboard + Schema.org + cookie banner

Closes the post-purchase support gap, makes the site Google-rich-result eligible

Added

  • /dashboard.html, customer self-service booking lookup. Stripe session ID in URL or pasted manually. Shows tier, status, meeting URL, call time, reschedule path.
  • /privacy.html, /terms.html, /refunds.html, baseline legal pages. Visible draft banners on the first two pending formal legal review.
  • /case-studies.html, 3 placeholder case studies pending operator permission to publish real names.
  • Schema.org JSON-LD on / (Organization + FAQ), /pricing.html (8-tier Product ItemList), /operator.html (Course), /about.html (Person). Rich-result eligible.
  • Sticky build-call CTA on long pages (pricing, operator, workshops). Dismissible per session.
  • Cookie consent banner, lightweight, stores acceptance in localStorage. No third-party tracking pixels.
  • 404 fuzzy match on the styled 404 page suggests likely-meant pages.

Fixed

  • Course-delivery copy in welcome emails rewritten to honest "I'll send within 24 hours" pattern. Previous copy promised "your course access link arrives within 5 minutes" while the codebase did not send it.
  • HTML injection vector in admin emails closed. escapeHtml now used on every customer-controlled field that lands in an email body.
  • Admin token comparison now uses crypto.timingSafeEqual. Timing-attack resistant.
  • CSRF protection added to /api/book-slot via Origin header check.
  • Error messages no longer leak internal Stripe error details to API responses.
  • Slot picker timezone fixed: was approximating UTC-5 (off by 1 hour during DST). Now uses proper America/Chicago timezone math.
  • Past-slot guard changed from 6 hours to 24 hours to match the documented buffer.

2026-05-15 · Wave 1

Security headers + SEO + 215-prompt library

Hardens the site and triples the prompt library

Added

  • HSTS, CSP, and Cache-Control headers in vercel.json.
  • 301 redirect from expressyourintent.com apex to express-intent.com (was serving duplicate content before).
  • robots.txt and sitemap.xml (both were 404 before).
  • Styled /404.html page replacing the default plain-text Vercel 404.
  • Canonical tags on 5 pages that were missing them.
  • twitter:creator meta site-wide.
  • 203 CC0 public-domain prompts added to /prompts.html. Library grew from 12 to 215.
  • "Built by Enoch Odu Studios" footer attribution on every page (fusion plan).

Fixed

  • Foundations CTA bait-and-switch: the Foundations $97 tier button was routing customers to the $150 Direct Call. Now routes correctly.
  • Checkmark glyphs on pricing tiers were rendering as literal "--" text. Replaced with inline SVG checkmarks and X marks.
  • BUILDER25 promo banner markup was missing from the pricing page DOM (CSS shipped, HTML did not). Restored.
  • "Zoom link" copy on booking/success.html updated to tool-neutral "meeting link" (was misleading when ZOOM_PERSONAL_URL was unset).
  • Tools count on tools.html aligned to actual count (787) instead of marketing claim (820+).
  • 243 em-dashes purged across HTML, JS, README per writing-style preference.

2026-05-14 · Wave 0

Initial site shape

Before this session began

Pre-existing

  • 12 HTML pages, 6 Vercel serverless API endpoints, Stripe checkout flow, 8 pricing tiers, slot booking flow, admin dashboard. Foundation that the above waves all build on.

Want to know when something ships?

Follow @enochodustudios on Threads where build logs go up every day. Or grab Crew Pass and watch the agents ship in real time inside the Slack workspace.

Paste express-intent.com/feed.xml into NetNewsWire, Feedly, Reeder, or Inoreader.