How SafeStay uses Arkiv

SafeStay is a deposit-truth registry for Indian renters. Deposits and PG advances of ₹20k–₹1L+ change hands with no verifiable history — this app puts the truth on a public database nobody controls.

The trust model — why fake reviews can’t exist

A landlord signs deposit_terms naming a tenant wallet. When the tenancy ends, that tenant signs a deposit_outcome referencing the terms — and the app only marks it verified when the referenced terms name the reviewer back.

A fabricated review would need a colluding landlord signature — which incriminates the landlord. Filtering runs on $creator, Arkiv’s immutable provenance field, never on a writable attribute.

Why Arkiv and not Postgres / IPFS / an API

  • Postgres — whoever runs the site can edit or delete any record. The whole point is that nobody can.
  • IPFS — content-addressed but not queryable: “give me every outcome about this wallet” has no answer.
  • A custom API — trust re-enters through the operator. Arkiv makes the records public, signed, typed and expiring by construction.

Arkiv features → what you see

  • $creator + cross-referenced terms → “verified link” badges.
  • Typed attributes (addr, u256, key, u64) → the exact queries below, no server-side sort.
  • executeBatch → outcome + evidence hash land in one atomic transaction.
  • Entity Expiration → every record shows a live expiry; truth outlives the app, not the person.
  • Lifetime Extension → landlords can renew terms while a tenancy is active.
  • watchEntityEvents over WebSocket → the history page and live feed update with no refresh.

Exact queries

Landlord history (the lookup)

project='safestay_v1' AND entity_type='deposit_outcome' AND landlord_wallet=<addr>

Open scope on purpose — any tenant may review. Trust comes from the two-way link, not an allowlist.

Signed terms for verification

project='safestay_v1' AND entity_type='deposit_terms' AND $creator=<landlord>

The landlord's own signature is the provenance — $creator can't be forged.

Open terms for a tenant

project='safestay_v1' AND entity_type='deposit_terms' AND tenant_wallet=<addr>

A tenant can only answer terms that name them.

Evidence for an outcome

project='safestay_v1' AND entity_type='evidence_log' AND outcome_key=<key>

key-typed attributes join records without a foreign-key layer.

Landlord directory

project='safestay_v1' AND entity_type IN ('deposit_terms','landlord_profile')

Directory membership = every wallet that signed terms; display names come only from profiles that wallet signed itself.

Creator wallets — read live from Arkiv

Every wallet below signed at least one deposit_terms entity — this list is a live query, not a config file. Seeded identities are synthetic demo businesses; names appear only where the wallet signed its own landlord_profile.

Kept off Arkiv, deliberately

Photos, names, phone numbers and exact addresses never touch the chain. Evidence is a SHA-256 hash only — the file stays with the tenant. See /arkiv/schema.md and /arkiv/friction.md in the repository.