building / deploying / learning
Live Demo: tronswan.com
- 🍳 Chomptron — AI-powered recipe generator via Google Gemini. Connects to chomptron.com
- 🔧 Wrenchtron — Vehicle maintenance tracker with smart scheduling, NHTSA recall lookup, and offline PWA. Lives at wrenchtron.com
- 🦢 Swantron — Personal blog feed from swantron.com with search and pagination
- 🎵 Spotify Music Player — Top tracks, artists, playlists, liked songs, recently played, and playback control (Premium required)
- ⚾ MLB — Live standings, team stat splits, playoff race with elimination numbers, and top-10 rankings
- 🌡️ Weathertron — Real-time weather and 5-day forecast. Autocomplete city search, °F/°C/K toggle
- 📄 Resume — Content dynamically loaded from Google Docs API (setup guide)
- 🎬 Shorts — Gallery of video shorts with modal player
- 📊 Status — Blended fleet health at
/status: live API checks + continuous uptime/incidents from uptime-monitor (the heartbeat) overlaid with verified-deploy provenance from watchtron (the deploy gate), plus GitHub Actions + DigitalOcean monitoring (guide) - 🏠 Home — Hub page; clicking the logo navigates to a random video short
- Frontend: React 19.2, TypeScript, React Router 7.10
- Styling: CSS3 with CSS Variables, Responsive Design
- SEO: react-helmet-async for dynamic meta tags and Open Graph
- Testing: Vitest, React Testing Library, Playwright (E2E)
- Build Tools: Vite 7.1, TypeScript 5.9
- Server: Express.js 5.1 for production deployment
- Deployment: DigitalOcean App Platform
- APIs: Hugo JSON API, OpenWeatherMap, GitHub, DigitalOcean, Spotify Web API, MLB Stats, Google Docs
- Package Manager: Yarn
- CI/CD: Buildkite (dynamic pipeline, GCP agents) + GitHub Actions (deploy gating, Playwright E2E)
- Node.js (v24 or higher)
- Yarn package manager
git clone https://github.com/swantron/tronswan.git
cd tronswan
yarn installCreate a .env file — see Environment Configuration for the full list. Minimum for local dev:
VITE_WEATHER_API_KEY=your_openweathermap_api_key
VITE_WEATHER_CITY=Bozeman
VITE_WEATHER_UNITS=imperial
VITE_SITE_URL=https://tronswan.comyarn dev # development server
yarn build # TypeScript check + Vite build
yarn test --run # unit tests (Vitest)
yarn test:coverage # tests with coverage
yarn lint # ESLint
yarn type-check # TypeScript without emitting
yarn test:e2e # Playwright E2E testsThis repo uses a dynamic Buildkite pipeline at .buildkite/pipeline.yml running on a self-hosted GCP agent from buildkite-gcp-agent.
.buildkite/generate-pipeline.sh inspects which files changed and emits only the relevant steps:
Push / PR
└── Generate Pipeline
└── generate-pipeline.sh | buildkite-agent pipeline upload
└── src/** changed → Lint + Type-check (Tier 1)
components/hooks/... → Unit tests + coverage (Tier 2)
config/deps or main → Build (Tier 3)
always → Annotate result
| Tier | Steps | Triggers |
|---|---|---|
| 1 | Lint, Type-check | Any src/ change |
| 2 | Unit tests + coverage | components/, hooks/, services/, utils/ |
| 3 | Build | Config/dependency changes or push to main |
| — | Annotate | Always |
E2E tests run against the live DigitalOcean deployment via GHA — kept out of Buildkite as a security boundary.
All steps target queue: gcp.
Deployed to DigitalOcean App Platform via GitHub Actions. The Express server (server.js) serves the Vite build with SPA fallback routing. See CI/CD Setup for details.
MIT