Strip the AI-landing-page tells from the marketing site - #88
Merged
Conversation
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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
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
marked this pull request as ready for review
September 6, 2026 03:43
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
when your home shifts, you stay calmnever said what the product iswhileInViewreveals with per-card stagger◐ ✦ ♥used as the feature iconstext-transform/privacyexistedChanges
Palette.
--grad-accent/--grad-accent-soft/--grad-textcollapse to a single--accent-solid/--accent-wash.h1 emandh2 emare 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 globaltext-transform: lowercaseonh2and 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.
FadeInloses itsdelayprop and its 18px travel; grid items are no longer individually wrapped.Open Graph.
public/Lumen-thumbnail.pngwas 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 byscripts/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.htmlcovering 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/termsis routed invercel.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.mjsnow 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 adocument.fontsguard throws rather than screenshotting anyway. WideningFONT_CSS_URLto 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 lintcleannpm run test29/29npm run buildcleannpm run e2e8/8Notes for review
when your home shifts, you stay calmas the headline. It survives as the footer tagline. If you want it back as the H1, that reintroduces the "vague hero" item deliberately./termsresolving on the real deploy is inference from the existing/privacyrule, not something I verified. Worth one click.🤖 Generated with Claude Code
https://claude.ai/code/session_01WmouTty4UranwAXwByjsKy