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.
Yeah cassette is already taken :)
What a tape or a cassette, you may ask.
The logo represents the wheel of a cassette.
- 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+sto save with visual unsaved changes indicators - Persistent workspace: Remembers last opened folder, selection and config via
tape.jsonconfig - Context menus:
right-clickfor file and folder operations - Full-text search:
ctrl+kto 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
tabandshift+tab,enterto open - Shortcut help: just hit
ctrl+hto get the full list of shortcuts - Sync yourself: because the app handles plain
.mdfiles 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:
newchoose between light/dark/system and pick from a growing list of UI theme presets (Catppuccin, Rosé Pine, Tokyo Night, ...) - Vim keybindings:
newtoggle vim-style motion and editing in the editor (:wto save), fully compatible with the rest of the shortcuts - Line numbers:
newpick between relative, normal or no line numbers - File metadata:
newshow the last edited date of each file in the file tree - Config editor:
newedit yourtape.jsonsettings directly from the UI - External links:
newclick external links (http/https) in the reader to open them in your default browser
libwebkit is required on certain distro.
- Download the installer from releases
- Download the
.appbundle from releases - Drag to Applications folder
# Prerequisites: Go 1.23+, Node.js, Wails v2.9.0+
git clone https://github.com/results-may-vary-org/tape.git
cd tape
wails buildWhen 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.
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 verification — tape.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.
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) |
The supported flavor is the GFM one with some add-ons.
An example exists here: example.
See the following files:
Do not hesitate to open a PR or an issue. I reply when I can.
- Give me a tip
- Give a star on GitHub
- Report issues or contribute
- Or just participate in the development :D
