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.

5 comments
  1. Dave,
    This is impressive. We currently do not use mile split. I like your php pages where you are gathering from milesplit. How does the data get to MileSplit is that data you upload or the meet host uploads or do you manually input? I would be interested in the PHP files, but would need a bit of direction on milesplit in conjunction. Thoughts?

    1. Thanks, Cory! The data is uploaded manually unfortunately. I’ve contacted MileSplit in the past about their now defunct API and they’re not interested in unearthing it or even providing way to download even your own team’s results in bulk. 🙁

  2. Sounds excellent for Coaching stat nerds like so many of us. I have 69 runners this year, our biggest ever (boys and girls)… And it takes a LOT of time to hand-enter our tape-timer results from smaller meets etc.

    Hopefully you can turn this into a commercial app. I know I would be interested. Please keep us posted.

  3. Hello, I’ve become the Cross Country coach of my children’s grade school this year and found this while looking for a tool to track my team. I am also a web/app developer by profession so I’m impressed with what you’ve got started here. I would be very interested in seeing the code and helping you make it something other coaches could use also. I think you are definitely onto something here and would love to see where it could go. Selfishly, I’d also like to not start from scratch in making a new app for this. I’ve already made a COVID check-in app for the school district that I’m also apparently the tech support guy for…which has been very time-consuming.

Leave a Reply to Cory Freeman Cancel reply

Your email address will not be published. Required fields are marked *