Security & Data Protection

How OpenFrame keeps your data private and secure

Encrypted at Rest

OAuth tokens, API keys, and sensitive fields use AES-256-GCM encryption

Self-Hosted First

Your data stays on hardware you control — nothing is stored in our cloud

Open Source

Every line of code is publicly auditable on GitHub

Your Data Stays With You

OpenFrame is built on a self-hosted architecture. Your calendar events, photos, tasks, smart-home controls, and personal data live on your own hardware — a Raspberry Pi, a home server, or any Docker-capable machine on your network.

The optional OpenFrame Cloud service exists solely for convenience features like remote access and relay connectivity. It stores only your account email and instance connection metadata — never your calendars, photos, or personal content.

Encryption

In Transit

All communications use HTTPS/TLS encryption. API requests, OAuth flows, WebSocket relay connections, and browser sessions are encrypted end-to-end. HSTS headers enforce HTTPS on all supported browsers.

At Rest

Sensitive data stored in the database is encrypted using AES-256-GCM with randomly generated initialization vectors. This includes:

  • OAuth access and refresh tokens (Google, Microsoft, Spotify)
  • API keys for third-party services (weather, AI, maps)
  • Calendar event fields (titles, descriptions, locations)

Encryption keys are auto-generated on first run and stored with restricted file permissions (mode 0600) on the host filesystem, separate from the database.

Authentication & Access Control

Password Security

Passwords are hashed with bcrypt (cost factor 12) before storage. Plaintext passwords are never stored or logged.

API Key Security

API keys are hashed with SHA-256 before storage — only the key prefix is stored in plaintext for identification. Key comparison uses constant-time algorithms to prevent timing attacks.

Token Management

JWT access tokens are short-lived (15 minutes). Refresh tokens use family-based rotation with reuse detection — if a refresh token is replayed, the entire token family is invalidated, protecting against token theft.

OAuth Integrations

Third-party OAuth flows use cryptographically random state parameters verified server-side to prevent CSRF attacks. State tokens are single-use and expire after 10 minutes. You can disconnect any integration at any time, which immediately revokes stored tokens.

Infrastructure Security

HTTP Security Headers

The API server enforces security headers via Helmet, including Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, and Strict-Transport-Security.

Rate Limiting

Sensitive endpoints are rate-limited to prevent brute-force attacks: login attempts (10/minute), token refresh (10/minute), and device-code polling (10/minute). A global rate limit protects against abuse across all endpoints.

Input Validation

All API inputs are validated using JSON Schema (Fastify) and Zod type validation. File uploads are restricted by MIME type whitelist and size limits. Path traversal protections are enforced on all file operations.

CORS

Cross-Origin Resource Sharing is restricted to explicitly configured origins. Credentials are only accepted from trusted origins matching your deployment domain.

No Tracking, No Ads, No Data Sales

OpenFrame does not include third-party analytics, advertising trackers, or data-collection SDKs. We do not sell, rent, or share your data with anyone. There are no hidden data flows.

Because OpenFrame is self-hosted, your personal data never passes through our servers. Even when using the cloud relay for remote access, the relay acts as a transparent tunnel — message content is encrypted between your browser and your local instance.

Open Source Transparency

OpenFrame is 100% open source. Every security decision, encryption algorithm, and authentication flow is visible in the source code. You don't have to take our word for it — you can verify it yourself.

We welcome security reviews and responsible disclosure. If you find a vulnerability, please report it via our GitHub Issues.

Cloud-Hosted Instances

For users who opt into OpenFrame Cloud hosting (instead of self-hosting), the same security measures apply. Your hosted instance runs in an isolated container with its own database. Data is encrypted at rest and in transit, and you retain full control over your account and connected integrations.

You can export or delete your data at any time. Account deletion removes all associated data from our servers.

Questions?

If you have security questions or want to report a vulnerability, please reach out via GitHub Issues or review the full source code at github.com/tyler-danielson/openframe.