Your private bookmark manager that works simply and easily for you.
Bemarked (short name bmkd / bookmarks daemon) is a lightweight, self-hosted, private bookmark manager:
a single binary with built-in web-server, web UI and human-readable plain-text (TSV) storage format. No cloud, no accounts.
I’ve wanted to bring this project to life for a long time. In real-world use, when you frequently switch between different browsers and devices, bookmarks eventually get scattered around. On top of that, you need synchronization, quick access, straightforward backups, self-hosting/privacy options, and so on.
I looked into existing bookmark managers, ranging from feature-rich tools to minimalist ones. The comprehensive solutions solved the core problem, but were heavily bloated with extra features: setup required a dedicated server or Docker, and everything was stored in a complex database. The simple ones, on the other hand, often had rather niche implementations.
What I needed was a manager with a familiar interface, a clear and straightforward architecture, and the ability to access a bookmark even with just a plain text editor at hand. Having used Linux and other open-source projects like OpenWrt for years, I knew things could be kept simple. When creating it, I tried to adhere to the "unix philosophy": do one thing well, keep data as plain text, and compose with standard tools (grep, awk, cut). After gathering these ideas and structuring the architecture, this project was born.
- Small size — a single binary under ~300 KB.
- Tab-separated plain text format (TSV) — bookmarks are stored as plain text: easy to read, parse, sync (syncthing, rclone, gdrive, dropbox, etc), compress, and backup. Also it's 10× more compact than a browser's exported
bookmarks.html - High-performance & lightweight — near-zero CPU load; consumes only 5–10 MB of RAM (tested with 1000+ bookmarks).
- Cross-platform — Linux / Windows / MacOS / OpenWRT / SBC / Android/Termux (x86_64, x86, arm, arm64, mips, mipsel, riscv64)
- Simple interface — a web UI with built-in fuzzy search, a homepage for shortcuts, and everything needed to manage folders and links
- Responsive UI — works on mobile, with light / dark themes (auto-switching).
- Drag-and-drop — organize shortcuts, folders, and bookmarks with touch/pen support.
- Portable — one binary, one config file and one bookmarks file.
- HTTP REST API - with JSON output. The backend supports all the necessary features for managing bookmarks via API.
Grab the binary for your platform from the Releases page, unpack it, and run:
tar -xzf bmkd-linux-x86_64.tar.gz # or: unzip bmkd-windows-x86_64.zip
./bmkd # serves http://127.0.0.1:7773
Then open http://127.0.0.1:7773 in your browser. Each archive bundles the binary, a
sample conf.txt, README.md, and LICENSE. By default Bemarked listens on localhost
only — set bind = "0.0.0.0" in conf.txt to reach it from other devices on your LAN.
Prefer to build from source? Mongoose is already vendored in deps/mongoose/:
cmake -S . -B build
cmake --build build
./build/bmkd
Simple key = value lines; # starts a comment. Bemarked reads conf.txt from next to the
binary, or pass a path explicitly: ./bmkd /path/to/conf.txt.
| Key | Default | Meaning |
|---|---|---|
bind |
"127.0.0.1" |
interface to listen on ("0.0.0.0" exposes it on the LAN) |
port |
7773 |
TCP port |
bookmarks_file |
(next to binary) | path to bookmarks.txt |
link_open_mode |
"new-tab" |
new-tab or same-tab |
shortcuts_per_row |
7 |
homepage shortcut grid width |
shortcut[N] |
— | a homepage shortcut: "name | #hex_color | url" |
Example:
port = 7773
bind = "127.0.0.1"
link_open_mode = "new-tab"
shortcuts_per_row = 7
shortcut[0] = "DuckDuckGo | #DE5833 | https://duckduckgo.com"
shortcut[1] = "GitHub | #000000 | https://github.com"One bookmark per line, TAB-separated, with a # comment header:
# id name folder url
7fa93 Linux dev/sources https://linux.org
a1b2c Open Source Initiative dev/sources/osi https://opensource.org
- id — short, auto-generated identifier.
- name — the bookmark title.
- folder — a
/-separated path encoding subfolders (case-sensitive); empty defaults tounsorted. - url — the link.
It's just text: edit it in any editor, grep/awk it, sync or back it up. Writes are
crash-safe (temp → fsync → atomic rename, keeping one .bak).
Bemarked reads exported browser bookmarks — the standard HTML format that Chrome, Firefox, Edge, and Safari all produce.
Two ways to import:
- Web UI — ⋮ menu (top-right) → Import bookmarks, then pick the exported
.htmlfile. - CLI —
./bmkd convert bookmarks.htmlwrites abookmarks.txt.
- Test on different platforms
- Benchmark with 10k bookmarks, check the RAM and CPU load and publish measured numbers
- Add documentation
- Add a screencast guide
- Browser addons (Firefox, Chrome)
- Add authentication
- Add TLS support
- Add hotkeys / keyboard navigation + vim style navigation
- System tray icon (Windows / macOS / Linux) as an optional, build-time module
- Create native packages for Debian, Fedora, Arch
- Add to Flathub and Snap
To my beloved Wife
Bemarked is free and open source. If you find it useful, please consider supporting its development — it helps a lot and is sincerely appreciated.
Bemarked is licensed under GPLv2-only (see LICENSE); source files carry
SPDX-License-Identifier: GPL-2.0-only. This matches Mongoose, which is dual-licensed
GPLv2 or commercial — because the binary links Mongoose, a permissive redistribution
(MIT/Apache) would require either a commercial Mongoose license or swapping Mongoose for a
permissively-licensed server. See deps/mongoose/README.md.