Kavatana Portfolio
This website — my personal developer portfolio
What this proves
I can design and ship a maintainable, SEO-correct, accessible frontend with clean data/presentation separation and real deployment discipline — not just a static one-off page.
Problem
I needed a place to show who I am, what I'm building, and what I'm learning — without overstating my experience or understating my ambition.
My role
I designed and built this site myself, making decisions about stack, content structure, design tokens, accessibility, and SEO.
What I built
- — A Nuxt 4 portfolio with a design token CSS system.
- — JSON-driven content model so text is separate from code.
- — Mobile-responsive layout with accessible navigation.
- — SEO metadata, Open Graph tags, sitemap, and structured data.
Architecture
The site is a Nuxt 4 SSR app where content is fully decoupled from presentation: all copy is authored in content/*.json and surfaced through small typed composables that map slugs to data, validated against interfaces in types/content.ts. Routing is file-based with a dynamic /projects/[slug] page, and selected routes are prerendered for fast first paint. Cross-cutting concerns — SEO metadata, JSON-LD, sitemap, a CSS design-token system, and accessibility primitives (skip link, focus handling, reduced-motion) — are implemented as shared building blocks rather than duplicated per page.
Backend / deployment
- Status
- Deployed
- Frontend
- Nuxt 4 (Vue 3, TypeScript, SSR) with @nuxtjs/sitemap
- Backend
- None — Nitro serves the SSR app and sitemap route; no API routes and no server directory
- Database
- None — content is static JSON in the repo
- Hosting
- Vercel, custom domain kavatana.me
Nuxt 4 SSR on Vercel, custom domain kavatana.me — no backend or database.
Stack
What I learned
- — How to structure a real Nuxt 4 project with composables.
- — CSS design tokens and how to maintain a consistent design system.
- — Accessibility foundations: skip links, focus traps, reduced-motion.
- — The importance of honest personal branding over impressive-sounding copy.
Next backend step
Move the contact form behind a small hosted API (server actions or an Express/Postgres service) so submissions are dynamic rather than static — a good place to apply the backend hosting I am studying.
Working on something similar?
Let's talk →