Skip to content

Compromisee/linkboard

Repository files navigation

🔒 LinkBoard

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


Install

pip install pywebview cryptography
python app.py         # or ./run.sh
  • Python 3.9+
  • cryptography is 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.

Features

Core

  • 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 & customization

  • Layout modesCards (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.

Power tools (40+ touches)

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.

The .todofile format

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 .todofile is plain text — treat it like a password-free backup.

Security model

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 roundsFernet (AES-128-CBC + HMAC-SHA256).
  • The vault on disk is ciphertext — opening store.todo in 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.

Where data lives

~/.linkboard/
├── store.todo       # encrypted vault (folders, links, tags)
├── settings.json    # plain settings (theme, preview, toggles)
└── auth.json        # salts + password/PIN hashes (no plaintext)

Project layout

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

Build a standalone app

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.

Deploy the website

The landing page in docs/ deploys to GitHub Pages automatically via the included workflow. After pushing:

  1. Repo Settings → Pages → Build and deployment → Source: GitHub Actions.
  2. Push to main; the site publishes at https://YOURNAME.github.io/linkboard/.
  3. Search-replace YOURNAME in docs/index.html and this README with your GitHub username.

License

MIT © you. See LICENSE.

About

LinkBoard is a desktop app for hoarding and storing all your links securely

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors