About
Lynx is a personal link and feed management service โ a place to save, organise, and enrich URLs and RSS/Atom feeds without handing that data to a commercial read-later or bookmarking platform.
Why I Built It
I wanted to own my reading list. Existing bookmarking tools work well enough, but they’re third-party services with their own retention and privacy trade-offs. Lynx runs on my own infrastructure and stores everything in a PostgreSQL database I control.
It also gave me a realistic project to practice building an asynchronous enrichment pipeline: when a URL is saved, a Temporal workflow fetches the page, extracts metadata (title, description, Open Graph tags, language, author, canonical URL), archives the raw HTML and readable plain-text to object storage, and writes the enriched record back to the database.
What It Does
- Website/bookmark tracking โ store and browse URLs with deterministic UUID v5 deduplication on the normalised URL, so saving the same link twice is safe.
- Feed management โ track RSS/Atom feeds and link them to a parent website.
- Automatic enrichment โ on creation, a Temporal workflow fetches, parses, and archives each URL in the background.
- Magpie integration โ each new website is published as a
magpie.v1.ResourceKafka event so downstream services (search index, graph DB, etc.) can pick it up without tight coupling. - Bulk import โ the CLI reads a Markdown file of bullet-point URLs and creates website records for all of them in one shot.
Tech Stack
- Backend: Go, ConnectRPC, PostgreSQL
- Workflow orchestration: Temporal
- Messaging: Kafka (Redpanda in local development)
- Object storage: MinIO (S3-compatible)
- Frontend: WebAssembly SPA written in Go using go-app
For a deeper look at how the pieces fit together, see ARCH.md.