# SneakySwole Roadmap ## V2 Improvements Each improvement is implemented as a separate branch/PR. Implementation order matters — auth removal goes first since other features depend on the simplified profile flow. --- ### ~~1. Easier Profile Selection~~ ✅ Complete **Branch:** `feature/remove-auth` (merged in `758034b`) Strip all authentication entirely — this is a homelab app, no need for login. When the app opens, the landing page (`/`) shows a profile picker with cards for each user. Selecting a profile sets an `active_profile_id` cookie that persists across sessions (per-device, until the user switches profiles or clears cookies). **What gets removed:** - Admin login flow (login page, bcrypt password verification, session tokens) - `is_admin` and `password_hash` fields from the users table - `auth_service.py`, `auth.py` routes, `login.html` template - `bcrypt` and `itsdangerous` dependencies - Auth dependency (`get_current_admin_user`) from all route handlers **What gets added/changed:** - `/` becomes the profile picker page (cards with name, height, weight, and "Select" button) - `require_active_profile()` dependency replaces auth — just checks for the cookie - `NoProfileSelectedError` handler redirects to `/` if no profile is set - `NavContextMiddleware` simplified to only read the `active_profile_id` cookie - Nav bar always shows profile switcher dropdown (no admin gating) **Edge cases:** - No profiles exist → show "Create Profile" link - Cookie references a deleted profile → middleware returns None, redirect to picker - Existing DB with admin row → migration deletes it --- ### ~~2. Schedule Adjustment — "Workout Now" Flow~~ ✅ Complete **Branch:** `feature/workout-now` (committed in `4b117c6`) | **Depends on:** #1 merged Replace the `/workouts` page (static list of all 4 days) with a smart "Workout Now" page that auto-recommends the next workout in the Push → Pull → Lower → Full Body cycle based on the user's last completed session. **How it works:** 1. User selects profile → navigates to `/workouts` 2. App queries the most recent `workout_session` for that profile 3. Determines next day in cycle (e.g., last did Push → recommend Pull). No history defaults to Push. 4. Page shows all 4 workout types as cards, with the recommended one visually highlighted (`Recommended Next`, primary button vs outline for others) 5. User clicks "Start Workout" on any card → goes to that workout's exercise page 6. Once on a workout, a "Change Workout" button is visible to switch types (soft lock — not hard-locked, but the UI keeps you focused on the chosen workout) **Card-based approach (no JS):** The recommendation is shown via highlighted cards rather than a dropdown/select. This follows the project's HTMX-first principle — no JavaScript needed. **Display context:** Show "Last workout: Pull on Mar 10" message on the page so the user understands the recommendation. **Edge cases:** - Same-day multiple workout types → creates separate sessions (existing behavior, correct) - No profile selected → show "pick a profile first" message with link to `/` --- ### 3. Automatic Scaled Workout Reps / Sets / Weights — 6→12 Rep Ladder **Branch:** `feature/rep-ladder-progression` | **Depends on:** #1 merged Replace the current wk1/wk4 target system with a fixed, universal rep ladder progression. Every exercise follows the same pattern: **Progression model:** - **Rep ladder:** 6 → 8 → 10 → 12 reps at current weight - **Weight increase:** At 12 reps with all sets marked "felt easy" → +5 lbs, reset to 6 reps - **Hold:** If not all sets felt easy at current reps → stay at current reps/weight - **Climb:** If all sets felt easy but below 12 reps → move to next step in ladder - **Deload:** After 4+ consecutive sessions struggling (none felt easy) → reduce weight by 20%, reset to 6 reps - **Always 3 sets** per exercise **Schema change:** Simplify `user_exercise_programs` table — keep only `starting_weight` per user/exercise (migrated from existing `wk1_weight` data). Drop `wk1_reps`, `wk4_reps`, `wk4_weight` columns. The existing 40 rows of programming data (20 exercises × 2 users) are preserved as starting weights. **Starting weight behavior:** - Exercise with no log history → suggest starting_weight at 6 reps, 3 sets - Exercise with log history → progression engine picks up from last logged values **UI change:** Replace the Week 1/Week 4 target display on exercise cards with a rep ladder progress bar showing the 4 steps (6, 8, 10, 12) with the current position filled in. **Bodyweight exercises** (weight = "BW"): Weight increase is skipped. User climbs the rep ladder and holds at 12 reps. **Data continuity:** The 55 existing workout log entries are unchanged and feed directly into the new progression engine. The progression_service.py gets a full rewrite of `get_suggestion()` with the new ladder logic. --- ### 4. Export Workout History as CSV **Branch:** `feature/csv-export` | **Depends on:** #1 merged Add a CSV export section to the dashboard page with a date range picker (default: last 30 days) and a "Download CSV" button. **CSV format — one row per set:** | Column | Description | |--------|-------------| | date | Workout session date (ISO format) | | workout_type | Push / Pull / Lower / Full Body | | exercise | Exercise name | | set_number | Set number within that exercise | | reps | Reps completed | | weight | Weight used | | felt_easy | Yes / No | **Implementation:** - `GET /dashboard/export?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD` returns a CSV file download - Uses standard HTML form GET (not HTMX — HTMX can't trigger file downloads) - `StreamingResponse` with `Content-Disposition: attachment` header - Filename: `sneakyswole_{profile_name}_{start}_to_{end}.csv` - Date range defaults: start = 30 days ago, end = today. Invalid dates fall back to defaults. **Edge cases:** - No data in range → CSV with headers only (valid empty CSV) - No profile selected → redirect to dashboard - Large date ranges are fine — even a year of heavy use is ~3,000 rows --- ## Implementation Order ``` 1. Remove Auth ✅ ──┬──> 2. Workout Now ✅ ├──> 3. Rep Ladder Progression (can be parallel with 4) └──> 4. CSV Export (can be parallel with 3) ``` --- ## Future Ideas - Exercise video/image attachments - Custom workout program builder