Skip to main content
User Account

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 in adminapp.LegalDocument); routes named terms and privacy in config/urls.py render templates/legal_page.html.
  • When the terms change materially: update the template text AND its “Effective date”, then bump CURRENT_TERMS_VERSION in userapp/models.py so new signups record the new version.
  • The checkbox lives on SignupForm (config/forms.py, field accept_terms); the stamp happens in the form’s save().
  • 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.