Evolution view for the portfolio, aligned with Clean Architecture, DDD, i18n, and Supabase.
- Either pattern (
Left,Right,left,right) - Base classes:
Entity,ValueObject,AggregateRoot -
Validatorwith chain of responsibility - Migrated test runner to Vitest
- Value Objects:
Slug,Name,Url,LocalizedText,DateRange,Email - Entities:
Project,Experience,Profile,Skill,ContactMessage - Repository interfaces:
IProjectRepository,IExperienceRepository,IProfileRepository -
User,Role,IUserRepository,UnauthorizedError(Identity context)
- Prisma schema (Project, Experience, Skill, Profile, User)
- Repositories:
PrismaProjectRepository,PrismaExperienceRepository,PrismaProfileRepository,PrismaUserRepository - DI container (
makeContainer,getContainer) - Email adapter (
ResendEmailService) - Migrations and seed
- Use cases:
GetPublishedProjects,GetFeaturedProjects,GetProjectBySlug - Use cases:
GetExperiences,GetProfile,GetProfessionalValues - Use case:
SendContactMessage - Use cases:
GetCurrentUser,EnsureAdmin - DTOs for all implemented contexts
- i18n (
next-intl):pt-BR,en-US,es - Pages: Home, Projects, Projects/[slug], About, Login, Admin
-
error.tsxper route segment - Locale middleware (next-intl)
- Contact form with validation (React Hook Form + Zod)
-
Badgecomponent with variants -
Buttonwith appearance variants -
SectionHeader -
TextRichwith Markdown + Mermaid diagram support (React.lazy, client-side rendering) - OG image generation (
/ogroute with@vercel/og)
Items required before MVP launch, using Paul Scanlon's portfolio as a reference.
- Styling review — Figma round to identify what needs to be finished and changed in components
- Realistic data — seeds updated with production-representative content
- i18n in core —
LocalizedTextVO implemented in@repo/core; use cases resolve locale via.get(locale) - Remove hardcoded texts — fixed strings in
@repo/coreshould use localizable messages - Move admin to a dedicated app — extract
/{locale}/loginand/{locale}/admintoapps/admin - General code review — quality pass before launch
- Blog (
apps/blog) —BlogPost,Tag, public API, listing and detail pages (design spec). Post-MVP items deferred from the initial launch:-
/archivespage — reverse-chronological listing grouped by year - Tag index pages (
/blog/[locale]/tag/[tag]) - "Recently updated" and "Trending tags" sidebar widgets
- Sticky table of contents on post pages (heading extraction + scroll-spy)
- Reading-time estimate on post pages
- Comments, newsletter, reading analytics
-
-
IAuthenticationGateway— pluggable Supabase gateway,authSubject,EnsureAppUserForAuthSession - Dedicated backend — REST API in a separate repository;
apps/siteremains a pure SSG consumer - Playwright E2E — end-to-end tests for critical flows
- CI/CD — re-enable GitHub Actions when the plan allows runners
- Validation: Zod in APIs and row decoding; gradual migration to Zod in forms
- Errors: complete
ERROR_MESSAGEwithes; standardize codes and HTTP mapping - Tests: coverage for use cases and repositories (local DB)
- Documentation: keep
docs/in sync with decisions and code