Skip to content

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.com cannot be accessed or queried by scripts running on https://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, or navigator.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/core source 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:

  • password input 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: PBKDF2 using SHA-256 digest and 250,000 iterations.
  • Initialization Vector (IV): 12-byte cryptographically random Uint8Array generated via crypto.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 / EventProtected by ContinueJS?Explanation
Accidental Tab Closure✅ YESState is automatically saved in IndexedDB and restored on return.
Browser Crash / System Restart✅ YESIndexedDB persists across browser process restarts.
Page Refresh / Navigation Away✅ YESInput state is preserved and offer banner/modal is rendered.
Network Disconnect / Offline✅ YES100% offline local storage execution.
User Clears Browser Data❌ NOIf the user manually wipes browser storage, IndexedDB entries are purged.
Malicious Browser Extensions❌ NOExtensions with <all_urls> DOM access can read browser memory.
Physical System Compromise⚠️ OPTIONALUnencrypted drafts in IndexedDB can be read from disk; enable AES-GCM encryption for disk protection.
Storage Quota Exceeded⚠️ HANDLEDContinueJS catches storage quota errors gracefully without throwing unhandled exceptions.

Released under the MIT License.