NyxVault

Self-hosted, end-to-end encrypted file sharing. Encrypt in your browser, share a link, and the server never sees your data. Not the content, not the filename, not the file type. We use it every day to hand files to people outside our team.

  • Zero knowledge: the server only stores ciphertext
  • Argon2id + XSalsa20-Poly1305, encryption happens in the browser or CLI
  • Passkeys (Face ID, Touch ID, security keys) instead of passphrases
  • Burn after reading and links that expire after 1 hour up to 30 days

How sharing works

  • Open the admin page, drop a file, choose an expiry and optionally burn after reading
  • Enter a passphrase and click Encrypt & Upload
  • Share the link and the passphrase, ideally over two different channels
  • The recipient enters the passphrase and the file is decrypted in their browser, with a preview for images, video, audio, PDF and text
NyxVault start page on nyxvault.org

What the server can and cannot see

NyxVault keeps the trust you need in the server small, but you still trust the code that runs in your browser. That is why you can self-host it and read every line.

The server can seeThe server cannot see
The ciphertextThe plaintext
The file sizeThe filename
The upload timeThe file type
The expiry, if you set oneYour passphrase

Passkeys instead of passphrases

Register a passkey once and every upload is encrypted to your passkeys, with no passphrase to remember or leak. This is classic envelope encryption: each file gets a random key, sealed to a vault public key. The matching private key exists only wrapped by each of your passkeys, using the WebAuthn PRF extension.

Uploads never ask for your passkey, because sealing to a public key needs no ceremony. That also works from the CLI and the API. Any registered passkey can open any passkey-encrypted file. You can still choose a plain passphrase per upload.

Security details

  • Integrity-protected chunks: every chunk carries its index and a final-chunk marker, the header is authenticated with HMAC-SHA256. Reordering, truncating or tampering is detected
  • Burn after reading only deletes after a successful decryption, so a wrong passphrase can never destroy a file. The blob is overwritten with random bytes before it is removed
  • VirusTotal is opt-in: the SHA-256 hash is computed locally and only sent if you click Scan. The file itself is never uploaded
  • Strict content security policy, no inline scripts, PDF previews in a sandboxed frame, rate limits on login, upload and download
  • Optional TOTP two-factor login, the secret is encrypted at rest

Get started

You need Node.js 18 or newer. Put a reverse proxy with TLS in front, for example Caddy. Passkeys need one fixed hostname, so the README shows how to redirect www to the main domain. There is a CLI for uploads and decryption, and a full HTTP API.

git clone https://github.com/Open-Cosmic-Software/nyxvault.git
cd nyxvault && npm install
cp .env.example .env   # set API_KEY, WEB_PASSWORD, WebAuthn host
node server.js         # http://127.0.0.1:3870

Honest limits

  • A lost passphrase cannot be recovered, by design. Choose a strong one
  • Deleting your last passkey makes every passkey-encrypted file unreadable for good. The interface warns you clearly
  • The optional agent recovery key lets whoever controls that key file decrypt passkey files. It is opt-in and revocable, passphrase files are never affected
  • Some Apple devices return a different passkey value depending on how a passkey is used. NyxVault offers a one-time device calibration for that