5.9 KiB
5.9 KiB
Technology Stack
Analysis Date: 2026-02-26
Languages
Primary:
- TypeScript 5.7 - All application code (strict mode,
noEmit,ES2022target)
Secondary:
- CSS (Tailwind utility classes only, no custom CSS files)
Runtime
Environment:
- Node.js >=20.0.0 (engines field in
package.json)
Package Manager:
- npm (standard)
- Lockfile:
package-lock.jsonpresent
Frameworks
Core:
- Next.js 15.1 - App Router, standalone output, Turbopack dev mode
- React 19.0 - Server Components by default;
'use client'only where needed
API Layer:
- tRPC 11 (RC build
11.0.0-rc.678) - End-to-end typed RPC, superjson transformer @trpc/server,@trpc/client,@trpc/react-query- All at same version
Data:
- Prisma 6.19 - ORM and schema-first migrations; binary targets:
native,windows,linux-musl-openssl-3.0.x @prisma/client6.19 - Generated client with connection pool (limit=20, timeout=10)
Auth:
- NextAuth v5 (Beta 25) - JWT strategy, 24-hour sessions; Prisma adapter via
@auth/prisma-adapter
Forms & Validation:
- Zod 3.24 - Input validation for all tRPC procedures
- React Hook Form 7.54 - Client-side form state;
@hookform/resolversfor Zod integration
UI Components:
- shadcn/ui (configured via
components.json) - Radix UI primitives styled with Tailwind - Radix UI primitives: alert-dialog, avatar, checkbox, collapsible, dialog, dropdown-menu, label, popover, progress, radio-group, scroll-area, select, separator, slider, slot, switch, tabs, toggle, tooltip (all
^1.xor^2.x) - Tailwind CSS 4.1 - Utility-first,
@tailwindcss/postcssplugin - Lucide React 0.563 - Icon library (import-optimized via
next.config.ts) - Framer Motion 11 (
motionpackage) - Animation - Tremor 3.18 - Data visualization / chart components
@blocknote/react,@blocknote/core,@blocknote/shadcn0.46 - Rich text block editor- next-themes 0.4 - Dark/light mode switching
- Sonner 2.0 - Toast notifications
Testing:
- Vitest 4.0 - Test runner,
fileParallelism: false,pool: 'forks' @playwright/test1.49 - E2E test runner
Build/Dev:
- Turbopack (built into Next.js 15) - Dev server via
next dev --turbopack - tsx 4.19 - Direct TypeScript execution for scripts and seeds
- ESLint 9.17 +
eslint-config-next15.1 - Linting - Prettier 3.4 +
prettier-plugin-tailwindcss0.7 - Formatting
Key Dependencies
Critical:
superjson2.2 - tRPC transformer; enables Date, Map, Set serialization over the wirebcryptjs3.0 - Password hashing (no native bcrypt — pure JS for portability)minio8.0 - S3-compatible object storage clientnodemailer7.0 - SMTP email deliveryopenai6.16 - OpenAI SDK for AI features@anthropic-ai/sdk0.78 - Anthropic Claude SDK; wrapped in adapter matching OpenAI interface@notionhq/client2.3 - Notion API for project importcsv-parse6.1 - CSV import for candidatures seed
Infrastructure:
date-fns4.1 - Date manipulationuse-debounce10.0 - Input debouncing@tanstack/react-query5.62 - Server state caching (used via tRPC)@dnd-kit/core,@dnd-kit/sortable- Drag-and-drop ordering UIleaflet1.9 +react-leaflet5.0 - Map renderingmammoth1.11 - DOCX to HTML conversion for file content extractionpdf-parse2.4,unpdf1.4 - PDF text extractionhtml2canvas1.4,jspdf4.1,jspdf-autotable5.0 - PDF export for reportsfranc6.2 - Language detection for multilingual project contentpapaparse5.4 - CSV parsing in browsercmdk1.0 - Command palette componentreact-easy-crop5.5 - Avatar image croppingreact-phone-number-input3.4 - International phone number inputreact-day-picker9.13 - Date picker calendar
Configuration
TypeScript:
src/tsconfig.json: strict mode,ES2022target, path alias@/*→./src/*, bundler module resolution- Config file:
tsconfig.json
Next.js:
- Config file:
next.config.ts output: 'standalone'for Docker deploymenttypedRoutes: truefor compile-time route safetyserverExternalPackages: ['@prisma/client', 'minio']— not bundled
Tailwind:
- Config file:
tailwind.config.ts - PostCSS via
postcss.config.mjs+@tailwindcss/postcss - Brand palette: Primary Red
#de0f1e, Dark Blue#053d57, White#fefefe, Teal#557f8c
Vitest:
- Config file:
vitest.config.ts environment: 'node',testTimeout: 30000, sequential execution- Path alias mirrors tsconfig
Environment:
- Required vars:
DATABASE_URL,NEXTAUTH_URL,NEXTAUTH_SECRET,MINIO_ENDPOINT,MINIO_ACCESS_KEY,MINIO_SECRET_KEY,MINIO_BUCKET,SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS,EMAIL_FROM,OPENAI_API_KEY,CRON_SECRET - Optional vars:
MINIO_PUBLIC_ENDPOINT,OPENAI_MODEL(default:gpt-4o),OPENAI_BASE_URL,ANTHROPIC_API_KEY,SESSION_MAX_AGE(default: 86400),MAX_FILE_SIZE(default: 524288000),LOG_LEVEL,MAGIC_LINK_EXPIRY(default: 900) - All settings also configurable via
SystemSettingsDB table (DB takes priority over env vars)
Build:
npm run build→next build→ produces.next/standalone/outputnpm run typecheck→tsc --noEmit(no emit, type checking only)
Platform Requirements
Development:
- Node.js >=20.0.0
- PostgreSQL 16 (via Docker or local)
- MinIO instance (optional in dev, defaults to
localhost:9000)
Production:
- Docker (compose file:
docker/docker-compose.yml) - PostgreSQL 16 (
postgres:16-alpineimage) in Docker network - Next.js app runs as standalone Node.js server on port 7600
- MinIO and Poste.io are external pre-existing services on VPS
- Nginx reverse proxy with SSL (external, not in compose)
- CI/CD: Gitea Actions (image pushed to container registry,
pull_policy: always) - App entrypoint (
docker/docker-entrypoint.sh): runsprisma migrate deploy→prisma generate→ auto-seeds if DB empty →node server.js
Stack analysis: 2026-02-26