<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-04-22T02:22:18+00:00</updated><id>/feed.xml</id><title type="html">3thirty</title><subtitle>3:30 - Almost there.</subtitle><author><name>Ethan Smith</name></author><entry><title type="html">Productionizing Strava charts</title><link href="/2025/04/20/Productionizing-Strava-charts.html" rel="alternate" type="text/html" title="Productionizing Strava charts" /><published>2025-04-20T06:00:00+00:00</published><updated>2025-04-20T06:00:00+00:00</updated><id>/2025/04/20/Productionizing-Strava-charts</id><content type="html" xml:base="/2025/04/20/Productionizing-Strava-charts.html"><![CDATA[<p>I’ve been a Strava user for almost 15 years and have logged a lot of data there – something like 47,000 km across about 2,000 rides. Strava’s analytics are great for digging into a single ride, but I wanted to zoom out—see trends over time, track year-by-year totals, and watch how my average speed and power have changed.</p>

<p>So, during the pandemic, I built a <a href="https://www.github.com/3thirty/strava_charts">Python app to do just that</a>. It uses:</p>

<ul>
  <li><a href="https://bottlepy.org/docs/dev/">Bottle</a> for handling web requests</li>
  <li><a href="https://gunicorn.org">Gunicorn</a> as the dev web server</li>
  <li><a href="https://docs.python-requests.org/en/latest/index.html">Requests</a> for making calls to the Strava API (including OAuth)</li>
  <li><a href="https://github.com/IridiumIO/pyChart.JS">pyChart.JS</a> for rendering the charts</li>
</ul>

<p>The first version was a simple, local-only tool that did exactly what I needed. It was a great experience building something from the ground up using the building blocks of well-designed libraries.</p>

<p>I’d always meant to make the app public but never got around to it—until recently. I decided to <strong>productionize</strong> the app as a learning exercise to get hands-on with some newer AWS tools. Here’s what I used:</p>

<ul>
  <li><a href="https://www.orbstack.dev">OrbStack</a> – to build and run Docker images for a clean dev environment</li>
  <li><a href="https://docs.github.com/en/actions">GitHub Actions</a> – to automate Docker builds and deployment</li>
  <li><a href="https://aws.amazon.com/serverless/sam/">AWS SAM</a> – to orchestrate AWS services like ECR, Route53, API Gateway, and Lambda</li>
</ul>

<p>This required a few code tweaks—handling Lambda event input and fixing some <code class="language-plaintext highlighter-rouge">requests</code> caching issues on a read-only filesystem—but most of the effort (and slow trial-and-error) was in setting up the CI/CD pipeline.</p>

<p>Along the way, I picked up a few things:</p>

<ul>
  <li><strong>ChatGPT</strong> turned out to be a really helpful tool for ramping up quickly on new tech and syntax—it saved me a ton of time getting the initial AWS SAM and GitHub Actions configurations set up. That said, it tends to get confused when troubleshooting. Being able to clearly frame a specific question made a big difference.</li>
  <li><strong>AWS SAM</strong> seems really powerful, but it still feels a little magical to me, probably because I didn’t run into enough issues to force me to look under the hood.</li>
</ul>

<p>The end result: a fairly streamlined build-and-deploy flow, and a live version of the app now running at <a href="https://stravacharts.3thirty.space">https://stravacharts.3thirty.space</a>*. The full source is available for anyone who wants to run it themselves (or using their own API key)</p>

<p>* Strava login support for users other than me is still pending approval 🤞</p>]]></content><author><name>Ethan Smith</name></author><summary type="html"><![CDATA[I’ve been a Strava user for almost 15 years and have logged a lot of data there – something like 47,000 km across about 2,000 rides. Strava’s analytics are great for digging into a single ride, but I wanted to zoom out—see trends over time, track year-by-year totals, and watch how my average speed and power have changed.]]></summary></entry><entry><title type="html">Hello to github pages</title><link href="/jekyll/update/2024/11/03/hello-to-github-pages.html" rel="alternate" type="text/html" title="Hello to github pages" /><published>2024-11-03T21:19:12+00:00</published><updated>2024-11-03T21:19:12+00:00</updated><id>/jekyll/update/2024/11/03/hello-to-github-pages</id><content type="html" xml:base="/jekyll/update/2024/11/03/hello-to-github-pages.html"><![CDATA[<p>This site (using jekyll via github pages) is replacing my 17-year old wordpress installation on 3thirty.net (archived on the wayback machine: <a href="https://web.archive.org/web/20240224095106/http://3thirty.net/">https://web.archive.org/web/20240224095106/http://3thirty.net/</a></p>

<p>I’m not bothering to bring over any of the posts that are more than 10 years old, and are about very outdated technology, but hopefully I’ll have some more interesting things to add here soon.</p>

<p>In the meantime, old, outdated code is in my public github repos at <a href="https://web.archive.org/web/20240224095106/http://3thirty.net/">https://www.github.com/3thirty</a></p>]]></content><author><name>Ethan Smith</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[This site (using jekyll via github pages) is replacing my 17-year old wordpress installation on 3thirty.net (archived on the wayback machine: https://web.archive.org/web/20240224095106/http://3thirty.net/]]></summary></entry><entry><title type="html">Alfred app for Flickr API documentation</title><link href="/2018/08/17/Alfred-app-for-Flickr-API-documentation.html" rel="alternate" type="text/html" title="Alfred app for Flickr API documentation" /><published>2018-08-17T06:00:00+00:00</published><updated>2018-08-17T06:00:00+00:00</updated><id>/2018/08/17/Alfred-app-for-Flickr-API-documentation</id><content type="html" xml:base="/2018/08/17/Alfred-app-for-Flickr-API-documentation.html"><![CDATA[<p>I have just published a simple <a href="https://www.alfredapp.com/">Alfred App</a> workflow that provides easier access to <a href="https://www.flickr.com/services/api">flickr’s API documentation</a> and the API explorer. It’s not very complex, but is useful for someone (like me) who uses the flickr API regularly</p>

<p>You can get it from <a href="https://github.com/3thirty/alfred-flickr-api">https://github.com/3thirty/alfred-flickr-api</a></p>

<p><img src="/content/2018-08-17-screenshot.png" alt="Alfred App Screenshot" title="Alfred App Screenshot" /></p>]]></content><author><name>Ethan Smith</name></author><summary type="html"><![CDATA[I have just published a simple Alfred App workflow that provides easier access to flickr’s API documentation and the API explorer. It’s not very complex, but is useful for someone (like me) who uses the flickr API regularly]]></summary></entry></feed>