Skip to content

Releases: Workstr7blo/workstr-web

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 12:57

Added

  • A monthly workout calendar at the top of History. Every day you trained is filled in,
    graded by how many sets you completed, with a count when you trained more than once that
    day. Move between months or jump back to the current one; picking a day selects it. Three
    cards underneath say how many workouts you have done this month, how many weeks in a row
    you have trained, and how long it has been since your last session. Every state reads
    without relying on colour, each day carries its full date and workout count for screen
    readers, and the grid fits a 320px phone without sideways scrolling.

  • Repeat workout. Any completed session can start the next one. Expand a workout in
    History and tap Repeat workout: it rebuilds from what that session actually recorded, so
    it still works after the original program was edited or deleted, and it carries normal,
    superset and EMOM structure alike. The weight you finished each exercise on last time is
    offered as the starting value; nothing counts as logged until you complete the set. The
    original workout is never modified, and a session too old to hold what you trained says
    so on a disabled button rather than starting something broken.

Changed

  • History is grouped by day and follows the calendar. Completed sessions now sit under
    Today, Yesterday or a dated heading instead of running together in one list, and picking
    a day on the calendar shows just that day's workouts with a "Show all" way back. Deleting
    a session has moved behind a "More actions" disclosure so it is no longer sitting next to
    Publish summary; it still asks for confirmation. Deleting the last workout on the day you
    were viewing returns you to the full timeline instead of an empty screen.

Fixed

  • The training streak now counts the days you actually trained. It derived each workout's
    day in UTC and then compared it against your device's local midnights, so depending on
    your timezone an evening or early-morning session could land on the wrong day and break
    or extend a streak that was intact. History and Statistics now answer "which day was
    that?" the same way, using the day the workout finished in local time.

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 12:02

Changed

  • A mixed session now runs as one workout instead of two. Finishing the strength half
    no longer offers "Start EMOM" and "Finish session" as equal choices: the EMOM section
    takes the advance slot as "Next: EMOM", and ending there is demoted to a quiet "Finish
    early", matching the EMOM half's own early exit. Every strength card names its section
    ("Strength · Exercise 2 of 3 · EMOM next") so reaching the last exercise never reads as
    reaching the end, and the progress bar now spans both sections rather than filling to
    100% while a whole EMOM block is still ahead.

  • Mixed program details split into Strength and EMOM. Opening a program that combines
    both now shows each half under its own heading, in the order the session trains them,
    with its own exercise count and time. Timed exercises are described by rounds, interval
    and work duration instead of the sets, reps and rest a timed step never had, and an
    exercise used in more than one EMOM section reports each section's own numbers.

Removed

  • The vestigial plan object store is gone, at an IndexedDB upgrade to database
    version 2. It was created by version 1 and never read or written, so opening an existing
    database simply drops it and new databases never create it — no data moves and nothing
    is lost. Backups keep working in both directions: exports no longer carry a plan
    section, and an older export file that still has one imports fine.

Fixed

  • The countdown beeps now cover a timed EMOM step's own work phase. Cues followed the
    interval clock, so a step that finished before its interval did counted down only the
    recovery that followed it and the work timer ran out in silence. Work and recovery each
    count down on their own clock, and a step that fills its whole interval still beeps once
    per second rather than twice.

  • The time on a program's EMOM summary counted only the EMOM half while the program card
    counted the whole program, so a mixed program advertised two different durations. Both
    now come from one estimate and agree.

  • Countdown beeps no longer go silent after the first EMOM round. When the device
    interrupts the audio session mid-workout, the app now recovers instead of dropping
    every later cue: an inaudible keep-alive source holds the audio session open through
    the quiet part of each round, a resume that never completes can no longer latch audio
    off for the rest of the session, and any touch inside a live session re-primes sound.
    Settings reports the audio state next to the version.

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 01:00

Changed

  • Retired relay and catalog-source names are migrated to current Workstr vocabulary
    when an existing local database opens.

Added

  • Mixed program builder sections. A program can now combine a normal strength
    portion with EMOM sections, and EMOM sections can hold multiple movements in the same
    interval for superset-style timed work.
  • Live supersets. Normal programs can pair consecutive exercises into grouped
    rounds. The live runner advances through every movement before starting round rest,
    stores block/round/step coordinates with each set, and labels supersets in history.
  • EMOM program blocks. Programs can define rounds of one or more timed intervals,
    including several duration-based exercises inside the same interval. The live runner
    reconciles from wall-clock time, restores unfinished EMOM sessions, and logs actual
    reps independently from prescribed work duration for training statistics.

Fixed

  • Mixed normal + EMOM programs now run the normal strength section before opening the
    EMOM timer instead of treating the presence of any EMOM block as EMOM-only.
  • Starting the EMOM half of a mixed session no longer discards the strength half's start
    time. The session clock continues from where the strength work left off instead of
    resetting to zero, and finished-session duration counts both halves.
  • A mixed session can be finished from the strength half. The handoff moved to its own
    "Start EMOM" button, which appears once every prescribed strength set is logged, so the
    finish button always finishes.
  • Program cards estimate a mixed program as its strength section plus its EMOM sections,
    and list the exercise and superset counts alongside the EMOM label rather than hiding
    them behind it.
  • The program builder refuses to place one exercise in both the strength and EMOM halves,
    which previously saved without complaint and then silently dropped the strength copy.

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 15:58

Added

  • Starter programs. A fresh install now ships with three beginner programs —
    Foundation Full Body, Core Stability Starter, and Legs & Glutes — and the ten exercises
    they use. The app is usable offline, with no account and before Discover has ever been
    opened. The seed is the operator's own signed catalog events, so a seeded entry is
    identical to the imported one: Discover reports it as already in your library instead of
    offering a duplicate, and still offers an update if the catalog entry is republished.
  • Settings shows the running app version.
  • Support Workstr. A zap-first support panel in Settings with the project's Nostr
    identity, a canonical "Zap on Nostr" action, and a copy button for the npub. Below it,
    a live funding panel shows what came in this month against the published 85,000 sats
    monthly running cost — read directly from public NIP-57 zap receipts, with no account,
    analytics or server. Plain Lightning and on-chain routes are not presented as separate
    donation paths. Only receipts signed by the wallet provider are counted, and when the
    relays cannot be reached the panel says the total is unknown rather than reporting zero.

Changed

  • Seeding is backfill-only and applies once per account: a starter exercise you delete
    stays deleted, a program you edit becomes your own, and anything already occupying a
    slot is left untouched.

Fixed

  • Rest timers now reconcile against wall-clock time after iOS suspends and resumes the
    installed PWA.
  • Android opens mobile signer deep links in the existing app context instead of leaving
    users in a blank browser window.
  • Exercise images loaded from the Workstr catalog are cached for offline cold starts.

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 08 Aug 03:31

First tagged release. The app is feature-complete as a local-first tracker with a working
Nostr read path; it is versioned here so releases are traceable while v1.0 is finished.

Added

  • Training — live session runner with rest timer, wake lock, per-set logging, and a
    finish-and-review flow. Sessions store a denormalized snapshot of what was trained, so
    history survives later library changes.
  • Exercise library — browse, search, filter by category, muscle, equipment and
    difficulty, mark favourites, remove entries. Filled from the Workstr catalog rather
    than authored locally.
  • Owned equipment — record the equipment you actually have; drives a "My equipment"
    filter and keeps generated workouts from proposing exercises you cannot do. Bodyweight
    movements stay available under every kit.
  • Programs — program builder with ordered exercises, per-exercise targets, stable
    slugs, and a browsable library picker.
  • Progress — weekly volume, muscle distribution, estimated-1RM records, training
    streak, and a body-weight log.
  • Recovery — muscle recovery state computed from session history, rendered as a body
    map, plus a one-tap Quick Workout drawn from recovery state and owned equipment.
  • Workstr catalog — Discover reads operator-signed exercises (kind 33401) and
    programs (kind 33402) from public relays, verifies every signature, merges across
    relays, dedupes by address, and caches events for offline use. Import copies a
    snapshot; programs pull in their exercises through a dependency walk; bulk select
    imports many at once.
  • Update detection — imported rows keep their origin address and timestamp, so a
    newer catalog event surfaces as an available update rather than a duplicate.
  • Optional Nostr identity — NIP-07 and NIP-46 sign-in from Settings, with a QR
    connect flow for remote signers and cached signer sessions.
  • Local-first accounts — the app opens straight into training with no identity at
    all. Signing in adopts the anonymous account's data into a per-pubkey database;
    namespaces are never merged, and signing out returns to the anonymous account.
  • Workout summaries — publish a session summary as a kind:1 note to a broad write
    relay set, with the program's muscle map attached when one exists. Publishes are only
    reported as successful when a relay actually acknowledged the event.
  • Data export — JSON export and import of the entire local database, from Settings.
  • PWA — installable, offline-capable, with a same-origin service worker cache and a
    capped image cache.

Notes

  • Weights are stored canonically in kilograms; the display unit is a user preference.
  • session_sets.rpe exists in the schema but is never written — see ROADMAP.md.