Local app for tracking running activities.
I've used a variety of GPS devices and apps over the years. I wanted to have better control over my data, as they can be rather inconsistent (and let's be honest, you never know when they might simply go away or force a pay wall). This application is really just to serve my own needs and isn't public, but it is useful as a technical demonstration as it covers a range of interesting technologies.
WetzRun is split into a few different components:
- .NET 4.7 console app for processing GPS files
- ASP.NET Core + Carter web api
- A Vue-based front end web app
- A simple WPF app for viewing summary data
The GPS processor handles a variety of formats, including FIT, GPX, TCX, and CSV data. It has logic specific to the services I've used in the past, as well as for my devices (as software and hardware support tends to vary, even for the same manufacturer). I have it configured to copy files off attached GPS devices and then process them as needed (basically saves me from having to manually backup said files). It supports calculating mileage based on GPS points for any files that don't have it included. It will also pull additional metadata such as elevation gain/loss and temperature, if the given file has the data (varies by device).
The API is very simple. It has no authentication or security (I only run it locally) and only includes calls that I need in the front end.
Initially the web app was a simple read-only ASP.NET MVC app using Razor views. I decided to create a new fully functional version, using a new-to-me framework as a learning experience. While you can just use bits and pieces of Vue, that would have defeated the purpose; as such, the web app uses the full Vue stack (Vue Router, Vuex, single file Vue components, webpack, npm, babel). I utilized the official template to get started.
The WPF app lets me review my current weekly mileage status (as well as a guideline for max miles to avoid injury). Since it's stand-alone, it's very fast and I don't have to worry about spinning up the web server/client apps.