Features
CI
GitHub Actions pipeline — lint, type-check, and unit tests on every push.
TheShipStack ships with a GitHub Actions CI pipeline at .github/workflows/ci.yml.
What runs on every push
| Job | Command | Purpose |
|---|---|---|
| Lint | pnpm lint | ESLint — catches code quality issues |
| Type check | pnpm type-check | TypeScript — catches type errors |
| Unit tests | pnpm test | Vitest — fast unit test suite |
Git hooks
Husky + Commitlint enforce:
- Pre-commit: lint-staged runs ESLint and Prettier on staged files
- Commit-msg: Commitlint enforces conventional commit format
Commit format examples:
feat: add voting to feedback postsfix: correct password reset redirectdocs: update deployment guide
Valid prefixes: feat, fix, docs, style, refactor, test, chore.
CI environment variables
The workflow ships with dummy placeholder values so lint, type-check, and tests pass without real credentials — no external services are called during those steps.
For a real deployment pipeline, store your actual credentials as GitHub repository secrets (Settings → Secrets and variables → Actions), then override just the build step:
- name: Build
run: pnpm build
env:
RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }}
RESEND_FROM_EMAIL: ${{ secrets.RESEND_FROM_EMAIL }}
B2_PUBLIC_URL: ${{ secrets.B2_PUBLIC_URL }}
STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }}
STRIPE_WEBHOOK_SECRET: ${{ secrets.STRIPE_WEBHOOK_SECRET }}
STRIPE_PRICE_ID_STARTER_MONTHLY: ${{ secrets.STRIPE_PRICE_ID_STARTER_MONTHLY }}
STRIPE_PRICE_ID_STARTER_ANNUAL: ${{ secrets.STRIPE_PRICE_ID_STARTER_ANNUAL }}
STRIPE_PRICE_ID_PRO_MONTHLY: ${{ secrets.STRIPE_PRICE_ID_PRO_MONTHLY }}
STRIPE_PRICE_ID_PRO_ANNUAL: ${{ secrets.STRIPE_PRICE_ID_PRO_ANNUAL }}
STRIPE_PRICE_ID_BUSINESS_MONTHLY: ${{ secrets.STRIPE_PRICE_ID_BUSINESS_MONTHLY }}
STRIPE_PRICE_ID_BUSINESS_ANNUAL: ${{ secrets.STRIPE_PRICE_ID_BUSINESS_ANNUAL }}Skipping CI
Do not use --no-verify to skip hooks. Fix the underlying issue instead.