Skip to content

What's new

2.23.3 — 2026-09-06

Fixed

  • The February-scale test asserted exact totals against a database every worker test file shares, so a neighbouring file’s rows made it fail in CI with 522 events where 520 were seeded. It now asserts what it actually means — every seeded event comes back, none twice, and none from a group the coach does not run — which no longer depends on the database being otherwise empty.

2.23.2 — 2026-09-06

Fixed

  • Component tests no longer leak their markup into the next test. Ten files never cleared the document, which stayed invisible because vitest gives each file its own document when files run in parallel — CI runs them in one shared document, so a login test found a series form left behind by an earlier file. Green on every machine that ran it, red on the one that mattered.

2.23.1 — 2026-09-06

Fixed

  • The “Audience:” line on a Telegram post, and the first line of an email about a message with no event, now read “all coaches in these groups and 2 named coaches” instead of repeating ”+ a specific coach” once per person picked. It still names nobody: that line is posted where families can read it.

2.23.0 — 2026-09-06

Added

  • Every sent message has a Who got this expander listing the coaches and families it reached, with a ✓ against anyone who has opened it. The list showed only “9 coaches”, and the question after sending a broadcast is the same as the question before it — was that person on it? — which a count cannot answer and a sent message cannot be re-read to find out.

2.22.0 — 2026-09-06

Fixed

  • Sending a message about groups no longer fails with “Pick an event”. The Send button checked for an event whichever scope was chosen, so it refused a group message and named a field that was not on the screen.

Added

  • The message composer has the same B / I / U / highlight toolbar as the notes fields, and the formatting survives to the family page, the coach inbox and the HTML email. Plain-text email keeps the words and drops the markers.

2.21.1 — 2026-09-06

Fixed

  • A coach’s status on the Coaches page reads “setup 10%” or “setup not started” rather than ”…% onboarded”, and sits on the visible line with the buttons. In a column narrow enough to wrap, the eye landed on the word “onboarded” — so two admins who had done nothing looked finished.

Fixed

  • The Save button on a coach’s row is now beside Send invite, Deactivate and Delete, where you are already looking. It was the last column of a row wider than the screen, so it sat off the right edge behind a sideways scroll — reported twice as “there is no save button”, which for a save button is the same as not having one.

Added

  • The installed app’s home-screen icon carries the unread count, and a push arriving while the app is shut puts a dot on it. The bottom bar has always shown unread messages; the icon showed nothing, which is the one place it matters when the app is closed.

2.21.0 — 2026-09-06

Added

  • An admin’s groups are editable on the Coaches page. An admin sees every group no matter what — that has never depended on these ticks — so for them the ticks decide only which group messages reach them. They were locked, which is why a message to “all coaches in Ability” reached neither admin.

Fixed

  • Background work started by the bulk shift-assignment route went straight to waitUntil, so a failure was never logged and the tests could not drain it. Its push outlived the test that started it and died on a foreign key after the tables were wiped, failing whichever unrelated test was running — which cost two pnpm ship attempts this week on green code. A guard now refuses any direct waitUntil in the worker.

2.20.1 — 2026-09-06

Fixed

  • Specific family… now works. Naming a household sent to nobody unless one of its athletes happened to be in the groups the message was scoped to — it was dropped silently, with the audience count reading 0. Naming someone is the most explicit instruction there is, and the scope no longer overrules it. Naming people also no longer requires picking a group first.
  • The audience preview lists who it resolved to, not just how many. “6 coaches” cannot answer “is Sara on this?”, and a broadcast is not undoable.

Fixed

  • The group picker on Send message is compact again — one line per calendar with its groups beside it. Every checkbox had been stacking above its own name, turning a three-row picker into three screens.
  • An email about a message with no event says who it went to — “sent a message to all coaches in Ability” — instead of “about a club message”. The Telegram alert drops its About line rather than naming nothing.

2.20.0 — 2026-09-06

Added

  • A message no longer has to be about an event. Pick Groups and send to whole calendars — Ability takes FIS and U16 in one tick, Age Class takes U14, U12 and U10 — or to single groups, or (for admins) to the whole club. Then say in the Audience rules whether that means the coaches in those groups, the families, or both. Until now every message had to be attached to an existing session, so there was no way to write to the staff before the season was built.
  • The Include/Exclude pickers stay open, so several people can be added in a row instead of reopening the list for each one.

2.19.3 — 2026-09-06

Fixed

  • The button on a coach’s row says Send invite or Resend invite depending on whether one has ever gone out — not on whether they once signed in. It sends the same full two-step onboarding email either way; labelling it “Send sign-in link” for anyone who had looked around before made it read like a lesser thing, when it is exactly what a coach starting from scratch receives.

2.19.2 — 2026-09-06

Fixed

  • An admin can send a sign-in link to a coach who has already signed in. Signing in once removed the button for good, so there was no way to help a coach who lost the email, or who wanted to walk the setup again — the only answer was “find the login page yourself”. The button says Send sign-in link for someone already in, and Send invite / Resend invite for someone who isn’t.
  • A row on the Coaches page now says Unsaved changes while it is holding an edit. The Save button sits at the end of the row, which on a phone is several lines below the field you just typed in — findable, and repeatedly not found, so a phone-number change looked like it had no save at all.

2.19.1 — 2026-09-06

Fixed

  • The app now picks up a new version by itself. Until now an installed coach app kept running the build it started with until you force-quit it — resuming from the app switcher never checked for anything new. It now looks whenever you bring the app back to the front and refreshes quietly; if you’re halfway through typing, it waits and offers a Reload button instead of throwing your text away.
  • The “Do you also have a child in the program?” question on the on-the-hill list now has a Change my answer button. Answering it was a one-way door.

2.19.0 — 2026-09-06

Changed

  • The on-the-hill checklist now asks whether you also have a child in the program, rather than trying to work it out. Answer yes and it explains what else to set up — your family page is a separate app, with its own icon and its own notifications; answer no and the list is done. It has to ask, because coaches are set up before the families are, so there is nothing yet to match a coach against. Shipped in 2.18.0 as an item only coaches we could already match would see, which during onboarding is nobody.

2.18.0 — 2026-09-06

Added

  • If you’re also a parent in the program, the app now says plainly that your family page is a separate app — its own home-screen icon, and its own notifications. The ones you turn on as a coach do not cover your own child’s sessions. There’s a new help page, a note in Settings, and an extra item on the on-the-hill checklist for coaches we can see are also parents. Coaches with no child in the program don’t see it.
  • The coach app and the family page now install with different icons and different names — a dark “TS Coach” and a cyan “TS Family”. They used to be the same cyan square with the same mountain, so a coach who is also a parent ended up with two identical icons.

Changed

  • The More menu calls it “Your family page — a separate app” rather than “Switch to family view”, which read like a mode inside one app.

2.17.0 — 2026-09-05

Added

  • The same switch in Settings, applied to Today and My shifts.
  • One shared set of bright-sun colours for both apps, with a guard that computes every text and fill pair from the values and fails under 7:1 — the outdoor bar, not the indoor 4.5:1 — and refuses any rule in the bright-sun block that dims by opacity or drops under 12px.

2.16.0 — 2026-09-05

Added

  • The same note on the coach app, worded for the on-hill view. The “Put the app on your home screen” step on the On-the-hill checklist ticks itself once the app really is open from the home screen.
  • One shared decision, mirrored byte-for-byte between the family page and the coach app and tested from a single fixture table — including the plain-JS copy the family page ships, since it has no bundle.

2.15.3 — 2026-09-05

Added

  • A read-through of every notification the app sends — push, email and Telegram, both audiences — found the two items above and nothing else. A guard now checks that every link a notification carries opens a page that exists, on either the coach app or the family page.
  • A February-scale sweep: one club seeded the way a full season looks — two calendars, four groups, twelve coaches, sixty families, ninety athletes, 520 sessions, a month of RSVPs and two months of shift assignments. Every GET route is then asked for as an admin and as a two-group coach: no errors, every list complete to the last item, and no route whose query count grows with the data. Reintroducing the bound-parameter bug that shipped three times turns it red at once. It found nothing this time, which is the point of running it before February does.

2.15.2 — 2026-09-05

Fixed

  • The Message templates page says “No templates yet” when a club has none, instead of showing a heading over empty space. It was the one list page that had nothing to say when it was empty.

Added

  • A first-run sweep: a club with no calendars, groups, events or families, an admin, a coach with no groups yet, and a family with no athletes. Every GET route the worker answers — read off the app’s own route table — must return an empty answer rather than an error, the family page must say what is missing, and a calendar with no events must serve a valid feed. Every other test seeds data first, so nothing had ever rendered the app the way a new club sees it. It found no errors; the templates page was the only gap.

2.15.1 — 2026-09-05

Fixed

  • The help site caught up with the app. Nine pages still described a bottom bar with Events in it (it is My shifts now), a More sheet without My availability, three notification triggers where the settings page has four, a Telegram bot handle nobody has, an invite email subject that changed, and RSVP deadline options by names the form does not use.
  • The Calendars & groups page heading now matches the two menus that lead to it.

Added

  • A guard that reads the bottom bar, the More sheet, the notification triggers, the bot handle and the invite subject out of the code that renders them, and fails when a help page describes something else. Written after an audit found the app and its help had drifted apart in nine places in one week of releases.

2.15.0 — 2026-09-05

Fixed

  • The event picker on Send message showed only the first 100 events in its 90-day window, with nothing to say the rest existed. It now reads the whole window.
  • The categories page, the feedback page and the calendars table in settings could push the page sideways on a phone. Each wide table now scrolls inside its own box.
  • Cancelling an event, un-cancelling one, and changing groups in a bulk edit all return as soon as the change is saved. They used to hold the coach until every family had been notified, which is the moment a coach is least able to wait.

Added

  • Four guards over conventions that were correct in one place and missing in the next: a write route may not make the coach wait for its own notifications, a wide table must have somewhere to scroll, an overlay must be painted above the bottom navigation, and a caller of a paged list must either read it to the end or say why one page is right. Each one found a real instance on its first run.

2.14.1 — 2026-09-05

Fixed

  • The coach-note box on an event’s edit page has the formatting buttons, matching the same field on Today. Notes are shown formatted on the event page and the family page either way, so a coach who learned the buttons in one place lost them in the other.

Added

  • A guard over every box you can type into: if a field is displayed as formatted text, the box that writes it must offer the formatting buttons — and a field that is never displayed formatted must not, since those buttons would produce literal asterisks in an email.

2.14.0 — 2026-09-05

Changed

  • Changing groups is part of Bulk edit now, in its own section at the bottom, rather than behind a separate button beside it. Before you apply, it says what will happen in words — which groups, how many events, and that families in those groups will start or stop seeing them. Groups from another calendar are still not offered, and the panel explains why.

2.13.0 — 2026-09-05

Fixed

  • “Reuse from another event” shows more than one screen of results. It asked for twenty and threw away the rest, so the twenty-first event could only be reached by typing a narrower search. There is a Show more events button now.
  • Changing an event’s start time moves the end time with it, keeping the session the same length. Moving a 07:00–10:00 session to a 09:00 start used to leave it ending at 10:00 without saying so. The series form never linked the two at all.
  • Bulk edit’s notes box has the same B / I / U / highlight toolbar as everywhere else.
  • Saving a bulk edit is much faster. The edit was applied quickly, then the coach waited while every affected family was notified one at a time. Those now happen after the answer comes back.
  • An RSVP deadline set after the event starts is refused, with a message saying so. One January race had a deadline typed as 2028, so it never closed.

2.12.0 — 2026-09-05

Fixed

  • Editing an event no longer sends another coach a notification for every save. A run of edits to the same event now collapses into a single entry that updates in place and says how many changes it covers, and edits to an event more than a day away send nothing at all — the daily brief and the events list carry those.
  • Tapping that notification opens the event rather than its edit form. Reading is what you opened it for, and most coaches cannot edit most events anyway.

2.11.1 — 2026-09-05

Fixed

  • “This browser doesn’t support push notifications” now says what to do instead. On an iPhone notifications work only from a home-screen install and only in Safari, which is the whole answer and was missing.

2.11.0 — 2026-09-05

Fixed

  • On the Coaches page the admin and support checkboxes each keep their own label instead of the second one wrapping onto a line by itself.

Changed

  • The help-site screenshots are regenerated from the test club, so they show the invite box, the Status column and the new Settings sections.

Added

  • The browser suite now runs as a non-admin coach as well as an admin. Thirteen of fifteen coaches are editors, and until now nothing had ever loaded a page as one — which is how a checklist step pointing at an admin-only page shipped unnoticed.

2.10.1 — 2026-09-05

Fixed

  • On a phone you can reach the Apply button in bulk edit. The bottom bar was painted over the foot of the dialog, taking the buttons with it. The same was true of “Reuse from another event”. Both now open as a full-height sheet with their buttons pinned to the bottom, so a long form cannot push them out of reach.

2.10.0 — 2026-09-05

Added

  • Today tells you what is next and what is waiting. When you have nothing on today it names your next shift, and a short strip flags anything actually needing you — unread messages, notifications off on that phone, a setup checklist not finished. Both are silent when there is nothing to say.

Changed

  • The month view’s Order and Times pickers are out of view. The grid still orders a race week so it reads across, and a saved link that carries a choice still honours it.
  • “My availability” on the My shifts page, said plainly.

2.9.0 — 2026-09-05

Changed

  • The phone’s bottom bar is Today, My shifts, Messages and More. My shifts answers “am I on this, and where do I need to be”, which was two taps deep before. The full events list moved into More, since browsing a season is a laptop job and a single event is still reachable from Today.
  • My shifts links straight to your availability, so what you’re working and when you can work sit together.

2.8.1 — 2026-09-05

Changed

  • The help site has been read through and edited for people arriving today. Explanations of how things used to work, dated notes about changes nobody here lived through, and named attributions are gone; what remains says how the tool behaves and why. Where the help said to ask one person by name, it now says to ask an admin.

2.8.0 — 2026-09-05

Added

  • The same link opens the coach view of that event when a coach taps it, since coaches subscribe to the same feed.

2.7.1 — 2026-09-05

Changed

  • The same explanation on the coach side.

2.7.0 — 2026-09-05

Added

  • Settings has Your groups’ chats — a Join button for each of your groups’ Telegram channels. Until now only admins could see anything about Telegram, so a coach had no way to join the channel their own parents are in, or to see what those parents see.

2.6.1 — 2026-09-05

Fixed

  • The on-the-hill step about the group chat said to post one. On a practice event that button is deliberately dead, because nothing on the practice calendar can reach anybody — so the step now says to find it and see how it works, which is what it was always able to be.

2.6.0 — 2026-09-05

Changed

  • Buttons, filter chips and dropdowns are big enough to hit with a glove on a phone. The events screen alone had 48 Edit links at 30 pixels tall, 24 attendance buttons at 27, and the range filters at 29; those and the same controls across every screen are now 44. The schedule assignment grid is left as it is — it is fifty cells wide across a season and belongs on a laptop.

2.5.7 — 2026-09-05

Fixed

  • The FAKE practice session dated “today” now appears at the start of the club’s day rather than at 6am, so a coach checking the app before first chair finds it. It used to refresh only in the nightly job.

Added

  • A guard that measures every coach screen at iPhone width: none may push the page sideways, and none may use a form field under 16px, which is what makes iOS zoom the page and stay zoomed.

2.5.6 — 2026-09-05

Fixed

  • Two single-row forms — adding a category, and asking to link a family — stopped fitting a phone once the fields grew to 16px. They wrap now.

2.5.5 — 2026-09-05

Fixed

  • The previous release said forms no longer zoom the page on an iPhone. They did — the rule was being overridden by each form’s own styling, which we caught by measuring rather than assuming. This one takes effect.

2.5.4 — 2026-09-05

Fixed

  • Tapping any search box or dropdown on an iPhone used to zoom the whole page and leave it that way, which is most of why the tool felt “too wide” on a phone. iOS zooms whenever a field’s text is under 16px, and every form in the coach tool used 13 or 14. Fields are 16px on phones now.
  • Checkboxes on a phone were 13 pixels square. They are 20 now.

2.5.3 — 2026-09-05

Fixed

  • Five screens were wider than a phone and pushed the whole page sideways: creating an event, creating a series, writing a message, the families list and the coaches list. The forms had never been given any phone layout at all, and the two lists had no scroll container. Measured at 390px, the worst was 321px too wide.

Changed

  • The events list opens in card view on a phone and table view on a laptop. The table is eight columns and has to be scrolled sideways to reach anything; on the hill you are reading one event, not comparing forty. Choosing a view still sticks, per device.

2.5.2 — 2026-09-05

Fixed

  • On a phone, tapping an event in the list now opens it. In the table the title was plain text and the only link was the last column, which sits off the right edge of a scrolling table; in cards it was a small View button. Checking an event is the commonest thing a coach does on a phone.
  • On a phone, the Edit, Duplicate and Send message buttons on an event stay at the top of the screen as you scroll, instead of disappearing once you read past the first few lines.

2.5.1 — 2026-09-04

Added

  • The checklist guard covers the family tour as well, including a check that a family step never links to a page that exists only on the coach help site, and the reverse.

2.5.0 — 2026-09-04

Fixed

  • “Put the calendar on your phone” used to send every coach to Calendars and groups, which only admins can open — so most coaches got “Admin only” from a checklist step, and had no way to reach their own subscribe link at all. Settings now has a Calendar on your phone section with a Subscribe button per calendar you coach.
  • That step’s Help button opened an article about muting calendars, which is a different subject. It now opens a proper step-by-step guide for iPhone, Android, Mac and Outlook, written for people who have never subscribed to a calendar before.
  • A step on the On the hill list linked to a help page that only exists on the family site.

Added

  • On the hill has a step for putting the calendar on the phone you coach with.
  • A guard over the checklist: no step shown to a non-admin may point at an admin-only page, every step must point at a route that exists, and every Help button must open a page that exists with a heading matching its anchor. All three are read from the real files, not a hand-kept list.

2.4.1 — 2026-09-04

Fixed

  • Three steps on Getting started could never tick — editing an event, writing a coach note and sending a message all required the event to be on the practice calendar, which only exists after an admin creates the practice set. They now count the work wherever you did it, so a coach who has edited real events all season is credited for it. Sending a club-wide message counts too; it was missed because such a message has no event.
  • The morning brief no longer includes practice events. The practice set keeps one FAKE session dated today, so it would otherwise have pushed “Today: 1 event” to every coach every morning.

Changed

  • Every step on the On the hill list is self-reported. Nothing there is observable per device, and a tick that looks verified but is not is worse than being asked.

2.4.0 — 2026-09-04

Changed

  • A finished checklist stops advertising itself. Once every step on Getting started is done, it leaves the top bar; both lists stay in the More menu with a tick, so they can always be revisited.
  • The “New here?” prompt on Today now shows until the checklist is actually finished. It used to disappear as soon as you had opened the checklist once, so glancing at it and backing out lost the prompt for good.

Added

  • Each onboarding track records when it was first completed, read off the session lookup so no page pays an extra query for it. The stamp is never cleared: a step can un-tick if the data behind it is deleted, and someone who finished in November should not get their homework back in March.

2.3.1 — 2026-09-04

Changed

  • The invite email now leads with the two steps in order — sign in at a computer, then open the on-the-hill list on your phone — each with its own button and a description of what is on it. It also says plainly that a coach’s family page is a separate thing with its own address, so the two are not confused.

2.3.0 — 2026-09-04

Added

  • A second checklist, On the hill, for the phone you coach with: home screen, notifications on that phone, reading a session on Today, marking attendance in gloves, a coach note, the group chat, a parent quick message, and what happens with no signal. It is deliberately short and separate from the desk list, and the invite email now carries both links — one to start at a computer, one to open on the phone.
  • The admin Coaches page counts the two tracks separately, so it is clear which half a coach still has to do.

2.2.5 — 2026-09-04

Fixed

  • The getting-started step key is cleared from the address bar the moment a step is opened, rather than after the bar’s own setup work.

2.2.4 — 2026-09-04

Changed

  • The “Back to Getting started” bar is red and pinned to the top of the screen, so scrolling a long page cannot lose it, and it says what to do the moment you arrive on a step.

2.2.3 — 2026-09-04

Added

  • Following a step from Getting started now leaves a “Back to Getting started” bar on the screen it sent you to. It survives a reload, follows you one screen further, and disappears once you are back.

2.2.2 — 2026-09-04

Fixed

  • “Enable on this device” for phone notifications always said the server had no push key, even though it did. The coach tool is a separate worker and only forwards some paths to the main one; the key sat outside them, so the request never arrived. Nobody could turn on notifications, which is the first step of the getting-started checklist. Families were never affected.

2.2.1 — 2026-09-04

Fixed

  • Coach invites and coach broadcast emails could never be sent. Both attach a Reply-To so a reply reaches the person who wrote the message, and it was built in a form the mail library refuses outright — which threw before the message existed, so the request failed and nothing went out. No broadcast had been sent in production yet, so no message was lost. Family email never sets a Reply-To, which is why invites and digests kept arriving.
  • The email construction path has tests for the first time. Every existing email test returns early when the sending address is unconfigured, so the code that actually builds a message had never been exercised.

2.2.0 — 2026-09-04

Added

  • Admins invite coaches from the tool. Add a coach with “Send the invite now” ticked and the system emails them a one-time sign-in link (reply-to the admin, “open this on a computer”), reminds them on day 3, and tells the admin on day 7 if the link went unused. The link lands on Getting started, as does any coach’s very first sign-in.
  • The Coaches page has a Status column per coach — Not invited, Invited, Invite expired, Signed in · n% onboarded, Done — sorted so what needs the admin comes first, a summary line, per-row Send / Resend, and “Invite everyone not yet invited”.
  • A support account: an admin who is not a coach, hidden from the coach list by default and left out of every roster.
  • pnpm ship applies pending D1 migrations before deploying the worker.

2.1.4 — 2026-09-04

Fixed

  • Notes formatting renders the way it was typed: markers nested in any order, a space before a closing marker, and ***, ___ and ++ all work. The toolbar keeps a selected space outside the markers, which is how several notes had ended up showing raw ** and _.
  • Deleting or saving an event returns to the page and filters you came from, not page one.
  • After creating a series, “All incl. past” shows the whole calendar instead of only that series.
  • The month view keeps all seven days on screen; a long title is cut short instead of pushing Saturday off the edge.
  • Searching “vail” no longer returns every event whose notes mention availability — a search term matches at the start of a word.
  • Event and series creation are much faster. Every row of a create is written in one step, and telling families, writing the audit trail and refreshing the feeds now happen after the coach has moved on.

Changed

  • Bulk edit can set a title override across the selected events.
  • The race category FISU is now UNI, following FIS’s rename.
  • /api/lookups carries the six autosuggest lists; the event forms make one lookup call instead of seven.

2.1.3 — 2026-09-03

Changed

  • pnpm ship now builds and deploys both help sites and smoke-tests their “What’s new” pages; CI builds the coach app and both help sites on every push.
  • Five structural guards were rewritten so they can actually fail: table order is derived from the live schema, uncalled API routes must name their caller, volume tests must use the named timeout, round-trip budgets floor at one, and help anchors are derived from the link table.

2.1.2 — 2026-09-03

Added

  • The nightly self-check flags a club whose default time zone is not one the calendar knows.

Changed

  • A family’s page-split request has its own label in the feedback inbox, distinct from ordinary family feedback.

2.1.1 — 2026-09-03

Added

  • A family’s request to split siblings onto separate pages arrives in the feedback inbox with the athletes named.

2.1.0 — 2026-09-03

Added

  • A getting-started checklist at /coach/start that walks each screen in turn, with a practice set of clearly-marked FAKE events in early October and one today to try things on. FAKE in a title is the safe word: nothing about that event reaches a family.
  • Admins can reissue a family’s page address from the family screen; the old address stops working the moment the new one is issued.
  • Short recordings of each interaction on the help site, re-recorded from the test club on every help deploy.
  • A nightly self-check that files a feedback item when a scheduled send did not happen.
  • Bulk-volume tests — the whole roster invited and fanned out at once.

Fixed

  • Every “today”, “this month” and 48-hour check on the coach screens runs on the club’s clock — the events list, the Today chip, the schedule, My shifts, availability and the message picker. A coach travelling or living in another time zone sees the club’s day.
  • The daily brief no longer skips every other day over the winter.
  • Archived categories survive a save; two forms stop refusing 23:59.
  • Club-wide messages to more than a hundred families are sent in full instead of silently failing.
  • The admin family list no longer errors past a hundred families.
  • Notification retries never re-send what already went out; a rejected email recipient is counted and logged; dead-letter pushes for a family that no longer exists are dropped rather than retried forever.
  • A coach session is valid only on its own club’s hostname.
  • Calendar feeds change their ETag only when an event changes, so subscribers stop re-downloading an unchanged feed.

Changed

  • Deploys go through pnpm ship, which smoke-tests every feed and can run the browser suite against the test club before reporting success.

2.0.0 — 2026-09-02

The v2 relaunch on Cloudflare: the coach tool, the family RSVP page, calendar feeds, push, Telegram channels, daily briefs and digests, and the two help sites. Earlier history is in git. [Unreleased]: https://github.com/skiminnetonka/teamsummit-cal/compare/v2.23.3…HEAD [2.23.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.23.3 [2.23.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.23.2 [2.23.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.23.1 [2.23.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.23.0 [2.22.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.22.0 [2.21.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.21.1 [2.21.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.21.0 [2.20.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.20.1 [2.20.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.20.0 [2.19.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.19.3 [2.19.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.19.2 [2.19.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.19.1 [2.19.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.19.0 [2.18.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.18.0 [2.17.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.17.0 [2.16.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.16.0 [2.15.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.15.3 [2.15.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.15.2 [2.15.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.15.1 [2.15.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.15.0 [2.14.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.14.1 [2.14.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.14.0 [2.13.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.13.0 [2.12.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.12.0 [2.11.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.11.1 [2.11.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.11.0 [2.10.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.10.1 [2.10.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.10.0 [2.9.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.9.0 [2.8.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.8.1 [2.8.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.8.0 [2.7.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.7.1 [2.7.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.7.0 [2.6.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.6.1 [2.6.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.6.0 [2.5.7]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.7 [2.5.6]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.6 [2.5.5]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.5 [2.5.4]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.4 [2.5.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.3 [2.5.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.2 [2.5.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.1 [2.5.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.5.0 [2.4.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.4.1 [2.4.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.4.0 [2.3.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.3.1 [2.3.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.3.0 [2.2.5]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.5 [2.2.4]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.4 [2.2.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.3 [2.2.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.2 [2.2.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.1 [2.2.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.2.0 [2.1.4]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.1.4 [2.1.3]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.1.3 [2.1.2]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.1.2 [2.1.1]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.1.1 [2.1.0]: https://github.com/skiminnetonka/teamsummit-cal/releases/tag/v2.1.0