A personal movie database web app for tracking movies, creating custom lists, and managing your movie collection. Built with React/TypeScript frontend and Go backend.
- 🎬 Movie Search & Discovery - Search movies powered by TMDB API
- 📋 Custom Lists - Create and manage personal movie lists (public/private)
- 👤 User Profiles - URL-based profile pages with list filtering
- 📱 Mobile Responsive - Optimized for both desktop and mobile
- 🔐 Authentication - Secure login via Auth0
- 🎯 List Management - Add movies to multiple lists, prevent duplicates
- 🌙 Dark Mode - System preference with manual toggle
- Frontend: React 18, TypeScript, Vite, Tailwind CSS, React Router
- Backend: Go 1.22+, SQLite, Standard HTTP library
- Authentication: Auth0 (JWT tokens)
- API: TMDB (The Movie Database)
- Database: SQLite with migration system
- Node.js 18+
- Go 1.22+
- Auth0 account
- TMDB API key
make installBackend (.env):
AUTH0_DOMAIN=your-domain.auth0.com
AUTH0_AUDIENCE=https://your-api-audience
TMDB_API_KEY=your-tmdb-api-key
DATABASE_PATH=./moviedb.db
PORT=8080Frontend (web/.env.local):
VITE_AUTH0_DOMAIN=your-domain.auth0.com
VITE_AUTH0_CLIENT_ID=your-client-id
VITE_AUTH0_AUDIENCE=https://your-api-audienceFollow the Auth0 Setup Guide to configure authentication.
# Run both frontend and backend
make dev
# Frontend: http://localhost:3000
# Backend: http://localhost:8080# Build single binary with embedded frontend
make build-prod
# Run production server
./bin/moviedb| Command | Description |
|---|---|
make dev |
Run frontend and backend in development |
make build-prod |
Build optimized production binary |
make install |
Install all dependencies |
make test |
Run all tests |
make lint |
Run linters and formatters |
make typecheck |
TypeScript type checking |
make clean |
Clean build artifacts |
make help |
Show all available commands |
moviedb/
├── cmd/server/ # Go server entry point
├── internal/
│ ├── auth/ # Auth0 JWT middleware
│ ├── database/ # SQLite connection & migrations
│ ├── handlers/ # HTTP route handlers
│ ├── services/ # Business logic & TMDB client
│ └── types/ # Shared Go types
├── web/ # React frontend
│ └── src/
│ ├── components/ # Reusable UI components
│ ├── hooks/ # Custom React hooks
│ ├── pages/ # Page components
│ └── contexts/ # React contexts (dark mode, etc.)
├── db/migrations/ # SQL schema migrations
└── embed.go # Static file embedding
- Search movies via TMDB API
- View detailed movie information (cast, genres, ratings, etc.)
- Add movies to custom lists
- Duplicate prevention
- Create unlimited custom lists
- Public/private list visibility
- URL-based list filtering (
/profile/user?list=123) - List statistics and movie counts
- Responsive design (mobile-first)
- Dark/light mode toggle
- Keyboard navigation
- Loading states and error handling
- Single Binary Deployment - Frontend embedded in Go binary
- JWT Authentication - Secure Auth0 integration
- Mobile Optimized - Touch-friendly interface
- URL State Management - Shareable profile URLs
- Server-side Privacy - List visibility enforced at API level
The app builds into a single binary containing both frontend and backend:
- Build:
make build-prod - Deploy: Copy
bin/moviedbto server - Configure: Set environment variables
- Run:
./bin/moviedb
No separate frontend hosting needed - everything is self-contained!
- Fork & clone the repository
- Create a feature branch
- Make changes and add tests
- Run
make lintandmake typecheck - Submit a pull request
MIT License - see LICENSE file for details.