A web application for recording decisions - the context, the options considered, the reasoning, and eventually the outcome.
(Not yet) Live at decisionlog.app
This isn't a novel product idea. It's a deliberate showcase of the full development and deployment pipeline:
- FastAPI Python web application with Jinja2 server-side rendering
- Google OAuth authentication (no password storage)
- PostgreSQL via SQLAlchemy ORM
- Docker containerisation with multi-service local dev via Compose
- GitHub Actions CI/CD pipeline
- Google Cloud Run for serverless container deployment
- Google Artifact Registry for container image storage
- Google Cloud SQL for managed Postgres in production
- Google Secret Manager for secrets (no env vars in deployment config)
- Workload Identity Federation - no long-lived service account keys
- Custom domain with automatic HTTPS via Cloud Run domain mapping
The v2 branch will add "The Argument Clinic" - a feature for steelmanning both sides of a decision before making it - demonstrating a full feature deployment through the same pipeline.
- Docker and Docker Compose
- A Google OAuth app (see below)
git clone https://github.com/stetho/decision-log.git
cd decision-log
cp .env.example .env
# Fill in GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and SECRET_KEY
docker compose upApp runs at http://localhost:8000
- Go to Google Cloud Console → APIs & Services → Credentials
- Create an OAuth 2.0 Client ID (Web application)
- Add
http://localhost:8000/auth/callbackto Authorised redirect URIs - Copy client ID and secret into your
.env
GitHub push to main
→ GitHub Actions: test → build Docker image → push to Artifact Registry
→ Cloud Run: pull image, deploy
→ Cloud SQL: managed Postgres (europe-west2)
→ Secret Manager: DATABASE_URL, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, SECRET_KEY
→ Custom domain: decisionlog.app → Cloud Run service