TheShipStack Docs
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

JobCommandPurpose
Lintpnpm lintESLint — catches code quality issues
Type checkpnpm type-checkTypeScript — catches type errors
Unit testspnpm testVitest — 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 posts
  • fix: correct password reset redirect
  • docs: 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.

On this page