⚠️ Hobby tool without guarantees. Use at your own risk.
Linky is a mobile-first PWA for contacts, Nostr messaging, and Lightning/Cashu payments. It is local-first: data is stored in Evolu (SQLite) and syncs between devices.
- Nostr (chat, profile, auth-related flows)
- Evolu (local-first DB + sync)
- Cashu + mints (Lightning wallet flow)
- npub.cash (LN address + mint preference sync)
- Login supports either:
nsec, or- one 20-word SLIP-39 share
- With SLIP-39 login:
- Nostr keypair is derived at
m/44'/1237'/0'/0/0 - deterministic Evolu owner lanes are derived for:
- contacts (
contacts-n) - cashu (
cashu-n) - messages (
messages-n) - owner metadata (
ownerMeta)
- contacts (
- Nostr keypair is derived at
- If user pastes custom
nsecduring a SLIP-39 session, app switches to pasted key locally without immediate Evolu restore/write; choosing Derive switches back to seed-derived key.
- Contacts/cashu/messages owner lanes auto-rotate when owner-local write delta reaches:
OWNER_ROTATION_TRIGGER_WRITE_COUNT = 1000
- Per-type rotation cooldown:
OWNER_ROTATION_COOLDOWN_MS = 60000(1 minute)
- Contacts and valid token data migrate forward; messages are pointer-rotated (no message copy).
- App reads active + previous message owner for continuity.
- Stale owners are pruned locally (
n-2) after rotation. - Contact cap:
MAX_CONTACTS_PER_OWNER = 500
- Contacts: add/edit/delete, QR scan/share, grouping
- Messages: encrypted private chat (gift-wrap/NIP-17 flows)
- Wallet: Cashu token ingest, restore, validation, spend
- Payments:
- Lightning invoice and LN address payment
- contact payment via Cashu message flow
- Debug pages for Evolu current/history data and owner/rotation diagnostics
Requirements: Bun
bun install
bun run devBuild:
bun run buildAlways run the full check pipeline after changes:
bun run check-codeThis runs:
typecheckeslint --fixprettier --write
Workspace-scoped commands (web app only):
bun run --filter @linky/web-app typecheck
bun run --filter @linky/web-app eslint
bun run --filter @linky/web-app prettier