Skip to content
Runfolio
ToolsLog inClaim

Changelog

Changelog

What has changed in RunFolio, newest first. Written for people who use it rather than people who build it.

Last revised


Newest first. This is the user-facing account; the engineering log lives in the repository and is a different, much longer document.

26 August 2026

The Khadakwasla message now reads as tomorrow’s, because that is when you send it. It was headed “Today’s Plan” and it told you “today is your rest day” — but the whole point of the view is the message you post the night before, so it was wrong every single time it was used. A rest day now reads “Tomorrow is your rest day”, a running day is headed “Tomorrow’s Workout Plan”, the message covering everyone is “Tomorrow’s Plan”, and race day is “RACE DAY TOMORROW”. The date line still names the day of the session rather than the day you post it, so the message says which morning it means even if you send it late.

The Khadakwasla plan now has three ways to look at it. The calendar was printing all seventy days with every pace note and fuelling line whether you wanted them or not, which is a wall of text rather than a training plan you can read. There is now a control above it with three settings. Overview puts the whole ten weeks in one table — the dates, the mileage, the focus and the long run for each — so you can see the shape of the block on one screen. Compact, which is the new default, keeps every day but shows just the day, what kind of session it is and its name. Full is what the calendar always did, and it is one click away for the week you are actually running. The setting lives in the link, so sending someone the overview sends them the overview.

Getting the message for a day is now a question you ask, not a list you scroll. That view used to print all seventy messages, for every distance you had ticked, one after another. Nobody reads seventy messages — you want tomorrow’s, the night before. So it asks for a date instead and gives you that one, with a Copy button beside it. The two tabs still choose between one distance’s own message and one covering everyone running that morning, and the Include boxes still say who that is. The message stays folded away behind “Show the message” until you ask for it.

The day lookup that used to sit on the plan page has moved into that view rather than being duplicated, so there is one place to ask and one place to copy from.

A training plan for the Khadakwasla Ultra. The full ten-week block for the 25K, 35K and 55K at Khadakwasla on 22 November — every session with its pace and its fuelling, the pace zones, the gel and salt-tab table week by week, and what to do on race morning. Pick a distance, pick a date, and it tells you what you are running that day; there is a copy-ready message for the group chat beside it. It prints, and it downloads as a PDF.

It is the odd one out in Tools and worth saying so plainly. The other four work out an answer from your times. This one is one runner’s block, published as it was written — the paces are anchored to the fitness it was built around, not to yours. Read them as the shape of the block and adjust to your own threshold.

The volume chart no longer plots the race as a week. The plan this came from drew the race distance as an eleventh point on the weekly-mileage line, joined on with a dashed leader. Weekly volume and a single run are different things wearing the same unit, so for the 55K it put a 55 km dot among weekly totals of 46 to 78 and read as a week you had to run. The race sits inside week 10, where it belongs, and the caption says so.

“Long Run Run”. Every long-run message in the original was headed that way — the generator appended “Run” to a label that already ended in it. Thirty messages across the three distances.

The version number is honest again. It had been stuck at 0.1.0 since the first week while all ten phases of the rebuild finished and the site went live. It is 0.10.0 now, which is what the convention says post-plan work should be — not 1.0.0, which would be a launch announcement rather than a correction. Nothing in between was invented.

Log in from a phone. The link was hidden on narrow screens, so the only way into an existing account from a public page was to already know the address of the sign-in page. It is now in the bar at every width — the sign-up button shortens to make room.

Sign in with a code. Every sign-in email has always carried a six-digit code next to the button, and nothing on the site would accept it. Now the “check your email” page does. This matters on a phone: following the link from a mail app signs you in inside that app’s browser, not the one you started in. It is also the way through when a mail scanner has already followed the link and used it up.

Sharing says something. The share button copied a bare address, which is a fine thing to paste into a browser and a poor thing to paste into a group chat. It now opens a sheet with a suggested message you can edit before you copy it, the plain link if you would rather, your phone’s own share sheet, and —

A QR code for your profile, with your name under it, downloadable as a picture. For a race expo, a club noticeboard, or the back of a bib.

Stats fit on the screen. On a phone the four figures at the top of a profile sat in a sideways scroller with no hint that it scrolled, so half of them were invisible and “568.11 km” was cut off mid-number. They are laid out two-by-two now. Nothing to swipe.

The profile form fits too. One line of helper text contained your full page address, which cannot wrap, so it pushed the whole form off the side of a narrow screen.

Edit from the page you spotted it on. Your own public profile and race pages now carry an edit link, going straight to the form rather than to the top of the dashboard. Finding a wrong finish time no longer means going and looking for the race again.

Selecting more than one run to import from Strava works. It never did. Each tick registered twice and cancelled itself out, which looked exactly like a tick that had worked, right up until the import reported nothing. There is now a “select all” and a count on the button, so you can see the selection is real.

Refresh a race from Strava. If you corrected an activity on Strava after importing it, the race here can be re-read: name, date, distance and time. What you typed yourself — where it was, the bib, your notes, the photographs — is left alone, and the page tells you exactly what changed.

Links back to Strava, from an imported race and from your profile. The connection has been stored since the import shipped and pointed at nothing.

When Strava asks for a minute, we say so. Their limits are shared across everyone using RunFolio, so hitting one is ordinary rather than a fault, and it now reads that way instead of as an error.

Up to three links of your own on your profile, labelled however you like, alongside Website and Instagram.

Changing your username is its own decision. It used to be a field in the middle of the profile form, saved by the same button as your bio — and it is the one thing on that form that breaks every link you have already given anyone. It now has its own dialog, tells you whether the name is free as you type, and lists exactly what stops working before it will do anything.

Deleting your account asks properly. The typed confirmation is still there; now it is followed by the actual list — the page, the races, the photographs, the tokens, the username — and the fact that none of it comes back.

A map of where you race. The statistics view draws your cities as bars rather than an unordered scatter of labels, and keeps the full list underneath.

Explore’s city filter means where runners are. It was built from race locations, so it offered hundreds of towns nobody lives in and matched anyone who had ever travelled to one. Beside a box that searches names, “City” should mean the person. Now it does, and there is a chart of the busiest ones.

Somewhere to write to. A contact page, for questions and for asking RunFolio to do something it does not do, linked from the footer and from the end of the FAQ.

The site tells you where it actually lives. Two pages and the training-plan PDF printed a domain that was never registered, which is an unhelpful thing to hand someone.

Everything public can be read as data. Every profile and race page now has a plain-data twin at the same address with .json on the end, there is a documented directory endpoint, and the site describes itself to search engines and AI assistants properly. Your date of birth and your email are in none of it, and a runner who has left the directory is absent from all of it.

Race and profile pages are in the sitemap. They were the pages most worth finding and the only ones not listed.

22 August 2026

Pages that explain the product. Features, About, FAQ, Privacy and Terms, and this page. Until now the only way to find out what RunFolio did was to sign up for it.

A privacy policy and terms, which a service storing other people’s photographs should have had from the start. The privacy page describes what the software actually does, including the parts that are uncomfortable — photographs are served from a public bucket, and a profile is a public web page.

A footer that goes somewhere. It was three pieces of text and no links.

The site can be crawled. A sitemap and a robots.txt, neither of which existed.

Tools, earlier the same day. A public section of calculators that needs no account, starting with a training plan generator: a 5K or 10K time trial in, target paces, predicted finishes and a week-by-week plan for a half or full marathon out.

Every result is a link. The page is server-rendered from the query string, so it works with JavaScript switched off, prints properly, and exports a real PDF of selectable text rather than a screenshot.

21 August 2026

Photographs are stored exactly as you upload them. The pipeline that generated three sizes of every image was removed. Your browser compresses a photograph to a sensible size before it goes up, and that single file is what every part of the site uses — which is why a full-width photograph on a large screen now looks like one.

Profile pictures and banners, uploaded the same way as race photographs.

Filtering your own races by distance and by year.

Signing out from the sidebar, which previously meant going to settings first.

20 August 2026

Public profiles. The page the whole product is for: a banner, your statistics, and every race, in three views you can switch between — a photo grid, a chronological ledger, and a statistics breakdown. The view is part of the URL, so the version you are looking at is the version you share.

Race pages, one per race: the full-bleed cover photograph, your notes, the bib number, the certificate link, and the whole gallery in a lightbox.

Share cards. Links posted to a messaging app now unfurl into a card with your name and your numbers, generated when you save rather than when someone clicks.

19 August 2026

Accounts, with email and password or a magic link — whichever you prefer, treated as equals. No third-party sign-in buttons.

Logging a race: name, location, date, distance, finish time, bib number, certificate link and notes, with preset distances for the common ones.

Photo galleries, with the reorder-and-set-cover controls, and a blurred placeholder while each image loads instead of a spinner.

Strava import. Connect once, see your run activities, pick the ones that were races. Importing the same activity twice does not create a second race.

18 August 2026

RunFolio was rebuilt. The previous version was a React application that rendered races as rows of text. This one is server-rendered, ships almost no JavaScript to a visitor, and treats the photographs as the content rather than as an attachment to it.

The blue-and-purple gradients went with it.