- Home
- Terms Privacy Acceptance Signup
Terms of Service and Privacy Acceptance at Signup
What this is
Every new account must explicitly accept the Terms of Service and Privacy Policy before registration completes. The signup form shows a required checkbox linking both documents (they open in a new tab so the form is not lost); submitting without checking it blocks registration with a clear message.
The evidence record
When a user registers, the platform stamps terms_accepted_at
(exact time) and terms_version (the effective date of the terms they
saw) onto their UserWorkspacePreference row. If acceptance is ever
disputed, this is the record. Accounts created before 2026-07-20 have no stamp
— they predate the gate.
The legal pages
- /terms/ — plain-language Terms of Service: content ownership, AI-output disclaimer (not professional advice), acceptable use, as-is warranty disclaimer, liability cap, termination, changes-with-notice.
- /privacy/ — rewritten 2026-07-20 to be welcoming and plain-language while not naming internal vendors or stack details (hosting, email, AI providers are described generically). This is deliberate: the old page revealed infrastructure choices to competitors and created an update obligation every time a provider changed. A test guards against vendor names reappearing.
- Both pages are linked from the signup checkbox, the site footer, and the “Explore OrbitingFox” popup (the i in the homepage title and the footer i icon).
Editing the legal pages (no coding)
Admin Dashboard → System → Legal Pages
(/adminapp/legal-pages/): edit the full HTML of either document and
Save & publish — the public page updates immediately. Reset to
built-in switches back to the shipped text at any time (the custom draft is
kept, just switched off). A blank save is rejected, and if anything ever goes
wrong with the database override, the built-in text renders — the pages can
never be empty.
For developers / future changes
- Built-in content:
adminapp/legal_content.py(admin override stored inadminapp.LegalDocument); routes namedtermsandprivacyinconfig/urls.pyrendertemplates/legal_page.html. - When the terms change materially: update the template text AND its
“Effective date”, then bump
CURRENT_TERMS_VERSIONinuserapp/models.pyso new signups record the new version. - The checkbox lives on
SignupForm(config/forms.py, fieldaccept_terms); the stamp happens in the form’ssave(). - Tests:
config.tests.TermsAcceptanceTests.
Professional note
These documents are written to solid industry standard but have not been reviewed by a licensed attorney. Before charging customers (Stripe phase) or at meaningful scale, have a lawyer review: (1) the governing-law / venue clause in the Terms, and (2) whether the privacy policy needs GDPR/CCPA-specific sections for the audience being marketed to.