Favorite Things
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

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.

Features
- Google and GitHub OAuth, with server-side sessions
- Nested folders with an optional markdown description and banner image
- Items with photos,
#hashtagtags, 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


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