Skip to content

feat(ui): add a first-visit welcome and a crawlable what-is page - #71

Merged
morsela merged 1 commit into
mainfrom
claude/zen-fermat-37bkuy
Oct 16, 2026
Merged

morsela merged 1 commit into
mainfrom
claude/zen-fermat-37bkuy

Conversation

@morsela

@morsela morsela commented Oct 16, 2026

Copy link
Copy Markdown
Owner

A first visit landed on a screen full of controls for a treadmill that isn't connected yet. Nothing on it said what the app is or what it needs. The static intro in index.html does explain it, but main.tsx removes the intro as soon as the app mounts.

The app has no URL of its own for a crawler to index, so this is split into two pieces.

In the app

  • WelcomeSheet opens by itself once, on a first visit. It only does that when the browser has no stored walks and no record of having seen the sheet, so existing users never get it. It is deliberately short: three things the app does, what it needs (a Chromium browser, with the phone app closed), and the safety rule. It has a Get started button and a Read more link to the full page.
  • To reopen it later, there's a "What is Belt Control?" button in the footer on every screen, next to Send feedback.
  • The "seen" flag gets its own storage key, wp.welcome.seen.v1, so the Recovery screen's dump and clear include it automatically. One new analytics event, welcome_shown { first }, tells the automatic showing apart from a reopen.

For crawlers

  • /what-is-belt-control is a static page like the other four in public/. It covers what the app is for, how it works, what you need, safety, and who makes it.
  • It gets the five edits docs/deploying.md lists for a new page:
    • the file itself
    • the slug in the vercel.json rewrite lookahead
    • the slug in the revalidate header (a flat list, as the docs require)
    • an entry in sitemap.xml
    • links from the index.html static intro and from the footer of every written page
  • The docs table is updated too.

Checked

  • typecheck, oxlint and all tests (320 + 146) pass; the build puts the page in dist/ and stamps it into the sitemap.
  • In Chromium against vite preview:
    • the sheet opens on first load at both desktop and phone width
    • it stays closed after a reload once dismissed
    • the footer button reopens it
    • the static page renders

🤖 Generated with Claude Code

https://claude.ai/code/session_01XyxvATqpdrFdrGbkCMayk6


Generated by Claude Code

A first visit landed on a screen of controls for a machine that is not connected
yet, with nothing saying what the app is or what it needs. The static intro in
index.html says it, but main.tsx removes it the moment the app mounts.

Two pieces, because the app has no URL of its own to give a crawler:

- A welcome sheet that opens on its own once, for a browser with no stored walks
  and no record of having seen it. It is short on purpose: what it does, what it
  needs, and the safety rule. A "What is Belt Control?" button in the footer
  reopens it from any screen.
- /what-is-belt-control, a written page like the other four in public/, which the
  sheet's "Read more" links to. It carries the long version, is in the sitemap,
  is excluded from the SPA rewrite and given the revalidate header, and is linked
  from the static intro and the footer of every written page — the five edits
  docs/deploying.md lists for a new page.

The seen flag is its own storage key, so Recovery's dump and clear pick it up.

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

vercel Bot commented Oct 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
beltcontrol Ready Ready Preview Oct 16, 2026 2:45am UTC

Request Review

@morsela
morsela merged commit 6809303 into main Oct 16, 2026
6 checks passed
@morsela
morsela deleted the claude/zen-fermat-37bkuy branch October 16, 2026 03:01

This branch was successfully deployed

1 active deployment
Preview — 776ee119 Deployed Oct 16, 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.

2 participants