FormSeal - E2EE contact form backend

A privacy-first, end-to-end encrypted contact form backend designed to be blind to message contents.

Project created on: Dec. 2025 | Last updated: Dec. 2025

FormSeal is an experimental, security-focused contact form backend built to eliminate server-side visibility into user messages. Unlike traditional form handlers, the backend is intentionally blind — messages are encrypted on the client before submission and stored without ever being decrypted server-side.

The project explores different architectural variants using Cloudflare Workers and KV storage, focusing on stateless authentication, key exchange, and practical end-to-end encryption in a serverless environment.

FormSeal is designed as a framework rather than a single deployment, allowing different trade-offs between usability, security, and privacy depending on the chosen variant.

Overview

Problem

Standard contact form backends store messages in plaintext, creating unnecessary trust assumptions and long-term data exposure risks.

Solution

A client-side encrypted submission pipeline where the backend only handles encrypted blobs and metadata, never plaintext messages.

Core stack

Cloudflare Workers · KV Storage · Client-side E2EE · Stateless authentication · Vanilla JavaScript

Architecture

FormSeal follows a client-encrypt → server-store → client-decrypt model, ensuring the backend never gains access to message contents.

Key Features

End-to-end encryption

Message contents are never visible to the backend.

KV-blind storage

Encrypted data is stored as opaque blobs without schema coupling.

Multiple variants

Supports different trade-offs between security, privacy, and usability.

Serverless by design

No servers to manage, patch, or secure.

Minimal metadata

Only essential routing and anti-abuse metadata is retained.

Sample code snippet

This snippet shows how encrypted payloads are handled server-side without decryption:

// Store encrypted payload without inspection
await SUBMISSIONS.put(id, encryptedPayload, {
  metadata: {
    created_at: Date.now(),
    variant: "e2ee"
  }
});
      

Possible future improvements

Links

GitHub: https://github.com/grayguava/formseal

Live Demo: No Live demo or deployments available