nessa: publish /terms and the support address the app promises (FRE-1670) #8
Reference in New Issue
Block a user
Delete Branch "freno-dev/FRE-1670-nessa-terms-and-support-contact"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
nessa.freno.me/termsis a live 404, but the Nessa app links it from Settings › Legal and the subscription paywall (AppSettings.termsOfServiceURL) — App Review 3.1.2 surface. No published Nessa page namednessa-support@freno.me, the address the app tells users to mail, so a user who leaves the app for the privacy policy or contact page had no route back.The Terms document already existed on the unmerged FRE-194 branch (PR #7), but it had no host-dispatch route. Production Vercel deployments do not apply the
vercel.jsonhost rewrites (the Nitro Build Output API config supersedes them), sosrc/routes/nessa/terms.tsxalone still 404s on the subdomain. This PR carries that document, adds the missing/termsdispatch, and publishes the support address.src/routes/terms.tsx(new) — host-aware dispatch:/termsserves Nessa; every other site 404s.src/routes/nessa/terms.tsx— Terms of Use (FRE-194); contact section now namesnessa-support@freno.me.src/routes/nessa/privacy.tsx— adds the data-controller clause and the support address.src/routes/nessa/contact.tsx— shows the support address beside the form.src/routes/nessa/deletion.tsx— accepts a deletion request by email at the same address.src/routes/nessa/content.ts— oneSUPPORT_EMAILconstant for all four pages.src/routes/subdomain-dispatch.test.ts— the old test could not fail. It filteredreaddirSyncresults to.tsx/.tsnames before askingstatSync(...).isDirectory(), so it asserted over an empty list. It now lists directories first and considers.tsxpage routes only, which is what caught the missing/termsdispatch.src/routes/nessa/support-contact.test.ts(new) — guards that all four contact routes render the same address the app shows.App side unchanged:
AppSettings.termsOfServiceURLstayshttps://nessa.freno.me/terms, so the FRE-194 constant/guard do not move.Evidence
curl -o /dev/null -w '%{http_code}' https://nessa.freno.me/terms→404(measured 2026-11-09).413 tests,397 pass,16 fail,14 errors. The same 16 failures / 14 errors are present on basea0e6ff1(408 tests,392 pass) — they are missing-env andvinxi/runtime/httperrors, not this diff. The diff adds 5 passing tests and no new failures.bun run build→✓ built in 5.23s,✔ Nitro Server built(Vercel preset). The built function chunk contains the terms page andnessa-support@freno.me.vinxi devcannot serve in this container (TypeError ... reading 'client'from vinxi's dev runtime, before the app mounts), so live 200 is verified after merge/deploy, not from a local dev server.Merge danger
Door: one-way — once the legal document is live, users rely on it and changes are versioned by "Last Updated", not rolled back.
Blast radius: one new route + the dispatch file + contact text on three existing Nessa pages. No nav entry, no component change, no other site changes. Nessa nav stays Home · Contact · Privacy;
/termsis in the sitemap and reachable from the app.Needs the repo owner's merge: this is a public legal document. Wording follows PR #7, which flagged entity name / governing law as deliberate omissions; no new legal claims were added here. Supersedes PR #7 (same FRE-194 commit plus the missing dispatch and support contacts), which should be closed to avoid two open PRs carrying the same page.
Companion app evidence:
nessa-support@freno.meis the literal inNessa/Features/Subscription/Views/SubscriptionView.swiftandHelpSupportView.swift(FRE-1646).