🔒 Everything Encrypted, Always

Your private,
encrypted workspace.

SealKeep lets you build custom data apps - contacts, password managers, patient forms, anything - where your data is locked in your browser before it ever reaches the server. No code required.

🏗️ No-code builder 🔑 Shared access 🔍 Search & filter 📱 2FA support 💾 Backup & restore 📦 Offline binaries
SealKeep App Builder - unlocked and ready
🔑 The Big Idea

Your data is locked before it leaves your device

Most apps store your data on a server where people with server access could read it. SealKeep works differently: your app locks your records on your device before sending them. The server stores locked data, not plain records.

🛡️

If someone steals a copy of the database, they should only see locked data. They still would not have your records in plain text.

🔐

Locked before sending

Your data is locked in your app before upload. Each record is locked separately.

🧂

Hard to guess

Your sign-in setup is designed to make password guessing much harder for attackers.

🔁

Recovery codes

Get 10 one-time backup codes at setup. Each one independently unlocks your data if you forget your password.

🌐

Built into the browser

In web mode, protection depends on the app code delivered to your browser and your own device security.

Getting started

From creating an account to managing encrypted records - here's everything you need.

Step 1 - Account

Create your account

Register with an email address and a password. Your records are unlocked on your device. The server does not store your password in plain text.

After registering, you're taken straight to the recovery code setup - it's required before you can do anything else.

Registration form filled

Enter your email and a strong password (8+ characters)

Step 2 - Recovery codes

Save your recovery codes

SealKeep generates 10 one-time backup codes and shows them on screen. Each code can help you recover access if you lose your password. Store them like you'd store a spare house key: somewhere safe and offline.

⚠️

If you forget your password and lose all your recovery codes, your data is gone forever. There's no "forgot password" email that can recover encrypted data.

Recovery codes screen

10 one-time recovery codes - write these down and keep them safe

Step 3 - App Builder

Design your app without coding

The App Builder lets you create any kind of data tracker - a password manager, a contact list, a patient intake form, an invoice log - by clicking, not coding. Add fields, choose types, set layouts, and hit Save.

Every time you open the Builder, you unlock it with your password. This ensures your key is only in memory when you're actively using it.

Builder with fields defined

Builder - fields defined for a Password Manager app

Step 4 - Your data

Add and manage records

Open your app, enter a record, and click Save. Everything you type is scrambled in the browser before it's sent. When you open the app next time, your records are fetched as scrambled data and unscrambled locally for display.

Edit, delete, tag, and search your records. You can also add rich-text notes with formatting - bold, italics, lists, and tables.

Full record list

Both entries visible - all data decrypted locally for display

🤝 Shared Access

Share an app without sharing your password

You can invite another SealKeep user to access one of your apps - they'll be able to read and add records without ever knowing your password. Access can be revoked at any time with a single click.

🔑

How it works: When you invite someone, SealKeep creates a digital envelope addressed specifically to their account. Only they can open it with their own password - you never share credentials. When you revoke access, the envelope is destroyed and the app's encryption key is rotated automatically.

How to share access

  • The person you want to share with creates an account and opens the Builder once.
  • In your app's Builder panel, click Shared Access.
  • Create an invite link and send it to them.
  • Once they accept, your app grants access to their account.
  • They open the app with their own password - and can read and add records immediately.
🚫

To remove someone's access, click Revoke next to their name. Their access ends immediately and the app's key is rotated so old data remains secure.

Shared access panel open

Shared Access panel - invite collaborators with a private invite flow

📱 Two-Factor Authentication

Add a second lock to your account

Two-factor authentication (2FA) means that even if someone steals your password, they still can't log in - they'd also need your phone. SealKeep supports standard authenticator apps like Google Authenticator, Authy, and 1Password.

Setting up 2FA

  • Open your account settings and click Enable Two-Factor Auth.
  • Scan the QR code with your authenticator app.
  • Save the backup codes shown on screen - you'll need these if you lose your phone.
  • Enter the 6-digit code from the app to confirm setup.
  • From now on, every login requires your password and a fresh code from the app.
🔓

If you lose your authenticator app, use a backup code to regain access. You can also reset your password via the Forgot Password link on the login page, which lets you set a new password and re-enter with a backup code.

TOTP QR code setup

Scan this QR code with any authenticator app

TOTP login prompt

Login prompts for a 6-digit code after password

Backup code input

Lost your phone? Use one of the backup codes to get in

💾 Backup & Restore

Your data, safe even if the server disappears

SealKeep lets you download a backup of your app data at any time. Record contents in that backup stay in locked form. If something goes wrong, restore from backup and continue where you left off.

How backup works

  • In the App Builder sidebar, click Backup. A snapshot of your app data is downloaded.
  • Record contents remain locked in the backup file.
  • To restore, open the App Builder and click Restore. Select your backup file. Records are imported and opened in your app after unlock.
  • Backups don't replace regular records - restoring adds the backed-up records back if they're missing.
📋 Field Types

Build any form you can imagine

Every field type stores its value as locked data. Pick the type that matches what you're collecting - the app handles the rest.

text

Short text - names, titles, single-line values

email

Email address - format is checked automatically

tel

Phone number

number

Numeric - quantities, prices, ages

date

Date picker - calendar pop-up

select

Dropdown - one choice from a list you define

radio

Radio buttons - all choices visible at once

checkbox

Multi-select checkboxes - pick several options

textarea

Rich text editor - bold, italic, lists, tables

tags

Label chips - type to add, click to remove

file

File upload - file bytes are encrypted inside the record

lineitems

Invoice rows - description, qty, price, tax, total

Column layout

Each field can be sized independently: Full (entire row), Half, One-third, or Two-thirds. On mobile, all fields automatically expand to full width so nothing gets squished.

Hidden fields

Fields can be hidden in the list view, the form, or both. Use this to keep internal notes or sensitive values out of sight without removing them from the record.

🔐 Security & Encryption

How your data is protected - in plain English

SealKeep uses several layers of protection. Here's what each one does and why it matters.

🔑

Your unlock happens on your device

When you unlock, your records are opened in your app memory on your device. The server stores locked records.

Good password handling and login protections make account guessing attacks harder.

🔒

Every record is locked individually

Before a record is sent to the server, your app locks it. Each record is locked separately so plain content is not stored on the server.

If locked data is changed in transit or storage, record opening can fail instead of silently showing bad data.

Per-record protection · Locked at rest · Tamper checks
🔁

Recovery codes are separate keys

Each recovery code can restore access if you lose your password. Using a code removes it from the list so it cannot be reused.

Codes are shown once. Save them offline.

One-time codes · Offline safekeeping recommended
🤝

Sharing uses digital envelopes

When you invite a collaborator, SealKeep grants access without sharing your password. They sign in with their own account.

Revoking access removes their access and refreshes app access state for safety.

Per-user access grants · Revocation support
🏷️

Tags are fingerprinted, not stored

Tag labels are represented by private fingerprints on the server so filtering can work without storing plain tag text.

This lets you filter by tag while keeping labels private in normal use.

Private fingerprints · Locked labels
📱

Two-factor authentication

Optional TOTP (time-based one-time password) support means even a stolen password can't be used to log in alone. The 6-digit code changes every 30 seconds and is generated by an app on your phone.

Backup codes let you regain access if you lose your authenticator. Password reset works without breaking any of your encrypted data.

Authenticator app codes · Backup codes
🚦

Rate limiting on login

The login endpoint limits repeated failed attempts and temporarily blocks abusive traffic. This helps slow down automated password-guessing attacks.

Temporary lockouts on repeated failures
🍪

Sessions via secure cookies

Authentication uses HttpOnly session cookies, which means JavaScript on the page cannot read the session token. This protects against a common attack called cross-site scripting (XSS).

CSRF tokens protect all state-changing requests (POST, PUT, DELETE) from being triggered by malicious third-party websites.

HttpOnly cookies · CSRF tokens · SameSite policy

What the server can and cannot see

Here's every piece of data stored in the database and whether anyone with a copy of that database could read your information.

What's stored What it is Readable without your key?
users.password_hash A protected form of your sign-in secret Not plain password
users.encryption_salt A helper value used for account unlocking Visible - not harmful alone
users.recovery_blobs_json Encrypted copies of your data key, one per recovery code 🔒 Encrypted
records.payload Your actual record content in locked form 🔒 Encrypted
records.meta_json Internal record metadata (e.g. migration state) 🔒 Encrypted payload only
app_schemas.fields & app_schemas.title Your app's field definitions and title 🔒 Encrypted
user_tags.tag_hmac Private fingerprint of each tag label 🔒 Not reversible
user_tags.tag_enc Encrypted tag label text 🔒 Encrypted
app_key_grants.* Shared access grant data for collaborators 🔒 Encrypted per-recipient
users.public_key Collaborator's public key (used for sharing) Public - intentionally visible
users.encrypted_private_key Collaborator's private key, encrypted with their password 🔒 Encrypted
users.totp_secret Two-factor authentication secret data for account login checks 🔒 Encrypted
Activity metadata Timing, counts, and usage patterns needed to run the service Visible to server
ℹ️

Hosted web mode still requires trusting the app code delivered to your browser. For stronger assurance, use standalone mode and verified releases.

📦 Standalone Mode

Build an offline app anyone can run

Design a form in the Builder, then compile it into a single file that users run on their own computer. No cloud account and no cloud server required. The developer never sees user data - not even with a copy of the database file.

How to build a standalone app

  1. Design your schema in the hosted Builder
  2. Click Export on the app card - downloads a schema file
  3. Run the build script with your schema file and a target platform
  4. Distribute the single binary - users need nothing else
  5. To update: build a new binary with the updated schema. Users replace the file and keep their data.
# Build for Linux (64-bit)
SCHEMA_FILE=contacts-schema.json APP_NAME=my-contacts \
./scripts/build-standalone.sh

# Build for Windows from Linux
SCHEMA_FILE=contacts-schema.json APP_NAME=contacts.exe \
GOOS=windows GOARCH=amd64 \
./scripts/build-standalone.sh
Standalone build modal open

One-click build from the Builder - choose your platform

💻

Cross-platform

Linux, macOS (Intel + Apple Silicon), Windows - all from a single build command.

📁

Single file

Schema, UI, and server all in one binary. Only data.sqlite is created at runtime.

🔒

Developer-blind

The developer can't read user records from a database copy alone because records are stored in locked form.

🔄

Safe upgrades

Ship a new binary with an updated schema. Existing records open fine - the key doesn't change.

🚀 Quick start

Up and running in 30 seconds

Clone, run, register, and start building your first encrypted app.

# 1. Start the server
go run ./cmd/server

# 2. Open in your browser
http://localhost:8085/auth/register.html

# 3. Register → save recovery codes → build your first app
Register now →