What a parent gets: per-child pseudonym profiles, progress visibility, observations, and the controls over what a child can use.
Status: Live / built. This is the original, self-serve version of Synapse (predates the school-account product).
/api/children/:id/notes (lib/auth.js:414), which returns learning observations, phase badges, session counts and wellbeing flags — never conversation text. It explicitly never touches social_transcript or director_transcript (lib/auth.js:433-435, 450-454)./api/transcript (index.js:741), requires the session to have been narrowed by a child PIN (index.js:742). So the way a parent reads a full transcript is by entering their child's profile with that child's PIN — and since a parent can reset any of their children's PINs at will (lib/accounts.js:260, route lib/auth.js:358), that path is always available to them.Verified directly against the schema and account logic. The short answer: one shared login and one shared encryption key for the whole family; separate profiles and separate PINs per child; separation between siblings is enforced by application-layer scoping, not by cryptography.
families table holds a single email and a single pair of wrapped keys (lib/db.js:21-29). There is no per-child login credential and no second parent account.createFamilyKeys() mints exactly one random DEK at signup (lib/crypto.js:56-70), wrapped twice — once under the parent's password, once under the recovery code. Every child's profile and every child's content is encrypted under that same key (lib/accounts.js:208, 336).lib/db.js:31-40; created at lib/accounts.js:198-224). Pseudonyms must be unique within a family (UNIQUE (family_id, pseudonym), lib/db.js:39). No limit on the number of children is imposed anywhere in the code.lib/accounts.js:245). The DEK enters the session when the parent signs in (lib/accounts.js:87-104, 352); the child's PIN merely narrows that already-unlocked session to one child (accounts.setSessionChild, lib/accounts.js:365-368, called from lib/auth.js:346).childId from the session rather than the request body (index.js:741-742, index.js:753-754, and resolveSocialChild at index.js:827-832, which rejects a request whose body names a different child than the session). This is implemented consistently and correctly everywhere it was checked. But it means a child who knows a sibling's PIN can sign in as that sibling and read their content — the encryption would not stop them, because it is the same key. Family accounts are designed around a household trust boundary, not a child-versus-child one.lib/accounts.js:298-307, 317-326). See Social Resilience.families.trial_session_count is incremented by any child's activity (lib/db.js:224-228, lib/trial.js:18, 48), so siblings draw on one pool.ON DELETE CASCADE removing the child rows (lib/db.js:33, lib/accounts.js:182-194). There is no single-child deletion — a parent cannot remove one child's profile and data while keeping the others. This matches the gap already noted in Privacy Model.An earlier version of this document described per-family spend caps on Anthropic API usage as an existing safeguard. That was design intent that was never built, and the claim has been removed. The accurate position, as of Aug 2026:
max_tokens ceilings (index.js:180, 226, 245, 265), which bound a single reply rather than a family's spending, and the free-session trial counter (lib/trial.js:48, default 20 sessions) — which counts sessions, not spend, and stops applying entirely once a family subscribes (lib/trial.js:152, 176).api_usage table (lib/db.js, written by lib/usage.js). It captures input, cached-read, cached-write and output tokens separately, plus which surface made the call (tutor / social / director / worksheet). It records counts only — never any part of a prompt or reply — and it deliberately gates nothing: the recording function runs after a reply already exists and swallows its own errors, so it can never interrupt a child's session. A family's usage rows are purged when that family deletes their account. scripts/usage-report.js renders a month-to-date view per family with an indicative cost at Anthropic list rates.Family Synapse is a pay-what-it's-worth monthly subscription, not a fixed price. A parent tries the product (a free session allowance before any payment is required — see the shared-allowance note under "How a Family Account Handles Multiple Children" above), then names their own recurring monthly amount.
Two different numbers are involved, and they behave differently — worth stating precisely, because they are easy to conflate:
lib/billing.js:51-52) — and the parent is free to clear it and type anything at or above the floor (public/dashboard.html:1515).public/dashboard.html:1529-1533). The constraint is revealed only when it becomes relevant — self-determination before the constraint, rather than a minimum presented as the starting point.So the design withholds the constraint, not the suggestion. This mirrors the same pay-what-it's-worth approach already used for Waypoint, a separate product from the same developer.
The reasoning behind this model, stated directly by the developer: the cost of a fixed price is not the same for every family — the same dollar figure means something very different to a family under financial strain than to an affluent one. The developer has said explicitly that he is less concerned with maximising profit than with making sure a child who could genuinely benefit isn't excluded by price, while also noting that people tend to value something more when they've chosen to pay for it themselves — part of the reasoning for a name-your-own-amount model rather than a fully free product.
Once enough real subscriptions exist, the agent should be able to tell a parent the current average payment or typical range. It currently cannot — usage is too new and too low to produce a meaningful figure (see Technical Architecture). Until then, the honest answer to "what do other people pay" is that there isn't yet enough data to say.
Billed via Stripe, implemented as an inline adjustable-amount recurring subscription (Stripe doesn't support a single Price object that's both custom-amount and recurring, so this is built per-checkout rather than as a fixed catalogue price). Stripe is currently in test/sandbox mode; live payments are explicitly blocked by a code-level guard until deliberately enabled.
The originally modelled NZ$25–30/month figure is now historical context only — it described a fixed-price model superseded by the pay-what-it's-worth approach, and should not be treated as current pricing guidance.
Two further implementation details, for an agent answering specifics: there is a $500 input ceiling — not a limit on generosity, just a guard against a slipped decimal point turning $20 into $2,000; above it the parent is asked to email and set it up by hand (lib/billing.js:113-122). And amounts are in USD, not NZD (CURRENCY = 'usd', lib/billing.js:48) — so the $10 floor is roughly NZ$17 and the $15 suggestion roughly NZ$25, which is worth being precise about with a New Zealand parent.
Family and school accounts are architecturally related but operate as separate domains — a teacher account cannot decrypt family content and vice versa (cryptographic session isolation, enforced both by separate encryption keys and by query scoping in the database layer). See Security Architecture for detail.