Iron Law
NO FIREBASE HOSTING DEPLOY WITHOUT WORKLOAD IDENTITY FEDERATION.
CI/CD uses GitHub Actions + WIF — never long-lived service account JSON keys. The
GOOGLE_APPLICATION_CREDENTIALS environment variable must never point to a key file
in any workflow or .env file.
Project Context
Before using this skill:
- Check
CLAUDE.mdfor the project's build tool and output path (e.g.dist/) - Confirm the
firebase.jsonlocation (typically repo root) - Confirm whether a
hostingblock already exists infirebase.json
Build the web app before deploying:
# Adjust command to match your project's build setup
npm run build
# Confirm the output directory matches firebase.json "public" setting
What are you doing?
Configuring firebase.json?
→ Load references/configuration.md
→ Set "public" to the project's actual build output directory
Deploying live or to a preview channel? → Load references/deploying.md → For CI/CD with GitHub Actions: Load references/ci-cd-github-actions.md
Adding env vars for project ID or WIF?
→ Must sync across all env files (.env, .env.staging, .env.production) in the SAME PR
→ Run the project's env-sync check before committing
References
- Configuration: references/configuration.md
- Deploying: references/deploying.md
- CI/CD (GitHub Actions + WIF): references/ci-cd-github-actions.md
Related Skills
angular-spa— Angular build setup; produces the static outputfirebase-basics— Firebase CLI auth, project setup, npx disciplinegcp-cloud-run— WIF setup patterns reused for Firebase Hosting CI/CDdeployment-engineeragent — for complex multi-environment pipeline setup
Local Development
Firebase Hosting has no local emulator equivalent — the project's dev server handles this:
# Serve locally (no Firebase needed) — adjust to project's dev command
npm run start
# Or test the production build locally
npx -y firebase-tools@latest emulators:start --only hosting
# Serves the build output at http://localhost:5000