Skip to content

Releases: natrontech/wattroom

2026.09.147

Choose a tag to compare

@github-actions github-actions released this 26 Sep 14:38
fa3f2a8

Added

  • wattroom.ch now explains itself. The new landing page has an FTP slider that shows one workout scaled to four riders, and a sprint you can play with your thumb. New pages cover:
    • group workouts with friends
    • the seven game modes
    • a free FTP ramp test, with an FTP and zones calculator
    • riding a smart trainer from the browser
    • self-hosting
    • honest comparisons with Zwift, TrainerRoad and MyWhoosh
    • a page in German.

Changed

  • The landing page arrives finished: it draws before any script runs, and search engines, AI search and link previews read the whole page instead of an empty frame. wattroom.ch now has a sitemap, and a mistyped address answers "not found" instead of a copy of the landing.

Fixed

  • A paused session that everyone has left now ends on its own after 10
    minutes, and saves everyone's ride. Before, it waited for the coach or an
    admin to come back and press End, kept the voice channel locked to everyone
    else in the meantime, and the next update threw the rides away.
  • Strava uploads work again on servers that set WATTROOM_TOKEN_KEY. Once
    that key encrypted the stored Strava sign-ins, the uploader could not read
    them, so every ride failed to reach Strava as soon as the rider's short-lived
    access token expired. Update, then retry any failed upload from the ride's
    page. Nobody needs to reconnect Strava.

2026.09.146

Choose a tag to compare

@github-actions github-actions released this 26 Sep 08:15
1de436f

Added

  • Operators: /metrics now says how much the instance is used — accounts,
    signups and riders who rode over the last day, week and month, rides, time
    and work ridden, crews, workouts, jukebox tracks, Strava connections and
    upcoming sessions. Counts only, recounted from the database every five
    minutes, so they survive a restart; nothing names a rider or a crew.

Changed

  • Every "are you sure?" question now offers the same way out, "Keep it",
    or "Keep riding" / "Keep going" while you are mid-effort. A few had
    drifted to "Leave it", "Keep it running" and "Keep playing".
  • Deleting a channel or an account, opening your messages, and checking your
    medals no longer get slower as the server's ride and message history grows:
    the database now has an index for each of them.
  • A voice channel with playlists queued now uses a fraction of the data it
    did. The jukebox queue is sent when it changes, not every second: with a few
    long playlists queued, each second's update drops from about 14–25 KB to
    about 0.2 KB, which matters most for a phone on mobile data over a two-hour
    ride.
  • Quieter screens: the WattRoom mark glows only while something is live, Home
    no longer lists a friend in a voice channel twice (and says "Nobody is in a
    voice channel" rather than "Nobody's around" when friends are online), Join
    voice is no longer the brightest button on the riding screen, and the
    people column starts at the width it was designed for.
  • The ride graph does less work on long rides. It used to rebuild every
    second from every second of the ride, which grew heavier on phones and TV
    sticks as a ride went on. It now draws the peaks and troughs the screen
    can show, so the last hour of a long ride costs no more than the first.
  • A voice channel no longer downloads YouTube's player — over a megabyte from
    Google, running for the whole ride — until someone queues a YouTube link.
    Channels that never use the jukebox, or play only your own tracks, load
    nothing from YouTube at all.

Fixed

  • Small words are readable again in the light themes. "Start a session",
    "Start" and "Walk in" buttons, the "Reload" and "running now" labels, the
    crew switcher's "riding" count and "starting soon" were drawn in the
    magenta or violet accent at 3.2–4.3:1; they are now in the text colour,
    with the accent kept on the button's edge and on icons. Red error and
    Delete text in Monokai Day now clears 4.5:1 too.
  • Someone stepping away and back over and over can no longer flood a voice
    channel's timeline and push out the lines that matter, like a session
    starting or a game's result. It now shows one line a second for them,
    saying where they ended up.
  • On a phone, or in a narrow window, the message box now spans the
    width beside Send, with the image, emoji, poke and timer buttons on a
    row above it. Before, those buttons left about one word's width to
    type in.
  • When your connection drops mid-ride, the banner now counts how much
    riding this device is holding, and an elimination game's disconnect
    grace counts down. Both used to sit at 0:00 and 30 s for the whole
    outage, so a rider was knocked out with no warning. With no ride
    running, the banner no longer claims riding is stored.
  • When a crew's founder deleted their account, everyone left in that crew
    could no longer load any of their crews ("Your crews could not be
    loaded"), and live sessions and plans vanished from every crew they were
    in. The crew list loads again.
  • A crew page you are looking at when you are banned from that crew now closes
    and offers Home. It used to keep the crew's code, its members and a Retry
    that could never work. The Schedule's Start button now says "Start without a
    trainer" when none is paired, the same as the plan card in the voice
    channel.
  • Removing a crew's picture asks first, since everyone stops seeing it and putting it back takes the file again; taking a member out of a private channel now offers an undo.
  • A voice channel can no longer be deleted while a session is running in it.
    Deleting one mid-session used to throw away every rider's ride from that
    session. End the session first, then delete the channel.
  • The desktop app has its WattRoom icon again. Since desktop 2026.9.11 it
    showed Electron's default atom in the Dock, the Applications folder and
    the Windows and Linux installers.
  • In the desktop app, Connect Google, GitHub or Strava and Add a passkey in
    Settings now open that page in your browser, where they work. Before, Connect
    Google left the window stuck on a Google page with no way back, and adding a
    passkey waited forever.
  • The desktop app's sign-in screen, and the browser page that hands a sign-in
    back to it, no longer claim the server has no sign-in providers configured.
    The desktop app's line now names the ways this server offers, Google
    included.
  • The Diesel medal is no longer handed to whoever joined first when nobody
    rode a steady step — a game session, or a workout of only ramps, sprints
    or free riding. It now goes only to a rider whose steady power was measured.
  • On a phone, a direct message with a friend whose status is long no
    longer scrolls sideways or pushes their status under the Poke button.
    The status is cut short in the header instead.
  • A crew you founded that nobody else is in no longer sticks to you for good.
    Delete its channels and it goes with the last one, which frees one of your
    three founding slots. The confirm says so before you click. A crew with no
    channels left also goes when its last member leaves, and that member is told
    first. A crew with a channel is never deleted this way.
  • While your crews, library or messages are loading, or if they fail to load,
    WattRoom no longer tells you to start your first crew, add your first tracks
    or message a friend. Home waits for your crew list before offering "Start a
    crew", so you cannot found a duplicate by accident.
  • Your data export now includes the pins you wrote on a crew's board, the crew
    you chose as home, an invite you have not taken up yet, and whether your
    status emoji is a crew's own picture.
  • Locked achievements, empty medal counts, away riders' names, an offline
    rider's initial, the jukebox's "just played" list and the small print on a
    few buttons are no longer faded below readable contrast. A locked badge
    still shows its lock, and an away rider their away mark.
  • The power gauge no longer disappears in Windows high-contrast mode. The
    riding screen kept the big number and "on target" but painted the bar, the
    target band and its marker away, so there was nothing to read your power
    against; they now draw in your contrast theme's own colours, and so do the
    zone bars on rider tiles, the TV and the execution meter.
  • Checkboxes, radio buttons, text fields and sliders have edges you can see.
    On the light themes an unchecked box was a faint outline, so settings like
    "list the crew in the directory" read as bare labels; every form control's
    edge now clears the contrast a control needs, in every theme.
  • A free ride now counts as a ride everywhere: the screen goes dark as it does
    in a session, the desktop app's floating HUD shows your watts and time
    ridden, and tapping another voice channel asks before it ends the ride and
    lets your trainer go.
  • Undo after removing a friend or withdrawing a friend request now sends
    them a new request, even when you share no crew with them. It used to fail
    for friends made by trading codes, told you to ask for the code you had
    just used, and still counted against your hourly friend requests.
  • A game started during a workout session now ends when the workout does.
    Before, it kept running with nobody feeding it, knocked every rider out on
    the same second and named a random winner.
  • Reloading the page, or a phone dropping Wi-Fi for a few seconds, no longer
    costs you Sprint Roulette or the Points Race, or your place in the Team
    Relay line. You leave the game only once you have been gone for 15 seconds.
  • A coach can hand the session only to someone riding in it. Handing it to
    a spectator or to someone free-riding beside the session used to put them
    on its timeline and take over their trainer. When a coach leaves, the
    session also no longer passes to a rider who left the ride.
  • You can see and stop your heart rate going to the call again. Whenever bpm
    is coming in — from a strap you paired, or relayed by your trainer with
    nothing paired here — the riding screen, the free ride and the Lounge say
    it is shared with the call, with a Stop sharing button beside it. The
    control had been missing since early September, so a trainer-relayed heart
    rate reached everyone in the voice channel with no way to turn it off.
    Your choice also sticks now: setting a status used to write back whatever
    the app had loaded at start, which could undo a sprint grade changed in
    Equipment and would have switched sharing back on.
  • "In voice" now only ever means someone is on the call. The crew page listed
    everyone standing in a voice channel under "in voice", even with nobody
    talking; it and the sidebar's strip now say "in the channel", and the
    strip's count includes you.
  • A crew code typed on Home or in the sidebar's + sheet now opens the crew's
    invite, which says whether the crew keeps a weekly board, before you join.
    Joining from that box used to put your kJ and time on the crew's board with
    nothing having mentioned it. A mistyped code is still refused right under
    the box.
  • On your profile, Disconnect and Remove are now disabled on your last way
    to sign in, with the reason shown, instead of asking "are you sure" and
    then being refused.
  • Joining a session partway through now saves the ride you rode. It is
    scored against the blocks you actually rode, counts as completing the
    session when you reach the end, and is dated (and sent to Strava) from
    when you ...
Read more

2026.09.145

Choose a tag to compare

@github-actions github-actions released this 25 Sep 07:56
5c2e1e1

Added

  • Whoever planned a session, and the crew's owner and admins, can now see who
    is out and who has not answered yet, under Show names on the Schedule and
    on the voice channel's plan card. The rest of the crew still sees only how
    many are out.

2026.09.144

Choose a tag to compare

@github-actions github-actions released this 25 Sep 02:14
55e342a

Removed

  • A crew's old shared reaction set is removed from the database. Since
    2026.09.138 each rider picks their own, and nothing has used the crew's
    since. The privacy policy now lists a crew's own emoji in its place.

Fixed

  • A session's closing summary lists only the people who rode it, not
    everyone who was in the voice channel. The sidebar's line for a running
    session names its coach and says "paused" while it is. A phone no longer
    shows "block 1 of 1" for a paused session. A rider alone in a session sees
    their live execution score, as they would on a solo ride.
  • A phone in a voice channel with a session running now offers Watch the
    session
    . TV mode's exit button is full size. Join the ride on a crew's
    Home now opens the session itself, as it already did from Home and from the
    session-start notification.
  • The pre-ride now counts a trainer you paired in a voice channel as paired,
    and Start rides it — before, /ride called it unpaired and pairing again
    dropped the link. A new account's FTP is now asked about above Start and
    called what it is: the 200 W everyone starts at, not a measurement.

2026.09.143

Choose a tag to compare

@github-actions github-actions released this 25 Sep 01:22
ed959b4

Added

  • A solo ride or ramp test left paused for 10 minutes now ends itself, and
    the stopped time is left off the ride. Getting off without pressing End
    used to leave the ride running all night, and pressing End the next morning
    filed a ride too long to save or export.

Fixed

  • A ride page's Against your best no longer shows "execution 0%" for a ride
    that isn't scored, such as a second ramp test. It shows "—", as the rest of
    the page does.
  • Deleting a ride no longer warns that its XP goes with it. It doesn't: your
    XP and level stay, and only the power trace and medals are removed.
  • Several ride screens stopped saying things that weren't true:
    • leaving a ride promised it would be saved even when it was under a minute;
    • a ride ended early said "Ride complete";
    • a ride whose save failed said its XP had reached your account;
    • "Keep my current FTP" after a ramp test threw the result away;
    • effort ratings 6, 8 and 9 showed made-up words where the scale has none;
    • a few leftover "lounge" and "session ended" lines now name the voice
      channel or say what actually happened;
    • a planned session's notes now say who is told, and where your own
      calendar link lives.
  • A ride you rode with a crew no longer reads "solo" once that crew is
    deleted. It says "in a session". A crew you have left or been banned from
    is still named on the ride's page, but no longer as a link to a page you
    can't open.
  • If your ride from a session takes a while to save, the session summary now
    offers Your ride lands on Rides instead of leaving you with no link and
    no word about where the ride went.

2026.09.142

Choose a tag to compare

@github-actions github-actions released this 25 Sep 00:05
f8f54c8

Added

  • Statuses now show wherever a rider's name does. That covers session and game standings, the crew tiles while riding, the list of who rode after a session, session recaps, the weekly board, rider volumes, the "who's in voice" lines on Home and the crew page, announcements, and the title of channel message notifications.

Fixed

  • A text channel line that arrives just as you read the channel stays unread until it is on your screen. Before, it could be marked read the moment it landed, and if you left the channel right then it never counted as new.
  • A crew's Workouts page now has Plan a session, which opens the crew's
    schedule ready to plan. It used to send you to your own workout library,
    where every button started a solo ride, and once the crew had any history
    the page had no way to plan something new.
  • A crew's own emoji now shows as its picture in more places: a message that uses one added moments earlier no longer stays stuck as :name: until you reload, pins draw them, the message box and the edit box show how the line will read, and the emoji picker no longer offers another crew's emoji as bare text in a DM, your status or your reaction set.
  • End ride during a solo ride and I'm done during a ramp test now ask
    before they end it. A stray tap next to TV or Skip block used to end a ride
    that can't be resumed, or stop a ramp test early with too low an FTP.
  • A ⚑ you tap during a solo ride or ramp test now reaches the developers
    even if you leave without pressing Send. Before, it was sent only from
    the button under the summary, and leaving the page dropped it without a
    word.
  • The "your FTP looks low" prompt now shows up right after the ride that
    earned it, on Rides, and a session ride brings it too. Before, it appeared
    only after a reload or a visit to Home. It also shows when the charts on
    Rides fail to load, which used to hide it.
  • If saving an imported workout fails, the preview and both Save buttons now
    stay on screen, with a Try again above them. Before, they disappeared
    behind a message that read as if the file were broken, and you had to pick
    the file again.
  • A solo ride and a ramp test show your live execution score beside your
    cadence and heart rate again, as you ride. It never appeared during the ride,
    only on the summary afterwards.
  • On a crew's Workouts page, Plan it again (it used to say "Ride it again",
    but it only ever planned) now works like the Schedule. The time starts at
    the next hour, you can plan with no voice channel yet, and a crew whose
    channels failed to load is told so with a Retry, instead of that it has no
    voice channel.
  • A ramp test you ride all the way to its last step now shows your result
    when it ends. It used to stop on a frozen riding screen until you pressed
    I'm done.
  • Session recap cards now say which day the session was ("Tue 16 Sep · 4
    riders · 1 h 02") on a crew's Members page, its Home and under a workout's
    sessions. A recap from weeks ago used to look like last night's.
  • On a phone-sized screen, the ride's numbers row no longer runs off the
    edge once heart rate and execution appear. The bias buttons move to a line
    of their own and stay whole, instead of the + ending up off screen.
  • A ride you are still riding, in another tab or in a live session, is no
    longer offered as a recovered ride. Saving it from there kept only the part
    ridden so far, and Discard could delete the only copy on this device of a
    session still in progress.
  • When a ride or ramp test can't be saved because the server or your
    connection is down for a moment, the summary now has a Try again button.
    Before, it told you to reload and look for the ride on Rides.
  • On a slow connection the sidebar no longer lets a late answer overwrite a
    newer one. A crew you had just left could come back until the next update,
    and a late answer could clear the "not updating" mark while the crew list
    was still failing.
  • On a crew's Workouts page, clicking another page in the sidebar no longer
    does nothing now and then. If anyone in your crews joined, left or planned
    something at that moment, the click was dropped and you stayed on Workouts.

2026.09.141

Choose a tag to compare

@github-actions github-actions released this 24 Sep 21:24
c58bdd9

Changed

  • The list of who is in a voice channel now shows each rider's status, and marks anyone who is away. Moving a rider by dragging their name is smoother: the name lands in the new channel as soon as you drop it, the channel it can go to lights up while you drag, and if the move is refused, or the rider doesn't arrive, the name goes back and a message says why.

Fixed

  • A ride that crashed or never reached your account is now much easier to find. Home and your crew's Home say so until you deal with it, and Rides is where you save or download it. The ramp test's setup screen offers it too, and on a solo ride it now sits at the top of the setup screen instead of at the very bottom. Recover the ride after a server restart now goes to Rides.

2026.09.140

Choose a tag to compare

@github-actions github-actions released this 24 Sep 21:19
1ba4a90

Added

  • A message notification shows the sender's status emoji after their name, like "Sven 🤒", so you know they're out sick before you open it.
  • A poke now says who and when. If you're looking at the screen, a toast names who poked you, with a Poke back button. Before, you only heard a sound. Between friends, each poke is saved as a line in your direct messages ("poked you · 14:32"), so you can see who poked you and when, even later. Poke with a message… adds a few words, and a bell button in the message box sends your next line as a poke. You can poke a friend from anywhere: their row in your friends list, their messages, a crew's member list, or the new Poke button at the top of your conversation with them. The person who pokes now sees "Poked Sven" when it lands.
  • The crew switcher's You entry shows your status emoji.

Fixed

  • For self-hosters: a page a rider leaves before it finishes loading no longer
    writes an ERROR line to the server log. A normal evening of clicking around
    used to leave dozens of them, burying real failures and tripping error-rate
    alerts.
  • Cancelling the 3-2-1 count-in on a solo ride or ramp test, or leaving the page during it, keeps your trainer paired and Start ready. Before, the trainer showed as unpaired while still connected, so pairing it again could come up empty or leave the trainer with two connections at once.
  • A direct message that arrives just as you read the conversation stays unread until it is on your screen. Before, it could be marked read the moment it landed, and if you closed the conversation right then you never got a dot for it.

2026.09.139

Choose a tag to compare

@github-actions github-actions released this 24 Sep 20:46
885a7d8

Added

  • Rider hover cards. Rest your pointer on someone's face or name in chat, the member list, the people column, the friends panel or the voice strip, and a card shows their level, their status, where they are, and buttons to message them or open their page.
  • A crew's owner or admin can move a rider into another voice channel by dragging their name in the sidebar, or with the name's right-click menu. The rider's mic and camera come along, and a toast says who moved them. A rider who is pedalling can't be moved.

Fixed

  • A chat where riders carry a status line no longer grows a second scrollbar that lets the whole app scroll out of the window.
  • When the server refuses a time you chose for a planned session, or for moving one, the reason now shows right under the time field instead of in a toast over the picker. It goes away once you pick another time.

2026.09.138

Choose a tag to compare

@github-actions github-actions released this 24 Sep 20:32
f65af6a

Changed

  • A crew's text channels are now chat channels throughout the app, beside its voice channels, and carry a chat bubble instead of a # — in the sidebar, on their pages and on the toast and the OS notification a new line or a DM brings. A voice channel's announcement now links to the chat channel it was marked in, as the Board's does.
  • Your reactions are your own: pick up to eight icons or emoji in Settings → Profile, and they are your mid-ride cheer buttons and the first row of the chat's picker in every crew and DM. Crews no longer set a reaction set, and everyone starts on the stock six.

Fixed

  • Reading a text channel always clears its unread count. When the server's clock ran ahead of the database's, the newest line could stay counted as unread right after you read it.
  • The one-time offer to turn on notifications now also appears under the next session on your crew's Home and on the crew's Schedule. WattRoom opens in your crew, so a rider in a single crew might never reach Home's What's next, which used to be the only place it was offered.
  • Reading a conversation on one device now clears its unread mark on your others: a text channel's count goes at once, a direct message's dot within ten seconds. Direct messages used to remember what you read per browser; the first start after upgrading counts every existing conversation as read.
  • The voice strip shows your crewmates' statuses and keeps them current while you're on another page, and the tiles in a voice channel show them too.