Repository navigation
Redesign the front page around what PushThat does and how it is encrypted - #13
Merged
Merged
Conversation
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>
… 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>
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.
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:
config/plan.ts. The old layout's 140px left padding, which pushed the screenshots off-centre on a phone, is gone with it.index.html, with a 1200x630 card atpublic/og.pngrendered by hand fromog/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/webto production.🤖 Generated with Claude Code