Skip to content

emilkrebs/VailNote

Repository files navigation

About

VailNote is a simple, open-source note-sharing app designed for maximum privacy. All notes are encrypted using modern encryption technology before being stored, ensuring that no one else can access them. The app is built with a focus on user-friendliness and security.

🔗 See VailNote in action at vailnote.com.

Features

  • 🔒 End-to-end encryption
  • 🗂️ Self-destructing notes - automatically deleted after viewing
  • 🔑 Optional password protection
  • Configurable expiration times (10 minutes to 30 days)
  • 🚫 No tracking or analytics
  • 🛡️ Privacy-preserving rate-limiting using Anonymous Rate-Limited Credentials (ARC) (View Implementation)

Tech Stack

  • Framework: Fresh (Deno)
  • Runtime: Deno
  • Database: FoundationDB (Deno KV)
  • Encryption: AES-GCM with PBKDF2 key derivation for content encryption, bcrypt for password storage
  • Frontend: Tailwind CSS & Preact

Note

Safety and transparency are our top priorities. VailNote is made to be as secure as possible while still being easy to use and compatible with most clients. I highly encourage you to look into the architecture to ensure your safety!

How does VailNote work?

Take a look at the architecture diagram for a better visual representation.

Every possible step where I think it might be insecure, given the possibility that the network, server, or database has The system has been compromised and is marked with (!).

  1. Before sending anything to the server, the content will be encrypted.
  2. First, the password will be hashed with PBKDF2 for security
  3. The original password (not the hash) will then be used to encrypt the content.
  • If no password is provided, the client will generate a random phrase (auth key).
  1. The client will send the encrypted content, PBKDF2 hashed password, and expiration time to the server.
  2. If the document is valid, the server will generate a random note ID, hash the PBKDF2 password again using bcrypt for secure storage, and store the note in the database.
  3. The server will send a successful response containing the new note ID.
  4. The client will generate a valid link using the note ID and local auth key using the following structure: https://vailnote.com/[noteId]#auth=[authKey]

Viewing the Note

  1. When a note is accessed, the client fetches the encrypted note data from the server.
  2. The client asks the user for confirmation before viewing (and destroying) the note.
  3. If an auth key is present in the URL, the client uses it to decrypt the note. If a password is required, the client prompts for it and decrypts locally.
  4. The client never sends the password or auth key to the server—decryption always happens in the browser.
  5. After successful decryption, the client requests that the server delete the note.
  6. If decryption fails, the note remains on the server until a valid decryption attempt is made or it expires.
architecture diagram

Known Issues

(None)

Add Issue

Installation & Development

Prerequisites

  • Deno v2.3 or later

Local Development

  1. Clone the repository:

    git clone https://github.com/emilkrebs/VailNote.git
    cd VailNote
  2. Set up environment variables:

  3. Start the development server:

    deno task start
  4. Open http://localhost:8000 in your browser

Environment Variables

  • DATABASE_URI - Deno KV connection string
  • ARC_SECRET - Secret for ARC rate-limiting

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Screenshots

Home Page

Confirm Page

Password Protected

Content Page

About

VailNote is a highly secure privacy-first note sharing application.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •