feat: Initial release of LOADOUT - Travel Manifest & Bag Allocation System
This commit is contained in:
commit
805f3fe97a
26 files changed
+7618
No files matched your search
@@ -0,0 +1,82 @@
|
||||
# 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
|
||||
Reference in new issue
Block a user