A workout tracker that runs on Android, Windows, iOS, macOS, and the browser from one Blazor UI. You plan workouts and log sets against a rest timer that keeps running while you switch apps. Progress shows in a heatmap, charts, and automatic personal records. Your data stays in local SQLite. The app works offline.
An AI assistant with 15 tools answers questions about your training and edits your plans. The same tools are open to external agents over MCP.
Download the latest build from the releases page, or use the direct links below.
Windows runtime note. Install the .NET 11 Desktop Runtime once.
- Allow Install unknown apps for your browser
- Open the APK and install
Extract the ZIP file, then run Physiquinator.exe. If the app does not start, see WINDOWS-INSTALL.md.
Every v* tag builds a signed APK and a Windows package via .github/workflows/release.yml. Updates keep your local SQLite data. The app checks GitHub releases on start and shows an update prompt in Settings.
First launch seeds sample plans and workouts.
Live workout, Plans home, AI assistant
Activity history, Session summary, Exercise detail
Create plan, Edit plan, Settings
- Plans. Build plans with custom exercises, per-exercise rest, sets, and reps. Duplicate any plan. Undo removes the copy.
- Logging. Log weight and reps, bodyweight reps with added load, or duration. Each set pre-fills from your last session of the same plan. Names autocomplete from the catalog and your history. Custom names still save.
- Supersets. Group exercises into supersets. The workout shows the partner up next and skips the rest between the two.
- Rest timer. Count down with add-time, reset, skip, and pause. Progress counts completed time, not just sets. On Android the timer floats over other apps from a foreground service, with sound, vibration, and exact alarms.
- History. Read the 53-week heatmap, per-exercise charts with PR markers, and automatic records for weight, reps, volume, and session length. Streaks respect your training days. Open any session to edit its sets, continue it, or delete it.
- Session compare. Pick two sessions and compare them side by side.
- Bodyweight. Log bodyweight daily and read the trend by range. Calisthenics volume counts a share of your bodyweight. Push-ups count 65%, pull-ups 100%. Charts use 70 kg where you logged no weight.
- Share cards. Copy a session as text or save it as a PNG card. You pick the parts and the theme.
- AI assistant. Chat in the app with streaming answers. The assistant works through 15 tools that read plans, history, bodyweight, and settings.
generate_deload_plancuts volume for a light week.calculate_progressive_overloadsets next targets from recent sessions. - AI providers. Use OpenAI, OpenRouter, OpenCode, local Ollama, or any OpenAI-compatible endpoint. Fetch the model list from the endpoint and test the connection before you save. Custom instructions steer every chat. No API key? The clipboard bridge carries your context and the action schemas to Gemini or ChatGPT and back. You review each action as a diff before the app applies it.
- Agent API. The web host exposes the same 15 tools at
/mcpover Streamable HTTP for MCP clients. Destructive tools ask for confirmation. SetMcp__ApiKeybefore you expose the host. Browser clients also needCorsOriginsinappsettings.json. - Profiles and backup. Switch one-tap profiles, each with its own database. Export and import plans, history, or everything as JSON. You preview the contents before you apply them.
- Themes and settings. Pick from 15 themes or follow the OS. The native chrome follows your pick. Set kg or lb, rest alerts, the floating bubble, and your training days. Settings has search.
- Web and browser.
Physiquinator.Webserves the same UI with cookie auth and per-account SQLite mirrored to IndexedDB. It answers/healthzand needsMcp__ApiKeyin public, so serve it behind HTTPS.Physiquinator.Wasmruns with no server and no accounts, keeps per-browser SQLite with a 20-second autosave, and installs as an offline PWA. Clearing site data deletes history, so export from Settings regularly. Browser AI calls need CORS headers, so setOLLAMA_ORIGINSfor Ollama. The WASM host has no/mcp.
| Area | Choice |
|---|---|
| Runtime | .NET 11 SDK, see global.json, plus the MAUI workload |
| UI | Blazor Hybrid, one Razor tree in Physiquinator.UI for native, web, and WASM |
| Hosts | Native host Physiquinator covers Android, iOS, macOS, and Windows. Physiquinator.Web serves the UI and /mcp. Physiquinator.Wasm ships the static build |
| DB | SQLite storage with sqlite-net-pcl, offline-first, one database per profile |
| AI | SSE client with tool loops for OpenAI-compatible endpoints. ModelContextProtocol.AspNetCore serves MCP |
| Timer | Android foreground service with draggable overlay, sound, vibration, and exact alarms |
| Tests | xUnit, Playwright e2e in tools/web-e2e, screenshots in tools/screenshot-generator |
git clone https://github.com/kadato/Physiquinator.git
cd Physiquinator
dotnet restore
# Run on Windows
dotnet build -t:Run -f net11.0-windows10.0.19041.0
# Run on Android (device/emulator)
dotnet build -t:Run -f net11.0-android
# Run the web client (includes the MCP server on /mcp)
dotnet run --project Physiquinator.Web
# Enable format checks and commit linting (one time)
./install-hooks.shCI runs the same build, test, and format checks on every push and PR, plus SonarCloud analysis with coverage.
Other commands:
dotnet test Physiquinator.Tests/Physiquinator.Tests.csproj
dotnet run --project Physiquinator.Web --urls http://localhost:8080 # then: cd tools/web-e2e && npm testTo target another host, set PLAYWRIGHT_BASE_URL. To regenerate the docs screenshots, build Physiquinator.Web once, then run node tools/screenshot-generator/screenshot-web.js.
- WINDOWS-INSTALL.md - Windows setup and troubleshooting
- docs/theming.md - how to add a theme