create-blitzpack 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/index.js +35 -77
  2. package/package.json +5 -6
  3. package/template/.dockerignore +0 -59
  4. package/template/.github/workflows/ci.yml +0 -157
  5. package/template/.husky/pre-commit +0 -1
  6. package/template/.husky/pre-push +0 -1
  7. package/template/.lintstagedrc.cjs +0 -4
  8. package/template/.nvmrc +0 -1
  9. package/template/.prettierrc +0 -9
  10. package/template/.vscode/settings.json +0 -13
  11. package/template/CLAUDE.md +0 -175
  12. package/template/CONTRIBUTING.md +0 -32
  13. package/template/Dockerfile +0 -90
  14. package/template/GETTING_STARTED.md +0 -35
  15. package/template/LICENSE +0 -21
  16. package/template/README.md +0 -116
  17. package/template/apps/api/.dockerignore +0 -51
  18. package/template/apps/api/.env.local.example +0 -62
  19. package/template/apps/api/emails/account-deleted-email.tsx +0 -69
  20. package/template/apps/api/emails/components/email-layout.tsx +0 -154
  21. package/template/apps/api/emails/config.ts +0 -22
  22. package/template/apps/api/emails/password-changed-email.tsx +0 -88
  23. package/template/apps/api/emails/password-reset-email.tsx +0 -86
  24. package/template/apps/api/emails/verification-email.tsx +0 -85
  25. package/template/apps/api/emails/welcome-email.tsx +0 -70
  26. package/template/apps/api/package.json +0 -84
  27. package/template/apps/api/prisma/migrations/20251012111439_init/migration.sql +0 -13
  28. package/template/apps/api/prisma/migrations/20251018162629_add_better_auth_fields/migration.sql +0 -67
  29. package/template/apps/api/prisma/migrations/20251019142208_add_user_role_enum/migration.sql +0 -5
  30. package/template/apps/api/prisma/migrations/20251019182151_user_auth/migration.sql +0 -7
  31. package/template/apps/api/prisma/migrations/20251019211416_faster_session_lookup/migration.sql +0 -2
  32. package/template/apps/api/prisma/migrations/20251119124337_add_upload_model/migration.sql +0 -26
  33. package/template/apps/api/prisma/migrations/20251120071241_add_scope_to_account/migration.sql +0 -2
  34. package/template/apps/api/prisma/migrations/20251120072608_add_oauth_token_expiration_fields/migration.sql +0 -10
  35. package/template/apps/api/prisma/migrations/20251120144705_add_audit_logs/migration.sql +0 -29
  36. package/template/apps/api/prisma/migrations/20251127123614_remove_impersonated_by/migration.sql +0 -8
  37. package/template/apps/api/prisma/migrations/20251127125630_remove_audit_logs/migration.sql +0 -11
  38. package/template/apps/api/prisma/migrations/migration_lock.toml +0 -3
  39. package/template/apps/api/prisma/schema.prisma +0 -116
  40. package/template/apps/api/prisma/seed.ts +0 -159
  41. package/template/apps/api/prisma.config.ts +0 -14
  42. package/template/apps/api/src/app.ts +0 -377
  43. package/template/apps/api/src/common/logger.service.ts +0 -227
  44. package/template/apps/api/src/config/env.ts +0 -60
  45. package/template/apps/api/src/config/rate-limit.ts +0 -29
  46. package/template/apps/api/src/hooks/auth.ts +0 -122
  47. package/template/apps/api/src/plugins/auth.ts +0 -198
  48. package/template/apps/api/src/plugins/database.ts +0 -45
  49. package/template/apps/api/src/plugins/logger.ts +0 -33
  50. package/template/apps/api/src/plugins/multipart.ts +0 -16
  51. package/template/apps/api/src/plugins/scalar.ts +0 -20
  52. package/template/apps/api/src/plugins/schedule.ts +0 -52
  53. package/template/apps/api/src/plugins/services.ts +0 -66
  54. package/template/apps/api/src/plugins/swagger.ts +0 -56
  55. package/template/apps/api/src/routes/accounts.ts +0 -91
  56. package/template/apps/api/src/routes/admin-sessions.ts +0 -92
  57. package/template/apps/api/src/routes/metrics.ts +0 -71
  58. package/template/apps/api/src/routes/password.ts +0 -46
  59. package/template/apps/api/src/routes/sessions.ts +0 -53
  60. package/template/apps/api/src/routes/stats.ts +0 -38
  61. package/template/apps/api/src/routes/uploads-serve.ts +0 -27
  62. package/template/apps/api/src/routes/uploads.ts +0 -154
  63. package/template/apps/api/src/routes/users.ts +0 -114
  64. package/template/apps/api/src/routes/verification.ts +0 -90
  65. package/template/apps/api/src/server.ts +0 -34
  66. package/template/apps/api/src/services/accounts.service.ts +0 -125
  67. package/template/apps/api/src/services/authorization.service.ts +0 -162
  68. package/template/apps/api/src/services/email.service.ts +0 -170
  69. package/template/apps/api/src/services/file-storage.service.ts +0 -267
  70. package/template/apps/api/src/services/metrics.service.ts +0 -175
  71. package/template/apps/api/src/services/password.service.ts +0 -56
  72. package/template/apps/api/src/services/sessions.service.spec.ts +0 -134
  73. package/template/apps/api/src/services/sessions.service.ts +0 -276
  74. package/template/apps/api/src/services/stats.service.ts +0 -273
  75. package/template/apps/api/src/services/uploads.service.ts +0 -163
  76. package/template/apps/api/src/services/users.service.spec.ts +0 -249
  77. package/template/apps/api/src/services/users.service.ts +0 -198
  78. package/template/apps/api/src/utils/file-validation.ts +0 -108
  79. package/template/apps/api/start.sh +0 -33
  80. package/template/apps/api/test/helpers/fastify-app.ts +0 -24
  81. package/template/apps/api/test/helpers/mock-authorization.ts +0 -16
  82. package/template/apps/api/test/helpers/mock-logger.ts +0 -28
  83. package/template/apps/api/test/helpers/mock-prisma.ts +0 -30
  84. package/template/apps/api/test/helpers/test-db.ts +0 -125
  85. package/template/apps/api/test/integration/auth-flow.integration.spec.ts +0 -449
  86. package/template/apps/api/test/integration/password.integration.spec.ts +0 -427
  87. package/template/apps/api/test/integration/rate-limit.integration.spec.ts +0 -51
  88. package/template/apps/api/test/integration/sessions.integration.spec.ts +0 -445
  89. package/template/apps/api/test/integration/users.integration.spec.ts +0 -211
  90. package/template/apps/api/test/setup.ts +0 -31
  91. package/template/apps/api/tsconfig.json +0 -26
  92. package/template/apps/api/vitest.config.ts +0 -35
  93. package/template/apps/web/.env.local.example +0 -11
  94. package/template/apps/web/components.json +0 -24
  95. package/template/apps/web/next.config.ts +0 -22
  96. package/template/apps/web/package.json +0 -56
  97. package/template/apps/web/postcss.config.js +0 -5
  98. package/template/apps/web/public/apple-icon.png +0 -0
  99. package/template/apps/web/public/icon.png +0 -0
  100. package/template/apps/web/public/robots.txt +0 -3
  101. package/template/apps/web/src/app/(admin)/admin/layout.tsx +0 -222
  102. package/template/apps/web/src/app/(admin)/admin/page.tsx +0 -157
  103. package/template/apps/web/src/app/(admin)/admin/sessions/page.tsx +0 -18
  104. package/template/apps/web/src/app/(admin)/admin/users/page.tsx +0 -20
  105. package/template/apps/web/src/app/(auth)/forgot-password/page.tsx +0 -177
  106. package/template/apps/web/src/app/(auth)/login/page.tsx +0 -159
  107. package/template/apps/web/src/app/(auth)/reset-password/page.tsx +0 -245
  108. package/template/apps/web/src/app/(auth)/signup/page.tsx +0 -153
  109. package/template/apps/web/src/app/dashboard/change-password/page.tsx +0 -255
  110. package/template/apps/web/src/app/dashboard/page.tsx +0 -296
  111. package/template/apps/web/src/app/error.tsx +0 -32
  112. package/template/apps/web/src/app/examples/file-upload/page.tsx +0 -200
  113. package/template/apps/web/src/app/favicon.ico +0 -0
  114. package/template/apps/web/src/app/global-error.tsx +0 -96
  115. package/template/apps/web/src/app/globals.css +0 -22
  116. package/template/apps/web/src/app/icon.png +0 -0
  117. package/template/apps/web/src/app/layout.tsx +0 -34
  118. package/template/apps/web/src/app/not-found.tsx +0 -28
  119. package/template/apps/web/src/app/page.tsx +0 -192
  120. package/template/apps/web/src/components/admin/activity-feed.tsx +0 -101
  121. package/template/apps/web/src/components/admin/charts/auth-breakdown-chart.tsx +0 -114
  122. package/template/apps/web/src/components/admin/charts/chart-tooltip.tsx +0 -124
  123. package/template/apps/web/src/components/admin/charts/realtime-metrics-chart.tsx +0 -511
  124. package/template/apps/web/src/components/admin/charts/role-distribution-chart.tsx +0 -102
  125. package/template/apps/web/src/components/admin/charts/session-activity-chart.tsx +0 -90
  126. package/template/apps/web/src/components/admin/charts/user-growth-chart.tsx +0 -108
  127. package/template/apps/web/src/components/admin/health-indicator.tsx +0 -175
  128. package/template/apps/web/src/components/admin/refresh-control.tsx +0 -90
  129. package/template/apps/web/src/components/admin/session-revoke-all-dialog.tsx +0 -79
  130. package/template/apps/web/src/components/admin/session-revoke-dialog.tsx +0 -74
  131. package/template/apps/web/src/components/admin/sessions-management-table.tsx +0 -372
  132. package/template/apps/web/src/components/admin/stat-card.tsx +0 -137
  133. package/template/apps/web/src/components/admin/user-create-dialog.tsx +0 -152
  134. package/template/apps/web/src/components/admin/user-delete-dialog.tsx +0 -73
  135. package/template/apps/web/src/components/admin/user-edit-dialog.tsx +0 -170
  136. package/template/apps/web/src/components/admin/users-management-table.tsx +0 -285
  137. package/template/apps/web/src/components/auth/email-verification-banner.tsx +0 -85
  138. package/template/apps/web/src/components/auth/github-button.tsx +0 -40
  139. package/template/apps/web/src/components/auth/google-button.tsx +0 -54
  140. package/template/apps/web/src/components/auth/protected-route.tsx +0 -66
  141. package/template/apps/web/src/components/auth/redirect-if-authenticated.tsx +0 -31
  142. package/template/apps/web/src/components/auth/with-auth.tsx +0 -30
  143. package/template/apps/web/src/components/error/error-card.tsx +0 -47
  144. package/template/apps/web/src/components/error/forbidden.tsx +0 -25
  145. package/template/apps/web/src/components/landing/command-block.tsx +0 -64
  146. package/template/apps/web/src/components/landing/feature-card.tsx +0 -60
  147. package/template/apps/web/src/components/landing/included-feature-card.tsx +0 -63
  148. package/template/apps/web/src/components/landing/logo.tsx +0 -41
  149. package/template/apps/web/src/components/landing/tech-badge.tsx +0 -11
  150. package/template/apps/web/src/components/layout/auth-nav.tsx +0 -58
  151. package/template/apps/web/src/components/layout/footer.tsx +0 -3
  152. package/template/apps/web/src/config/landing-data.ts +0 -152
  153. package/template/apps/web/src/config/site.ts +0 -5
  154. package/template/apps/web/src/hooks/api/__tests__/use-users.test.tsx +0 -181
  155. package/template/apps/web/src/hooks/api/use-admin-sessions.ts +0 -75
  156. package/template/apps/web/src/hooks/api/use-admin-stats.ts +0 -33
  157. package/template/apps/web/src/hooks/api/use-sessions.ts +0 -52
  158. package/template/apps/web/src/hooks/api/use-uploads.ts +0 -156
  159. package/template/apps/web/src/hooks/api/use-users.ts +0 -149
  160. package/template/apps/web/src/hooks/use-mobile.ts +0 -21
  161. package/template/apps/web/src/hooks/use-realtime-metrics.ts +0 -120
  162. package/template/apps/web/src/lib/__tests__/utils.test.ts +0 -29
  163. package/template/apps/web/src/lib/api.ts +0 -151
  164. package/template/apps/web/src/lib/auth.ts +0 -13
  165. package/template/apps/web/src/lib/env.ts +0 -52
  166. package/template/apps/web/src/lib/form-utils.ts +0 -11
  167. package/template/apps/web/src/lib/utils.ts +0 -1
  168. package/template/apps/web/src/providers.tsx +0 -34
  169. package/template/apps/web/src/store/atoms.ts +0 -15
  170. package/template/apps/web/src/test/helpers/test-utils.tsx +0 -44
  171. package/template/apps/web/src/test/setup.ts +0 -8
  172. package/template/apps/web/tailwind.config.ts +0 -5
  173. package/template/apps/web/tsconfig.json +0 -26
  174. package/template/apps/web/vitest.config.ts +0 -32
  175. package/template/assets/logo-512.png +0 -0
  176. package/template/assets/logo.svg +0 -4
  177. package/template/docker-compose.prod.yml +0 -66
  178. package/template/docker-compose.yml +0 -36
  179. package/template/eslint.config.ts +0 -119
  180. package/template/package.json +0 -77
  181. package/template/packages/tailwind-config/package.json +0 -9
  182. package/template/packages/tailwind-config/theme.css +0 -179
  183. package/template/packages/types/package.json +0 -29
  184. package/template/packages/types/src/__tests__/schemas.test.ts +0 -255
  185. package/template/packages/types/src/api-response.ts +0 -53
  186. package/template/packages/types/src/health-check.ts +0 -11
  187. package/template/packages/types/src/pagination.ts +0 -41
  188. package/template/packages/types/src/role.ts +0 -5
  189. package/template/packages/types/src/session.ts +0 -48
  190. package/template/packages/types/src/stats.ts +0 -113
  191. package/template/packages/types/src/upload.ts +0 -51
  192. package/template/packages/types/src/user.ts +0 -36
  193. package/template/packages/types/tsconfig.json +0 -5
  194. package/template/packages/types/vitest.config.ts +0 -21
  195. package/template/packages/ui/components.json +0 -21
  196. package/template/packages/ui/package.json +0 -108
  197. package/template/packages/ui/src/__tests__/button.test.tsx +0 -70
  198. package/template/packages/ui/src/alert-dialog.tsx +0 -141
  199. package/template/packages/ui/src/alert.tsx +0 -66
  200. package/template/packages/ui/src/animated-theme-toggler.tsx +0 -167
  201. package/template/packages/ui/src/avatar.tsx +0 -53
  202. package/template/packages/ui/src/badge.tsx +0 -36
  203. package/template/packages/ui/src/button.tsx +0 -84
  204. package/template/packages/ui/src/card.tsx +0 -92
  205. package/template/packages/ui/src/checkbox.tsx +0 -32
  206. package/template/packages/ui/src/data-table/data-table-column-header.tsx +0 -68
  207. package/template/packages/ui/src/data-table/data-table-pagination.tsx +0 -99
  208. package/template/packages/ui/src/data-table/data-table-toolbar.tsx +0 -55
  209. package/template/packages/ui/src/data-table/data-table-view-options.tsx +0 -63
  210. package/template/packages/ui/src/data-table/data-table.tsx +0 -167
  211. package/template/packages/ui/src/dialog.tsx +0 -143
  212. package/template/packages/ui/src/dropdown-menu.tsx +0 -257
  213. package/template/packages/ui/src/empty-state.tsx +0 -52
  214. package/template/packages/ui/src/file-upload-input.tsx +0 -202
  215. package/template/packages/ui/src/form.tsx +0 -168
  216. package/template/packages/ui/src/hooks/use-mobile.ts +0 -19
  217. package/template/packages/ui/src/icons/brand-icons.tsx +0 -16
  218. package/template/packages/ui/src/input.tsx +0 -21
  219. package/template/packages/ui/src/label.tsx +0 -24
  220. package/template/packages/ui/src/lib/utils.ts +0 -6
  221. package/template/packages/ui/src/password-input.tsx +0 -102
  222. package/template/packages/ui/src/popover.tsx +0 -48
  223. package/template/packages/ui/src/radio-group.tsx +0 -45
  224. package/template/packages/ui/src/scroll-area.tsx +0 -58
  225. package/template/packages/ui/src/select.tsx +0 -187
  226. package/template/packages/ui/src/separator.tsx +0 -28
  227. package/template/packages/ui/src/sheet.tsx +0 -139
  228. package/template/packages/ui/src/sidebar.tsx +0 -726
  229. package/template/packages/ui/src/skeleton-variants.tsx +0 -87
  230. package/template/packages/ui/src/skeleton.tsx +0 -13
  231. package/template/packages/ui/src/slider.tsx +0 -63
  232. package/template/packages/ui/src/sonner.tsx +0 -25
  233. package/template/packages/ui/src/spinner.tsx +0 -16
  234. package/template/packages/ui/src/switch.tsx +0 -31
  235. package/template/packages/ui/src/table.tsx +0 -116
  236. package/template/packages/ui/src/tabs.tsx +0 -66
  237. package/template/packages/ui/src/textarea.tsx +0 -18
  238. package/template/packages/ui/src/tooltip.tsx +0 -61
  239. package/template/packages/ui/src/user-avatar.tsx +0 -97
  240. package/template/packages/ui/test-config.js +0 -3
  241. package/template/packages/ui/tsconfig.json +0 -12
  242. package/template/packages/ui/turbo.json +0 -18
  243. package/template/packages/ui/vitest.config.ts +0 -17
  244. package/template/packages/ui/vitest.setup.ts +0 -1
  245. package/template/packages/utils/package.json +0 -23
  246. package/template/packages/utils/src/__tests__/utils.test.ts +0 -223
  247. package/template/packages/utils/src/array.ts +0 -18
  248. package/template/packages/utils/src/async.ts +0 -3
  249. package/template/packages/utils/src/date.ts +0 -77
  250. package/template/packages/utils/src/errors.ts +0 -73
  251. package/template/packages/utils/src/number.ts +0 -11
  252. package/template/packages/utils/src/string.ts +0 -13
  253. package/template/packages/utils/tsconfig.json +0 -5
  254. package/template/packages/utils/vitest.config.ts +0 -21
  255. package/template/pnpm-workspace.yaml +0 -4
  256. package/template/tsconfig.base.json +0 -32
  257. package/template/turbo.json +0 -133
  258. package/template/vitest.shared.ts +0 -26
  259. package/template/vitest.workspace.ts +0 -9
@@ -1,90 +0,0 @@
1
- # Multi-stage Dockerfile for API deployment
2
- # Optimized for pnpm monorepo with Prisma
3
-
4
- # Stage 1: Dependencies
5
- FROM node:22-alpine AS deps
6
- RUN apk add --no-cache libc6-compat openssl
7
-
8
- # Install pnpm
9
- RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
10
-
11
- WORKDIR /app
12
-
13
- # Copy workspace files
14
- COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
15
-
16
- # Copy all package.json files for workspace dependencies
17
- COPY apps/api/package.json apps/api/
18
- COPY packages/types/package.json packages/types/
19
- COPY packages/utils/package.json packages/utils/
20
-
21
- # Install dependencies (frozen lockfile for reproducible builds)
22
- RUN pnpm install --frozen-lockfile --prod=false
23
-
24
- # Stage 2: Builder
25
- FROM node:22-alpine AS builder
26
- RUN apk add --no-cache libc6-compat openssl
27
-
28
- RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
29
-
30
- WORKDIR /app
31
-
32
- # Copy installed dependencies from deps stage
33
- COPY --from=deps /app/node_modules ./node_modules
34
- COPY --from=deps /app/apps/api/node_modules ./apps/api/node_modules
35
- COPY --from=deps /app/packages/types/node_modules ./packages/types/node_modules
36
- COPY --from=deps /app/packages/utils/node_modules ./packages/utils/node_modules
37
-
38
- # Copy source code
39
- COPY . .
40
-
41
- # Build shared packages first (types and utils)
42
- RUN pnpm --filter @repo/packages-types build
43
- RUN pnpm --filter @repo/packages-utils build
44
-
45
- # Generate Prisma Client
46
- RUN pnpm --filter @repo/api db:generate
47
-
48
- # Build the API
49
- RUN pnpm --filter @repo/api build
50
-
51
- # Stage 3: Runner (production)
52
- FROM node:22-alpine AS runner
53
- RUN apk add --no-cache openssl
54
-
55
- RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
56
-
57
- WORKDIR /app
58
-
59
- # Create non-root user for security
60
- RUN addgroup --system --gid 1001 nodejs && \
61
- adduser --system --uid 1001 fastify
62
-
63
- # Copy necessary files from builder
64
- COPY --from=builder --chown=fastify:nodejs /app/apps/api/dist ./apps/api/dist
65
- COPY --from=builder --chown=fastify:nodejs /app/apps/api/package.json ./apps/api/
66
- COPY --from=builder --chown=fastify:nodejs /app/apps/api/prisma ./apps/api/prisma
67
- COPY --from=builder --chown=fastify:nodejs /app/apps/api/start.sh ./apps/api/
68
- COPY --from=builder --chown=fastify:nodejs /app/packages ./packages
69
- COPY --from=builder --chown=fastify:nodejs /app/node_modules ./node_modules
70
- COPY --from=builder --chown=fastify:nodejs /app/apps/api/node_modules ./apps/api/node_modules
71
- COPY --from=builder --chown=fastify:nodejs /app/package.json ./package.json
72
- COPY --from=builder --chown=fastify:nodejs /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
73
-
74
- # Make start script executable
75
- RUN chmod +x /app/apps/api/start.sh
76
-
77
- # Switch to non-root user
78
- USER fastify
79
-
80
- WORKDIR /app/apps/api
81
-
82
- # Expose the API port
83
- EXPOSE 8080
84
-
85
- # Health check
86
- HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
87
- CMD node -e "require('http').get('http://localhost:8080/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
88
-
89
- # Start command (handles database wake-up, runs migrations, then starts server)
90
- CMD ["/app/apps/api/start.sh"]
@@ -1,35 +0,0 @@
1
- # Blitzpack Template Setup
2
-
3
- After clicking "Use this template" and cloning your repository:
4
-
5
- ## Quick Start (Use As-Is)
6
-
7
- ```bash
8
- pnpm install
9
- pnpm init:project
10
- pnpm dev
11
- ```
12
-
13
- **That's it!** The template works out of the box. Customize when ready.
14
-
15
- ## When You're Ready to Customize
16
-
17
- ### Update Branding
18
-
19
- - `apps/web/src/config/site.ts` → Project name, description, GitHub URL
20
- - `README.md` → Replace Blitzpack README.md with yours
21
-
22
- ### Optional: Change Database Credentials
23
-
24
- Default credentials: `postgres/postgres_dev_password/app_dev`
25
-
26
- To use different credentials:
27
-
28
- 1. Update `docker-compose.yml` (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB)
29
- 2. Update `apps/api/.env.local` (DATABASE_URL must match step 1)
30
- 3. Restart Docker: `docker compose down && docker compose up -d`
31
- 4. Run migrations: `pnpm --filter @repo/api db:migrate`
32
-
33
- ---
34
-
35
- **Delete this file when done.**
package/template/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Arman Ganjoo
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,116 +0,0 @@
1
- <div align="center">
2
- <img src="assets/logo.svg" alt="Blitzpack Logo" width="200">
3
- <h1>Blitzpack</h1>
4
- <p>Full-stack TypeScript monorepo template with Next.js, Fastify, and Turborepo. From zero to production in minutes.</p>
5
-
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
- [![Node.js](https://img.shields.io/badge/Node.js-≥20.0.0-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
8
- [![pnpm](https://img.shields.io/badge/pnpm-≥9.0.0-F69220?logo=pnpm&logoColor=white)](https://pnpm.io/)
9
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
- [![CI](https://github.com/CarboxyDev/blitzpack/actions/workflows/ci.yml/badge.svg)](https://github.com/CarboxyDev/blitzpack/actions/workflows/ci.yml)
11
-
12
- </div>
13
-
14
- ---
15
-
16
- ## Why Blitzpack?
17
-
18
- Stop wasting days bootstrapping your next project. Most templates hand you a skeleton and leave you to figure out database migrations, API documentation, logging infrastructure, and much more. Blitzpack ships with all of it configured and working. You just need to run a single script to get started with a production-ready full-stack application.
19
-
20
- **Ship your next project faster with battle-tested infrastructure already wired up.**
21
-
22
- - **Zero-config setup**: Run one command and you're ready to code. Environment files, Docker containers, database migrations—all handled automatically.
23
-
24
- - **Full-stack type safety**: Zod schemas define your API contracts once in `packages/types`, then flow automatically to web forms, API validation, and database queries. No duplicate validation logic.
25
-
26
- - **Production-grade infrastructure**: Better-auth with session management and OAuth ready. Request ID tracing, automatic validation, rate limiting, structured logging, and environment-aware error responses out of the box.
27
-
28
- - **AI pair programming ready**: Comprehensive CLAUDE.md file means AI assistants understand your architecture instantly and can accelerate your development.
29
-
30
- ## Tech Stack
31
-
32
- **Web:** Next.js, React, TanStack Query, Tailwind CSS
33
-
34
- **Backend:** Fastify, Prisma, PostgreSQL
35
-
36
- **Monorepo:** Turborepo, pnpm workspaces
37
-
38
- <details>
39
- <summary>Full stack details</summary>
40
-
41
- <p>
42
-
43
- **Web**
44
-
45
- - Next.js 16 + React 19
46
- - TanStack Query v5 for server state
47
- - shadcn/ui + Tailwind CSS v4
48
- - React Hook Form + Zod validation
49
- - Jotai for client state
50
-
51
- **API**
52
-
53
- - Fastify 5
54
- - Prisma 7 + PostgreSQL 17
55
- - Better-auth for authentication
56
- - Pino for logging
57
- - Scalar API docs
58
- - Helmet + rate limiting
59
-
60
- **Monorepo**
61
-
62
- - pnpm workspaces + Turborepo
63
- - Shared packages for types, utils, config in `packages/`
64
- - Vitest for testing
65
- - Husky + lint-staged for pre-commit hooks
66
- </p>
67
- </details>
68
-
69
- ## Quick Start
70
-
71
- ```bash
72
- # Install dependencies
73
- pnpm install
74
-
75
- # Automated setup (creates .env files, starts docker, runs migrations)
76
- pnpm init:project
77
-
78
- # Start development
79
- pnpm dev
80
- ```
81
-
82
- The setup script handles everything: environment files, docker containers, database migrations, and optional seeding. Safe to run multiple times.
83
-
84
- You must have docker installed and running on your machine.
85
-
86
- **What's running:**
87
-
88
- - Web: [http://localhost:3000](http://localhost:3000)
89
- - API: [http://localhost:8080/api](http://localhost:8080/api)
90
- - API Docs: [http://localhost:8080/docs](http://localhost:8080/docs)
91
- - Health Check: [http://localhost:8080/health](http://localhost:8080/health)
92
-
93
- **Database tools:**
94
-
95
- - Prisma Studio: Run `pnpm db:studio` to open [http://localhost:5555](http://localhost:5555) (recommended for data inspection)
96
-
97
- **Built-in pages:**
98
-
99
- - `/examples` - Component examples
100
- - `/dashboard` - Protected user dashboard
101
- - `/login` - Sign in page
102
- - `/signup` - Create new account
103
- - `/forgot-password` - Forgot password page
104
- - `/reset-password` - Reset password page
105
-
106
- ## Project Structure
107
-
108
- ```
109
- blitzpack/
110
- ├── apps/
111
- │ ├── web/ # Next.js app
112
- │ └── api/ # Fastify API
113
- └── packages/
114
- ├── types/ # Zod schemas + inferred types
115
- └── utils/ # Shared utilities
116
- ```
@@ -1,51 +0,0 @@
1
- # Dependencies
2
- node_modules
3
- .pnpm-store
4
-
5
- # Build outputs
6
- dist
7
- build
8
- .next
9
- *.tsbuildinfo
10
-
11
- # Development files
12
- .env
13
- .env.local
14
- .env.*.local
15
- *.log
16
- npm-debug.log*
17
- yarn-debug.log*
18
- yarn-error.log*
19
- pnpm-debug.log*
20
-
21
- # Testing
22
- coverage
23
- test-results
24
- .vitest
25
-
26
- # IDE
27
- .vscode
28
- .idea
29
- *.swp
30
- *.swo
31
- .DS_Store
32
-
33
- # Git
34
- .git
35
- .gitignore
36
- .gitattributes
37
-
38
- # Documentation
39
- *.md
40
- !README.md
41
-
42
- # CI/CD
43
- .github
44
- .gitlab-ci.yml
45
- .travis.yml
46
-
47
- # Misc
48
- .cache
49
- .temp
50
- tmp
51
- temp
@@ -1,62 +0,0 @@
1
- NODE_ENV=development
2
- API_URL=http://localhost:8080
3
- FRONTEND_URL=http://localhost:3000
4
- PORT=8080
5
-
6
- # Database connection string for local Docker PostgreSQL
7
- # Match credentials from docker-compose.yml
8
- # Note: Test database will automatically use app_dev_test (suffix added by test runner)
9
- DATABASE_URL=postgresql://postgres:postgres_dev_password@localhost:5432/app_dev
10
-
11
-
12
- # Cookie secret for signing cookies
13
- COOKIE_SECRET=dev-secret-change-in-production-use-random-string
14
-
15
- # Logging verbosity level
16
- # - minimal: Only errors and critical warnings (recommended for production)
17
- # - normal: Standard HTTP requests, business events, errors (default)
18
- # - detailed: Include debug info, SQL queries, cache operations
19
- # - verbose: Everything including request/response bodies, timing breakdowns
20
- LOG_LEVEL=normal
21
-
22
- # Better Auth configuration
23
- BETTER_AUTH_SECRET=dev-secret-change-in-production-must-be-at-least-32-characters
24
- # Base URL of your API for Better Auth callbacks
25
- BETTER_AUTH_URL=http://localhost:8080
26
-
27
-
28
-
29
- # Email Service Configuration
30
- # You MUST verify your domain in Resend dashboard before sending emails
31
- RESEND_API_KEY=re_xxxxxxxxxxxx
32
- EMAIL_FROM=noreply@yourdomain.com
33
-
34
- # OAuth Provider Credentials (Optional but recommended)
35
- # Google and GitHub OAuth are enabled by default.
36
- # Google OAuth Setup:
37
- # 1. Go to: https://console.cloud.google.com/apis/credentials
38
- # 2. Create OAuth 2.0 Client ID (Web application)
39
- # 3. Add authorized redirect URI: http://localhost:8080/api/auth/callback/google
40
- # 4. For production, add: https://<domain>.com/api/auth/callback/google
41
- GOOGLE_CLIENT_ID=
42
- GOOGLE_CLIENT_SECRET=
43
-
44
-
45
- # GitHub OAuth Setup:
46
- # 1. Go to: https://github.com/settings/developers
47
- # 2. Create new OAuth App
48
- # 3. Set Authorization callback URL: http://localhost:8080/api/auth/callback/github
49
- # 4. For production, add: https://<domain>.com/api/auth/callback/github
50
- GITHUB_CLIENT_ID=
51
- GITHUB_CLIENT_SECRET=
52
-
53
-
54
- # File Storage Configuration (OPTIONAL)
55
- # Defaults to local file storage if not configured
56
- # For S3-compatible storage (AWS S3, Cloudflare R2, MinIO, etc.)
57
- # STORAGE_TYPE=local
58
- # S3_BUCKET=
59
- # S3_REGION=auto
60
- # S3_ACCESS_KEY_ID=
61
- # S3_SECRET_ACCESS_KEY=
62
- # S3_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
@@ -1,69 +0,0 @@
1
- import { Link, Text } from '@react-email/components';
2
- import * as React from 'react';
3
-
4
- import { EmailLayout } from './components/email-layout';
5
- import { emailConfig } from './config';
6
-
7
- interface AccountDeletedEmailProps {
8
- userEmail: string;
9
- deletedAt: string;
10
- }
11
-
12
- export default function AccountDeletedEmail({
13
- userEmail = 'user@example.com',
14
- deletedAt = new Date().toLocaleString('en-US', {
15
- dateStyle: 'medium',
16
- timeStyle: 'short',
17
- }),
18
- }: AccountDeletedEmailProps) {
19
- const { appName, supportEmail } = emailConfig;
20
-
21
- return (
22
- <EmailLayout
23
- preview={`Your ${appName} account has been deleted`}
24
- heading="Account deleted"
25
- >
26
- <Text style={paragraph}>
27
- Your account (<strong>{userEmail}</strong>) has been permanently deleted
28
- on {deletedAt}.
29
- </Text>
30
-
31
- <Text style={paragraph}>
32
- All your data has been removed from our systems. This action cannot be
33
- undone.
34
- </Text>
35
-
36
- <Text style={paragraph}>
37
- If you didn't request this deletion or believe this was done in error,
38
- please contact us immediately at{' '}
39
- <Link href={`mailto:${supportEmail}`} style={link}>
40
- {supportEmail}
41
- </Link>
42
- .
43
- </Text>
44
-
45
- <Text style={paragraphSmall}>
46
- Thank you for being part of {appName}. We're sorry to see you go.
47
- </Text>
48
- </EmailLayout>
49
- );
50
- }
51
-
52
- const paragraph: React.CSSProperties = {
53
- color: '#334155',
54
- fontSize: '15px',
55
- lineHeight: '24px',
56
- margin: '0 0 24px',
57
- };
58
-
59
- const paragraphSmall: React.CSSProperties = {
60
- color: '#94a3b8',
61
- fontSize: '13px',
62
- lineHeight: '20px',
63
- margin: '24px 0 0',
64
- };
65
-
66
- const link: React.CSSProperties = {
67
- color: '#2563eb',
68
- textDecoration: 'underline',
69
- };
@@ -1,154 +0,0 @@
1
- import {
2
- Body,
3
- Container,
4
- Head,
5
- Heading,
6
- Hr,
7
- Html,
8
- Img,
9
- Link,
10
- Preview,
11
- Section,
12
- Text,
13
- } from '@react-email/components';
14
- import * as React from 'react';
15
-
16
- import { emailConfig } from '../config';
17
-
18
- interface EmailLayoutProps {
19
- preview: string;
20
- heading: string;
21
- children: React.ReactNode;
22
- showFooterLinks?: boolean;
23
- }
24
-
25
- export function EmailLayout({
26
- preview,
27
- heading,
28
- children,
29
- showFooterLinks = true,
30
- }: EmailLayoutProps) {
31
- const { appName, logoUrl, primaryColor, supportEmail } = emailConfig;
32
-
33
- return (
34
- <Html>
35
- <Head />
36
- <Preview>{preview}</Preview>
37
- <Body style={main}>
38
- <Container style={container}>
39
- <Section style={logoSection}>
40
- {logoUrl ? (
41
- <Img src={logoUrl} width="48" height="48" alt={appName} />
42
- ) : (
43
- <Text style={{ ...logoText, color: primaryColor }}>
44
- {appName}
45
- </Text>
46
- )}
47
- </Section>
48
-
49
- <Section style={contentSection}>
50
- <Heading style={h1}>{heading}</Heading>
51
- {children}
52
- </Section>
53
-
54
- <Hr style={hr} />
55
-
56
- <Section style={footer}>
57
- {showFooterLinks && (
58
- <Text style={footerLinks}>
59
- <Link href={`mailto:${supportEmail}`} style={footerLink}>
60
- Contact Support
61
- </Link>
62
- </Text>
63
- )}
64
- <Text style={footerText}>
65
- © {new Date().getFullYear()} {appName}. All rights reserved.
66
- </Text>
67
- <Text style={footerMuted}>
68
- If you didn't expect this email, you can safely ignore it.
69
- </Text>
70
- </Section>
71
- </Container>
72
- </Body>
73
- </Html>
74
- );
75
- }
76
-
77
- const main: React.CSSProperties = {
78
- backgroundColor: '#f8fafc',
79
- fontFamily:
80
- '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif',
81
- padding: '40px 0',
82
- };
83
-
84
- const container: React.CSSProperties = {
85
- backgroundColor: '#ffffff',
86
- margin: '0 auto',
87
- maxWidth: '560px',
88
- borderRadius: '12px',
89
- border: '1px solid #e2e8f0',
90
- overflow: 'hidden',
91
- };
92
-
93
- const logoSection: React.CSSProperties = {
94
- padding: '32px 40px 24px',
95
- textAlign: 'center',
96
- };
97
-
98
- const logoText: React.CSSProperties = {
99
- fontSize: '24px',
100
- fontWeight: '700',
101
- margin: '0',
102
- letterSpacing: '-0.5px',
103
- };
104
-
105
- const contentSection: React.CSSProperties = {
106
- padding: '0 40px 32px',
107
- };
108
-
109
- const h1: React.CSSProperties = {
110
- color: '#0f172a',
111
- fontSize: '24px',
112
- fontWeight: '600',
113
- lineHeight: '32px',
114
- margin: '0 0 24px',
115
- letterSpacing: '-0.25px',
116
- };
117
-
118
- const hr: React.CSSProperties = {
119
- borderColor: '#e2e8f0',
120
- borderTop: 'none',
121
- margin: '0',
122
- };
123
-
124
- const footer: React.CSSProperties = {
125
- padding: '24px 40px',
126
- backgroundColor: '#f8fafc',
127
- };
128
-
129
- const footerLinks: React.CSSProperties = {
130
- textAlign: 'center',
131
- margin: '0 0 16px',
132
- };
133
-
134
- const footerLink: React.CSSProperties = {
135
- color: '#64748b',
136
- fontSize: '13px',
137
- textDecoration: 'underline',
138
- };
139
-
140
- const footerText: React.CSSProperties = {
141
- color: '#64748b',
142
- fontSize: '13px',
143
- lineHeight: '20px',
144
- textAlign: 'center',
145
- margin: '0 0 8px',
146
- };
147
-
148
- const footerMuted: React.CSSProperties = {
149
- color: '#94a3b8',
150
- fontSize: '12px',
151
- lineHeight: '18px',
152
- textAlign: 'center',
153
- margin: '0',
154
- };
@@ -1,22 +0,0 @@
1
- /**
2
- * Email template configuration.
3
- *
4
- * IMPORTANT: Update these values before deploying to production.
5
- * The logo must be hosted at a publicly accessible URL.
6
- */
7
-
8
- export interface EmailConfig {
9
- appName: string;
10
- websiteUrl: string;
11
- supportEmail: string;
12
- primaryColor: string;
13
- logoUrl: string | undefined;
14
- }
15
-
16
- export const emailConfig: EmailConfig = {
17
- appName: 'Your App',
18
- websiteUrl: 'https://yourapp.com',
19
- supportEmail: 'support@yourapp.com',
20
- primaryColor: '#2563eb',
21
- logoUrl: undefined,
22
- };