A paper-and-ink "field notebook" SwiftUI workout logger (Poppins type, hairline rules, four color schemes) with per-set tracking, drop sets, previous-lift ghosts, a rest timer, muscle-recovery visualization, routines, and progression statistics. Built with SwiftData (all data stays on device).
Arete is open source under the MIT license, built by Rayze.
Requires Xcode 15+ and targets iOS 17+.
- Open Xcode → File → New → Project → iOS → App.
- Name it
Arete, Interface: SwiftUI, Language: Swift, Storage: None (we set up SwiftData in code). - Delete the generated
ContentView.swiftandAreteApp.swift. - Drag the entire
Arete/source folder from this repo into the project navigator (check "Copy items if needed" and add to the app target). - Build & run on a simulator or your iPhone.
brew install xcodegen
cd <repo root> # the folder containing project.yml
xcodegen generate
open Arete.xcodeproj| Tab | What it does |
|---|---|
| Home | Body Freshness meter + Train Next recommendation, muscle-readiness body diagram (green = fresh, red = fatigued), last-7-days calendar (dot color shows how hard each day was, green → red; purple = cardio-only), recent workouts, and the + to start a freestyle workout or one from a routine. |
| Routines | Build named routines (exercises + set counts, reorderable). "Start This Workout" pre-logs everything with empty sets. |
| Stats | Pick any exercise → best lift, top-set weight progression chart, session volume chart, and a full log of every past session. |
| More | Add/Edit Exercises (assign primary/secondary muscle groups, which drive search, categorization, and recovery; ⋯ menu has Reset to Default), Train Next Settings (recommendation style + per-muscle bias/exclude preferences), Enable App Features (toggle Body Freshness, Train Next, Muscle Readiness, DD/MM dates; an Effort section with RPE/RIR options; and Experimental Features gating Minor Muscle Groups + Developer Mode), Change UI (four notebook color schemes), and Wipe All Workouts (double-confirmed). |
- Tap + on Home → name the workout and add notes → Start Logging.
- The + Add Exercise bar opens the picker — a pale-blue Add Cardio button at the top leads to the time-based cardio menu, and below it you can search lifts by name or muscle ("triceps" finds all your triceps work); recently used exercises come first.
- Each exercise card starts with one set. The PREV column shows what you
lifted last time for that same working-set position (warm-ups excluded;
drop sets show their initial portion;
0×0if there's no history). Tap the ghost to autofill. - Per set: weight, reps, Effort, and notes. The ⋯ menu marks a set as a Warm-up or Drop Set — drop sets get a subset list where you log each drop's weight and reps.
- The clock button on an exercise shows every past session for that exercise.
- Reorder (toolbar) lets you drag exercises into a new order.
- The Rest Timer button opens the countdown: 1/2/3-minute presets, ±15s nudges, free-form entry ("1:30" or "90"), and a ★ to save any custom time as a favorite.
Every filled-in working set adds fatigue to the muscles that exercise hits (planned sets left at 0×0 don't count), scaled by the set's Effort — RPE or RIR, whichever style is active — on an exponential curve (sets with no Effort logged assume ~8 RPE). Per-muscle sets past ~6 in one workout count sublinearly. Fatigue decays back to zero over each muscle's recovery window — legs/back ~4 days, chest ~3, shoulders/arms ~2, calves/forearms/abs ~1.5 — so freshness (0–100) regenerates each day you don't train the muscle. Cardio bleeds a little fatigue into the legs.
A separate Body Freshness score (0–100 on the Home tab, 100 = fully recovered) is a linear recovery budget: each workout deposits a cost from its per-set Effort (damped past ~15 sets), tonnage relative to your recent median (capped 0.75–1.25×), and cardio, and the budget drains at a fixed rate per day. A small chronic term accumulated over ~4 weeks tightens the cycle during long training streaks. The Today card turns this into a recommendation — rest once freshness hits 50% or below, otherwise the freshest muscle groups (with bias/exclude preferences and a nudge toward long-untrained muscles) or the best-fit routine. More → Train Next Settings picks the style and preferences.
All tuning knobs live in Models/RecoveryEngine.swift (maxFatiguePerSet,
rpeFalloff, acuteRecoveryPerDay, acuteScale, chronicHalfLife,
restThreshold, …) and Models/Models.swift (recoveryDays, cardio
intensity per activity).
Arete uses semantic versioning. Every release is tagged and published on the Releases page, with changes documented in CHANGELOG.md.
Current version: v0.2.0
Issues and pull requests are welcome. See CONTRIBUTING.md.
Arete has no accounts, no analytics, and makes no network calls — every workout is stored on-device with SwiftData and never leaves your phone. The privacy policy is published at rayzecompany.github.io/arete/privacy.html.
MIT © 2026 Rayze
The bundled Poppins fonts are licensed separately under the SIL Open Font License 1.1.
Arete/
├── AreteApp.swift — app entry, SwiftData container
├── Theme.swift — paper/ink palette, Poppins fonts, freshness colors
├── Models/
│ ├── Models.swift — SwiftData models (Workout, Exercise, Set, Drop, Routine, RestPreset)
│ ├── RecoveryEngine.swift — freshness/fatigue math + previous-lift lookup
│ └── SeedData.swift — starter catalog (80+ lifts) + routines, versioned migrations
└── Views/
├── RootTabView.swift — tab bar, More menu, Train Next + App Features screens
├── HomeView.swift — readiness, 7-day calendar, start workout, founder note
├── BodyDiagramView.swift — front/back human figure heatmap
├── WorkoutLogView.swift — active workout log, reorder, rest/add-lift bar
├── ExerciseCardView.swift — sets, prev ghosts, warm-up/drop menus
├── ExercisePickerView.swift — search by name/muscle, recents first
├── RestTimerView.swift — countdown, presets, favorites
├── ExerciseHistoryView.swift— past lifts per exercise
├── ExercisesManageView.swift— exercise CRUD + muscle categories
├── RoutinesView.swift — routine builder + start
├── StatsView.swift — dashboard pages, charts, lifetime logs
├── WorkoutHistoryView.swift — full workout log (View All)
└── Components.swift — numeric fields, muscle tags, ruled panels