Date: 2026-03-23
Status: Accepted
The repository contained an Angular 18 portfolio application with typical developer-portfolio patterns (skills meters, project gallery, resume section). The brand strategy requires a premium client-acquisition website optimized for SEO, performance, and conversion.
Replace Angular 18 entirely with Next.js 15 (App Router), TypeScript, Tailwind CSS v4, and shadcn/ui.
- SEO: Next.js App Router provides server-rendered metadata, sitemap, robots, and JSON-LD out of the box
- Performance: React Server Components, automatic code splitting, and image optimization align with Lighthouse 100 targets
- Ecosystem: shadcn/ui, Framer Motion, and Lucide integrate natively with React
- Brand alignment: The reference aesthetic (Stripe, Linear, Vercel) is overwhelmingly React/Next.js
- Maintainability: Single-person consultancy benefits from a simpler, modern stack with strong community support
- All Angular code removed (not deprecated — clean break)
- Case study data migrated and restructured from
project-data.ts - Team must learn Next.js App Router patterns if unfamiliar
Date: 2026-03-23
Status: Accepted
Tailwind CSS v4 uses @import "tailwindcss" and @theme directives instead of tailwind.config.js.
Use Tailwind v4 with all design tokens defined in src/styles/globals.css.
- Single file for all visual tokens (colors, radius, shadows, motion, fonts)
- No separate config file to maintain
- Native CSS custom properties for theme switching
- Aligns with shadcn/ui v4 support
Date: 2026-03-23
Status: Accepted
Need a scalable folder structure that supports multiple pages without coupling.
Thin route files in src/app/, domain logic in src/features/, shared primitives in src/components/.
- Pages are routing concerns only
- Features can be developed and tested independently
- Shared UI components remain generic and reusable
- Mirrors production SaaS application patterns
Date: 2026-03-23
Status: Accepted
Content includes case studies, services, FAQ, and navigation. CMS adds complexity for a single-operator consultancy.
Store content as typed TypeScript modules in src/data/.
- Type safety for all content
- Version-controlled content changes
- Zero infrastructure cost
- Easy migration path to MDX or headless CMS later
- Content edits require deploy — acceptable for low-frequency updates
When blog launches (Phase 5), evaluate MDX files in-repo before adopting a headless CMS.
Date: 2026-03-23
Status: Accepted
Typography is the primary visual element. Font choice sets the premium tone.
Use Geist Sans (body) and Geist Mono (code) via the geist npm package.
- Used by Vercel — aligns with reference aesthetic
- Optimized for screen readability
- Next.js font optimization built-in
- Clean, modern, timeless — not trendy
- Inter (Google Fonts) — safe but generic
- Custom font — unnecessary complexity for launch
Date: 2026-03-23
Status: Accepted
Temptation to start building homepage immediately.
Complete design system, architecture, documentation, and tooling before any page UI.
- Prevents one-off styles that bypass the design system
- Designer and developer can work from documented tokens
- Avoids rework when component library evolves
- Enforces production-grade discipline
Date: 2026-03-23
Status: Accepted
Angular portfolio had a projects page with tech stacks and screenshots. Brand strategy calls for outcome-focused case studies.
Restructure project data into case studies with: slug, category, summary, highlights, description, capabilities, featured flag. Remove githubUrl/liveDemoUrl from primary data model.
- Founders evaluate stories, not tech stacks
- "Capabilities" replaces "techStack" in copy
- Featured flag enables curated homepage selection
- Slug-based routing supports SEO (
/work/[slug])
Date: 2026-03-23
Status: Accepted
Brand strategy recommends addressing pricing in FAQ, not homepage.
No pricing page or homepage pricing section at launch. FAQ will address engagement models and ranges.
- Premium positioning requires trust before price discussion
- FAQ provides transparency without anchoring visitors on cost
- Contact form budget field qualifies leads without public rate card
| Decision | Options | Target Phase |
|---|---|---|
| Contact form backend | Formspree, Resend, custom API route | Phase 4 |
| Calendly vs Cal.com | Evaluate privacy and branding | Phase 3 |
| Analytics | Plausible, Vercel Analytics, none | Phase 4 |
| Blog content format | MDX in-repo, Contentlayer, headless CMS | Phase 5 |
| OG image generation | Static asset vs @vercel/og |
Phase 4 |