Files
hemx/examples/workout/README.md
T
slhx agent a514237b09 feat(workout): complete mobile session flow
Make Workout Copilot behave like a finished phone-first session: rest/next state, progress, undo recovery, finish/export, replayable local log, and host proof controls tucked behind product states.

req: examples/001

req: local/001

req: local/003

req: local/004

req: host/002
2026-06-11 23:15:55 +02:00

2.4 KiB

Now-first Workout Copilot example

This is the phone-first local-first product exemplar for hemx. It shows a complete useful session: next action shown, set completed, rest/next state entered, progress updated, mistakes undone, workout finished, and the result exported or replayed without storing DOM patches or UI update payloads as truth. req: examples/001 req: local/001 req: local/003 req: local/004

Run

cargo run --bin hemx-workout-example

Open http://127.0.0.1:3028.

If the port is busy, pick another address:

HEMX_WORKOUT_ADDR=127.0.0.1:3030 cargo run --bin hemx-workout-example

The server prints the URL it bound. A bind failure means another process owns the address; retry with HEMX_WORKOUT_ADDR instead of changing app code.

Test

cargo test -p hemx-workout-example

The E2E test starts the real HTTP binary, loads the page, checks the shared runtime asset, submits workout interactions, decodes hemx effect responses, and replays exported events back into a projection. Unit tests cover rest/next, finish, undo recovery, export replay, and host-result boundaries. req: test/001 req: examples/001

For the full repository gate:

cargo run -p hemx-xtask -- test

Deploy shape

The deployable artifact is the Rust server binary plus the generated hemx resources embedded by the build script:

cargo build --release --bin hemx-workout-example
HEMX_WORKOUT_ADDR=0.0.0.0:8080 ./target/release/hemx-workout-example

Put a normal reverse proxy or platform router in front of that port. The app serves the shared hemx runtime through hemx-axum; there is no frontend build, Node runtime, Expo/Ionic/Tauri shell, or handwritten selector UI JavaScript to ship. req: axum_integration/005 req: examples/005

Boundaries proven

  • Core workout logging works without network availability once the page/runtime is loaded: commands/events/projections are app truth, including rest/next, finish, and undo recovery. req: local/001
  • Browser/PWA export uses the host capability contract and the host result returns through app code before UI effects. req: host/001 req: host/005
  • Native-shell-shaped haptic acknowledgment uses the same host call/event path without giving the shell ownership of workout state. req: host/002
  • Sync, backup, auth, AI/STT, provider policy, and conflict handling are not hidden in hemx core or the example runtime; they remain explicit app or integration decisions. req: local/002 req: local/003