Quickmark - Personal Bookmark Manager
I have far too many devices in my life, and while most of them are Apple I can't get on the use Safari for everything in my life train. Previous bookmark managers I used have gone out of business or closed down such as Del.icio.us, Pocket, etc..
Problem
A way to store and search bookmarks across devices. Without having a million tabs open, link fatigue, reliance on 3rd parties that either shut down or quickly move to monetization.
I'm a big user of Tailscale and have my Home Assistant, Homelab, and Digital Ocean server all behind it as well as use it for ad blocking so how can I leverage that infra to provide an account-less browser homepage that gives me quick access to both viewing my bookmarks and creating new ones.
Solution
A basic personal link manager. Enter Quickmark - Keep it lightweight, keep it fast, keep it simple.
- Frontend Framework: SvelteKit 5 with Svelte 5 runes ($state, $derived, $props) for reactive state management
- Styling: Bootstrap 5.3.3 with Bootstrap Icons for a clean, responsive interface
- Database: SQLite via better-sqlite3 for lightweight, file-based data persistence
- Metadata Extraction: jsdom for HTML parsing and Open Graph data extraction
- Runtime: Node.js 22 (Alpine Linux in Docker)
- Deployment: Docker-ready with multi-platform support (amd64/arm64)
Approach & Features
Link sharing in social media is so prevalent these days I knew I wanted to leverage OpenGraph where possible. Generally all sites provide Title, Description and Image but I wanted to fall back to meta information and favicons when not possible.
I save alot of Youtube videos for later watching so I integrated their oEmbed API to have high quality images saved.
I wanted to save down graphic assets to local storage to prevent spam bot protections when loading the bookmark page which I will do dozens of times a day.
I wanted different views, not because I expect to toggle between each often but because this early into this project I am not sure which view I prefer. Now that it's built I'll likely keep it, but I needed to experience it to see what was for me.
I wanted tagging and filtering. I left it optional as it adds friction but it does make sorting by a tag much easier. The simple search is also dead simple and searches across URLs, titles, descriptions, domains and tags.
Keyboard navigation was important. If I want to make this as easy as possible I need to quick access keyboard controls so I can easily add and navigate the site. A win for accessibility as well.
Data Portability and Backup:
- JSON Export: Complete bookmark data with all metadata
- HTML Export: Standard Netscape bookmarks format for browser import/export compatibility
- Simple file-based backup (just copy the data/ directory)
No tracking or analytics. This app is for me not for anyone else I don't need that overhead. So nothing to do here.
Architecture Highlights
SSR + SPA Hybrid: Server-side rendering for initial load with client-side interactivity
RESTful API Design:
POST /api/bookmark
- Save with automatic metadata extractionDELETE /api/bookmark/:id
- Remove bookmarksGET /api/export
- Download JSON or HTML formatsGET /assets/:path
- Serve locally cached favicons and images
Reflection
It was surprisingly easy to spin this up. I've always been a fan of Svelte but it's come so far that it's becoming pretty simple to just get a site like this off the ground.
Now that it's build their are new features I may add. Such as editing the title of the bookmark, editing tags, etc. I need to really build up a library of links before I can determine if it's worth adding this. It wouldn't be a huge lift of course but it does add some degree of complexity to the UI which is something I am generally looking to avoid.
If you have a homelab, or just want to host this on your computer you can check out the GitHub Repository and get it setup for yourself.