What happens when there's no CI: the pratyaksha deploy
Pratyaksha — our AI cognitive journaling app — had no CI pipeline. Every release depended on three fragile local conditions: a running Docker daemon, a fresh Firebase CLI token, and valid local AWS credentials. If any of those were missing, the deploy failed. And every deploy was manual.
The failure cascade was predictable: merge to main, deploy nothing. The developer tries to deploy locally, Docker Desktop isn't running. Start Docker, try again, Firebase auth token expired (firebase login:list lied and showed the account as logged in). Try firebase login --reauth — refuses non-interactive mode in the terminal. Three hours lost to a deployment that should have been a push.
The fix was PR #20: a deploy-pratyaksha.yml that triggers on push to main, builds the frontend on the GitHub runner, pushes the Docker image to ECR, and redeploys Lightsail — all with keyless WIF/OIDC auth. No local credentials, no Docker Desktop dependency. The pipeline ran green on first push: frontend in 2m55s, backend in 3m49s.
The rule: a production app with no push-to-deploy pipeline is an incident waiting to happen. CI is not optional infrastructure — it's the minimum viable deployment mechanism. Every hour spent on CI setup saves a day of debugging "but it works on my machine" later.
Also: CLI login tokens rot independently of browser sessions. firebase login --reauth cannot be automated. Use keyless identity (WIF/OIDC) everywhere.