- 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.

