• v1.0.0-Beta.05 14e2a7120b

    v1.0.0-Beta.05
    All checks were successful
    CI / check (push) Successful in 1m26s
    Release / release (push) Successful in 2m2s
    Docker Release / build-and-push (push) Successful in 4m29s
    CI / tests (push) Successful in 5m8s
    Pre-release

    k4wit0 released this 2026-09-01 18:07:30 +02:00 | 62 commits to main since this release

    The phone: icon, zones, sessions that end and imports that speak

    Fixed

    • The installed application wears the mascot on a phone. The manifest declared
      one icon and it was an SVG; Chrome on Android will not take a vector for a
      home-screen icon, and with nothing it could use it kept whatever it already
      had — the dumbbell that came before the mascot. The same drawing now ships as
      PNG at 192 and 512, with a square-edged 512 for maskable so the platform's
      own mask has a full plate to cut from, and an apple-touch-icon because iOS
      never reads the manifest for that one.
    • The icon is one named face rather than whichever one was on screen.
      scripts/icon.ts took the first svg.mascot it found, and which of the ten
      moods that is depends on the account that happened to be open — so the
      identity of the application was decided by somebody's training week, and a
      rebuild could quietly change the face on every home screen. It signs out
      first, asks for meeting by name, and refuses to write anything if that face
      is not there.
    • The icon's plate is the canvas colour. It was left on #121212 when the
      canvas moved, so it sat a shade lighter than the screen it opens.
    • Finishing a session ends it. finish() recorded the workout and then left it
      in the signal, and the Train tab asks that signal before it asks the device —
      so touching Train after finishing walked straight back into the workout that
      had just ended, every exercise still there, and the only way out was the menu
      again. clear() existed for exactly this and nothing had ever called it.
    • A session says when it is over. Every exercise asks "done, or one more?" when
      its sets are in; the last one was answered and the screen then sat there with
      nothing owing, nothing to do and nothing saying so. The way out was behind
      the three dots, which is where somebody goes to abandon a session rather than
      to complete one.
    • Importing an activity says it worked. The message was written into the notice
      and then onChanged redrew the screen, throwing away the node it had just
      been written to — so a successful import said nothing at all, and only the
      new session appearing behind the sheet suggested anything had happened. It is
      a toast now, which lives outside what is being redrawn. Errors stay in place:
      a failure is to read and act on, not to glance at before it slides away.
    • The upload sheet closes when the file is in, and its file control is a button
      of ours rather than the browser's grey "Choose file / No file chosen" under a
      label repeating the title of the sheet it was in.
    • Time in zones is laid out. .zone-bars was a class with no rule anywhere in
      the stylesheet, so it rendered as the browser's own list — discs down the
      margin, and three inline spans with nothing between them, which ran the
      zone's range and the time spent in it together as one number: "Zona 1
      114–1265:55". Nothing looks wrong reading the stylesheet, because the rule
      that would be wrong is not there. Each zone is now its name, its range and
      its time on one line with the bar underneath at full width, and a zone with
      no time in it draws an empty track rather than a stub that says "a little".
    • A watch file can be chosen on a phone. Chrome on Android turns the file
      input's accept list into an intent filter, and it can only use the entries
      it can map to a MIME type — .fit and .tcx are not in Android's table, so
      what reached the picker was "XML" and a watch file was not something that
      could be picked. The same screen worked from a computer, which is how a
      filter that exists on one platform only manages to hide.
    Downloads