9.3 KiB
ThumbPreview Constitution
Core Principles
I. Tech Stack
All new code MUST use the established technology stack:
Frontend (React SPA):
- React 19.x with TypeScript 5.x
- Vite as build tool with HMR
- Tailwind CSS 4.x for styling
- shadcn/ui for UI components (Radix UI primitives)
- Zustand for client state management
- @tanstack/react-query for server state
- Axios for HTTP requests
- lucide-react for icons
Backend (NestJS API):
- NestJS 11.x with TypeScript 5.x
- Express via @nestjs/platform-express
- PostgreSQL with TypeORM
- class-validator and class-transformer for DTOs
- Multer for file uploads
- Sharp for image processing
Rationale: Consistent tooling reduces onboarding friction, ensures compatibility, and enables shared patterns across the codebase.
II. Architecture & Project Structure
This is a monorepo with separate frontend and backend packages. New code MUST follow the established directory organization:
Frontend (/frontend/src/):
components/- Application React UI componentscomponents/ui/- shadcn/ui primitive components (auto-generated)hooks/- Custom React hooks (useX naming)store/- Zustand state storesapi/- Axios client and API methodstypes/- TypeScript interfaces and typeslib/- Utility functions (includesutils.tsfor cn() helper)assets/- Static images and resources
Backend (/backend/src/):
modules/- Feature modules (NestJS module pattern)- Each module contains:
*.module.ts,*.controller.ts,*.service.ts
- Each module contains:
entities/- TypeORM entity definitions
Configuration Files:
components.json- shadcn/ui configuration (registry, aliases, styling)tsconfig.json- Must include@/*path alias for shadcn imports
Rules:
- One component/hook/service per file
- Feature-based module organization in backend
- Clear separation between API, state, and presentation layers
- All imports MUST use
@/alias for shadcn components and lib utilities - Application components use relative imports within packages
Rationale: Predictable structure enables faster navigation and reduces cognitive load when adding features.
III. Styling & UI Components
All styling MUST use Tailwind CSS utility classes combined with shadcn/ui:
shadcn/ui Usage:
- Use shadcn/ui components for standard UI elements (Button, Card, Input, etc.)
- Install components via
npx shadcn@latest add <component> - Components installed to
src/components/ui/- DO NOT modify generated files - Use shadcn MCP server for component discovery and installation commands
- Compose shadcn components with application-specific styling via className prop
Tailwind Integration:
- Import Tailwind via
@import "tailwindcss"in index.css - CSS variables defined in index.css for theming (--primary, --background, etc.)
- Use
cn()utility from@/lib/utilsfor conditional class merging - Dark mode via
class="dark"on html element - Follow established color scheme via CSS variables
Styling Rules:
- Prefer shadcn/ui components over custom implementations
- Use Tailwind utilities for layout, spacing, and custom styling
- Use CSS variables (--primary, --muted-foreground, etc.) for colors
- Use Tailwind's responsive breakpoints (sm, md, lg, xl) for layouts
Forbidden:
- Inline style objects except for dynamic values (e.g., computed widths)
- Creating new CSS files for component-specific styles
- Using
!importantoverrides - CSS Modules, styled-components, or CSS-in-JS libraries
- Modifying files in
components/ui/directory
Icon Usage:
- Use lucide-react for all icons
- Import icons individually:
import { IconName } from 'lucide-react' - Use
size-XorclassName="size-X"for icon sizing
Rationale: shadcn/ui provides accessible, well-designed primitives while Tailwind enables customization. This combination ensures consistency and reduces custom CSS maintenance.
IV. Data Management
Frontend State:
- Use Zustand for UI/client state (view mode, selections, form data)
- Use React Query for server state (API data, caching, mutations)
- Define all store actions in the store file, not in components
- React Query stale time: 1 hour for search results
Backend Storage:
- PostgreSQL for persistent data (via TypeORM)
- UUID primary keys for all entities
- File uploads stored in
/backend/uploads/directory - YouTube API responses cached in database with 24-hour TTL
Environment Configuration:
- Backend: Use @nestjs/config with .env files
- Frontend: Use Vite proxy for API calls (no .env needed)
- Never commit .env files or API keys
Rationale: Clear boundaries between client and server state prevent synchronization bugs and simplify debugging.
V. Development Practices
TypeScript:
- Strict mode enabled for frontend application code
- All new code MUST have explicit type annotations for function parameters
- Use interfaces for object shapes, types for unions/aliases
- No
anytype except in exceptional cases with justification - Path aliases MUST be configured:
@/*→./src/*
Linting & Formatting:
- Frontend: ESLint with React hooks and React Refresh plugins
- Backend: ESLint + Prettier (singleQuote, trailingComma: all)
- Run
npm run lintbefore committing - Run
npm run format(backend) for consistent formatting
Testing (Backend):
- Jest for unit and integration tests
- Test files:
*.spec.tsadjacent to source files - Run
npm run testfor test suite
Validation:
- Backend: Use class-validator decorators on all DTOs
- Global validation pipe enabled (whitelist + transform)
- File uploads: Validate MIME types (JPEG, PNG, WebP only, 5MB max)
Rationale: Consistent quality standards prevent regressions and maintain code health over time.
Technology Stack Reference
| Layer | Technology | Version | Purpose |
|---|---|---|---|
| Frontend Runtime | React | 19.x | UI library |
| Frontend Build | Vite | 7.x | Build + HMR |
| Frontend Styling | Tailwind CSS | 4.x | Utility CSS |
| Frontend UI | shadcn/ui | 3.x | Component library |
| Frontend Icons | lucide-react | latest | Icon library |
| Frontend State | Zustand | 5.x | Client state |
| Frontend Data | React Query | 5.x | Server state |
| Backend Framework | NestJS | 11.x | API server |
| Backend Database | PostgreSQL | 16 | Data persistence |
| Backend ORM | TypeORM | 0.3.x | DB abstraction |
| Runtime | Node.js | 20+ | Server runtime |
New dependencies MUST be justified and reviewed for:
- Compatibility with existing versions
- Bundle size impact (frontend)
- Maintenance status (active development, security updates)
- License compatibility (MIT preferred)
shadcn/ui Component Installation:
# List available components
npx shadcn@latest add --help
# Add a component (use shadcn MCP for discovery)
npx shadcn@latest add button card input --yes
# Components are added to src/components/ui/
Code Quality Standards
Pull Request Checklist:
- Code follows architecture patterns (correct directory placement)
- Styling uses Tailwind utilities and/or shadcn components
- TypeScript types are explicit (no implicit any)
- Linter passes with no errors
- New backend endpoints include validation
- Environment variables documented if added
- shadcn components used for standard UI elements
Commit Guidelines:
- Use conventional commits:
feat:,fix:,docs:,refactor:,test: - Reference issue numbers when applicable
- Keep commits focused (one logical change per commit)
Code Review Focus Areas:
- Security: No hardcoded credentials, proper input validation
- Performance: Avoid unnecessary re-renders, efficient queries
- Maintainability: Clear naming, appropriate abstractions
- UI Consistency: Use shadcn components, follow established patterns
Governance
This constitution establishes non-negotiable development standards for the ThumbPreview project. All contributors MUST adhere to these principles.
Amendment Process:
- Propose changes via pull request to this file
- Document rationale for changes
- Increment version according to semver rules
- Update dependent templates if principle changes affect them
Version Policy:
- MAJOR: Backward-incompatible changes (removing principles, changing stack)
- MINOR: New principles or significant expansions
- PATCH: Clarifications, typo fixes, non-semantic refinements
Compliance:
- All PRs MUST pass constitution checks before merge
- Violations require explicit justification in PR description
- Repeated violations should trigger constitution review
Version: 1.1.0 | Ratified: 2026-01-29 | Last Amended: 2026-01-29