Personal side projects

In my spare time, I enjoy building little side projects that are useful to myself and potentially to others, trying to make daily life a little bit easier through coding. Pretty much everything I write ends up with permissive open-source licenses on GitHub, in the hopes it may solve some problems for others’ too. Some highlights:
PackageMate
jat255/PackageMate (100 stars)
Using React, MongoDB, Express.js, and Node, this was a simple web app I built primarily to learn about “full-stack” JS development. The app centralizes tracking of shipped packages by connecting various shipping service APIs (or scraping status webpages, where necessary) and presenting them in one coherent interface.
Zwift Click Handler
jat255/Zwift_click_handling (35 stars)
Using Python and Bluetooth LE communication, this project is a small service to pair and receive button presses from the “Zwift Click” Bluetooth LE button. This work involved reverse engineering of the Bluetooth LE protocol and translating button presses into simulated keyboard strokes for use in programs other than Zwift. I’ve been using this to control virtual shifting in other indoor training virtual cycling platforms than the one (Zwift) it was designed for.
Fit File Faker
jat255/fit-file-faker (30 stars)
Using Python, this is a tool to automatically process FIT workout activity files produced by various indoor bike training platforms to increase compatibility with Garmin’s web services.
Solar System Logging
jat255/solar-inverter-datalogger
Using Python, Bluetooth Low-energy, InfluxDB, Grafana, Android Reverse Engineering, this project runs a service (deployed on a Raspberry Pi Zero) to extract real-time production data from my home’s photovoltaic inverter via Bluetooth Low Energy communication. Data from the inverter is logged to an InfluxDB time-series database, with visualizations and alerting built in a Grafana dashboard. This project was motivated by the lack of data provided by the system as-installed, so I reverse-engineered the vendor’s Android application and built my own monitoring system that has been running for five years with minimal intervention. An example screenshot of the dashboard is in the featured image at the top of this post.