This is my personal portfolio website built with Nuxt 4, Vue 3, TailwindCSS, and shadcn-vue.
It includes my selected work, experience, writing, and a contact form powered by Supabase.
Live: https://www.cedrouseroll.dev
- Node.js 22+
- pnpm (recommended via Corepack)
Enable Corepack and activate pnpm:
corepack enable
corepack prepare pnpm@latest --activate- Nuxt 4 (Vue 3)
- TailwindCSS
- shadcn-vue
- Supabase (contact form storage)
- VueUse
- Nuxt Image
- Nuxt A11y
- Sonner (vue-sonner) for toast notifications
- Minimal portfolio layout
- Performance + accessibility focused UI
- Blog pages with automatic word count and reading time
- Custom cursor interaction
- Weather widget in footer
- Contact form with validation + Supabase integration
- SEO optimized metadata + OpenGraph support
Install dependencies:
pnpm installStart the dev server:
pnpm devApp runs on:
http://localhost:3000
Build for production:
pnpm buildPreview production build locally:
pnpm previewRun coverage locally:
pnpm test:coverage -- --runCoverage is uploaded in CI (GitHub Actions) and reflected in the badge at the top of this README.
Create a .env file (or copy from .env.example if you keep one):
NUXT_PUBLIC_SUPABASE_URL=your_supabase_url
NUXT_PUBLIC_SUPABASE_KEY=your_supabase_key
NUXT_PUBLIC_SITE_URL=https://www.cedrouseroll.devThe contact form requires Supabase public URL/key to be present.
pnpm dev # start local dev server
pnpm build # production build
pnpm preview # preview production build
pnpm test # run all tests
pnpm test:watch # test in watch mode
pnpm test:coverage # coverage run
pnpm test:unit # unit project tests
pnpm test:nuxt # nuxt project tests
pnpm commit # interactive conventional commit (Commitizen)
pnpm changelog # regenerate CHANGELOG.md from commits
pnpm release # changelog + version bump flowPlease read contribution.md before opening a PR. This project uses Husky hooks and commitlint, so commit messages must follow Conventional Commits.
Deployed on Vercel, but works on any Nuxt-compatible platform.
Docs: https://nuxt.com/docs/getting-started/deployment
Cedrouseroll Omondi Software Engineer