Skip to main content

Overview

VizBoard is built with modern, production-ready technologies focused on type safety, developer experience, and performance.

Core Framework

Next.js

Version: 15.3.2
  • App Router architecture
  • Server Components
  • Server Actions
  • Turbopack for fast builds
  • Built-in optimizations

React

Version: 19.0.0
  • Latest features
  • Server Components
  • Improved hydration
  • Concurrent rendering
  • Automatic batching

TypeScript

Version: 5.8.3
  • Full type safety
  • Enhanced IDE support
  • Compile-time error checking
  • Better refactoring

Node.js

Runtime environment
  • ESM module support
  • Crypto for encryption
  • Environment variables

Database & ORM

Prisma ORM

Purpose: Application database operations
import prisma from '@/lib/db/prisma'

// Type-safe database queries
const projects = await prisma.project.findMany({
  where: { userId },
  include: {
    dbconnections: true,
    widgets: true,
  },
})
Features:
  • Auto-generated type-safe client
  • Schema migrations
  • Connection pooling
  • Transaction support
  • Relation loading

PostgreSQL

Primary database for storing:
  • User accounts and authentication
  • Projects and configurations
  • Widget definitions
  • Encrypted connection credentials
  • Cached database schemas

Knex.js

Purpose: External database connections
import knex from 'knex'

// Dynamic connections to user's databases
const connection = knex({
  client: 'pg',
  connection: {
    host: decryptedConfig.host,
    port: decryptedConfig.port,
    database: decryptedConfig.database,
    user: decryptedConfig.user,
    password: decryptedConfig.password,
  },
})

const data = await connection('users').select('*').limit(100)
Features:
  • Multiple database support
  • Query building
  • Transaction management
  • Connection pooling

Knex Schema Inspector

Purpose: Discover database structure
import schemaInspector from 'knex-schema-inspector'

const inspector = schemaInspector(knexConnection)

// Introspect database structure
const tables = await inspector.tables()
const columns = await inspector.columnInfo('users')
const foreignKeys = await inspector.foreignKeys('orders')
Used for:
  • Table discovery
  • Column metadata
  • Primary keys
  • Foreign key relationships
  • Data types

Authentication

NextAuth.js

NextAuth.js v5.0.0-beta.28

Features:
  • JWT-based sessions
  • Multiple providers
  • Prisma adapter
  • TypeScript support
  • Custom callbacks
Providers:
  • Google OAuth
  • GitHub OAuth
  • Email/Password (Credentials)
import { auth } from '@/lib/auth/auth'

const session = await auth()
if (!session?.user) {
  redirect('/login')
}

Password Hashing

import bcrypt from 'bcryptjs'

// Hash password on signup
const hashedPassword = await bcrypt.hash(password, 10)

// Verify on login
const isValid = await bcrypt.compare(inputPassword, user.password)

UI Framework & Components

Styling

Tailwind CSS

Version: 4.x
  • Utility-first CSS
  • JIT compilation
  • Custom design system
  • Dark mode support
  • PostCSS integration

CSS Utilities

class-variance-authority - v0.7.1
Component variants
tailwind-merge - v3.3.0
Merge Tailwind classes
clsx - v2.1.1
Conditional classes

Radix UI Primitives

Headless, accessible UI components:
@radix-ui/react-accordion       ^1.2.11
@radix-ui/react-alert-dialog    ^1.1.14
@radix-ui/react-avatar          ^1.1.10
@radix-ui/react-checkbox        ^1.3.2
@radix-ui/react-collapsible     ^1.1.11
@radix-ui/react-dialog          ^1.1.14
@radix-ui/react-dropdown-menu   ^2.1.15
@radix-ui/react-hover-card      ^1.1.14
@radix-ui/react-label           ^2.1.7
@radix-ui/react-popover         ^1.1.14
@radix-ui/react-scroll-area     ^1.2.9
@radix-ui/react-select          ^2.2.5
@radix-ui/react-separator       ^1.1.7
@radix-ui/react-slot            ^1.2.3
@radix-ui/react-switch          ^1.2.5
@radix-ui/react-tabs            ^1.1.12
@radix-ui/react-toggle          ^1.1.9
@radix-ui/react-toggle-group    ^1.1.10
@radix-ui/react-tooltip         ^1.2.7
Why Radix?
  • Fully accessible (ARIA)
  • Unstyled by default
  • Composable primitives
  • TypeScript support
  • Keyboard navigation

Icons

Lucide React

Version: 0.511.0
  • 1000+ icons
  • Tree-shakeable
  • Consistent design
  • Lightweight SVGs
import { Plus, Trash2, Settings } from 'lucide-react'

<Plus className="w-4 h-4" />

Tabler Icons

Version: 3.33.0
  • Additional icon set
  • Consistent stroke width
  • Outlined style
  • React components

Theme Support

import { ThemeProvider } from 'next-themes'

<ThemeProvider
  attribute="class"
  defaultTheme="system"
  enableSystem
  disableTransitionOnChange
>
  {children}
</ThemeProvider>
Features:
  • System theme detection
  • Persistent preference
  • No flash on load
  • Class or data-attribute

Data Visualization

Recharts

Recharts - v2.15.3

Composable charting library for React
import { BarChart, Bar, XAxis, YAxis, Tooltip } from 'recharts'

<BarChart data={data} width={600} height={400}>
  <XAxis dataKey="name" />
  <YAxis />
  <Tooltip />
  <Bar dataKey="value" fill="#3b82f6" />
</BarChart>
Supported Charts:
  • Bar charts
  • Line charts
  • Area charts
  • Composed charts
Features:
  • Responsive
  • Customizable
  • SVG-based
  • Animations
  • Tooltips

TanStack Table

Headless table library
import { useReactTable, getCoreRowModel } from '@tanstack/react-table'

const table = useReactTable({
  data,
  columns,
  getCoreRowModel: getCoreRowModel(),
  getSortedRowModel: getSortedRowModel(),
  getFilteredRowModel: getFilteredRowModel(),
})
Features:
  • Sorting (multi-column)
  • Filtering (global & column)
  • Pagination
  • Row selection
  • Column visibility
  • Resizing
  • Type-safe
  • Headless (bring your own UI)

State Management

Zustand

Zustand - v5.0.5

Lightweight state management
import { create } from 'zustand'

interface StoreState {
  count: number
  increment: () => void
}

const useStore = create<StoreState>((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}))
Why Zustand?
  • Simple API
  • No boilerplate
  • TypeScript support
  • DevTools integration
  • Middleware support
  • Persistence plugin
Used for:
  • Widget dialog state
  • Project draft persistence
  • UI preferences

SWR

Data fetching and caching
import useSWR from 'swr'

const { data, error, isLoading, mutate } = useSWR(
  '/api/projects',
  fetcher,
  {
    revalidateOnFocus: true,
    refreshInterval: 30000,
  }
)
Features:
  • Automatic revalidation
  • Cache management
  • Optimistic updates
  • Pagination support
  • Error retry
  • Focus revalidation
  • Interval polling
Used for:
  • Projects list
  • Dashboard data
  • Widget configurations
  • Real-time updates

Form Handling

React Hook Form

react-hook-form - v7.56.4

import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { z } from 'zod'

const schema = z.object({
  title: z.string().min(1),
  description: z.string().optional(),
})

const { register, handleSubmit, formState } = useForm({
  resolver: zodResolver(schema),
})
Features:
  • Minimal re-renders
  • Built-in validation
  • Zod integration
  • Error handling
  • TypeScript support
Used for:
  • Project creation/editing
  • Database connection forms
  • Widget configuration
  • User settings

Validation

Zod

TypeScript-first schema validation
import { z } from 'zod'

const ProjectSchema = z.object({
  title: z.string().min(1, 'Title is required').max(100),
  description: z.string().optional(),
  isPublic: z.boolean().default(false),
  connections: z.array(z.object({
    title: z.string().min(1),
    host: z.string().min(1),
    port: z.number().int().min(1).max(65535),
    database: z.string().min(1),
    user: z.string().min(1),
    password: z.string().min(1),
  })),
})

type Project = z.infer<typeof ProjectSchema>
Benefits:
  • Type inference
  • Composable schemas
  • Custom error messages
  • Transform data
  • Runtime validation

UI Enhancements

Animation & Interaction

Framer Motion

Version: 12.19.2
  • Smooth animations
  • Gesture handling
  • Layout animations
  • Spring physics
import { motion } from 'framer-motion'

<motion.div
  initial={{ opacity: 0 }}
  animate={{ opacity: 1 }}
  exit={{ opacity: 0 }}
/>

DnD Kit

Version: 6.3.1
  • Drag and drop
  • Sortable lists
  • Touch support
  • Accessibility
Used for:
  • Widget reordering
  • Dashboard layout

Additional UI Libraries

Sonner - v2.0.4
Toast notifications
import { toast } from 'sonner'

toast.success('Project created successfully')
Vaul - v1.1.2
Drawer component for mobile
react-resizable-panels - v3.0.2
Resizable panel layouts
react-day-picker - v9.7.0
Date picker component
input-otp - v1.4.2
OTP input fields

Utilities

Date & Time

import { format, formatDistanceToNow } from 'date-fns'

const formatted = format(new Date(), 'PPP')
const relative = formatDistanceToNow(date, { addSuffix: true })
Benefits:
  • Modular (tree-shakeable)
  • Immutable
  • TypeScript support
  • Locale support

Other Utilities

import { v4 as uuidv4 } from 'uuid'

const id = uuidv4()

Security

Encryption

import crypto from 'crypto'

const ENCRYPTION_KEY = Buffer.from(process.env.ENCRYPTION_KEY!, 'base64')
const algorithm = 'aes-256-gcm'

export function encrypt(text: string): string {
  const iv = crypto.randomBytes(16)
  const cipher = crypto.createCipheriv(algorithm, ENCRYPTION_KEY, iv)
  
  let encrypted = cipher.update(text, 'utf8', 'hex')
  encrypted += cipher.final('hex')
  const authTag = cipher.getAuthTag()
  
  return `${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted}`
}

export function decrypt(encryptedData: string): string {
  const [ivHex, authTagHex, encrypted] = encryptedData.split(':')
  
  const iv = Buffer.from(ivHex, 'hex')
  const authTag = Buffer.from(authTagHex, 'hex')
  const decipher = crypto.createDecipheriv(algorithm, ENCRYPTION_KEY, iv)
  
  decipher.setAuthTag(authTag)
  
  let decrypted = decipher.update(encrypted, 'hex', 'utf8')
  decrypted += decipher.final('utf8')
  
  return decrypted
}
Used for:
  • Database connection credentials
  • Sensitive configuration
  • AES-256-GCM encryption
  • Authentication tags for integrity

Development Tools

Build & Dev Tools

Turbopack

Next.js 15 bundler
  • Fast incremental builds
  • Optimized for Next.js
  • Built in Rust
npm run dev
# Uses --turbopack flag

ESLint

Version: 9.x
  • Code quality
  • Next.js rules
  • TypeScript support
npm run lint

TypeScript

Version: 5.8.3
  • Type checking
  • IntelliSense
  • Refactoring support

ts-prune

Version: 0.10.3
  • Find unused exports
  • Dead code detection
npm run find-deadcode

Database Tools

prisma - v6.8.2
Prisma development tools
npm run db:migrate    # Run migrations
npm run db:studio     # Open Prisma Studio
npm run db:reset      # Reset database
ts-node - v10.9.2
Run TypeScript directly for seeding
tsx - v4.19.4
Fast TypeScript execution

Test Data Generation

import { faker } from '@faker-js/faker'

const users = Array.from({ length: 100 }, () => ({
  name: faker.person.fullName(),
  email: faker.internet.email(),
  avatar: faker.image.avatar(),
  createdAt: faker.date.past(),
}))
Used in:
  • Database seeding scripts
  • Test data generation
  • Sample dashboards

Package Management

package.json
{
  "type": "module",
  "name": "dataviz-project",
  "version": "0.1.0",
  "private": true
}
VizBoard uses ESM modules ("type": "module") for modern JavaScript features and better tree-shaking.

Scripts

npm run dev              # Start dev server with Turbopack
npm run build            # Production build
npm run start            # Start production server
npm run lint             # Run ESLint

Environment Variables

.env
# Database
DATABASE_URL="postgresql://user:pass@localhost:5432/vizboard_db"

# Authentication
AUTH_SECRET="your-random-secret-min-32-chars"
NEXTAUTH_URL="http://localhost:3000"

# OAuth Providers
AUTH_GOOGLE_ID="your-google-client-id"
AUTH_GOOGLE_SECRET="your-google-client-secret"
AUTH_GITHUB_ID="your-github-client-id"
AUTH_GITHUB_SECRET="your-github-client-secret"

# Encryption
ENCRYPTION_KEY="your-32-byte-key-in-base64"

# Optional
NODE_ENV="development"
Generate keys:
# AUTH_SECRET
openssl rand -base64 32

# ENCRYPTION_KEY
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

Deployment Considerations

Vercel

Recommended Platform
  • Native Next.js support
  • Edge functions
  • Automatic HTTPS
  • Preview deployments
  • Environment variables

Docker

Self-Hosted Option
  • Included docker-compose.yml
  • PostgreSQL containers
  • Database seeding
  • Volume persistence
All production dependencies are carefully selected for stability, active maintenance, and TypeScript support.

Build docs developers (and LLMs) love