docs(landing): claim-integrity pass — truthful wording for parity, providers, Node version, privacy and README - #418
Open
BSalaeddin wants to merge 1 commit into
Open
docs(landing): claim-integrity pass — truthful wording for parity, providers, Node version, privacy and README#418BSalaeddin wants to merge 1 commit into
BSalaeddin wants to merge 1 commit into
Conversation
…oviders, Node version, privacy and README
Review or Edit in CodeSandboxOpen the branch in Web Editor • VS Code • Insiders |
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.
Text-only claim-integrity pass over the public copy: the landing site, the docs
pages that state versions or compare upup to other uploaders, and the npm-facing
README. Every row below came from the audit in
upup-artifact/seo-2026-09-11/claim-inventory.mdwith verdict FALSE,UNSUPPORTED or STALE, and every figure was re-fetched today (2026-09-12)
before the wording was changed. No dependency, layout or markup changes — only
the words, plus one new vitest guard.
What was wrong, and what it says now
apps/landing/src/lib/faqs.ts:12(also emitted as FAQPage JSON-LD)apps/e2e-test/cross-framework/parity-dom.ts:24-26compares a normalized tree — "only the shared design-system contract (structure, stable data-testid / data-upup-slot hooks, a11y attrs, andupup--prefixed class tokens). Everything framework-injected is stripped" — and it unwraps Angular host elements (L32-37) and treats<svg>as a leaf (L38). It cannot prove byte equality.apps/landing/src/components/FeatureShowcase/index.tsx:49README.md:10README.md:34README.md:41README.md:115upup-classes, enforced by a cross-framework parity harness"apps/landing/src/components/HomepageFeatures/index.tsx:930packages/core/src/types/storage-provider.ts—NON_S3_STORAGE_PROVIDERScontains exactly one member, Azure;packages/server/src/storage.ts:20throws for it, which is why the qualifier is "client mode". The provider chip 60 lines above already says "client mode only".apps/landing/src/app/privacy/page.tsx:39apps/landing/src/app/contains onlyapi/,docs/,docs-llms/,docs-md/,mobile-demo/,privacy/,support/. The three named paths are the ones that actually post personal data (api/upup-support/route.ts, reached from the support form and from the HomepageFeatures provider-interest modal).apps/landing/src/app/privacy/page.tsx:198813b1f4; last touched 2026-08-06,fc969f4b, layout only). The date is moved to today because this PR changes the policy's wording — had the text been left alone the badge would have been dropped instead of forward-dated.apps/landing/content/docs/guides/server-auth.mdx:131packages/server/package.jsonengines.nodeis">=20";.nvmrcis20.20.2. Node 18 was never a supported target.apps/landing/content/docs/guides/reliability.mdx:301fastAbortThresholdis only declared (packages/core/src/options/types.ts:70) and forwarded (resolve-upload-config.ts:100-101,upload-manager.ts:27) — no consumer. The label is relabelled to the minor line so it stays true across 3.3.x instead of rotting again.apps/landing/content/docs/comparisons/upup-vs-filepond.mdx:27locale/, plus configurable label strings"GET api.github.com/repos/pqina/filepond/contents/locale→ 48 files (am-et.js…zh-tw.js), re-counted 2026-09-12. This was the only outright false cell about a competitor.apps/landing/content/docs/comparisons/upup-vs-uploadthing.mdx:28createUpload(start, pause, resume), since v7"createUpload— Since 7.0 … Create a resumable upload. Resumable uploads allows you to start an upload, pause it, and then resume it at a later time." docs.uploadthing.com/uploading-files adds the raw-HTTP form ("include theRangeheader …x-ut-range-start").apps/landing/content/docs/comparisons/upup-vs-uploadthing.mdx:25-27README.md:15<!-- npm badges: add after first @useupup publish -->README.md:125-129@upupjs/*scope — the same codebase, published before the rename to@useupup/*."@upupjs/core+@upupjs/next3.1.0 —uNotes15/package.json:127-128andshortyapi/package.json:101-102(committedacdcc071, 2026-08-07). The inventory said Shorty was still on v1upup-react-file-uploader@^1.5.2; that is no longer true, there is noupup-react-file-uploaderreference left in that repo. Neither app runs@useupup/*3.3.New guard
apps/landing/src/__tests__/claim-integrity.test.ts(4 tests) reads the landingcopy sources as text —
faqs.ts,FeatureShowcase/index.tsx,HomepageFeatures/index.tsx,privacy/page.tsx— and fails if:byte-identicalorbyte-for-bytereappears (whitespace-normalized first, soa phrase that straddles a JSX line wrap is still caught);
when you sign upreappears while the site still has no sign-up route;trusted by,users worldwide,#1,most popularappears. None ofthose four is in the copy today — that assertion is a ratchet against
unsubstantiated social proof arriving later, not a fix.
Proven both ways: green as committed (4 passed), and red on a temporary
re-insertion of
byte-identicalintofaqs.ts(1 failed | 3 passed, pointingat
faqs.ts claims byte-identical rendering the parity suite does not verify).Tests that pinned the old wording
None. Grepped
apps/landing/src/__tests__,apps/landing/tests,apps/e2e-test/landingandapps/e2e-test/cross-frameworkfor every replacedphrase: the only
byte-identicalhits are upload byte-integrity assertions inapps/e2e-test/e2e/multipart-*.spec.ts(about stored objects matching theirsource — unrelated) and one comment in
ingestion-verification.spec.ts. The twostructural pins that would have mattered —
docs-source.test.ts:24-30'sexpect(pages.length).toBe(64)andlanding/docs.spec.ts:30-31's/documentation/comparisonsredirect — are untouched: no comparison page wasadded, renamed or removed.
Gates run locally (Windows,
rtk proxy, exit codes checked)pnpm --filter @useupup/landing run lintpnpm --filter @useupup/landing run typecheckpnpm --filter @useupup/landing run testsrc/__tests__suites green incl. the new guard; the only failures are pre-existing timeouts intests/— see belowpnpm run test:qualitypnpm run vocab:checkpnpm run docs:links:checkpnpm run docs:api-sync:checkpnpm run docs:snippets:coveragepnpm exec prettier --checkon all 10 touched files (incl.README.mdand the four.mdx)Failures seen locally that this PR does not cause. Every one is
Error: Test timed out in 5000mson a box running five other build agents, andthe set changes between runs (1, then 4, then 5 failures) — the signature of load
flake, not a regression. None is in
apps/landing/src/__tests__, where this PR'sonly new test lives; all five
src/__tests__suites pass every run.apps/landing/tests/support-route.test.ts— reproduced on the unmodifiedbranch point (2 failed | 12 passed there vs 1 failed | 13 passed with this PR
applied). This PR touches neither the route nor its test.
apps/landing/tests/analytics-isolation.test.ts— same timeout signature;untouched by this PR.
packages/react tests/source-overlay.test.tsx— failed once inside a parallelturbo run … --force, passes on its own (4 passed). No package source istouched by this PR.
pnpm run docs:snippets:checkwas not run locally: it type-checks doc snippetsagainst built
dist, and no snippet changed. CI's Docs-Gate covers it.Deliberately out of scope
apps/landing/src/app/page.tsx:17(the last remaining "byte-identical" inproduct copy),
src/app/[framework]/page.tsxmetadata, andsrc/lib/siteConfig.tsare being rewritten by the parallelseo/money-page-copyPR, which drops the phrase there. Splitting it avoidstwo PRs fighting over the same strings. Once both land, no public surface
claims byte equality.
Owner questions
above, every cell in all four tables is now backed by something fetched from
the competitor's own docs or repo. The alternative is dropping the feature
grids and keeping only the prose + "Choose X if" lists — note that deleting a
comparison page also requires bumping
docs-source.test.ts'stoBe(64)andfixing the
/documentation/comparisonsredirect target.@upupjslineage, so the section is now qualified rather than dropped. The other option
is to upgrade uNotes and Shorty to
@useupup/*3.3 and then restore anunqualified claim. Related: the Discord badge points at guild
1299099371647930502, which is still named "UpUp - React File Uploader"(9 members) — a Discord-side rename, nothing to change in this repo.
@useupup/serveris behind on npm: registry latest is3.3.0, while theother eight packages are at
3.3.3. (devhas every package at 3.3.0;masterhas the other eight at 3.3.3.) Publish lag or a failed publish? Noversion was touched by this PR, but any doc that names a server version will
be wrong until it lands.
processors behind "usage data via cookies and similar technologies"
(
posthog-provider.tsx,gtag.ts)? Also, the page still opens "Welcome toUpup" where the brand is lowercase "upup" everywhere else — left alone
here as a style call, not a truth call.