Skip to content

Redesign the front page around what PushThat does and how it is encrypted - #13

Merged
cdeutsch merged 18 commits into
mainfrom
claude/marketing-page-redesign-164826
Oct 27, 2026
Merged

cdeutsch merged 18 commits into
mainfrom
claude/marketing-page-redesign-164826

Conversation

@cdeutsch

Copy link
Copy Markdown
Contributor

The front page led with the logo, the name and a one-line claim, asked for a sign-up before showing anything, and never mentioned end-to-end encryption, the one thing that sets PushThat apart from the other link pushers. It also said "Android" when the app runs on iPhone, Mac, the web and Chrome too.

Three commits:

  • READMEs. Both still described encryption as a design none of which had shipped. They now say pushes are encrypted and point at the spec and the reference.
  • The front page. A headline that states the outcome, the share sheet feeding a desktop tab with an encrypted pill travelling between them, how it works in three steps, the reverse direction, an encryption section in the Security page's plain terms (including what the server can still see, with links to the security page and the spec), a feature grid, and the pricing cards with a line on who each tier is for. The plan's numbers still come from config/plan.ts. The old layout's 140px left padding, which pushed the screenshots off-centre on a phone, is gone with it.
  • Share metadata. A description and Open Graph tags in index.html, with a 1200x630 card at public/og.png rendered by hand from og/card.html (the file says how), so a pasted link shows more than the name.

Checked: lint, the site build and the Chrome build, and the page at 1280 wide and at phone width.

Not done on purpose: no store badges, since the Android app is on a closed testing track and the extension is loaded unpacked. The hero's secondary button is where they go when the listings are public.

Merging deploys apps/web to production.

🤖 Generated with Claude Code

cdeutsch and others added 3 commits October 27, 2026 14:27
Both READMEs still described end-to-end encryption as a design none of which had shipped. All five phases are in production now: the clients encrypt every push and the rules refuse a plaintext one, so the paragraph was telling a reader who came to check the claim the opposite of what runs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…pted

The page led with the logo, the product's name and a one-line claim, and asked for a sign-up before showing anything. End-to-end encryption, the one thing that sets PushThat apart from the other link pushers, was not mentioned; it was reachable only through the Security link in the footer. Nothing named the features, and the subtitle said "Android" when the app also runs on iPhone, Mac, the web and Chrome.

The new page states the outcome in the headline, shows the share sheet feeding a desktop tab with an encrypted pill travelling between them, and then explains: how it works in three steps, the reverse direction, an encryption section written in the Security page's plain terms (what is encrypted, that the password is the key, and what the server can still see), a feature grid, and the pricing cards with a line on who each tier is for. The copy quotes the plan's limits from `config/plan.ts` as before.

The old two-row screenshot layout kept a 140px left padding below 860px wide, which pushed the phone screenshots off-centre on a phone; the new layout is a single column there.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
index.html carried only the title, so a link to pushthat.link pasted into a chat or a search result showed the name and nothing else. The front page now sets a title and description through Helmet, and index.html carries the same text as static Open Graph tags, with a 1200x630 card, for the crawlers that read the HTML as served and run nothing.

The card is rendered by hand from `apps/web/og/card.html` with headless Chrome, so the build needs no browser; the file says how.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions github-actions Bot added the web The web app and the Chrome extension (apps/web) label Oct 27, 2026
cdeutsch and others added 15 commits October 27, 2026 15:01
… page does

The front page's "What we can still see" named the account, the time, the type and a file's rough size, then said the limits and expiry "need that much and no more". The server also sees which device sent a push (kept for echo suppression), how many pushes an account makes, and when two pushes share a search token. `docs/e2ee.md` and the Security page both list those, so the front page understated what leaks and contradicted the rest of the site.

The paragraph now names the same metadata and search patterns as the Security page's "What is not", and gives notifications as one of the reasons, as that page does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The front page said a share from the phone "opens on your Mac or in Chrome before you reach the keyboard", and that it becomes "a tab on your Mac". The macOS app has no push notifications and refreshes by pulling (`docs/macos.md`), and it opens a link only when its row is tapped. The web app lists a push without opening it. Only the extension's background worker opens a tab on arrival. "How it works" also said to push with "the extension's icon in Chrome", but the icon opens PushThat's page rather than pushing the tab you are on.

The hero, "Both directions" and the steps now tie the new tab to Chrome and say the push waits in the list on the web and the Mac, as the README does. The step that shares from a computer says to paste into PushThat on the web or in the extension. The description in `index.html` and in Helmet says a push "arrives" on the computer rather than "opens".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Free allows 50 links a month, under two a day, and the card right below the sentence says so. "A few links a day" would run out around the middle of the month. The intro now says "a link or two most days", which the limit covers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Files too" said "anything up to 100 MB", which is Pro's limit. A Free account stops at 25 MB, so someone who read the grid and signed up would have a file refused. The card now gives both sizes, still read from `LIMITS`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
react-helmet writes `document.title` only while a mounted `Helmet` provides one, and never restores the previous title when that `Helmet` unmounts. The front page now sets a long title, so a new visitor going from the front page to the login page and on to the list kept "PushThat: send links and files between your devices, encrypted" in the tab for the rest of the visit. The pages Security, Support and Privacy already leaked their titles the same way.

`Layout` wraps every route, so a `<Helmet defaultTitle>` there gives every page without its own title the plain name, and a page's own title still wins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The description was written three times: a `DESCRIPTION` constant the front page gave to Helmet, and the `description` and `og:description` tags in `index.html`. Helmet replaces only the tags it added itself, so the front page ended up with two identical `<meta name="description">` tags for any crawler that runs the app, and crawlers that do not saw only the static one. The comments beside them also said the pitch was kept "in one place" and that the front page set "the same title", neither of which was true.

The constant and the Helmet tag are gone. `index.html` is the one copy, and its comment says why it is not repeated in the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comment said the pill's travel is in px "against the frames' fixed sizes, so it stays on course at every container width". The browser frame is placed at `left: 28%`, so where the pill lands along the tab strip moves with the width. It still lands over the frame at the widths the layout uses, but the comment promised more than that, and someone moving the frame would have relied on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stylesheet's header said pink marks "the one word of each heading that carries the claim", but no heading highlights a word and there is no class for it. The list now names what is pink: the primary action, the icons and the step numbers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`.steps` reset a CSS counter that nothing reads: the numbers are rendered as text in the markup, so the line only suggested a `counter()` that is not there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page wrote its secondary text colour as a white `rgba` literal in twelve places, at five opacities, two of them (0.55 and 0.8) a hair from their neighbours. Changing the palette meant finding them all.

`.container` now defines `--text-body`, `--text-muted` and `--text-faint`, and every rule reads one of them. The fine print moves from 0.55 to 0.6 and the footer links from 0.8 to 0.78, which nobody can see but leaves three shades rather than five.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The encryption section and the feature list mapped the same `{ Icon, title, body }` shape into the same `.cards` and `.card` markup, written out twice. A change to one card layout would have needed the same edit in the other. `CardGrid` now holds the markup once and both sections pass it their list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comment in `og/card.html` said "The copy is the hero's", but only the headline is; the paragraph under it is a shorter sentence of the card's own. Someone updating the hero would have looked for a matching paragraph that is not there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The "How it works" step for sharing from a computer said to paste into PushThat, then listed a photo and a PDF among the things to share. The web app takes a pasted link, but a file goes through a file picker, so a photo or a PDF cannot be pasted. The step now says to paste a link or pick a file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The front page listed Android, iPhone, Mac, the web and Chrome as if each could be installed now. Android is on a closed testing track, the extension is loaded unpacked, and the Mac app does not build at its deployment target, so a visitor looking for any of them would find nothing to install.

The hero's fine print and the "Every device you own" card now say the web works today and the other apps arrive as each reaches its store.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cdeutsch
cdeutsch merged commit ae77811 into main Oct 27, 2026
7 checks passed
@cdeutsch
cdeutsch deleted the claude/marketing-page-redesign-164826 branch October 27, 2026 20:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

web The web app and the Chrome extension (apps/web)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant