← Back to the workshop How and why I built it

This site

One home for everything I build, stitched together at the edge and refreshed by itself every 15 minutes.

You're on itCloudFront · S3 · Lambda · DynamoDB · CDKAbout $1–2 a month
The Live page: latest run, latest flag football game, the last 30 days in activities, Citi Bike numbers, and GitHub activity
The Live page. Every number on it updates itself.Open it →

The itch

Every tool I built lived at its own random CloudFront address that nobody could remember. I wanted one place for all of it: somewhere I could send a friend or a recruiter, that also shows what I've been up to without me having to keep it updated.

What it does

How a page gets to you

The pages are plain HTML files in a private S3 bucket. CloudFront serves them over HTTPS from edge locations close to you, and a tiny function runs on every request before anything is fetched.

  1. Youshampoe.com
  2. Route 53DNS
  3. CloudFrontHTTPS · edge cache
  4. Router functionruns on every request
  5. Page or appS3 · Citi Bike · Volo
The router adds missing slashes, redirects www, and sends /citibike/app/ and /volo/app/ to those projects' own CloudFront sites.

Stitching projects together. When you open /citibike/app/, the router strips the prefix and forwards the request to Citi Bike Tides' own CloudFront distribution. The map loads its data with relative paths, so it works here without any changes, and every deploy of that project shows up here immediately.

How the Live page stays fresh

A small Python Lambda runs every 15 minutes, gathers the latest from each source, and writes a single live.json file. The page reads that file and fills in the tiles. If one source is down, its tile simply stays hidden.

  1. Every 15 minutesEventBridge schedule
  2. Live feed LambdaPython
  3. Five sourcesGitHub · Goodreads · Citi Bike · Volo · Strava
  4. live.jsonS3
  5. Your browserlive.js fills the tiles
Volo's poller adds each new drop-in to a daily count in DynamoDB, and the Lambda reads it from there.

Privacy on the maps. Run maps drop everything within 400 meters of the start and finish, so they never show where I live. Flag football games are drawn in full, since the whole game happens on one field. Only slow, on-the-field activities count as games, which keeps a ride home I once mislabeled "Flag Football" off the map.

Secrets stay in AWS. Strava credentials live encrypted in SSM Parameter Store, and the Lambda saves Strava's rotating refresh token back there on its own.

Built with

Everything, from the certificate and DNS to the schedule and permissions, is defined in AWS CDK, so the whole site can be rebuilt from the repo with one command. It costs about a dollar or two a month, mostly the domain's DNS.

What's next

A "now playing" tile from Spotify on the Live page, and more tools on the workbench.

See it in action

The Live page updated a few minutes ago.

Open the Live page →