Skip to content

feat: add terms of service in all nine languages - #194

Merged
wavekat-eason merged 2 commits into
mainfrom
claude/privacy-agreement-flow-4fd4co
Sep 12, 2026
Merged

wavekat-eason merged 2 commits into
mainfrom
claude/privacy-agreement-flow-4fd4co

Conversation

@wavekat-eason

@wavekat-eason wavekat-eason commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Why

WaveKat had a privacy policy and nothing else. Nowhere did anyone agree to anything: the desktop app installs and runs without a word, the sign-in page hands you an account with no mention of terms, and the two things a user most needs told — that WaveKat Voice cannot reach emergency services, and that recording calls is their responsibility, not ours — lived only inside a privacy policy nobody is asked to open. Neither is a privacy question.

This is the document the other two PRs point at (wavekat-voice #425, wavekat-platform #321).

Merge this one first. wavekat-voice's check-links job asserts wavekat.com/terms/ is live.

What's here

  • /terms/ in all nine languages: plain language, with the inconvenient parts said out loud. Emergency calling leads the page.
  • The privacy policy gains a reciprocal link in all nine languages. The policy is a notice the user acknowledges, not part of the contract they agree to — the sign-in copy in the sibling PRs draws that line deliberately, and both pages now say so.
  • The footer gains a Terms row beside Privacy.

What the review changed

The first draft described a product that does not exist yet. Every claim on the page was re-checked against wavekat-voice and wavekat-platform:

  • No billing clause. Pro is free during early access and there is no checkout anywhere in WaveKat, so the yearly plan, prices, taxes and 14-day refund are gone. The page says what is true today and that the price will be shown before anyone pays.
  • Recording on by default, live transcription off by default, both local.
  • Cloud sync is on by default once signed in, not opt-in.
  • Sign-in is GitHub, Google or Apple, and a password can be added afterwards.
  • Model training only with explicit opt-in. No opt-in exists yet, so nothing is trained; when the switch ships, the privacy policy's flat "we do not" needs the same edit.
  • New store section with the minimum wording Apple requires when an app carries its own agreement (contract is with WaveKat; Apple/Microsoft/Canonical owe no support and may enforce the terms).
  • Call flows, the wk tool and the voice prompt generator are now covered.
  • Indemnity narrowed to use that breaches the terms or the law; liability cap reworded so it plainly applies only once the law finds us liable.
  • No notice periods. Changes take effect when the date changes; continued use is acceptance. No shutdown-notice promise — the app is built to work without our servers.
  • Chatty asides removed throughout.

How it's built

The copy is data, not nine hand-written pages. src/lib/terms/<slug>.ts holds one TermsDoc per locale and TermsContent.astro renders it — the same arrangement voice/alternatives/ uses. scripts/test/terms-completeness.test.js (in npm test) enforces same sections, same block shapes, same link targets, same counts, across all nine.

The privacy policy is deliberately not migrated to this shape.

Verification

check result
npm test 7 passing
SYNC_DOCS=1 WAVEKAT_LOCAL_REPOS=… npm run build clean — all nine /terms/ pages render with 17 sections
npm run check:links 250 pages, no broken or un-localized links
npm run check:meta ✅

⚠️ One thing to confirm before this is relied on

The governing-law section names New Zealand and caps liability at NZ$100. The jurisdiction is inferred from where WaveKat operates; the registered company name is not written down anywhere in the repos. Confirm both — there's a comment on the clause in en.ts.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QDCYcZcop1rsVEVsn7xson

WaveKat had a privacy policy and nothing else. Nowhere did anyone agree
to anything: the desktop app installs and runs without a word, the
sign-in page hands you an account with no mention of terms, and the two
things a user most needs told — that WaveKat Voice cannot reach
emergency services, and that recording calls is their problem, not ours
— lived only in a privacy policy nobody is asked to open.

This is the document those flows will point at. It is written the way
the privacy policy is: plain language, by the people who build the
thing, with the inconvenient parts said out loud rather than buried.

Emergency calling leads the page. It is a calling app that is not a
phone line, and a user who assumes otherwise finds out at the worst
possible moment.

The copy is data, not nine hand-written pages. `src/lib/terms/<slug>.ts`
holds one TermsDoc per locale and `TermsContent.astro` renders it, the
same arrangement the comparison pages use — so the nine page files are
byte-identical and a clause added in English is visibly missing from the
other eight rather than quietly absent. `terms-completeness.test.js`
(wired into `npm test`, which CI runs) enforces that: same sections in
the same order, same block shapes, same link targets, and no locale
falling back to English.

The privacy policy gains a reciprocal link in all nine languages, and
the footer gains a Terms row beside Privacy — the app and the sign-in
page will both ask people to agree to this, so it has to be findable
afterwards, in their own language.

Governing law is New Zealand and the liability cap is NZ$100. Both are
placeholders in the sense that they are the one part of this page a
court reads literally — confirm the registered company name and
jurisdiction before this goes public. There is a comment on the clause
in en.ts saying so.

Verified: `astro build` clean, `check:meta` passes in all nine (three
translations busted the 160-char description budget and were shortened;
Korean busted the 85-char CJK budget), `check:links` reports no new
broken or un-localized links, `npm test` green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YK1AV5YEozu4Sj73d5r5Xc
@wavekat-eason
wavekat-eason marked this pull request as draft September 12, 2026 17:11
@github-actions

Copy link
Copy Markdown
Contributor

The first draft described a product that does not exist yet: a paid
yearly Pro plan with a 14-day refund, transcription on by default,
opt-in cloud sync, and a privacy policy folded into the contract. Pro
is free during early access with no checkout anywhere, transcription
is off until turned on, sync is on once you sign in, a password can be
added to an account, and the sign-in page deliberately says "agree to
the terms and acknowledge the policy".

Also adds the store section Apple requires when an app carries its own
agreement, a call-flow paragraph, coverage of the wk tool and the voice
prompt generator, and narrows the indemnity. Drops the notice periods
and the chatty asides. All nine locales and the privacy policy's
reciprocal sentence are updated together.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QDCYcZcop1rsVEVsn7xson
@wavekat-eason
wavekat-eason marked this pull request as ready for review September 12, 2026 23:48
@wavekat-eason
wavekat-eason merged commit e57d62c into main Sep 12, 2026
2 checks passed
@wavekat-eason
wavekat-eason deleted the claude/privacy-agreement-flow-4fd4co branch September 12, 2026 23:48
wavekat-eason pushed a commit that referenced this pull request Sep 12, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.0.67](wavekat-com-v0.0.66...wavekat-com-v0.0.67)
(2026-09-12)


### Features

* add terms of service in all nine languages
([#194](#194))
([e57d62c](e57d62c))
* **privacy:** account holders agree we may contact them by email
([#192](#192))
([f23000e](f23000e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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