Side project

lockedin

A quiet reader. Follow curated sources and topics; read a paginated feed with no algorithm, no infinite scroll, no engagement bait.

StatusPreview
v1 cut in progress: catalog, follow, reading feed, pagination
StackGo · PostgreSQL · sqlc · database/sql · html/template
Updated27 Aug 2026
LinksSource ↗

Screenshots

Screenshots land with the v1 deployment.

What it does

  • Catalog — a curated list of sources: RSS feeds and communities by topic. Browse, follow, unfollow.
  • Reading feed — the newest posts from what you follow, chronological, twenty to a page, with numbered pages instead of infinite scroll. “Showing 41–60 of 87 · Page 3 of 5.”
  • Fetcher — a separate binary pulls followed feeds and ingests new items. The web app never fetches on request.
  • Accounts — signup with email verification, session cookies, logout. No social login.
  • No ranking. Nothing on the page is optimised to keep you on the page.

Why I built it

I wanted to read the handful of sources I actually care about without the machinery designed to keep me scrolling. The constraint that made it interesting: build it with as little as possible — Go’s standard library, server-rendered templates, Postgres — and see how far that goes before reaching for a framework.

Under the hood

Two Go binaries — api (HTTP and templates) and fetcher (feed ingestion) — over one PostgreSQL database. SQL lives in .sql files and sqlc generates typed Go from it; schema changes are numbered migrations.

Engineering notes

sqlc instead of an ORM

Queries are written in SQL and compiled to typed Go functions at build time. What you wrote is exactly what runs, the types are checked, and there’s no runtime reflection. The cost is writing every query by hand; for a read-heavy app with a dozen tables that cost is small.

Pagination from one count

The feed page runs two queries: COUNT(*) of the user’s items, and one LIMIT 20 OFFSET n page. Everything else — page count, the “of N” labels, clamping an out-of-range page — is arithmetic on the count. No probe rows, no “fetch 21 to know whether there’s a next page”. The full walkthrough is in the repo’s docs/.

Fetching out of band

Feed fetching is its own process with its own entrypoint. The web app only reads what’s already in Postgres, so a slow or dead upstream feed can never make a page slow.

Status & roadmap

Done: accounts and sessions · curated catalog and follow · fetcher · reading feed with numbered pagination.

In progress: cutting v1 — README, deployment, screenshots.

Later: manual refresh from the feed page · resurfacing email digest.

Last updated 27 Aug 2026 · ← All work