How Togetherward is built
Togetherward is a shared immigration case workspace for two partners. This page describes what is actually running today, for readers who want the data boundaries before the product story. It is a description of the current system, not a certification and not an independent audit.
Runtime
React 19 on TanStack Start, server-rendered and served from an edge worker runtime. Client-to-server calls are typed server functions; public HTTP surfaces (webhooks, cron, calendar feeds, health) are separate server routes that verify their own callers with signatures or HMAC rather than relying on the platform gate.
Encryption of protected content
On a case with encryption enabled, protected content is encrypted in the browser before upload with AES-256-GCM and per-file random nonces. Each user holds a random key-encryption key protected by a passkey-capable credential or a device-local key, with a separate emergency recovery code. Each case has its own content-encryption key, wrapped separately for every member of that case.
Consequences we accept deliberately: the server, the storage layer, our operators, and any automated processing see ciphertext for those categories; there is no escrow key, so a case whose members lose every active unlock method and emergency recovery code cannot be recovered. Account authentication and content encryption are separate: a sign-in passkey may also support private-case unlock when verified and enrolled, but sign-in success alone never releases the case key.
For encrypted document revisions, user-entered details — filenames, exact file types, categories, dates, labels, statuses, and notes — are encrypted with the document. Our servers still see opaque document IDs and storage paths, ciphertext sizes and hashes, upload times, and a coarse file family. Other structured case fields, such as task titles and due dates or timeline event dates, remain server-readable for search, reminders, calendars, and exports. The security page lists both sides of that line item by item.
Data isolation
Postgres with row-level security on every protected table. Case-scoped rows are gated by a security-definer membership function rather than by application code, and roles live in a dedicated table so a role can never be edited through a profile record. Privileged service-role access is confined to verified webhook handlers and maintenance paths; it is never used to decide whether a caller is an administrator.
The public demo is offline by construction
The sample case renders deterministic fictional fixtures with a fixed clock. It performs no database call, writes nothing, and cannot mutate anything — that isolation is asserted by a test that fails if the page issues a request. It is a demonstration of the product’s shape, not a personalised assessment.
Open the sample caseImmigration data and provenance
Process content is tied to official U.S. government sources — USCIS, the Department of State, and the consular posts themselves. Each stored source keeps its canonical URL, publisher, retrieval status, and last-verified timestamp. Togetherward Team reviews source changes before guidance updates. Togetherward never queries a government case system, and it does not infer status, timing, eligibility, or legal sufficiency.
What is not built
There is no public checkout: the only public entry point is the private beta application flow. There is no scoped attorney access inside a case — sharing with counsel today means the couple exports their own material. Anything not described on this page or the changelog should be assumed not to exist.
If you want to poke at it
The demo needs no account. Access to the real workspace is by invitation while we work with a small group of couples.
Questions this page usually raises
- What can the operator actually read?
- On a case with encryption enabled, protected content — uploaded files, shared notes, case memories, attorney-question drafts — is encrypted on the device before it reaches us, and we hold no key that opens it. Structured metadata such as filenames, dates, and task titles stays server-readable so search, reminders, and exports work.The full security page
- Has this been independently audited?
- No. This page is a description of the system as it runs today, not a certification and not a third-party audit. Treat it as a claim you are welcome to test rather than as a verified result.Send us a technical question
- Can I look at it without an account?
- Yes. The sample case needs no sign-in and touches no backend. The workspace itself is open to invited couples in a private beta while we work with a small group. There is no public checkout and no paid signup: the only public way in is to apply.Open the sample caseApply for the private beta