--- title: "Garmin Eink" date: 2026-02-20T15:42:06Z draft: false image: /projects/garmin-eink/featured.jpg summary: "Using an Eink display with an ESP32 to track and motivate me for a virtual running challenge" tags: ["ESP32", "Self-Hosting"] --- ### 📋 Project Highlights * **Goal:** Show my running progress on my desk * **Tech Stack:** Python, ESP32, C# * **Outcome:** A clean and simple setup that works reliably For christmas my wife got me a virtual running challenge. I have to run 80km with a smart watch and at the end I get a nice Scooby-Doo medal. The issue is, now that everything requires its own app I forget to open it. My Garmin watch tracks all my running and syncs it to the running app but I wanted a way see my progress, clearly on my desk in the hope it will motivate me to get out and run more. I had a waveshare 4.2" eink display in my drawer that ive been looking to find a good use for. A quick search only and I found a python wrapper that can pull data from Garmin connect and suddenly I had all the pieces to put this project together. --- ### Step 1 - Getting the Garmin Data I found this brilliant tool online called [Python Garmin Connect](https://github.com/cyberjunky/python-garminconnect) that allows you to input your Garmin account details and pull specific data from their API. The tool was installed and setup up as a system service on my server and the results servered with a Caddy web server. ### Step 2 - Displaying data on the eink screen In VS Code I installed platform IO and connected my ESP32. The code was written to connect to wifi, grab the data from the web server and display it to the eink. I gave it a title and a progress bar with percentage to clearly show how much I have completed. I also added a Last Updated time stamp and logic to put the ESP to deep sleep and only update each morning after my typical workout time slot. ![Early basic setup](./basic-setup.jpg) I later decided it made more sense to show todays date at the botton my the page, making it double as a basic daily calender. One of the greatest challenges was my desicion to include an image. An easier option would have been to buy an ESP32 with a micro SD card slot to give me an easier way of storing the image. Wanted to make this work without buying anything new I decided to stream the image from my Caddy server directly ro the display. With some AI magic I had a bash script that would convert any image I gave it to a resized monochrome bitmap suitable for the basic eink display. The great thing about using this approach is it makes changing the image for a different future challenge much easier. The case comes from [printables](https://www.printables.com/model/495094-waveshare-42-e-paper-stand/comments) and felt like the cleanest option. ### 🏁 Summary & Lessons Learned Wrap up your project here. What would you do differently next time? This provides that "closing" feel for a future employer.