How the sausage gets made 🌭
Spoiler: it involved a lot of AI-assisted typing and remarkably few secrets.
Built with GitHub Copilot
This site — pages, styling, tiny Express server, and the whole deployment pipeline — was built with AI assistance using GitHub Copilot. Yes, even this sentence. Copilot helped scaffold the HTML/CSS/JS, wire up the Node server, and author the GitHub Actions workflow that ships it to Azure.
The infrastructure
The app runs on a deliberately cheap and cheerful setup: a B1 Basic tier Azure Linux App Service, provisioned entirely as code using Bicep in a companion "lab" repo. No clicking around the Azure Portal — the infra is defined, versioned, and repeatable.
- Runtime: NODE|20-lts on Linux App Service
- Infra-as-code: Bicep templates in a sibling repo
- App code: this repo — plain static files behind a minimal Express server
The deployment pipeline
Every push to main triggers a GitHub Actions workflow that:
- Checks out the code and sets up Node.js 20
- Installs dependencies
- Logs into Azure using OIDC federated authentication — no client secrets or publish profiles stored anywhere
- Deploys straight to the App Service via azure/webapps-deploy
The app name itself is never hardcoded — it's injected via a repository variable, since Bicep gives the real App Service a unique, generated suffix.