Skip to content

danieldjupvik/portfolio

Repository files navigation

Header banner with name Daniel Djupvik

Live Site Stars Last Commit

React TypeScript Vite Vercel


A blazing-fast portfolio built with React 19 + React Compiler

View Live β†’ Β β€’Β  MovieWatcht Β β€’Β  Daniel AI


Portfolio Preview

↑ Click to visit the live site


πŸ“– Table of Contents

⚑ Highlights

πŸš€ Modern Stack

  • React 19 with React Compiler
  • TypeScript 5.9 for type safety
  • Vite 7 for lightning builds
  • React Router 7 with lazy loading

🎨 Design & UX

  • Fluid responsive layouts
  • Smooth page transitions
  • WebGL effects with OGL
  • Typewriter animations

βš™οΈ Developer Experience

  • Hot Module Replacement
  • Path aliases (@/, src/)
  • SASS with BEM methodology
  • ESLint + TypeScript strict

πŸ“Š Production Ready

  • Vercel Analytics
  • Optimized images
  • Code splitting
  • Edge-deployed on Vercel

πŸ› οΈ Tech Stack

React
React 19
TypeScript
TypeScript
Vite
Vite 7
SASS
SASS
Vercel
Vercel
GitHub
GitHub

Also using: React Router 7 Β· React Compiler Β· Lucide Icons Β· OGL (WebGL) Β· Styled Components Β· Typewriter Effect Β· Vercel Analytics


🎨 Pages

Route Page Description
/ Portfolio Hero with typewriter, projects showcase, skills grid, contact form
/moviewatcht MovieWatcht Landing page for the MovieWatcht mobile app
/ai Daniel AI AI service page with features and capabilities
/ai/privacy-policy Privacy Policy AI service privacy documentation
/ai/terms-of-service Terms AI service terms of service
/privacy Privacy Main site privacy policy

πŸš€ Getting Started

Prerequisites

Node.js  β‰₯ 20.x
npm      β‰₯ 10.x

Installation

# Clone the repository
git clone https://github.com/danieldjupvik/portfolio.git

# Navigate to directory
cd portfolio

# Install dependencies
npm install

# Start development server
npm run dev
πŸ’‘ Using fnm?

The repo includes .nvmrc β€” fnm reads it automatically:

fnm use

Or enable auto-switching in your shell config:

# ~/.zshrc or ~/.bashrc
eval "$(fnm env --use-on-cd)"

🌐 Development server: http://localhost:4500


πŸ“ Project Structure

portfolio/
β”‚
β”œβ”€β”€ πŸ“‚ public/
β”‚   β”œβ”€β”€ images/                 # Hero backgrounds, assets
β”‚   └── *.png                   # Favicons, app icons
β”‚
β”œβ”€β”€ πŸ“‚ src/
β”‚   β”œβ”€β”€ πŸ“‚ components/          # Reusable UI components
β”‚   β”‚   β”œβ”€β”€ Navigation/
β”‚   β”‚   β”œβ”€β”€ Hero/
β”‚   β”‚   β”œβ”€β”€ Projects/
β”‚   β”‚   └── ...
β”‚   β”‚
β”‚   β”œβ”€β”€ πŸ“‚ pages/               # Route page components
β”‚   β”‚   β”œβ”€β”€ Home/
β”‚   β”‚   β”œβ”€β”€ MovieWatcht/
β”‚   β”‚   └── AI/
β”‚   β”‚
β”‚   β”œβ”€β”€ πŸ“‚ hooks/               # Custom React hooks
β”‚   β”œβ”€β”€ πŸ“‚ types/               # TypeScript definitions
β”‚   β”‚
β”‚   β”œβ”€β”€ πŸ“‚ scss/
β”‚   β”‚   β”œβ”€β”€ partials/           # _variables, _mixins, _reset
β”‚   β”‚   └── *.scss              # Component styles
β”‚   β”‚
β”‚   └── πŸ“‚ assets/              # Static imports (images, fonts)
β”‚
β”œβ”€β”€ πŸ“‚ api/                     # Vercel serverless functions
β”‚
β”œβ”€β”€ πŸ“„ vite.config.ts           # Vite configuration
β”œβ”€β”€ πŸ“„ tsconfig.json            # TypeScript configuration
└── πŸ“„ .nvmrc                   # Node version (works with fnm)

πŸ“œ Scripts

Command Description
npm run dev Start Vite dev server on port 4500
npm run dev:vercel Dev with Vercel environment & serverless functions
npm run build Create optimized production build
npm run preview Preview production build locally
npm run deploy Deploy to Vercel production

🎯 Performance

  • React Compiler β€” Automatic memoization, zero manual useMemo/useCallback
  • Code Splitting β€” Lazy-loaded routes via React.lazy() + Suspense
  • Image Optimization β€” Responsive hero images (desktop/mobile variants)
  • Tree Shaking β€” Dead code elimination via Vite/Rollup
  • Edge Deployment β€” Global CDN distribution via Vercel

πŸ”§ Configuration

Environment Variables

Create .env.local for local development:

VITE_API_URL=your_api_url
Path Aliases

Both src/ and @/ resolve to the source directory:

import { Button } from 'src/components/Button';
import { useTheme } from '@/hooks/useTheme';

Configured in vite.config.ts and tsconfig.json.

Theme Variables

Core design tokens in src/scss/_variables.scss:

$background: #1d1d1d;
$navbar: #181818;
$accent: #74f7d9;
$font-heading: 'Roboto Mono', monospace;
$font-body: 'Roboto', sans-serif;
$max-width: 768px;

πŸ‘€ Author

Daniel Djupvik

Daniel Djupvik

Website GitHub


Footer wave decoration

Releases

Packages

Used by

Contributors

Languages