Skip to content

Strip the AI-landing-page tells from the marketing site - #88

Merged
mohabbis merged 2 commits into
mainfrom
claude/marketing-site-redesign-1us9ro
Sep 6, 2026
Merged

Strip the AI-landing-page tells from the marketing site#88
mohabbis merged 2 commits into
mainfrom
claude/marketing-site-redesign-1us9ro

Conversation

@mohabbis

@mohabbis mohabbis commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Audits the marketing site against a checklist of the visual defaults that make a landing page read as machine-generated, and adds tests so they do not creep back. iOS lane untouched.

What was actually wrong

Audited every item. Three were already clean and needed nothing: no fake counters, no fake reviews, no fake metrics, and there is no cursor animation and no "made with AI" tag. The rest were real:

Tell Status
Purple gradient Blue-to-purple ramp across accents, ambient layers and gradient-clipped heading text
Vague hero text when your home shifts, you stay calm never said what the product is
Too much scroll animation 32 whileInView reveals with per-card stagger
Pill-shaped buttons Badges, chips and the mobile FAB on a 99px capsule
Emoji icons ◐ ✦ ♥ used as the feature icons
Em dashes 20 across the rendered copy
AI copy Every heading the same lowercase two-beat + italic tail, forced by a global text-transform
AI images The Open Graph card (see below)
T&C page Missing; only /privacy existed

Changes

Palette. --grad-accent / --grad-accent-soft / --grad-text collapse to a single --accent-solid / --accent-wash. h1 em and h2 em are a solid accent colour rather than gradient-clipped text, in both themes. Purple ambient layers and radial washes are re-tinted blue.

Copy. The hero now states the product (A home app that asks before it acts) with a lede naming the actual signals it reads. Headings are broken out of the repeated construction and set in sentence case, with the global text-transform: lowercase on h2 and nav removed so authored case is what renders. Em dashes are gone. The mood line moves to the footer, where a tagline belongs.

One inconsistency surfaced while editing: the hero badge said Private beta while the sign-up card said open to everyone. Both now say "Beta on TestFlight" — worth a look, since which one is true is your call, not mine.

Chrome. Site badges, chips and the mobile FAB move to the 6–14px radius scale the buttons already used. Capsules stay on progress bars and on the in-phone surfaces that mirror native iOS, where they are correct.

Motion. 32 reveals drop to 16 section-level ones. FadeIn loses its delay prop and its 18px travel; grid items are no longer individually wrapped.

Open Graph. public/Lumen-thumbnail.png was an AI mockup: emoji furniture icons, a gradient headline, a generated interior photo, a garbled glyph in one tile, and a tab bar (Home / Automations / Activity / Settings) that does not exist in the app. It is now produced by scripts/build-og-image.mjs (npm run og), which screenshots the running preview and composes the 1200×627 card around it, so the card always shows the real app. 1.5 MB → 358 KB.

Legal. Adds public/terms/index.html covering a free TestFlight beta. Rewrites the privacy page onto the site palette — it was on an unrelated gold-serif theme with its own purple wash and a pill nav. Both are linked from nav and footer, and /terms is routed in vercel.json.

Also names the preview's demo home, which rendered as "Welcome Home, / Home" and read like a bug in every screenshot including the OG card.

Second commit: the OG card's fonts

Worth calling out because it was my own bug, caught after the first commit was already green.

The card <link>ed straight to Google Fonts and screenshotted after a fixed delay. When that request lost, the page still rendered, just in a fallback face, and a card whose typography did not match the site shipped with nothing to indicate it. The card in the first commit was exactly that — verified by hashing it against a render with the fonts provably unavailable, byte-identical.

scripts/build-og-image.mjs now fetches the font CSS in Node, inlines every font file as a data URI, and injects the result into both the card and the site page it screenshots. The render touches the network zero times, so it is deterministic, and a document.fonts guard throws rather than screenshotting anyway. Widening FONT_CSS_URL to the site's full set also fixed the in-phone greeting, which was rendering in a system serif instead of Fraunces.

Tests

Hero and getting-started assertions follow the new copy. Two new guards: the footer links both legal pages, and no em dash reaches the rendered DOM.

  • npm run lint clean
  • npm run test 29/29
  • npm run build clean
  • npm run e2e 8/8

Notes for review

  • The H1 rewrite retires when your home shifts, you stay calm as the headline. It survives as the footer tagline. If you want it back as the H1, that reintroduces the "vague hero" item deliberately.
  • The terms page has no governing-law clause. I left it out rather than inventing a jurisdiction; that is the one section worth a lawyer's eye.
  • I could not reach the Vercel preview host from the build environment, so /terms resolving on the real deploy is inference from the existing /privacy rule, not something I verified. Worth one click.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WmouTty4UranwAXwByjsKy

The site carried most of the visual defaults that make a landing page read
as machine-generated. This audits them out and adds tests so they do not
creep back.

Palette: the blue-to-purple ramp is gone. --grad-accent / --grad-accent-soft
/ --grad-text collapse to a single --accent-solid / --accent-wash, h1 em and
h2 em are a solid accent colour instead of gradient-clipped text in both
themes, and the purple ambient layers and radial washes are re-tinted blue.

Copy: the hero now says what Lumen is ("A home app that asks before it acts")
with a lede naming the actual signals, instead of a mood line. Every heading
used the same lowercase two-beat + italic-tail construction; that is broken
up and set in sentence case, with the global text-transform: lowercase on h2
and nav removed so authored case is what renders. All 20 em dashes are gone
from site copy, and the mood line moves to the footer where a tagline belongs.
The hero badge read "Private beta" while the sign-up card read "open to
everyone"; both now say the same thing.

Chrome: site badges, chips and the mobile FAB move off the 99px capsule onto
the 6-14px scale the buttons already used. Capsules stay on progress bars and
on the in-phone surfaces that mirror native iOS. The dingbat pillar glyphs
become lucide icons.

Motion: 32 scroll-triggered reveals with per-card stagger drop to 16 section
reveals. FadeIn loses its delay prop and its 18px travel.

Open Graph: public/Lumen-thumbnail.png was an AI mockup with emoji furniture
icons, a gradient headline, a generated interior photo, a garbled glyph and
tab names that do not exist in the app. It is now generated by
scripts/build-og-image.mjs, which screenshots the running preview and
composes the card around it, so the link preview shows the real app. Also
1.5 MB to 358 KB.

Legal: adds public/terms/index.html with terms for a free TestFlight beta,
rewrites privacy onto the site palette (it used an unrelated gold serif theme
with its own purple wash), links both from nav and footer, and routes /terms
in vercel.json.

Also names the preview's demo home, which rendered as "Welcome Home, Home"
and read like a bug in every screenshot.

Tests: hero and getting-started assertions follow the new copy, plus new
guards that the footer links both legal pages and that no em dash reaches
the rendered DOM. Unit 29/29, e2e 8/8, lint and build clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmouTty4UranwAXwByjsKy
@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
lumen-idpz Ready Ready Preview Sep 6, 2026 2:00am UTC

Request Review

The card linked straight to Google Fonts and screenshotted after a fixed
delay. When that request lost, the page still rendered, just in a fallback
face, and a card whose typography did not match the site shipped with nothing
to indicate it. The card committed in the previous commit was exactly that:
byte-identical to a render with zero fonts registered.

The proxy in this environment drops the browser's tunnel to
fonts.googleapis.com intermittently while plain HTTPS from Node succeeds, but
the failure mode is not specific to it. Any flaky network at screenshot time
produced a silently wrong card.

Fetch the font CSS in Node instead, inline every font file it references as a
data URI, and inject the result into both the card and the site page being
screenshotted. The render no longer touches the network, so it is
deterministic. A guard on document.fonts throws if the faces are somehow still
missing, rather than screenshotting anyway.

FONT_CSS_URL now carries the site's full set, Fraunces included, so the
in-phone greeting renders in the real serif rather than a system substitute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WmouTty4UranwAXwByjsKy
@mohabbis
mohabbis marked this pull request as ready for review September 6, 2026 03:43
@mohabbis
mohabbis merged commit 3facc7f into main Sep 6, 2026
5 checks passed
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-06T03:45:13.258908Z d9e16e8 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

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.

2 participants