A Better Way to Visualize XC Team Results

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.

The XC Coaching Timer App I Created

Since we just got done with the state meet yesterday, I wanted to post some details about the app I created a few years ago and the companion web site.  I don’t have any plans on making this available to others, but maybe it will give someone some ideas to do some better things with a timing app.

The Problem I’m Trying to Solve

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:

  1. 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.
  2. Easily keep track of mile splits during a XC race for each runner on the team.
  3. Tell me at a glance how well the runner ran compared to their personal best and their season best.
  4. 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.

My Approach

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.

The main timer view for a race

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.

Ben and Owen just passed the mile mark

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.

PR and SB comparison added to 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.

Sending results via email

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.

Managing groups and the Import function

Just check the box for each runner to include in this group.

List of runners in descending order by PR

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.

My Cheap, Delicious, Homemade Energy Drink

Keith Sockman and I ride bikes together and the subject of energy drinks came up. I told him my philosophy of energy drinks at the time: “Never ride far enough to require any refreshment besides water.” I’m too cheap!

(Quick aside about the energy drink market – it’s big business! On any serious cycling ride you’ll find all sorts of colors and textures of liquids being consumed from water bottles. They’re expensive. In fact, in true cycling over-the-top fashion you can order custom energy drinks specific to your body – that can’t be cheap!)

Keith told me that he makes his own energy drink and has perfected the recipe over the years. Most of the benefit for a fraction of the price – this immediately piqued my interest!

I’ve tried this recipe 3 times now (each batch makes ~48 bottles) and I’ve been very pleased. I’ve also sent this to our Cross Country team and many of them have tried it with positive results. It’s important to emphasize especially to young runners that although water is great, in the summer it’s oftentimes not enough. (Interesting side note – when I first sent this out to the team, I’m pretty sure we singlehandedly affected the local lime market temporarily.  We’ve got a large team!)

Here’s the recipe (with Keith’s permission):

  • 2 cups honey
  • Juice from 12 limes – I also include a lot of the pulp
  • 1/3 cup salt

Combine the ingredients in a used mayonnaise or peanut butter jar, top it off with a little water, and put in the freezer. After a while it gains a slushy like texture, less so if you add less (or no) water.

When you’re ready to make a bottle, put 3 tablespoons of the mixture in the bottom of the bottle and fill the rest up with water. It might taste a little salty at first but I quickly got accustomed to it.

One tip – I reused the same old peanut butter jar and I used a sharpie to mark the 2 cup line so I can easily fill the honey to the line without wasting a lot of it by having to use a separate measuring cup.


Have you tried this or something similar?  Do you have any suggestions for the recipe?  I’d love to hear them.


Do High School Sports Create or Reveal Character?

A paper published last month asks this question and, from the perspective of this high school XC coach, comes to a perhaps sobering conclusion: they find no correlation with high school sports participation and later life outcomes like attending college, higher wages, and labor force participation. On first thought this is exactly opposite of what I would expect.

It’s an even more interesting question that I initially thought after reading the paper.  High school sports participation has consistently risen for 25 years and now 56% of students participate in some type of sport.  This is good of course, but like anything else there are some costs.  Participation in sports necessarily takes time away from other pursuits (like homework or other academics) and the cost to high school is certainly not negligible.  There’s also a risk of injury in sports which is a cost that, because of research on football related concussions, is higher than we estimated a few years ago.

The paper points out that athletic programs are being dropped at an increasing rate – they estimate that 27% of high schools will have no athletic programs by 2020 which seems surprising to me.

Given the budget constraints at many high schools and the cost of athletic programs this seems like an important study.  Participation in high school sports is widely found to be correlated with good outcomes later in life, but is it causal or simply selection bias?  (That is, do kids that are already predisposed to good outcomes choose to participate in high school sports?) If you could find that high school sports cause better outcomes then that would be excellent evidence that the costs are worth it.

Interestingly that is not what this paper finds.  It finds that the effect is not causal and therefore most likely due to selection.  It does find, however, that men (and not women) are more likely to exercise regularly as adults when they participate in high school sports.  They are no less likely to be obese adults though.

As I read the paper I kept waiting for them to examine the effect of specific sports.  One theory I have (albeit maybe biased) is that all sports are not equal in determining later life outcomes.  Some high school sports have very little opportunity for continued participation as adults (football, baseball, field hockey, wrestling) while for others it’s very convenient and common for adults to participate (cross country, tennis, basketball). If it’s easier to participate as adults then it makes more sense to encourage kids to play those sports in high school.  It could also be possible that some sports are negatively correlated with exercising as adults.  What percent of regularly exercising adults are doing so by playing football?  An incredibly small number.

I’ve emailed the paper’s authors to see if they looked at the effects of specific sports on their examined outcomes.