Skip to content

Site copy: overview paragraph, nonclinical notice, real legal text, contact route, plan and settings wording - #209

Merged
andyy-yang merged 8 commits into
BodyMaps:mainfrom
andyy-yang:andy/copy-tier1
Aug 30, 2026
Merged

Site copy: overview paragraph, nonclinical notice, real legal text, contact route, plan and settings wording#209
andyy-yang merged 8 commits into
BodyMaps:mainfrom
andyy-yang:andy/copy-tier1

Conversation

@andyy-yang

Copy link
Copy Markdown
Collaborator

TLDR

Wordsmithing pass across the public surfaces so a first-time visitor knows what the site is, every page carries the same nonclinical sentence, the legal pages are real text instead of a "Draft placeholder" scaffold, and the Settings/plan copy says only what the service actually does. Seven commits, 27 files, no behaviour change except one endpoint returning less (the account export drops internal ids and server paths).

Major decisions

Decision Rationale Source
One canonical sentence everywhere: "For nonclinical use only. Not medical advice or for patient care." "Research use only" was wrong — commercial nonclinical use is allowed and users keep commercial rights in their own masks product review 2026-08-29
Strings live in src/helpers/copy.ts, guarded by copy.test.ts (canonical strings present, retired phrases swept from src/) The last copy pass was silently reverted by an upstream merge; a test makes that visible repo history
Legal pages are provisional ("Provisional terms, under review.") and name no institution Institutional review is pending; the URL already says where it is hosted product review
Landing subtitle and stats untouched; only a paragraph is added under the subtitle The stats question (32,768 vs study-level figures) is deferred to the PI review decision 26
Export narrowed, not removed Objection was internal ids + job rows with server paths; the fields you can see in Settings are fine to download product review
Team: two verified LinkedIn links only Other URLs not verified yet review decision 28

What changed

Area Files Change
Landing LandingPage/index.tsx, .module.css, index.html Overview paragraph under the subtitle; tab/og/twitter title → "BodyMaps: CT Library, Segmentation, and Annotation"; descriptions follow
Footer SiteFooter/* Tagline kept; nonclinical sentence stacked under it; right line → "For private licensing and other inquiries, contact BodyMaps, Inc. through thebodymaps.com/contact."
Auth + nav AuthModal.tsx, Header/index.tsx "By continuing, you agree to the Terms of Service and acknowledge the Privacy Policy." on sign-in and sign-up; CONTACT entry (desktop + mobile) opening the contact form in a new tab
Legal LegalPage.tsx, .css Real Terms (9 sections) and Privacy Notice (7 sections); quiet status line replaces the orange banner; closing line routes to the contact form
Team TeamPage/* Optional links on members; LinkedIn for Zongwei Zhou and Wenxuan Li with " on LinkedIn" labels
Plans accountProfile.ts, UpgradeDialog.tsx Future tiers read "Coming soon" with no prices; BAA/DPA, PACS, priority-queue, pooled-usage, hospital/practice/clinical phrasing removed; "reports" → "research summaries"
Settings / export PrivacySettings.tsx, auth_blueprint.py Truthful delete-history and delete-account texts; export relabelled "Export account details" and GET /api/me/export returns only email, name, account_type, plan, created_at
Tests 9 test files (6 new) See below
Shared copy helpers/copy.ts (new) Canonical strings

Testing

Local gates identical to ci.yml, on the final tree:

  • npm run typecheck — 0 errors
  • npm run lint — 0 errors (49 pre-existing warnings, unchanged from main)
  • npm test — 46 files, 307 tests passed (6 new files: landing, siteFooter, header, legalPage, teamPage, copy guard)
  • npm run build — OK; /, /team, /terms, /privacy, /upload screenshotted from vite preview at 1440 px
  • Backend, CI's exact list in a Python 3.12 venv with CI's pip set: python -m compileall -q . OK; path_safety, user_dataset, chunk_store, job_store, auth_store + auth endpoints, oauth, plan_store, live_room_store, live_quiz, quiz_platform (-k) — all passing. The export test pins the payload shape.

Edge cases covered: sign-in vs sign-up vs reset views (fine print only on the first two); export mocked as a 503 in the notice tests; plan picker shows one group at a time; $0 is a legitimate price while $x.xx is asserted absent; LinkedIn link count pinned to exactly two.

Verified correct, no change needed: landing subtitle and stats row; on-page <h1>; favicon/og-image set; brand.css tokens; plan limits and admin-only tier switching in plan_store.py / /me/plan; account-type values (Patient/Clinician/Researcher/Student) — labels only, left as is.

Lower-severity, deferred (with reason): mobile overflow at ≤390 px on the landing page — pre-existing on main (open PR #43 covers it); AuthModal useEffect dependency warning — pre-existing; copy.test.ts sweeps src/ only, not flask-server PDF header strings.

Conflict proof: branch is upstream/main (7893a9f) + 7 commits; git merge-tree clean; no open PR and no upstream branch pushed since 2026-08-22 touches any of the 27 files.

Out of scope (deliberately)

  • First-upload consent dialog: needs a durable server record and a gate in api_blueprint.py; text is ready, implementation is a separate PR.
  • Wording inside the viewer, report screen, assistant and share card: other owners' active files; the terminology guide goes to them.
  • Retention/analytics purge scheduling, upload cleanup, contribution pipeline: engineering, not copy.

Reviewer checklist

  • / reads: subtitle → overview paragraph → stats; tab title changed, subtitle not
  • Footer shows the tagline, the nonclinical sentence, and the inquiry link on /, /dashboard, /upload, /team
  • Auth modal fine print appears on both Sign in and Create account, not on Reset
  • CONTACT in the header opens thebodymaps.com/contact in a new tab (desktop and drawer)
  • /terms and /privacy render every section; no "placeholder"/"not in force" text remains
  • Team page: exactly two LinkedIn links
  • Settings → Plan: no prices on Pro/Team; buttons still "Coming soon" for non-admins
  • Settings → Privacy: "Export account details" downloads a JSON with five account fields only

…itle the tab

A first-time visitor had no sentence explaining what the site does. Add a
short paragraph under the hero subtitle (browse, upload for segmentation,
annotate) followed by the site-wide nonclinical sentence, and move the
canonical strings into src/helpers/copy.ts so every surface uses the same
wording. Browser-tab / og / twitter title becomes "BodyMaps: CT Library,
Segmentation, and Annotation" and the descriptions follow; the on-page
subtitle and stats row are unchanged.

copy.test.ts guards the index.html strings and landing.test.tsx checks the
paragraph renders directly under the subtitle.
…s, Inc. contact form

Keep the tagline, stack the site-wide nonclinical sentence under it, and
replace the generic "For commercial use" pointer with an inquiry line that
names BodyMaps, Inc. as the contact route and links straight to the form.
Strings come from helpers/copy.ts; siteFooter.test.tsx covers the link
attributes and copy.test.ts now sweeps src/ for retired phrases.
…TACT entry

The fine print was sign-up only and read as if the Privacy Policy were a
contract. Show it on both sign-in and sign-up (not on password reset) as
"By continuing, you agree to the Terms of Service and acknowledge the
Privacy Policy." The header gains a CONTACT pill (desktop and mobile
drawer) that opens the BodyMaps, Inc. contact form in a new tab, so bug
reports and collaboration inquiries have a visible route.

accounts.test.tsx now expects the line on sign-in; header.test.tsx covers
the external link attributes.
…al real text

The two pages were section scaffolds behind a "Draft placeholder — not yet
in force" banner. Replace them with plain-English text that describes what
the service does today: nonclinical use (commercial or noncommercial),
18+ accounts, no PHI and no BAA, the scan-contribution license on
de-identified uploads, users' full rights (including commercial) in the
masks they create, honest retention and deletion wording, and the analytics
non-identification guarantee with the account/browser linkability
disclosure. The two sentences that were untrue in production ("deleted
automatically", "never used to identify you personally") are gone. A quiet
"Provisional … under review" status line replaces the orange banner; the
closing line routes questions to the BodyMaps, Inc. contact form.

legalPage.test.tsx checks headings, status line, retired phrases and the
contact link; copy.test.ts adds the retired phrases to its sweep.
Member cards were plain text. Add an optional links field and render a
small LinkedIn link under the role for the two profiles that have been
verified (Zongwei Zhou, Wenxuan Li); the other four cards stay unlinked
until their URLs are confirmed. Title, roster, order and photos are
unchanged. teamPage.test.tsx pins exactly two links with accessible
"<name> on LinkedIn" labels.
… cards

Pro and Team showed invented donation prices ($1.99 / $4.99) and the cards
promised things the code does not do (BAA/DPA, PACS integration, priority
queue, pooled usage) with clinical framing ("clinical and research work",
"practice", "hospital"). Future tiers now read "Coming soon" with general
wording; Free says "always free"; Enterprise lists private deployment and
alternate data terms; report-oriented strings say research summaries and
the upgrade dialog no longer speaks of donations. Behaviour (limits,
admin-only tier switching) is unchanged.

Tests updated for the new strings; copy.test.ts retires the old ones.
…t you can see

The two confirmation texts promised more than the service does: "Delete
scan history" claimed to permanently delete every scan, and account
deletion implied a clean 30-day purge. Reword both to what happens:
history clearing removes the visible jobs and the working files and masks
we can associate with them, a separated de-identified contribution may
remain, and account removal is scheduled after the 30-day grace period
rather than guaranteed on a day.

GET /api/me/export used to return the whole account row (internal id
included) plus job rows carrying server paths. It now returns only the
fields a user can already see in Settings — email, name, role, plan,
created date — and the control is relabelled "Export account details".
The Privacy Notice's rights section mentions the download.

Functional test pins the exact payload shape (no id, no jobs, no hash);
the settings tests that used Export as a notification fixture now use
clear-history instead.
… under the stats

The overview paragraph sat between the subtitle and the stats row and
broke the hero's rhythm. Move it under the stats. The subtitle changes
from "The open library of labeled body CT scans" to "The intelligence
layer for medical imaging AI", and the same line replaces it in the
og/twitter image alt text and in the link-preview artwork (svg source
edited, png re-rendered at 1200x630).

landing.test.tsx pins the new order; routes smoke test and the copy
guard follow the subtitle change.
@andyy-yang
andyy-yang merged commit 7218675 into BodyMaps:main Aug 30, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant