A secure, animated desktop desk for hoarding, copying, and clearing links.
Paste a pile of links → copy them (one, all, your selection, or the first N) →
tag, cross off, and lock them away. Folders & subfolders, drag-and-drop, an
encrypted vault, and a plain-text .todofile format you actually own.
Built with Python + pywebview — a native window, no browser tab, no server, no cloud, no telemetry.
Features · Install · The .todofile format · Security · Website
pip install pywebview cryptography
python app.py # or ./run.sh- Python 3.9+
cryptographyis required for the encrypted vault & per-item locking.- On Linux you may also need a webview backend:
pip install pywebview[qt](or the system GTK/WebKit packages).
On first launch you set a master password — this creates and encrypts your vault. There is no recovery, so write it down.
- Bulk add — paste anything; every URL is extracted & de-duplicated, with a live "N detected" counter.
- Copy everything the way you want — per-link copy, Copy… (pick how many
with 5/10/25/all presets), or select-and-copy. Every link tracks
copied N×. - Cross off / undo — mark done → turns green, strikes through, auto-sinks to the bottom; undo from the card or the toast.
- Folders & subfolders — unlimited-depth collapsible tree; color-code folders; drag & drop links and folders to reorganize.
- Named color tags — custom names + colors; filter the current folder by tag; bulk-tag selections.
- Lock anything — encrypt individual folders or links with a separate Lock PIN; locked items are unreadable on disk and masked until you enter the PIN.
- Layout modes — Cards (grid), List (roomy single-column, Apple-todo style), and Compact (dense one-line checklist rows).
- Density — Normal / Cozy / Dense row padding.
- Second-line display — show each link's URL or its page title (either way it still opens and copies the URL, never the visible text).
- Quick-paste mode — paste links straight into the current list with
Ctrl/Cmd+V; the Add button hides for a frictionless flow. - Copy = URL only — copying always puts the raw URL on your clipboard, not the label.
- Custom accent color, optional dot-matrix background, toggle favicons and the copy counter, and 6 themes.
Animated vault unlock screen · Select mode (bulk copy / move / done /
delete) · instant search · sort by name / most-copied / domain · hover
previews (title+favicon, image, or URL) · 6 themes with matching
dot-matrix backgrounds · statistics panel · keyboard shortcuts
(A add, C copy, S select, / search, Ctrl+B sidebar, Esc close) ·
undo toasts · inline rename · change master password with safe
re-keying · import/export .todofile (merge or replace) · reduced-motion
toggle · collapsible sidebar & branches · open in default browser.
Your data lives in an encrypted ~/.linkboard/store.todo vault. Export
decrypts it into a clean, human-readable, git-friendly .todofile; import
parses one back (merge or replace).
# comments start with a hash
% theme: forest
% sortDone: true
@urgent #ff6b6b # declare a tag with a color
@read_later #3ecf8e
> All Links # folders use ">" and indentation (2 spaces/level)
- [ ] https://example.com "Homepage" +urgent (copies=3)
> Work {color=#5b8cff}
- [x] https://done.com "Shipped" +read_later
> Clients {color=#3ecf8e lock} # {lock} = encrypted folder
- [ ] https://secret.com "NDA" {lock}
| Token | Meaning |
|---|---|
% key: value |
document metadata (theme, preview, sortDone) |
@name #hex |
declare a tag + color |
> Name {…} |
a folder; attrs: color=#hex, lock |
- [ ] / - [x] |
a link, open / completed |
"Title" |
custom label |
+tag |
apply a declared tag (auto-created if missing) |
(copies=N) |
copy counter |
{lock} |
this item is encrypted |
@done(ISO) |
completion timestamp |
Full spec: docs/FORMAT.md.
Exporting locked items requires the Lock PIN to be entered (otherwise they're skipped). The exported
.todofileis plain text — treat it like a password-free backup.
| Secret | Role |
|---|---|
| Master password | Encrypts the entire vault (store.todo). Required to open the app. |
| Lock PIN | Separate secret; adds a second encryption envelope around individually-locked folders/links. |
- Key derivation: PBKDF2-HMAC-SHA256, 200,000 rounds → Fernet (AES-128-CBC + HMAC-SHA256).
- The vault on disk is ciphertext — opening
store.todoin a text editor shows nothing readable. - Passwords/PINs are stored only as salted hashes in
auth.json; no plaintext secrets, no recovery. - Everything is offline. No network calls except optional favicon/metadata fetches for hover previews.
~/.linkboard/
├── store.todo # encrypted vault (folders, links, tags)
├── settings.json # plain settings (theme, preview, toggles)
└── auth.json # salts + password/PIN hashes (no plaintext)
linkboard/
├── app.py # backend: pywebview bridge, crypto, storage
├── todofile.py # the .todofile parser / serializer
├── ui.html # the full self-contained UI
├── run.sh # one-command launcher
├── linkboard.spec # PyInstaller build spec (standalone app)
├── PACKAGING.md # how to build installers / binaries
├── docs/
│ ├── index.html # landing page / website (GitHub Pages)
│ └── FORMAT.md # .todofile spec
├── .github/workflows/pages.yml # deploy docs/ to GitHub Pages
├── LICENSE # MIT
└── requirements.txt
Turn LinkBoard into a double-clickable desktop app (no Python needed by end
users) with PyInstaller and the bundled linkboard.spec:
pip install pyinstaller
pyinstaller --clean linkboard.spec
# -> dist/LinkBoard/ (or dist/LinkBoard.app on macOS)Full instructions — icons, one-file vs. one-folder, signing, notarization, and installers — are in PACKAGING.md.
The landing page in docs/ deploys to GitHub Pages automatically via the
included workflow. After pushing:
- Repo Settings → Pages → Build and deployment → Source: GitHub Actions.
- Push to
main; the site publishes athttps://YOURNAME.github.io/linkboard/. - Search-replace
YOURNAMEindocs/index.htmland this README with your GitHub username.
MIT © you. See LICENSE.