I’ve always thought that we could do a lot better displaying XC race team results. The cold, dry text format that we’re all used to is nice for a quick score, but pretty bad for most anything else. Just how did our fifth runner stack up against everyone else’s? Sure, you can scan the column and compare a couple teams at a time, but there should be a better way.
Another thing that should be easily visualized is the differences in the scores. Let’s say we were behind a team by 10 points. Is that a lot? In a dual meet it’s not really that close but in the state meet or a big invitational that’s a razor thin margin!
Here’s my attempt at making cross country team results way more fun to look at. These are the results from the North Carolina XC State meets from November 3rd, 2018. Each column represents a team. Each colored section in the column represents the points for one of the five scoring runners. The total column height is the team score for the team. Hover your mouse over the columns to see a popup that shows the runner’s name, place, and time.
Take a look and let me know what you think. How would you improve it? Any reason Milesplit shouldn’t do this? If you like this, follow me on Twitter.
My wife Joan is the head coach of Chapel Hill High (I’m the assistant). Although I’m the “data guy,” Joan is simply amazing at remembering all the PRs and times of the entirety of both the boy’s and girl’s teams. As soon as the runners finish a race she instantly knows if they ran well or not with high accuracy. I quickly realized that there was no way I could remember the PRs for 80 kids each season. I knew I needed a technological solution.
Here’s a list of things that I wanted to be able to do:
Be able to record the finishing times of each runner on the team as they cross the line without having to write anything down on a clipboard.
Easily keep track of mile splits during a XC race for each runner on the team.
Tell me at a glance how well the runner ran compared to their personal best and their season best.
Keep track of the big, notable workouts we do each year to be able to compare runners’ progress across years against themselves and against runners that graduated seasons ago.
The Web Site
I created a web site using PHP and a database that can store times, splits, and rosters from races and workouts. You can do all sorts of queries and reports to compare 5k results across the program’s history or see a particular workout report that shows athlete’s improvements over time.
This was quite an effort but not because of the coding as much as collecting as much race history as we could from Mile Split and our archives. Of course this is mostly a manual effort and Mile Split doesn’t make it easy since they only allow you to show one race at a time instead of being able to download your team’s entire history. I made this request to them but they were not interested in allowing this.
My Android Timing App
The web site is pretty nice, but by itself it’s not particularly unique. In my mind the real convenience is the Android app that I created to integrate with the web site for efficiently timing the actual races. I call it Coaching Timer (such an amazing name I realize!) and here’s some screenshots to show how it works.
Timing the Race
Here’s a screenshot of the main timer view. You start the timer with either volume up or down button. The 04:45 is the current elapsed race time.
As they come through the mile split, I press the button for that particular runner as they cross the mile mark. The runners are in descending order by their PR (more on how this happens later – it’s easy!) When I press a runner’s button, that button goes to the bottom of the list of buttons. See this screenshot that shows Ben Hawley and Owen Rogers having dropped to the bottom of the list. Why is this important? It minimizes the hunting I have to do to find the name as someone crosses the mile mark. It also allows me to quickly determine if every team member has crossed the mile mark. Also, if I end up having to click a button out of order that’s a mild indication that someone might be having a good day or a bad day.
As I click each button the timestamp is recorded along with the name in the left hand column.
As They Finish
I record the 2 mile splits similarly, but then for the finish the app sees that it’s within a normal range of a 5k finish and it adds some important details to the timestamp.
In the above screenshot, Amelia Maughan, Lilly Crook, and Sydney Runkle just crossed the finish line and I clicked their buttons (which moved to the bottom of the list, remember.) In this case, though, their PR and SB (season best) data was added to the timestamp. I can quickly see that Amelia tied her PR, Lilly was 20 seconds off a PR and 10 seconds off a season best, and Sydney beat her PR by 6 seconds.
Send the Results
In the 3 dot menu on the top right of the app, there are several options, two of which allow you to send results.
The Email Times and Text Times menu items let’s you send the results to another app for sending. Email Times brings up the following email message ready to send. Text Times let’s you send them via text message.
So How Does The App Know the PRs?
Here’s where some magic happens that I really like. You create groups in the app for each race that’s happening – for example, Boys Varsity, Boys JV, Boys JJV, etc. When you initially start a timer you choose the group to use for the race.
I initially created the groups by hand – typing in each runner’s name individually. I realized quickly how much better it could be, so I added an Import function for creating the groups.
The import function pulls a list of runners from the web site. It stores three pieces of data for each runner: their name, their PR, and their season best. The runners are listed in descending order by PR which lines them up just right for selecting varsity, JV, and JJV.
Just check the box for each runner to include in this group.
Then to start a timer for a race, just choose the appropriate group and click Start Timer:
Additional Nice Features that I’ve Added
Phone Sleep Prevention: As I’ve used the app over the years I’ve added some features to improve it. When waiting for the start, sometimes the phone would time out and I’d have to unlock it and, dang, I just missed the start of the race. So now there’s a feature implemented that prevents the phone from going to sleep with the Coaching Timer app is active.
Volume Buttons Start Timer: Also I realized it was hard to tap a button and look at the starter’s pistol in the distance across a field since there’s no tactile feedback from a virtual button on the screen. I added a way to start the timer via either volume control – problem solved and it’s much, much easier.
Disabled Phone Rotation: At first I thought it would be important to be able to rotate the phone and have the app switch from portrait to landscape since some names can be long and starting wrapping in portrait mode. This mostly ended up being disorienting when trying to get splits quickly and I disabled it.
Multiple Simultaneous Timers: Most races end up completing before subsequent race begin, but occasionally that’s not the case and they overlap. This is why it’s important to be able to keep multiple timers running simultaneously.
Adjust Start Time for Running Timer: Another critical feature that I added that has saved my behind multiple times is the ability to adjust the start time of an already started timer on the fly. Super useful! Let’s say you missed the start of the race. No more quick math to adjust each time after the fact – as long as anyone got the start of the race on their stopwatch, this function let’s you set the timer to any running time. This has been probably the most useful feature I added – it happens a lot and this is an awesome backup.
Adjustment Factor for Certain Race Venues: There’s an optional “adjustment factor” that you can apply on the web site for certain race venues/meets. Let’s say there’s a course one day that’s cold and muddy and the times are very slow compared to a “normal” course on a good day, or perhaps a course is short. You can apply an adjustment factor that provides an adjusted time for the purposes of the PR calculation. This prevents the PRs being skewed if we run a short course where true PRs shouldn’t really be valid.
The State of the App
The app is pretty stable right now and I’ve thought about releasing it to other coaches. But in order to do that I would have to put a good amount of work into generalizing it to work with other teams. Also, it’s highly dependent on the web site which is another layer of complication for someone to set up. To be honest I’ve always thought this would be a good thing for MileSplit to do since they have a good bit of the data required to make something like this work for any coach.
If you have any comments or suggestions I’d love to hear some feedback. Comment on this post and also follow me on Twitter while you’re at it.