A simple webapp to manage your wishlists. Share them with friends and family, and let them mark items as purchased.
- User Accounts: Register and log in with email/password or OpenID Connect
- Multiple Wishlists: Create and manage unlimited wishlists
- Open Graph Metadata: Automatically fetch title, description and images from product URLs
- Public/Private Lists: Control which lists appear on the homepage
- Item Tracking: Mark items as purchased to prevent duplicate gifts
- Dark Mode: Built-in dark theme support
- i18n: Available in English and German
version: '3.7'
services:
wishlist:
image: thisisbenny/wishlist-app:latest
environment:
- JWT_SECRET=your-secure-random-secret-at-least-32-chars
- AUTH_EMAIL_LOGIN_ENABLED=true
- AUTH_EMAIL_REGISTER_ENABLED=true
ports:
- '5000:5000'
volumes:
- ./data:/app/dataOIDC providers are configured via environment variables following this pattern:
| Variable | Description |
|---|---|
OIDC_<ID>_NAME |
Display name shown on the login page |
OIDC_<ID>_CLIENT_ID |
OAuth2 client ID from the provider |
OIDC_<ID>_CLIENT_SECRET |
OAuth2 client secret |
OIDC_<ID>_ISSUER_URL |
OpenID Connect discovery URL |
Replace <ID> with a unique identifier for each provider (e.g., GOOGLE, GITHUB, POCKETID).
Example with two providers:
environment:
- OIDC_GOOGLE_NAME=Google
- OIDC_GOOGLE_CLIENT_ID=123456789-abc.apps.googleusercontent.com
- OIDC_GOOGLE_CLIENT_SECRET=GOCSPX-your-secret
- OIDC_GOOGLE_ISSUER_URL=https://accounts.google.com
- OIDC_POCKETID_NAME=PocketID
- OIDC_POCKETID_CLIENT_ID=your-client-id
- OIDC_POCKETID_CLIENT_SECRET=your-client-secret
- OIDC_POCKETID_ISSUER_URL=https://pocketid.example.comThe OIDC callback URL is http://localhost:5000/api/auth/oidc/<ID>/callback. Configure this as an allowed redirect URI in your OIDC provider's settings. The app auto-discovers provider metadata (JWKS, endpoints) from the issuer URL on startup.
# Install dependencies
npm install
# Setup environment
cp .env.template .env
# Edit .env and set JWT_SECRET to a secure random string
# Start development server
npm run devVisit http://localhost:5173
- Click the login icon in the header (top-right)
- Click "Not registered? Create an account" to register
- Enter your email and a password (min 8 chars, uppercase, lowercase, digit, special character)
- You'll be automatically logged in after registration
- Activate edit mode (toggle in header)
- Click the "+" tile to create a new wishlist
- Fill in title, description, and choose public/private
- Open any wishlist
- Activate edit mode
- Add items manually or use the bookmarklet
Create a bookmark with this JavaScript to quickly add items:
javascript: window.location =
'http://localhost:5000/add-wishlist-item?url=' + window.locationShare wishlists via their unique URLs. Friends and family can mark items as purchased without needing an account.
| Command | Description |
|---|---|
npm run dev |
Start frontend + backend |
npm run build |
Build for production |
npm run test:unit |
Run unit tests |
npm run test:api |
Run API handler tests |
npm run test:e2e |
Run E2E tests |
npm run lint |
Lint code |
npm run typecheck |
Type check |
See DEVELOPER.md for complete documentation.
The app exposes a REST API. See API.md for complete API documentation.
curl http://localhost:5000/api/wishlistcurl -X POST http://localhost:5000/api/wishlist/{id}/item/{itemId}/bought- Frontend: Vue 3, Vue Router, Vue I18n, Tailwind CSS
- Backend: NestJS, Drizzle ORM, SQLite
- Authentication: JWT (HTTP-only cookies), bcrypt, OpenID Connect
- Testing: Vitest, Playwright
MIT


