๐Ÿ“– User Guide

How to use Persona

Everything you need to know about anonymous sessions, encrypted chats, and privacy-first discovery.

๐Ÿš€Quick Start

1. Visit the homepage โ€” No login, no email, no phone required.

2. Pick an alias & emoji (optional) โ€” Or skip to get a random ghost identity like Quiet Fox ๐ŸฆŠ.

3. Tap "Start anonymous session" โ€” Your session is created instantly with an ephemeral ECDH key pair.

4. Start chatting โ€” Choose Random Match, Nearby, QR, or Invite to connect with another ghost.

5. Close the tab when done โ€” Your session, keys, and messages vanish forever.

๐Ÿ”‘Core Concepts

โณ

Ephemeral Sessions

A session is a temporary JWT token (default 4 hours). It lives only in your browser's sessionStorage โ€” closing the tab destroys it. No server-side persistence of your identity.

๐Ÿ”

End-to-End Encryption

Each session generates an ECDH P-256 key pair locally. When paired, both parties derive a per-room AES-256-GCM key via HKDF. The server only relays ciphertext โ€” it never sees plaintext or private keys.

๐Ÿ”‘

Safety Codes

Every session has a fingerprint (8-char code like <code className="bg-[var(--accent-soft)] px-2 py-1 rounded">AB12-CD34</code>). Compare codes out-of-band (voice/video/in-person) to verify no man-in-the-middle.

๐Ÿ“

Coarse Geolocation

Nearby discovery never sends raw GPS. Your browser coarsens coordinates into a geohash cell (~3km) locally. Only the cell ID reaches the server.

๐ŸŽฏDiscovery Modes

๐ŸŒ Random Match

Global FIFO queue. Oldest-waiting ghost gets paired first. Optional zone-scoped matching (Event/Travel Mode).

  1. 1Tap "Random Match"
  2. 2Wait for queue position
  3. 3Auto-paired when another ghost joins

๐Ÿ“ Nearby

GPS-based discovery. Shows other ghosts in your coarse cell who have opted in. Tap a ghost to connect directly.

  1. 1Enable location permission
  2. 2Tap "Match nearby ghosts"
  3. 3Tap a ghost from the list
  4. 4Direct connection if available

๐ŸŸฉ My QR / ๐Ÿ“ท Scan

Single-use 5-minute pairing codes. Generate your QR, let someone scan it, or scan theirs. Camera runs 100% locally.

  1. 1Open "My QR" tab to show code
  2. 2Or "Scan" tab to read another's
  3. 3Auto-creates encrypted room on match

๐Ÿ”— Invite Links

Named rooms for reconnecting. Create a custom slug (e.g. <code className="bg-[var(--accent-soft)] px-2 py-1 rounded">persona-chat.vercel.app/join/alice-bob</code>) and share.

  1. 1Tap "Invite" โ†’ "Create Invite"
  2. 2Optional: set custom slug
  3. 3Share link with the other person
  4. 4They tap "Join" to enter same room

๐ŸŒซ๏ธ Ghost Zones

Event/Travel mode. Pin your coarse cell as a pairing bucket. Only ghosts in the same zone cell can match.

  1. 1Open "Zone" tab
  2. 2Tap "Enter Zone" for current location
  3. 3Or pick a zone from the list
  4. 4Matches now scoped to that zone

๐Ÿ“ถ Bluetooth (Optional)

Presence beacon for ultra-local discovery. Works without internet. Graceful fallback where Web Bluetooth unsupported.

  1. 1Tap "Enable Bluetooth discovery"
  2. 2Allow Bluetooth permission
  3. 3Peers nearby can discover you
  4. 4Tap "Ping for ghosts" to scan

๐Ÿ’ฌEncrypted Chat Room

Features

  • โœ“ Typing indicator โ€” Shows when partner is typing
  • โœ“ Safety code banner โ€” Tap ๐Ÿ” to verify fingerprints
  • โœ“ Message retention โ€” Nothing stored; refresh = gone
  • โœ“ Max 3000 chars per message
  • โœ“ Consent gate โ€” First message requires acknowledgment

Moderation

  • โœ“ Block โ€” Instantly tears down room, mutual silent block
  • โœ“ Report โ€” Hash-only note, rate-limited (5 per session)
  • โœ“ Leave โ€” Exits room, destroys keys on your side
  • โœ“ Room TTL โ€” Auto-expires after 1 hour (configurable)

๐Ÿ›ก๏ธPrivacy Model & Limits

What We Protect

  • โœ“ No accounts, no email, no phone
  • โœ“ Private keys never leave your device
  • โœ“ Chat plaintext never touches server
  • โœ“ Location coarsened on-device
  • โœ“ Sessions auto-expire & self-destruct
  • โœ“ No message persistence or backups
  • โœ“ Block/report data is hash-only

What We Cannot Guarantee

  • โš  Browser/OS fingerprinting
  • โš  Network operator metadata (IP, timing)
  • โš  What you voluntarily share in chat
  • โš  Compromised server could swap public keys (verify safety codes!)
  • โš  Screenshots/recordings by chat partner
  • โš  Legal compulsion on hosting provider

โŒจ๏ธKeyboard Shortcuts

EnterSend message (in chat)
Shift + EnterNew line (in chat)
Tab / Arrow keysNavigate tabs & emoji picker
EscapeClose modals / safety code / emoji picker
Ctrl/Cmd + KFocus message input (when chat open)

๐Ÿ”งTroubleshooting

Q"Encryption not ready yet โ€” retry in a second"โ–พ

Key derivation takes a few hundred ms on first message. Wait a moment and resend.

QMessages show "(could not decrypt)"โ–พ

Partner likely refreshed or keys desynced. Leave room and re-match.

QNearby shows no ghostsโ–พ

Ensure location permission granted. Try Ghost Zones or Random Match instead.

QQR scan not workingโ–พ

Grant camera permission. Ensure good lighting. Code expires in 5 minutes.

QBluetooth not availableโ–พ

Requires HTTPS and Chrome/Edge on Android or desktop. iOS Safari not supported.

QSession expired unexpectedlyโ–พ

Default TTL is 4 hours. Extend via session options or create new session.

Ready to become a ghost?

No accounts, no tracking, no history. Just encrypted conversations that vanish.