This repo is the public home for Ryan Baumann's portfolio and demo lab. It is part personal site, part runnable reference architecture, and part proof that developer experience work should ship as real artifacts.
The live site is https://www.ryanbaumann-portfolio.com/.
- Portfolio site at
/: a zero-dependency static site over a flat-file markdown CMS. It covers work, writing, talks, and demos with no client-side JavaScript. - Demo lab under app paths: Strava 3D Explorer, Air Quality Map, and Isochrones, each built as a self-contained app.
- Gateway in
gateway/: a zero-npm-dependency Node server that serves the site, mounts each demo, and keeps secret-bearing API calls behind same-origin/api/*routes. - Cloud Run container: one deployable artifact for the site and every demo.
The portfolio narrative is intentionally grounded: solution architecture, developer experience, forward-deployed incubation at Google Maps Platform, and product growth leadership. The codebase backs that up with live apps, public docs, shipped links, tests, smoke checks, and a changelog.
| Goal | Command |
|---|---|
| Configure local secrets | npm run setup |
| Build the whole container locally | npm run build |
| Run the production gateway locally | npm start |
| Smoke-test routes, assets, proxies, and secret leaks | npm run smoke |
| Add a demo app | npm run new:demo -- my-demo --title "My Demo" |
| Add a blog post | npm run new:post -- "Post title" |
| Regenerate demo screenshots | npm run previews |
- Site / Portfolio, served at
/: Ryan's home page, work, writing, talks, and demo index. - Strava 3D Explorer: visualize Strava routes, endpoints, and photos in Google Maps Platform Photorealistic 3D.
- Air Quality Map: inspect live Air Quality API heatmap tiles and point conditions on a 2D Google map.
- Isochrones: analyze delivery, commute, and response reachability with live-regenerating isochrone bands.
npm run setup
npm run build
npm startOpen http://localhost:8080/. Then run:
npm run smokeEach app can also run on its own dev server:
cd strava-explorer && npm install && npm run dev
cd aqi-map && npm install && npm run dev
cd isochrones && npm install && npm run dev
cd portfolio && node build.mjs && node serve.mjsportfolio/ builds static HTML into portfolio/dist/. Each demo builds its own static bundle. scripts/build-local.mjs stages those outputs under apps/<name>/, matching the Docker runtime layout. gateway/server.js serves the portfolio at the root, mounts demo apps from apps.json by most-specific path first, and proxies secret-bearing calls through server-side routes. See docs/ARCHITECTURE.md for the full design.
- Never commit API keys, OAuth secrets, access tokens, refresh tokens, or generated
.env.*files. - Browser-exposed Google Maps keys must use
VITE_variables, API restrictions, and HTTP referrer restrictions. - Server-side secrets stay in Node env vars:
STRAVA_CLIENT_ID,STRAVA_CLIENT_SECRET, andGMP_SERVER_API_KEY. - Gateway proxy endpoints return keyless
503JSON responses instead of crashing, so smoke tests can run without secrets.
.github/workflows/deploy.yml builds the container with Cloud Build and deploys it to Cloud Run on pushes to main using Workload Identity Federation.
Google Maps Platform usage may incur costs. For prototypes, consider the Maps Demo Key: https://mapsplatform.google.com/maps-demo-key.
These projects integrate Google Maps Platform and Strava APIs. Use them in compliance with the Google Maps Platform Terms of Service, Google Maps End User Additional Terms, Google Privacy Policy, and the Strava Developer Agreement.
Small, focused PRs are welcome. Keep app-specific code, commands, and dependencies inside the app directory you are modifying. Use npm only. Include the validation commands you ran.
MIT. See LICENSE.