No description
Find a file
2026-11-02 22:21:51 +01:00
backend feat(trips): per-trip discarded state with settled_at, discard button and filter pill 2026-11-01 23:24:09 +01:00
frontend style(trips): mute discarded items; docs: drop discard roadmap entry, add README convention 2026-11-02 22:21:51 +01:00
nginx fix: unique service names in docker-compose 2025-09-23 14:48:07 +02:00
.dockerignore feat: add .dockerignore 2025-09-22 19:57:55 +02:00
.gitignore feat(tags): clearer tag-type labels, inline hints and type icon badge on tags 2026-11-01 14:13:48 +01:00
AGENTS.md style(trips): mute discarded items; docs: drop discard roadmap entry, add README convention 2026-11-02 22:21:51 +01:00
DEPLOY.md docs(deploy): use prod compose file only — merging the dev file shadows built assets via bind mounts 2026-11-01 13:43:51 +01:00
docker-compose.prod.yml chore(deploy): guard liquibase 0004 with precondition; add one-shot db backup service and DEPLOY.md 2026-11-01 13:22:34 +01:00
docker-compose.yml fix(compose): ungate liquibase service so prod 'up' resolves depends_on (changesets are idempotent) 2026-11-01 13:33:33 +01:00
Dockerfile feat: add Dockerfile for containerized backend application setup 2025-09-03 22:26:17 +02:00
README.md style(trips): mute discarded items; docs: drop discard roadmap entry, add README convention 2026-11-02 22:21:51 +01:00

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_at timestamp 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). See DEPLOY.md for 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

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-proxy network).
  • 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 .env file or directly in the compose files.
  • For the frontend, VITE_API_URL is set to /api via 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-db service 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)