A blazing-fast portfolio built with React 19 + React Compiler
View Live β Β β’Β MovieWatcht Β β’Β Daniel AI
β Click to visit the live site
π Table of Contents
|
|
|
|
|
React 19 |
TypeScript |
Vite 7 |
SASS |
Vercel |
GitHub |
Also using: React Router 7 Β· React Compiler Β· Lucide Icons Β· OGL (WebGL) Β· Styled Components Β· Typewriter Effect Β· Vercel Analytics
| 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 |
Node.js β₯ 20.x
npm β₯ 10.x
# 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 useOr enable auto-switching in your shell config:
# ~/.zshrc or ~/.bashrc
eval "$(fnm env --use-on-cd)"π Development server: http://localhost:4500
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)
| 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 |
- 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
Environment Variables
Create .env.local for local development:
VITE_API_URL=your_api_urlPath 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;