Skip to content

feat(site): ship the Catalogue redesign with a support page - #69

Merged
scttbnsn merged 12 commits into
devfrom
feat/support-page
Oct 22, 2026
Merged

scttbnsn merged 12 commits into
devfrom
feat/support-page

Conversation

@scttbnsn

@scttbnsn scttbnsn commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Ships the Catalogue redesign as the site, with /support built in it. Builds on #68 (merged), whose sanitizer the support and project click events extend.

Design

  • / is the Catalogue homepage: editorial serif type, a specimen plate per project with a pixel mascot drawn from its real logo, the consulting list, one short funding section, and the footer wordmark.
  • /projects/<slug> is a detail page per specimen.
  • /support uses the same system.
  • Light is the default and the OS preference is followed. The choice stays under the existing theme key through the nonced init script, so there's no flash.
  • The 3D scene is gone from shipped routes. Everything the browser fetches for / drops from 502.5 kB to 220.7 kB gzip. three stays only for the dev-only /studio asset tools, and test:scene now fails if shipped code imports it.
  • Tailwind, shadcn/ui, sonner, lucide-react, cva, clsx and tailwind-merge are removed since nothing uses them. The newsletter form moved to the footer and shows its status inline.

Support

  • GitHub Sponsors is the primary option. Its six tiers are live: $5, $10, $25 and $100 monthly, $10 and $50 one-time.
  • The same six tiers are also Stripe Payment Links. They come only from CODESWHAT_SUPPORT_LINKS, already set in Vercel for Production and Preview. Unset ids render as "Opening soon". The page loads nothing from Stripe.
  • Shared costs (Apple $99/year, domains, Vercel and PostHog at $0), per-project lines with placeholders where costs aren't measured yet, and Systema Machinae at $30/month linked to its own page.
  • The supporters list is empty for now.

Analytics

  • project_<slug> ids for all eight specimens, with placement projects.
  • support_<tier-id> and sponsors_github, with placement support.
  • /projects/<slug> is an allowed route for known slugs only. Anything else becomes /_other.

Checks: lint, type-check, test:posthog (30), test:support (9), test:scene (12), build with the env set, test:browser (8, including the theme toggle and its persistence).

…supporters list

Six tiers mirror GitHub Sponsors and Stripe, with links read only from
CODESWHAT_SUPPORT_LINKS. Support clicks go through the existing PostHog
sanitizer under the support placement, and /support joins the route allowlist.
@vercel

vercel Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
codeswhat-website Ready Ready Preview Oct 22, 2026 11:07pm UTC

@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Homepage, /projects/<slug> specimen pages and /support now use the Catalogue
shell, sprites and fonts. One light/dark theme via the nonce'd init script.
Drops the WebGL scene from the shipped routes and the Tailwind/shadcn
layer; three stays only for the dev-only /studio capture tools.
@scttbnsn scttbnsn changed the title feat(site): add a support page with GitHub Sponsors and Stripe tiers feat(site): ship the Catalogue redesign with a support page Oct 22, 2026
@scttbnsn
scttbnsn changed the base branch from feat/posthog-events to dev October 22, 2026 23:06
# Conflicts:
#	frontend/components/EmailSignupForm.tsx
#	frontend/components/catalogue/TrackedCtaLink.tsx
#	frontend/components/site/sections/Projects.tsx
#	frontend/lib/posthog-privacy.ts
#	frontend/test/posthog-source.test.mjs
#	frontend/test/posthog.test.ts
@scttbnsn
scttbnsn merged commit 488e736 into dev Oct 22, 2026
4 checks passed
scttbnsn added a commit that referenced this pull request Oct 22, 2026
…s events (#70)

* fix(analytics): forward $raw_user_agent and $host for cookieless ingestion (#52)

PostHog's cookieless server-hash step reads $raw_user_agent and $host
straight off event.properties and drops the event with a
cookieless_missing_user_agent/cookieless_missing_host ingestion warning
if either is absent. createCommonProperties rebuilt an allowlisted
properties object that dropped both, so every event was silently
discarded at ingestion. Forward them through; never add $ip, which
PostHog's capture service fills in server-side from the connection.

Co-authored-by: scttbnsn <80784472+scttbnsn@users.noreply.github.com>

* chore(config): remove the stale Cursor rules (#54)

* fix(analytics): promote cookieless ingestion fix to production (#53)

PostHog's cookieless server-hash step reads $raw_user_agent and $host
straight off event.properties and drops the event with a
cookieless_missing_user_agent/cookieless_missing_host ingestion warning
if either is absent. createCommonProperties rebuilt an allowlisted
properties object that dropped both, so every event was silently
discarded at ingestion. Forward them through; never add $ip, which
PostHog's capture service fills in server-side from the connection.

Co-authored-by: biggest-littlest <zap_inane.2p@icloud.com>

* chore(config): drop the stale Cursor rules folder

* docs(config): drop dangling .cursorrules references

---------

Co-authored-by: biggest-littlest <zap_inane.2p@icloud.com>

* docs(readme): describe what this repo is and how it deploys (#55)

* chore(gitignore): ignore the root .vercel link and history-backup bundles

* feat(analytics): capture $pageleave and send $pathname (#60)

Measured over the shared PostHog project, 208 of 432 sessions across
the five instrumented sites record zero duration, and PostHog's
built-in Web analytics Page/Entry page/Exit page tables return zero
rows. capture_pageleave was false, so a session's last recorded
timestamp is its last pageview, and a five-minute read of one page
scores as zero seconds.

Flipping the option alone fixes nothing: sanitizeEvent allowlisted
only $pageview, cta activated, and $web_vitals, so every $pageleave
posthog-js emitted would have been dropped silently with no error and
no ingestion warning. This adds a $pageleave branch that rebuilds the
event the same way $pageview does. capture_pageview is false here
(pageviews are captured by hand), so posthog-js's
_shouldCapturePageleave gate needs an explicit true rather than the
default.

$pathname is the property PostHog's page tables actually key off, and
it was never sent. It's bound to the already-sanitized `path` value,
never the raw pathname, so it can't carry a route outside
ALLOWED_ROUTES and adds no information the event wasn't already
sending. A regression test asserts the two never diverge.

No privacy option changes: cookieless_mode, person_profiles,
persistence, disable_persistence, respect_dnt, save_referrer, and
save_campaign_params are untouched.

Part of X16 in the ops execution plan.

* fix(seo): repair JSON-LD logo 404 and double-slash base URLs

- fix(seo): point Organization.logo at /icon-512x512.png; the referenced
  /logos/codeswhat-logo-green.png never existed, so crawlers got a 404
- fix(seo): strip trailing slashes from BASE_URL and reuse it in robots.ts
  and sitemap.ts, so a NEXT_PUBLIC_SITE_URL set with a trailing slash can't
  emit //sitemap.xml-style URLs
- chore(seo): disallow /studio/ in robots.txt; the capture pages already
  404 in production but the exclusion shouldn't depend on that guard
- chore(seo): 308 the stable *.vercel.app production aliases to
  codeswhat.com instead of serving duplicate content
- fix(api): stop forwarding EmailOctopus error detail to subscribe clients;
  log it server-side and return a fixed message

* build(deps): bump next to ^16.2.11 to clear all 35 Dependabot alerts

One-line range bump; npm resolves next 16.3.3, which also pulls the
patched transitive versions: postcss 8.5.23, nanoid 3.3.18, sharp 0.35.4.
npm audit now reports zero vulnerabilities. No code changes needed: the
app has no middleware, rewrites, server actions, CSP nonces, or
next/image usage, so none of the fixed CVEs required app-side work.

* build(deps): regenerate next-env.d.ts for next 16.3

- build(deps): pick up the root-params.d.ts reference next 16.3 adds
- ci(hooks): pass --no-errors-on-unmatched to the biome pre-commit job so
  committing only biome-ignored files (like next-env.d.ts) doesn't fail

* docs(roadmap): track web-analytics table coverage follow-ups (ops X37)

* chore: ignore .claude/ with a tracked line (#59)

It was covered only by .git/info/exclude, which protects one clone and nobody else's. Without a tracked line, `git add -A` in the parent stages a nested worktree as an embedded gitlink and `git clean -ffd` deletes it.

* docs(roadmap): point acquisition-data item at the ops analytics standard

* docs(roadmap): pageleave ratio is structural; note the bot-detection canary caveat

* chore(config): add .planning/ to .gitignore (#62)

* fix(analytics): preserve validated referring hostnames (#64)

* fix(site): restore hydration and reject invalid signup bodies (#66)

* feat(analytics): add project, newsletter and client error events with bounded UTM labels (#68)

* fix(analytics): set $pathname on web vitals from the sanitized path

* feat(analytics): add project CTA, newsletter and client error events

* feat(analytics): record campaign labels through a bounded UTM vocabulary

* feat(site): ship the Catalogue redesign with a support page (#69)

* fix(analytics): set $pathname on web vitals from the sanitized path

* feat(analytics): add project CTA, newsletter and client error events

* feat(analytics): record campaign labels through a bounded UTM vocabulary

* feat(site): add /support page with GitHub Sponsors, Stripe tiers and supporters list

Six tiers mirror GitHub Sponsors and Stripe, with links read only from
CODESWHAT_SUPPORT_LINKS. Support clicks go through the existing PostHog
sanitizer under the support placement, and /support joins the route allowlist.

* feat(site): replace the 3D scene design with the Catalogue design

Homepage, /projects/<slug> specimen pages and /support now use the Catalogue
shell, sprites and fonts. One light/dark theme via the nonce'd init script.
Drops the WebGL scene from the shipped routes and the Tailwind/shadcn
layer; three stays only for the dev-only /studio capture tools.

* fix(site): replace the old tagline and em dashes in site copy

* feat(site): render Catalogue share cards for every page

* fix(site): match the share-card wordmark to the site header

* fix(site): drop the wind-down policy from the support page

* style(site): remove the unused notice signature rule

* fix(site): make the homepage support section a plain ask

* fix(site): address promotion review on theme fallback, support meta and deploy notes (#71)

---------

Co-authored-by: biggest-littlest <zap_inane.2p@icloud.com>
@scttbnsn
scttbnsn deleted the feat/support-page branch October 25, 2026 20:48

This branch was successfully deployed

1 active deployment
Preview — 6effdb77 Deployed Oct 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant