Crypto / protocol
- v4 envelope: X25519 + ML-KEM-768 hybrid (PQXDH-style HKDF over both
secrets). Heartbeats now carry an ML-KEM key; senders emit v4 whenever
the peer's heartbeat has one, v3 otherwise. Adds @noble/post-quantum.
- Heartbeats are signed by the KEZ identity and verified against the
recipient's primary before use. Previously a spoofed nostr pubkey
(from a re-wrapped replayed envelope) let an attacker substitute their
own heartbeat and read messages.
- Heartbeat retention counts from supersession, never deletes the
newest key, and GC runs after rotation — returning after a long
offline stretch no longer destroys the key the backlog needs.
- Verified-heartbeat cache per peer: 5-min TTL (one lookup per file
instead of per chunk) and anti-downgrade to identity ECDH.
- Always republish heartbeat on session start; rotate on the poll timer;
atomic IDB updates; wipe heartbeats on "Forget this account".
- Dedupe inbound envelopes by sender_sig (replays / re-broadcasts).
Server
- Proxy /v1/sigchains/* to the internal sig-server and hand out the
public https://<server>/v1/sigchains/... URL. Sigchain sync from the
app was failing ("Load failed") against http://sig-server:7878.
App
- Relay settings apply to profile / NIP-65 publishing (republished on
change); wss-only relays (ws:// for localhost); order-aware defaults.
- Clear chat also deletes attachments; retention changes apply
immediately with a warning when shortening.
- Photos: HEIC -> JPEG and downscale to 2048px (iOS canvas limit, strips
EXIF); snapshot the conversation at send time.
- Overlay a11y/Escape fixes, scroll-pin fix, svelte-check to 0 errors.
- Clear chat, image zoom, file-body fallback rendering, NIP-65 read
relays in publish set, relay settings UI, forward-secrecy settings.
Docs
- README rewritten to explain the whole app; SECURITY.md updated for v4;
heartbeat self-check (src/lib/heartbeat.selfcheck.ts).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
1.2 KiB
Plaintext
63 lines
1.2 KiB
Plaintext
# Rust
|
|
target/
|
|
**/*.rs.bk
|
|
Cargo.lock.bak
|
|
|
|
# Node
|
|
node_modules/
|
|
dist/
|
|
*.tsbuildinfo
|
|
npm-debug.log*
|
|
yarn-debug.log*
|
|
yarn-error.log*
|
|
|
|
# Python
|
|
.venv/
|
|
__pycache__/
|
|
*.py[cod]
|
|
*.egg-info/
|
|
.pytest_cache/
|
|
|
|
# Local runtime state
|
|
*.db
|
|
*.db-journal
|
|
*.db-wal
|
|
*.db-shm
|
|
.kez/
|
|
kez-sigchains.db
|
|
|
|
# Editor / OS
|
|
.DS_Store
|
|
.idea/
|
|
.vscode/
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
|
|
# Claude Code harness state (per-session scratch, not project code)
|
|
.claude/
|
|
|
|
# Cross-test artifacts
|
|
/tmp/
|
|
|
|
# Personal deploy scripts (have specific host/path baked in — kept local only)
|
|
kez-chat/deploy/deploy.sh
|
|
kez-chat/deploy/deploy.local.sh
|
|
kez-chat/deploy/*.local.sh
|
|
kez-chat/deploy/.env
|
|
kez-chat/deploy/.env.local
|
|
|
|
# Prebuilt artifacts staged by deploy-fast.local.sh (binary + SPA dist).
|
|
# Regenerated on every run; nothing in here is source of truth.
|
|
kez-chat/deploy/prebuilt/
|
|
|
|
# Buildx local cache used by deploy-fast.local.sh to keep rust target/
|
|
# and node_modules warm between runs. Now lives at
|
|
# ~/.cache/kez-chat-buildx (outside the repo, see deploy-fast.local.sh);
|
|
# the path below is just a historical fence-post in case anyone has the
|
|
# old in-repo cache lying around from before that move.
|
|
kez-chat/deploy/.buildx-cache/
|
|
|
|
# Syncthing per-folder ignore config — machine-local, not project source
|
|
.stignore
|