This page describes how Housekeyring is designed to protect your data. Our full privacy policy will be published here before the app launches.

Privacy, handover and secrets design

Who sees what (the privacy rule)

Every synced row is classified on the server. The server never trusts the app to filter.

Sensitivity Rows
private Items with is_private = 1 or category mortgage, and every child row of such an item: service events, documents, photos, costs, contacts, links, enquiries and field values.
personal enquiries (names, phones and messages to trades), and contacts with kind = 'reference' (policy, account and meter numbers).
financial costs, and photos attached to a cost (receipts).
secret_household / secret_shared secret_blobs, by scope.
Member level Can write Hidden from them
household (owner, partner) yes nothing
viewer (house sitter, relative, tenant) no private, personal, financial, secret_household
incoming (a buyer during a handover) no private, personal, all secrets. Costs are visible but paid_by is removed.

Further rules:

Third-party access (REST API, MCP and connected apps)

Tokens and connected apps (Claude, ChatGPT…) follow the same rule as the app (scopes ∩ the live role ∩ the granted houses), with stricter defaults:

Handover

Selling the house hands the logbook to the buyer without leaking the seller's private life.

  1. Start. The owner calls POST /houses/:hid/handover. This makes a single-use buyer invite, valid for 14 days by default and up to 90, and its URL is the QR in the handover pack. Only one handover can be active per house. Ownership transfer is blocked while it runs.

  2. Buyer joins using the invite. The buyer becomes owner with incoming = 1:

    • They are read-only, can't manage members, and can't see private, personal or secret data (see the table above).
    • The seller still runs the house and can keep tidying it.
    • GET /houses/:hid/handover shows the seller exactly what will be withdrawn.
  3. Complete. The seller confirms with POST …/handover/complete, normally on completion day. This permanently deletes:

    • private and mortgage items with all their children (including R2 files);
    • all enquiries and reference contacts;
    • all secret blobs and key envelopes. The key version resets, so the buyer starts a fresh vault and sets new alarm and wifi codes.
    • the paid_by field on costs;
    • the guest guide and its bookings, and every unused invite.

    Rows the buyer created themselves are kept. Then the seller household (owner, partners and viewers) is removed, and the buyer becomes a normal owner.

  4. Premium. If the house was premium, the buyer gets a gift of HANDOVER_GIFT_DAYS (365 by default, source handover_gift). Otherwise the house resets to free. In both cases the seller's store reference is cleared.

  5. Cancel. The seller can cancel at any time before completion. This removes the incoming buyer and revokes the invite. If the buyer leaves, that also cancels the handover.

Everything else carries over: the structure, items, service history, documents, photos, non-reference contacts, costs (without paid_by), links and septic checks. That history is what makes the logbook worth handing over.

Secrets (end-to-end encrypted)

Alarm codes, key-safe codes and the vault are encrypted on the device. The server stores ciphertext it cannot read.

The server side, including eligibility, version checks, privacy filtering and the rotation flag, is implemented and tested. The device-side crypto is for the app to build, using libsodium or @noble/curves + WebCrypto.

Not end-to-end encrypted: the guest-guide wifi password and booking door codes. The server must render them on the guest's web page, so they are stored as plaintext. Codes are wiped when the booking ends or is revoked.

Guest guide

Sign-in identities

Logs, retention, GDPR