83 lines
4.3 KiB
Markdown
83 lines
4.3 KiB
Markdown
# LOADOUT // Travel Manifest & Bag Allocation System
|
|
|
|
> **LOADOUT** is a tactile, retro-ephemera inspired travel packing manifest and luggage allocation system designed for purposeful travelers. Built with a boarding pass and cargo ticket aesthetic, continuous post-trip debrief learning, and modular bag management ("What goes in what bag").
|
|
|
|
---
|
|
|
|
## Key Features
|
|
|
|
### 1. Boarding Pass & Retro Ephemera Aesthetic
|
|
* **Distinctive Swiss Grotesk & Telemetry Monospace**: Uses `Bebas Neue` uppercase departure board headers, `Space Grotesk` structural typography, and `IBM Plex Mono` for flight codes, weights, and timestamps.
|
|
* **Tactile Perforated Stubs**: Items are rendered as tear-off baggage coupons with circular notch punchouts and dashed perforation lines.
|
|
* **Canary Yellow & Gate Orange Accents**: High-contrast utilitarian colorway with rubber stamp badges (`[STOWED]`, `[EXCLUDED]`, `[WISHLIST]`).
|
|
* **Built-in Tactile Web Audio**: Physical paper tear sounds upon checking off items and mechanical stamp thuds when stowing bags or filing debriefs—zero audio file downloads required.
|
|
|
|
### 2. Luggage Allocation ("What Goes In What Bag")
|
|
* Assign and visualize items across distinct containers:
|
|
* 🎒 **Personal Item / Daypack**: Under-seat essentials (passport, power bank, medications, AirPods, Kindle, cables).
|
|
* 🧳 **Carry-On Roller**: Overhead compartment (clothes packing cubes, 3-1-1 TSA compliant liquids pouch).
|
|
* 📦 **Checked Luggage**: Cargo hold (full-size liquids > 100ml, trekking poles, pocket knives, heavy boots).
|
|
* 🧥 **Worn on Person**: Travel day outfit (heaviest jacket, boots, watch to minimize bag weight).
|
|
* Dedicated visual bag overview cards with individual capacity meters and TSA advisory reminders.
|
|
* One-click re-allocation to move any item between bags on the fly.
|
|
|
|
### 3. Continuous Learning Loop (Post-Trip Debrief)
|
|
* At the conclusion of your voyage, launch the **Trip Debrief**:
|
|
* **Identify Deadweight (What Should Have Been Excluded)**: Tap items you packed but never used. The engine remembers this and penalizes or omits them on future matching voyages.
|
|
* **Log Missing Items (What Should Have Been Included)**: Record items you wished you had on the road. The engine automatically suggests them when planning future trips of that archetype.
|
|
* **Flight Log Archive**: Inspect accumulated packing wisdom, deadweight statistics, and learned discovery rules anytime.
|
|
|
|
### 4. Smart Heuristic Engine & AI Booster
|
|
* **Deterministic Multiplier Formulas**: Calculates clothing requirements dynamically based on days, climate, and mid-trip laundry access (e.g., 7 days with laundry caps duplicate clothing to ~4 days).
|
|
* **Optional AI Dispatcher**: Connect your local Ollama instance running on `vloser` or a cloud API key for customized destination recommendations that blend with your personal learned rules.
|
|
* **100% Offline Capability**: Full client-side fallback via `localStorage`—works seamlessly in airplane mode or remote backcountry camps.
|
|
|
|
---
|
|
|
|
## Self-Hosting with Docker & Traefik on `vloser`
|
|
|
|
Loadout is packaged as a lightweight Alpine Node container with persistent JSON storage:
|
|
|
|
```bash
|
|
docker compose up -d --build
|
|
```
|
|
|
|
### Compose Configuration (`docker-compose.yml`)
|
|
|
|
```yaml
|
|
services:
|
|
loadout:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
container_name: loadout
|
|
restart: unless-stopped
|
|
volumes:
|
|
- /home/chrisf/docker/appdata/loadout/data:/app/data
|
|
networks:
|
|
- t3_proxy
|
|
ports:
|
|
- "127.0.0.1:8478:80"
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://127.0.0.1:80/api/health || exit 1"]
|
|
interval: 15s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 5s
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.loadout.rule=Host(`loadout.vloser.us`)"
|
|
- "traefik.http.routers.loadout.entrypoints=websecure"
|
|
- "traefik.http.routers.loadout.tls.certresolver=letsencrypt"
|
|
- "traefik.http.services.loadout.loadbalancer.server.port=80"
|
|
|
|
networks:
|
|
t3_proxy:
|
|
external: true
|
|
```
|
|
|
|
Data is stored persistently in `/app/data`:
|
|
* `trips.json` — All past, active, and upcoming travel manifests
|
|
* `memory.json` — Learned exclusions, inclusions, and debrief statistics
|
|
* `settings.json` — Audio preferences and optional AI endpoint configuration
|