Huginn

Your reading life, beautifully organised.

by Ernest Magriñá ReadingSocial

Type
Web app
Runs on
Any modern browser
Get it
Open in the browser
Price
Free Supported by ads

How it’s built

Private source

The source code is private. How it’s built is still described below.

Frontend
  • Next.js (App Router)
  • React
  • TypeScript
  • Tailwind CSS
  • next-intl
Backend
  • NestJS
  • Prisma
  • PostgreSQL
  • Passport JWT
Data
  • Open Library API

Architecture

Two independent repositories — a Next.js frontend and a NestJS backend — talking over a plain REST API. No monorepo, no shared package between them; each is versioned and deployed on its own.

Frontend

Next.js (App Router), React and TypeScript. Styling is Tailwind CSS with shadcn/ui-style components and Iconify's Phosphor icon set; forms run through react-hook-form and Zod. The interface is translated into 28 languages with next-intl, without locale prefixes in URLs.

Backend

NestJS with Prisma over PostgreSQL. Auth is a Passport JWT strategy with bcrypt-hashed passwords, enforced by a global guard that routes opt out of explicitly rather than opting into. DTOs are validated with class-validator behind a global, whitelisting validation pipe.

Database & data model

There's deliberately no Book table. Every book is identified by its Open Library work id, so Huginn's own database stores a reader's relationship to a book — shelves, reading status, reviews, favourites — plus a self-referential follow graph between users.

APIs & data flow

Book search, covers and metadata are fetched live from the Open Library API rather than mirrored locally, both directly from server components and through a small caching proxy route that keeps repeated lookups from re-hitting Open Library on every render.

Why these choices

Not self-hosting the book catalogue means never maintaining a stale, partial copy of something Open Library already keeps current. The interesting trade-offs were mostly about restraint — building what a personal reading library needs rather than what a Goodreads clone could theoretically become.