Appearance
Honest Security & Privacy Model
At ContinueJS, we adhere to transparent, grounded engineering. We refrain from making misleading claims such as "100% unbreachable cloud security" or "zero data loss guarantees", because such statements are technically dishonest and mathematically impossible in client-side software.
This document presents an explicit, professional breakdown of ContinueJS's threat model, privacy boundaries, cryptographic mechanisms, and operational limitations.
🎯 Primary Purpose & Design Scope
ContinueJS is a UX continuity engine, built to prevent user frustration caused by accidental tab closures, browser crashes, misclicked navigation links, or network dropouts.
IMPORTANT
Scope Notice: ContinueJS is designed for state persistence during interrupted sessions. It is NOT a password manager, a long-term secure vault, or a substitute for authenticated server-side data processing.
🛡️ Core Security Architecture
1. Browser Same-Origin Policy (SOP) Isolation
Draft payloads are stored locally in the browser's IndexedDB. IndexedDB is strictly sandboxed by the browser's Same-Origin Policy (SOP):
- Data stored under
https://yourdomain.comcannot be accessed or queried by scripts running onhttps://otherdomain.com. - Draft records remain strictly confined to the user's browser storage.
2. Zero Telemetry & Egress Verification
The @continuejs/core package is built with zero runtime dependencies and zero network primitives:
- 🔒 No Network Calls: Contains no
fetch(),XMLHttpRequest,WebSocket, ornavigator.sendBeacon()calls. - 🔒 No Telemetry / Analytics: We collect zero analytics, zero usage metrics, zero IP addresses, and zero tracking pingbacks.
- 🔒 Local-First Verification: You can inspect
@continuejs/coresource code or audit browser network tabs — zero outbound HTTP requests are initiated by ContinueJS.
3. Automatic Sensitive Data Exclusion
To prevent unintentional persistence of sensitive credentials:
- ❌
passwordinput types are strictly excluded by the form serializer. - ❌ Form action buttons (
submit,reset,button) are strictly excluded. - ❌ Raw file content buffers are never stored (only safe metadata: filename and byte size).
- ❌ Custom sensitive fields can be excluded explicitly via
excludeFields: ['credit_card', 'ssn', 'auth_token'].
4. Client-Side AES-GCM 256-bit Web Crypto Encryption
For applications requiring payload protection against local browser profile inspection or physical device access:
typescript
const draft = createDraft({
id: 'confidential-intake',
encryption: {
enabled: true,
secret: 'user-provided-passphrase',
},
});Cryptographic Specification
- Algorithm:
AES-GCM(Authenticated Encryption with Associated Data). - Key Derivation:
PBKDF2usingSHA-256digest and 250,000 iterations. - Initialization Vector (IV): 12-byte cryptographically random
Uint8Arraygenerated viacrypto.getRandomValues(). - Authenticated Integrity: AES-GCM provides built-in 128-bit authentication tags, preventing ciphertext tampering without requiring redundant secondary HMACs.
5. Non-Reliance on Device Fingerprinting
CAUTION
Device fingerprints (CPU cores, screen dimensions, canvas hashes, user-agent strings) are NOT cryptographic secrets. They can be easily spoofed, change across browser updates, and compromise user privacy. ContinueJS never uses device fingerprinting for key derivation or identification.
⚖️ Threat Model & Realistic Boundaries
To ensure complete transparency, here is a realistic assessment of ContinueJS's protection boundaries:
| Threat / Event | Protected by ContinueJS? | Explanation |
|---|---|---|
| Accidental Tab Closure | ✅ YES | State is automatically saved in IndexedDB and restored on return. |
| Browser Crash / System Restart | ✅ YES | IndexedDB persists across browser process restarts. |
| Page Refresh / Navigation Away | ✅ YES | Input state is preserved and offer banner/modal is rendered. |
| Network Disconnect / Offline | ✅ YES | 100% offline local storage execution. |
| User Clears Browser Data | ❌ NO | If the user manually wipes browser storage, IndexedDB entries are purged. |
| Malicious Browser Extensions | ❌ NO | Extensions with <all_urls> DOM access can read browser memory. |
| Physical System Compromise | ⚠️ OPTIONAL | Unencrypted drafts in IndexedDB can be read from disk; enable AES-GCM encryption for disk protection. |
| Storage Quota Exceeded | ⚠️ HANDLED | ContinueJS catches storage quota errors gracefully without throwing unhandled exceptions. |
