Davi Naves' portfolio — a bilingual site whose content lives in a database, not in hardcoded objects.
This is a portfolio and a demonstration piece. It exists to show, in real code, how I build software when nobody is rushing me: clean layer boundaries, a typed monorepo, a real test pyramid and documentation kept in sync with the implementation.
The site started as a static prototype where adding a project meant editing markup and shipping a deploy. Here, the same experience is rebuilt as a layered application whose content is data — a project is an insert, not a commit.
What it is meant to demonstrate
- 🧱 Clean Architecture — domain rules in a package with zero runtime dependencies, testable in milliseconds
- 🌐 Real internationalization — translated content per locale with a fallback chain, not a strings file
- 🗄️ Content as data — projects, timeline, skills and links modelled in PostgreSQL
- 🧪 A full test pyramid — unit, integration, component and end-to-end, each owned by its layer
- 📐 Design before code — requirements, data model and roadmap written first and kept honest
| Feature | |
|---|---|
| 🌍 | Bilingual pt-BR / en — the visitor's browser language decides, pt-BR covers anything untranslated |
| 🔀 | Per-locale routes — every page is addressable in both languages, and the manual switch outranks the browser |
| 🚀 | Animated hero — headline, availability badge driven by a boolean, and an interactive particle field |
| 💼 | Project showcase — featured cards with category, tags, progress bar and a detail view with the skills applied |
| 📄 | Shareable project pages — a public list plus one canonical page per project, same slug in every language |
| 🕒 | Scroll-aware timeline — professional, academic and certification entries, ongoing ones worded per kind and locale |
| 🛰️ | Orbital skill map — skills grouped by category; picking one reveals everywhere it was used, with context |
| 📊 | Stat band and social footer — figures that animate into view, links rendered from inline SVG |
| ♿ | Accessible by requirement — keyboard-closable modals with focus return, and a Lighthouse a11y score of 95+ |
| 📱 | Responsive — verified at 380 px, 760 px and desktop |
| ⚡ | Static by default — pages pre-rendered and revalidated hourly; the database never reaches the client bundle |
| 📈 | Telemetry-ready — public access-counting endpoints are designed and deliberately deferred |
| Layer | Choice |
|---|---|
| Framework | Next.js 15 (App Router), React 19 |
| Language | TypeScript 5.6, strict |
| Database | PostgreSQL 16+ |
| Monorepo | pnpm 9 workspaces |
| Tests | Vitest, Testing Library, Playwright |
| CI / Hosting | GitHub Actions · Vercel |
Why each of these — and the Server/Client Component split that follows from it — is argued in docs/architecture/stack.md.
One deployable, three packages, dependencies pointing inward:
apps/web Next.js — pages and, later, public endpoints
packages/core Domain + application rules. Framework-free, zero dependencies.
packages/db Persistence: migrations, mappers, repositories
packages/telemetry Access counting — self-contained, deferred
web → core ← db: the domain knows nothing about Next.js, React or a database
driver, so it can outlive all three.
See clean-architecture.md and
monorepo.md.
Requirements and design are complete; implementation is starting. The workspace, TypeScript config, Docker Compose and CI pipeline are in place; the feature list above describes v1 as specified, not as shipped. Current phase and what lands next: docs/roadmap.md.
Requires Node 24, pnpm 9 and Docker. The version is pinned in .nvmrc — nvm use picks it up.
pnpm install && cp .env.example .env && docker compose up -d postgrespnpm db:migrate && pnpm db:seed && pnpm devUseful scripts: pnpm test (unit + component), pnpm test:integration (real
PostgreSQL), pnpm test:e2e (Playwright), pnpm typecheck, pnpm build.
Environment variables are documented in .env.example.
| Document | Purpose |
|---|---|
| docs/README.md | Index and v1 scope |
| requirements.md | What v1 must do — and what it explicitly won't |
| roadmap.md | Phases, deliverables, exit criteria |
| testing.md | Test levels, tooling, CI |
| data-model.md | Tables, enums, conventions |
| architecture/ | Layers, stack rationale, monorepo layout |
| CONTRIBUTING.md | Branch, commit and pull request conventions |
MIT © Davi Naves