nessa.freno.me/terms was a live 404 although AppSettings.termsOfServiceURL
links it from Settings > Legal and the paywall. The document existed only on
an unmerged branch and had no host-dispatch route, so it could not serve on
the subdomain. Carry the Terms of Use page, add the /terms dispatcher, and
publish nessa-support@freno.me on terms, privacy, contact and deletion.
- src/routes/terms.tsx: host-aware dispatch for nessa; other sites 404.
- src/routes/nessa/terms.tsx: the Terms page; its contact section names the
support address.
- privacy: add the controller clause and the support address.
- contact/deletion: show the support address; deletion also accepts a
request by email.
- subdomain-dispatch.test.ts: list directories before filtering to .tsx
files. The old predicate only ever received file names, so it asserted
over an empty list and missed the missing /terms dispatch.
- support-contact.test.ts: guard that every contact route renders the one
address the app shows.
App side unchanged: termsOfServiceURL stays https://nessa.freno.me/terms.
The Nessa app's Settings › Legal "Terms of Service" row had no Nessa-owned
document to resolve to: it linked another product's terms, and
nessa.freno.me/terms was a 404. Nessa sells an auto-renewing subscription, so
App Review 3.1.2 requires the app to link terms of use as well as a privacy
policy — the row has to land on a real document.
- src/routes/nessa/terms.tsx: the page, in the privacy.tsx house template
(EdgeCacheHeaders, site-aware PageHead, SubdomainHeader, subdomain-relative
internal links). Sections cover acceptance, the service and its limits,
accounts, community content and acceptable use, auto-renewable
subscriptions (payment, renewal, the 24-hour cancel window, managing it in
the App Store, trials, refunds, price changes), the Apple third-party
acknowledgements, IP, disclaimers and liability, termination, changes, and
contact.
- src/lib/sitemap-routes.ts: add /terms to the Nessa set, and update the
count assertion in sitemap-routes.test.ts to match.
Health and safety: Nessa is not a medical device, so section 2(c) says so
explicitly — the previous app-side link pointed at another product's terms,
which said nothing about Nessa's training features.
Deliberately left out, for Mike to decide rather than have me guess:
- No legal entity name and no governing-law clause. No Nessa page states
either today; the privacy policy speaks only as "we".
- No NAV_CONFIG entry, so the nav link-set matrix tests are untouched. The
route serves through the existing catch-all host rewrite in vercel.json;
adding a nav item is a one-line change plus a matrix update if wanted.