jake g.

jake g. avatar

Favorite Things

· 3 min read

Favorite Things is a personal inventory and collection app with a social side. Catalog anything you collect — consoles, albums, t-shirts, mechanical keyboards — attach photos, tag and rate each item, and decide whether it stays private or is visible to everyone. Folders work like a filesystem, and the whole collection can be browsed as one.

GitHub: drproteus/favorite-things

Live: things.skinet.org

My collection, with nested folders in the sidebar

How it works

Every account signs in with Google or GitHub; there are no passwords. Items live in a folder tree with one root folder per user, and folders nest to any depth. Each item has a title, a markdown description, up to 20 photos, hashtags and a 1–5 star rating. A private folder hides everything inside it, even items that are marked public.

Search matches titles, descriptions and tags, either within the current folder or across the whole collection, and a visibility filter narrows the results to public or private. Explore gathers public items and the most-used public tags, while every user gets a profile page at /users/:id that can be browsed as a folder view.

A folder, with breadcrumbs and search scope

Features

  • Google and GitHub OAuth, with server-side sessions
  • Nested folders with an optional markdown description and banner image
  • Items with photos, #hashtag tags, markdown descriptions and a star rating
  • Public and private visibility on both items and folders
  • Select mode for moving, hiding or deleting many items and folders at once
  • Folder visibility changes that can cascade to everything inside
  • Comments on items, visible to signed-in users
  • Explore page with full-text search and tag filters
  • Share links for public items
  • Drag-and-drop photo uploads
  • Optional photo suggestions: a vision model proposes a title, description and hashtags for the first photo of a new item
  • Responsive layout with light and dark mode

An item, with photos, rating, markdown description and hashtags

Explore, with the most-used public tags

Under the hood

The API is written in Go using net/http and pgx, with PostgreSQL for storage and S3 or MinIO for photos. Images are served through presigned URLs that expire after an hour, so the bucket stays private. On upload, each photo and folder banner is resized into 320, 640, 960, 1280 and 1920 px variants, and the frontend uses srcset so the browser downloads the smallest version that fits.

The web app is React 19 with TypeScript, Vite, Tailwind CSS and TanStack Query. Migrations are embedded in the Go binary and run at startup, and the frontend and API are built into a single Docker image, with Compose definitions for Postgres and MinIO.

GitHub: drproteus/favorite-things

Live: things.skinet.org