What CI/CD actually does
Continuous Integration: every commit triggers a build that runs linting, typechecking, tests, and any other checks. If anything fails, the commit can't merge.
Continuous Deployment: when code lands on the main branch, it gets built and deployed to production automatically. No human pressing a button.
The combination means: every commit is potentially shippable. Speed of releases stops being a function of "do we have time to deploy" and becomes a function of "is the code good."
What a real pipeline includes in 2026
- TypeScript typecheck
- Linter (ESLint or Biome)
- Unit tests
- Integration tests against a real database (test container)
- E2E tests on critical paths (Playwright)
- Build the production bundle and check size budgets
- Security scan (Snyk, Dependabot, npm audit at minimum)
- For AI features: eval suite as a gate
- Preview deploy on every PR
- Production deploy on main
What most teams skip (and shouldn't)
- Preview deploys per PR. Cheap on Vercel/Netlify, expensive to get value from without it. You can't review UX from a screenshot.
- Database migrations in CI. A broken migration that only blows up in production at 3 AM is preventable.
- The eval gate for LLM features. Skip this and a "better" model silently ships at lower accuracy.
- Type checks separate from tests. Tests run a subset of code; types check all of it.
What we ship as default
Next.js + Vercel + GitHub Actions. Preview deploys on every branch. Production deploy on merge to main. The whole setup is free for most projects under Vercel's free tier and takes about 2 hours to wire correctly on day one.


