Skip to main content
Contafy is built with modern web technologies focused on performance, type safety, and developer experience.

Core framework

Next.js 16

Why Next.js: Full-stack React framework with built-in optimizations
  • App Router: File-based routing with nested layouts
  • Server Components: Zero-JavaScript-by-default rendering
  • Image optimization: Automatic image optimization
  • Font optimization: Built-in font loading (Geist)
  • TypeScript: First-class TypeScript support
Version: 16.1.1 Configuration: next.config.ts

React 19

Why React 19: Latest React with improved performance and DX
  • Concurrent features: Improved rendering performance
  • Server Components: Native server component support
  • Actions: Built-in form handling
  • Suspense: Better async component handling
Version: 19.2.3

TypeScript 5

Why TypeScript: Type safety and better IDE support Configuration: tsconfig.json:3-7
Strict mode enabled: No any types, required null checks

Styling and UI

Tailwind CSS 4

Why Tailwind: Utility-first CSS framework for rapid UI development
  • JIT mode: Just-in-time compilation
  • Custom theme: Configured for dark mode
  • PostCSS integration: @tailwindcss/postcss
Version: ^4 (latest) Key utilities used:
  • Responsive design: md:, lg: breakpoints
  • Dark mode: Built-in dark mode support
  • Custom colors: Primary green theme
  • Spacing system: Consistent spacing scale

Radix UI

Why Radix: Unstyled, accessible UI primitives Packages used:
  • @radix-ui/react-dialog: Modal dialogs
  • @radix-ui/react-dropdown-menu: Dropdown menus
  • @radix-ui/react-select: Select inputs
  • @radix-ui/react-tabs: Tab navigation
  • @radix-ui/react-avatar: User avatars
  • @radix-ui/react-progress: Progress bars
  • @radix-ui/react-switch: Toggle switches
  • @radix-ui/react-radio-group: Radio buttons
  • @radix-ui/react-separator: Dividers
  • @radix-ui/react-label: Form labels
  • @radix-ui/react-slot: Component composition
Benefits:
  • WCAG compliant accessibility
  • Keyboard navigation support
  • Screen reader support
  • Full styling control

Shadcn/ui

Why Shadcn/ui: Pre-built components built on Radix UI Location: components/ui/ Components used:
  • button.tsx: Button variants
  • card.tsx: Card containers
  • table.tsx: Data tables
  • input.tsx: Form inputs
  • select.tsx: Select dropdowns
  • dialog.tsx: Modal dialogs
  • tabs.tsx: Tab navigation
  • badge.tsx: Status badges
  • progress.tsx: Progress bars
  • sonner.tsx: Toast notifications
Configuration: components.json

Lucide React

Why Lucide: Lightweight, customizable icons Version: ^0.562.0 Usage: Over 50 icons used throughout the app

Motion

Why Motion: Animation library for React Version: ^12.27.1 Used for: Smooth transitions and micro-interactions

Data fetching and state

TanStack Query (React Query) 5

Why TanStack Query: Powerful data synchronization for React Version: ^5.90.19 Configuration: components/providers/ReactQueryProvider.tsx:11-24
Features used:
  • Query caching and invalidation
  • Automatic background refetching
  • Optimistic updates
  • Request deduplication
  • Loading and error states
Example usage:

React Hook Form

Why React Hook Form: Performant form handling Features:
  • Minimal re-renders
  • Built-in validation
  • TypeScript support
  • Easy integration with UI libraries

Zod

Why Zod: TypeScript-first schema validation Usage: Form validation with React Hook Form

Data visualization

Recharts

Why Recharts: React charting library Version: ^3.6.0 Used for: Financial trend charts in dashboard Components used:
  • LineChart: Cash flow trends
  • BarChart: Monthly comparisons
  • AreaChart: Revenue visualization
Location: app/dashboard/components/FlowTrendChart.tsx

File processing and export

ExcelJS

Why ExcelJS: Excel file generation Version: ^4.4.0 Usage: Export financial reports to Excel format Implementation: lib/excel/

jsPDF

Why jsPDF: PDF generation in the browser Version: ^4.0.0 Usage: Export financial reports to PDF Implementation: lib/pdf/

jspdf-autotable

Plugin: Table generation for jsPDF Version: ^5.0.7

html2canvas-pro

Why html2canvas-pro: Convert HTML to canvas for PDF export Version: ^1.6.6

Utilities

Class Variance Authority (CVA)

Why CVA: Type-safe component variants Version: ^0.7.1 Used in: UI components for variant management

clsx

Why clsx: Conditional className construction Version: ^2.1.1

tailwind-merge

Why tailwind-merge: Merge Tailwind classes without conflicts Version: ^3.4.0 Combined with clsx in lib/utils.ts:4-6:

Sonner

Why Sonner: Toast notifications for React Version: ^2.0.7 Usage: User feedback for actions

Backend integration

Firebase

Why Firebase: Authentication and cloud services Version: ^12.9.0 Configuration: lib/firebase/config.ts Services used:
  • Authentication
  • Cloud Storage
  • Analytics

Logging

Pino

Why Pino: Fast JSON logger for Node.js Version: ^10.2.0 Configuration: lib/utils/logger.ts

pino-pretty

Dev tool: Pretty print Pino logs Version: ^13.1.3

Development tools

ESLint

Version: ^9 Configuration: eslint.config.mjs Extends:
  • eslint-config-next: Next.js recommended rules
  • eslint-config-prettier: Disable conflicting rules

Prettier

Version: ^3.8.1 Plugins:
  • prettier-plugin-tailwindcss: Sort Tailwind classes

Sharp

Image optimization: Next.js image processing Version: ^0.34.5

Package manager

pnpm

Why pnpm: Fast, disk-efficient package manager Required version: 8 or higher Workspace: Configured with pnpm-workspace.yaml Benefits:
  • Faster installs than npm/yarn
  • Saves disk space
  • Strict dependency resolution

Runtime requirements

Node.js

Required version: 20 or higher Why Node 20:
  • Native fetch support
  • Improved performance
  • Long-term support (LTS)

Environment variables

Required variables (.env.local):

Build output

Production build:
Generates optimized static and dynamic pages in .next/ Bundle analysis:
  • Server Components: No client JavaScript
  • Client Components: Code-split automatically
  • Images: WebP/AVIF with responsive srcset
See Architecture for how these technologies work together.