102 lines
7.1 KiB
Markdown
102 lines
7.1 KiB
Markdown
# Technology Stack
|
|
|
|
**Analysis Date:** 2026-04-20
|
|
|
|
## Languages
|
|
|
|
**Primary:**
|
|
- TypeScript 5.x - Main application, API, Prisma helpers, hooks, and tooling live in `src/**/*.ts`, `src/**/*.tsx`, `prisma/seed.ts`, `tailwind.config.ts`, and `vitest.config.ts`; the compiler is declared in `package.json`.
|
|
|
|
**Secondary:**
|
|
- JavaScript - Runtime and framework config live in `next.config.js`, `postcss.config.mjs`, and `scripts/generate-n8n-context.mjs`.
|
|
- CSS - Global styling and external font/icon imports live in `src/app/globals.css`.
|
|
- JSON - Repo and content config live in `package.json`, `tsconfig.json`, `.eslintrc.json`, `.prettierrc.json`, `vercel.json`, `docs/integrations/n8n/registry.json`, and `src/messages/*.json`.
|
|
- Prisma schema DSL - Database schema, datasource, enums, and vector column definitions live in `prisma/schema.prisma`.
|
|
- SQL migrations - Prisma migration output lives in `prisma/migrations/*/migration.sql`.
|
|
- Markdown - Integration contracts and workflow docs live in `docs/integrations/n8n/*.md`, `docs/integrations/n8n/workflows/*.md`, and mirrored GSD docs in `.planning/codebase/N8N-CONTEXT.md` and `.planning/codebase/N8N-DATAFLOW.md`.
|
|
|
|
## Runtime
|
|
|
|
**Environment:**
|
|
- Node.js 22.x - Containerized runtime is pinned by `Dockerfile` and `Dockerfile.runtime`, both based on `node:22-bookworm`.
|
|
- Server runtime is Next.js App Router with standalone output enabled in `next.config.js` and consumed by `Dockerfile.runtime`.
|
|
- Local runtime version pin file is not committed. No `.nvmrc`, `.node-version`, or `.tool-versions` file is present at repo root.
|
|
|
|
**Package Manager:**
|
|
- `pnpm` - All install/build/test scripts in `package.json`, `vercel.json`, `Dockerfile`, and `nixpacks.toml` use `pnpm`.
|
|
- Lockfile: present in `pnpm-lock.yaml`.
|
|
|
|
## Frameworks
|
|
|
|
**Core:**
|
|
- Next.js `15.1.11` - App Router pages, layouts, metadata routes, and route handlers live in `src/app/**/*`; framework config is in `next.config.js`.
|
|
- React `19.0.0` and `react-dom` `19.0.0` - UI runtime for components in `src/components/**/*` and route segments in `src/app/**/*`.
|
|
- `next-intl` `^4.0.2` - Locale middleware and message loading are wired through `next.config.js`, `src/middleware.ts`, `src/i18n/request.ts`, and localized routes under `src/app/[locale]`.
|
|
- Prisma `^6.1.0` / `@prisma/client` `^6.1.0` - ORM and generated client used by `src/lib/prisma.ts`, `src/hooks/useProjects.ts`, `src/hooks/useHome.ts`, and route handlers under `src/app/api/**/*`.
|
|
- Zod `^3.24.1` - Runtime validation is centralized in `src/lib/validations.ts` and consumed by API routes such as `src/app/api/search/ai/route.ts` and `src/app/api/webhook/signals/route.ts`.
|
|
|
|
**Testing:**
|
|
- Vitest `^2.1.8` - Unit-style tests are configured in `vitest.config.ts` and run against `src/**/*.test.ts`.
|
|
- Playwright: Not detected in committed dependencies or config. No `playwright.config.*` file and no committed `e2e/` directory are present.
|
|
|
|
**Build/Dev:**
|
|
- Tailwind CSS `^3.4.17` - Utility styling is configured in `tailwind.config.ts` and loaded from `src/app/globals.css`.
|
|
- `tailwindcss-animate` `^1.0.7` - Tailwind plugin registered in `tailwind.config.ts`.
|
|
- PostCSS `^8` with `autoprefixer` `^10.4.20` - CSS processing is configured in `postcss.config.mjs`.
|
|
- ESLint `^9` with `eslint-config-next` `15.1.11` and `eslint-config-prettier` `^9.1.0` - Linting rules are configured in `.eslintrc.json`.
|
|
- Prettier `^3.4.2` - Formatting rules are configured in `.prettierrc.json`.
|
|
- `ts-node` `^10.9.2` - Used by the Prisma seed command configured in `package.json`.
|
|
|
|
## Key Dependencies
|
|
|
|
**Critical:**
|
|
- `next` `15.1.11` - Main web framework for `src/app/**/*`.
|
|
- `react` `19.0.0` and `react-dom` `19.0.0` - Required by all React components in `src/components/**/*`.
|
|
- `@prisma/client` `^6.1.0` - Data access layer instantiated in `src/lib/prisma.ts`.
|
|
- `prisma` `^6.1.0` - Schema and migration tooling for `prisma/schema.prisma` and `prisma/migrations/*`.
|
|
- `next-intl` `^4.0.2` - Locale-aware routing and translations for `src/middleware.ts`, `src/i18n/request.ts`, and `src/messages/*.json`.
|
|
- `zod` `^3.24.1` - Request validation for search, tags, and webhook contracts in `src/lib/validations.ts`.
|
|
|
|
**Infrastructure:**
|
|
- `@vercel/analytics` `^1.6.1` - Client analytics are mounted in `src/app/VercelMetrics.tsx`.
|
|
- `@vercel/speed-insights` `^1.3.1` - Frontend performance telemetry is mounted in `src/app/VercelMetrics.tsx`.
|
|
- `react-markdown` `^10.1.0`, `remark-gfm` `^4.0.1`, and `rehype-sanitize` `^6.0.0` - Markdown rendering and sanitization stack used by `src/components/project/MarkdownContent.tsx`.
|
|
- `lucide-react` `^0.468.0` - Icon package optimized through `experimental.optimizePackageImports` in `next.config.js`.
|
|
|
|
## Configuration
|
|
|
|
**Environment:**
|
|
- Database connectivity is anchored by `DATABASE_URL` in `prisma/schema.prisma` and normalized by `buildPrismaDataSourceUrl()` in `src/lib/prisma-url.ts`.
|
|
- Optional Postgres mTLS/SSL overlay is configured in `src/lib/prisma-url.ts` using `PG_SSL_ROOT_CERT_B64`, `PG_SSL_IDENTITY_P12_B64`, `PG_SSL_IDENTITY_PASSWORD`, `PG_SSL_CERT_DIR`, and `PG_SSL_MODE`.
|
|
- Internal machine-to-machine auth uses `WEBHOOK_API_KEY` in `src/lib/auth.ts`.
|
|
- Outbound AI search proxying uses `N8N_AI_SEARCH_WEBHOOK` in `src/app/api/search/ai/route.ts`.
|
|
- Canonical URL generation uses `NEXT_PUBLIC_SITE_URL` in `src/app/robots.ts` and `src/app/sitemap.ts`.
|
|
- Vercel-only telemetry gating uses `VERCEL_ENV` in `src/app/layout.tsx`.
|
|
- Template env files exist as `.env.example`, `.env.local`, and `.env`; contents were not read.
|
|
|
|
**Build:**
|
|
- `next.config.js` enables `output: "standalone"`, wires `next-intl`, configures remote image hosts, and optimizes `lucide-react` imports.
|
|
- `tsconfig.json` enables strict TypeScript, `noUncheckedIndexedAccess`, `noImplicitReturns`, `noFallthroughCasesInSwitch`, and the `@/*` alias.
|
|
- `tailwind.config.ts` and `postcss.config.mjs` define the frontend styling pipeline.
|
|
- `vercel.json` defines install/build commands, the `nextjs` framework target, and region `hkg1`.
|
|
- `Dockerfile`, `Dockerfile.runtime`, and `nixpacks.toml` define container build and runtime packaging.
|
|
- `scripts/generate-n8n-context.mjs` generates `docs/integrations/n8n/CONTEXT.generated.md` and the GSD mirror `.planning/codebase/N8N-CONTEXT.md`.
|
|
|
|
## Platform Requirements
|
|
|
|
**Development:**
|
|
- Node.js 22-compatible runtime and `pnpm` are required to run `package.json` scripts.
|
|
- PostgreSQL is required because `prisma/schema.prisma` uses the `postgresql` provider.
|
|
- Prisma client generation is part of the build path in `vercel.json`, `Dockerfile`, and `nixpacks.toml`.
|
|
- The n8n context refresh flow requires `pnpm n8n:context`, which runs `scripts/generate-n8n-context.mjs`.
|
|
|
|
**Production:**
|
|
- Vercel is a first-class deployment target via `vercel.json` and the telemetry components in `src/app/VercelMetrics.tsx`.
|
|
- Container deployment is also supported through `Dockerfile`, `Dockerfile.runtime`, and `nixpacks.toml`.
|
|
- Production data storage is PostgreSQL via Prisma, with a `vector` column in `prisma/schema.prisma` used by semantic-search-related workflows documented under `docs/integrations/n8n/`.
|
|
- Standalone Next.js output is expected by `Dockerfile.runtime`, which boots `.next/standalone/server.js`.
|
|
|
|
---
|
|
|
|
*Stack analysis: 2026-04-20*
|