Skip to content

Tape

Tape - a simple markdown editor

Static Badge

Yet another md app?

Tape is designed as a no-bloat markdown editor that focuses on simplicity and efficiency.

I want it to be just what I need it for: taking notes.

No paywall, no outdated UI, no journaling system, simple and plain .md files.

Tape?!?

Yeah cassette is already taken :)

What a tape or a cassette, you may ask.

The logo represents the wheel of a cassette.

Main Features

  • Markdown editor & reader: Switch between editing and rendered preview modes with live preview ctrl+tab
  • File tree: Organized file browser with folders-first, alphabetical sorting
  • File operations: Create, rename, delete files and folders with existence validation
  • Save: ctrl+s to save with visual unsaved changes indicators
  • Persistent workspace: Remembers last opened folder, selection and config via tape.json config
  • Context menus: right-click for file and folder operations
  • Full-text search: ctrl+k to search across all markdown files with fuzzy matching
  • Cross-platform: Available for Linux, Windows, and macOS
  • Full keyboard integration: You can navigate the ui with tab and shift+tab, enter to open
  • Shortcut help: just hit ctrl+h to get the full list of shortcuts
  • Sync yourself: because the app handles plain .md files and the config file is placed at the root of your notes folder, you can sync your notes with any other app you want
  • Encryption: encryption is available out of the box, you can also encrypt your already existing .md file via the option
  • Themes: new choose between light/dark/system and pick from a growing list of UI theme presets (Catppuccin, Rosé Pine, Tokyo Night, ...)
  • Vim keybindings: new toggle vim-style motion and editing in the editor (:w to save), fully compatible with the rest of the shortcuts
  • Line numbers: new pick between relative, normal or no line numbers
  • File metadata: new show the last edited date of each file in the file tree
  • Config editor: new edit your tape.json settings directly from the UI
  • External links: new click external links (http/https) in the reader to open them in your default browser

Installation

libwebkit is required on certain distro.

Linux

  • Download via AUR
  • Download the installer from releases

Windows

macOS

  • Download the .app bundle from releases
  • Drag to Applications folder

Build from Source

# Prerequisites: Go 1.23+, Node.js, Wails v2.9.0+
git clone https://github.com/results-may-vary-org/tape.git
cd tape
wails build

Encryption

When privacy mode is enabled, tape encrypts both the content and the names of all your files and folders.

Your password is the only thing you need to decrypt them.

How it works

Key derivation — your password is processed through Argon2id (2 passes, 64MB memory, 4 threads) to produce a 256-bit encryption key. This makes brute-force attacks expensive.

Content encryption — each file's content is encrypted with AES-256-GCM. A unique random nonce is generated for every write, so encrypting the same content twice produces different ciphertext.

Filename & folder encryption — names are also encrypted with AES-256-GCM. Because raw encrypted bytes contain arbitrary binary data that filesystems can't handle, the result is encoded to Base64 URL-safe before being used as the actual name on disk. Encrypted files get the .mde extension.

File format — every encrypted file starts with a MDE1 version prefix, followed by the nonce, then the ciphertext:

MDE1 + nonce (12 bytes) + ciphertext

Filenames follow the same layout but base64-encoded:

MDE1 + base64url(nonce + ciphertext) + .mde

Password verificationtape.json stores a small encrypted blob (a random value encrypted with your key) and its nonce. On login, tape re-derives the key from your password and tries to decrypt this blob. If it succeeds, the password is correct. The key itself is never stored anywhere. This is only stored for UX purposes.

Your password alone is sufficient to recover your files. There is no recovery key and no secondary secret to keep.

Encryption Overview

Configuration tape.json

The config is mostly there to remember your last opened folder, selection and view mode.

It must be placed at the root of your notes folder.

{
  "lastOpenedFolder": "path of the last selected root folder",
  "lastOpenedFile": "path of the last selected note",
  "expandedFolders": ["array of each expanded folder"],
  "viewMode": "editor",
  "theme": "light",
  "uiTheme": "light",
  "privacyMode": false,
  "showFileMTime": false,
  "vimMode": false,
  "lineNumberMode": "relative",
  "check": "encrypted blob used to verify the password (only set when privacy mode is enabled)",
  "nonceCheck": "nonce for the check blob (only set when privacy mode is enabled)"
}

The keys are as follows:

Key Type Description
lastOpenedFolder string Path of the last selected root folder
lastOpenedFile string Path of the last selected note
expandedFolders string[] Array of each expanded folder
viewMode string "editor" or "reader"
theme string Editor color theme
uiTheme string UI color theme
privacyMode boolean Whether encryption is enabled
showFileMTime boolean Show file modification times in the file tree
vimMode boolean Enable vim-style editing
lineNumberMode string Line number display mode
check string Encrypted blob used to verify the password (only present when privacy mode is on)
nonceCheck string Random nonce used with check (only present when privacy mode is on)

Markdown flavor example

The supported flavor is the GFM one with some add-ons.

An example exists here: example.

Code of conduct, license, authors, changelog, contributing

See the following files:

Want to participate? Have a bug or a feature request?

Do not hesitate to open a PR or an issue. I reply when I can.

Want to support my work?

Thanks!

About

Take note without bloat

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

5 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages