No description
| backend | ||
| frontend | ||
| nginx | ||
| .dockerignore | ||
| .gitignore | ||
| AGENTS.md | ||
| DEPLOY.md | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
Packlist (Packi)
A full-stack packing list application built with FastAPI & React. Currently a PoC/MVP.
Features
- Manage items and tags, create trips by choosing a set of tags
- Tag types: Mitnahme (normal), Bedingung (required), Kategorie (category), Modifier (filter)
- Trips auto-generate their packing checklist from selected tags; items can be checked off or discarded per trip (with a shared
settled_attimestamp and a "recently settled" list) - Toggle to hide completed trip items; trips sorted by date; polling auto-refresh
- Responsive UI with React and TailwindCSS
- REST API with FastAPI, PostgreSQL database, Liquibase for migrations (runs automatically on deploy)
- Dockerized for easy development and production deployment
Tag types
Tags have one of four types, which control how items are picked for a trip:
| Type | Label in UI | Meaning | Example |
|---|---|---|---|
MITNAHME |
Anlass | Item is included if any (OR) of its tags is selected for the trip | tag "Strand" → towel comes along |
BEDINGUNG |
Voraussetzung | Item is included only if all (AND) of its BEDINGUNG tags are selected; if both types are present, both must match (AND across groups) | "Winter" + "Berge" → ski gear |
KATEGORIE |
gilt für | One checklist row per selected category tag | socks per traveling person |
MODIFIER |
Filter-Tag | Does not affect trip item selection — extra info/filter only (WIP) | — |
Item names support quantity placeholders like {days} / {nights} (with optional min/max), rendered per trip.
Project Structure
.
├── backend/ # FastAPI backend (SQLAlchemy models, routes, Liquibase changelogs in db/changelog)
├── frontend/ # React frontend (Vite, TypeScript, TailwindCSS)
├── nginx/ # nginx reverse proxy config for production
├── release-notes/ # per-version release notes
├── DEPLOY.md # production deploy, backup & rollback runbook
├── docker-compose.yml # Development compose file
├── docker-compose.prod.yml # Production compose file (use this ALONE for prod)
└── README.md
Branches
main— current, deployed single-user MVP (no accounts yet). SeeDEPLOY.mdfor production deploy/backup/rollback.user-accounts— WIP, not merged: JWT auth (register/login), superuser admin (user management), and teams ("Packlisten": invite by email, accept, switch active team, rename/leave). Open work there: the core data routes (/items,/tags,/trips,/trip_items) are not yet auth-protected or scoped to the active team, and frontend routes aren't guarded yet.
Roadmap (future ideas)
- Reset trip items — un-check everything for a trip
- Notes per trip
- Export / import all data
- Better item creation form; trip creation dialog should reuse the tag component
- Real user accounts (in progress on
user-accounts: auth, teams, admin) - PWA — installable, works offline
- Live reload of trip items across devices
- Dark mode
- Weather forecast for the trip destination/dates
- Automated deployment (CI/CD pipeline)
Development Setup
Prerequisites
Start in Development Mode
docker compose up --build
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000 (docs at
/api/docs) - Database: localhost:5432 (Postgres)
Production Deployment
⚠️ Use the prod compose file alone — merging in docker-compose.yml adds bind mounts that shadow the built frontend assets:
docker compose -f docker-compose.prod.yml up --build -d
- The app is served on port 80 via nginx (behind the external
nginx-proxynetwork). - The backend is proxied at
/api. - Liquibase migrations run automatically before the backend starts; one-shot DB backups and the full rollback procedure are documented in
DEPLOY.md.
Environment Variables
- Set environment variables in a
.envfile or directly in the compose files. - For the frontend,
VITE_API_URLis set to/apivia build arg in the prod compose file.
Useful Commands
- Rebuild after code changes (prod):
docker compose -f docker-compose.prod.yml up --build -d - Back up the database:
docker compose -f docker-compose.prod.yml --profile tools run --rm packlist-db-backup - Stop all containers:
docker compose down - Remove all data (danger!):
docker volume rm packlist_db_data
Troubleshooting
- If the frontend uses the wrong API URL, ensure you rebuild the frontend image after changing
VITE_API_URL. - If you see database connection errors, check that the
packlist-dbservice is running and reachable from the backend. - If pages return 502 after a deploy, recreate nginx (
docker compose -f docker-compose.prod.yml up -d --force-recreate nginx) — it caches upstream IPs.
License
MIT License
Author
Felix (and contributors)