Personal portfolio of Diego Nicolas Ramirez Maldonado — software developer specializing in scalable interfaces and performance architecture.
Live site: dieramirezma.dev
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript — strict mode |
| Styles | Tailwind CSS v4 |
| Animations | Framer Motion |
| Data fetching | TanStack Query v5 |
| Fonts | Geist + JetBrains Mono via next/font |
| i18n | next-intl (EN / ES) |
| Theming | next-themes (dark default) |
| Deploy | Vercel |
- Void aesthetic design system — "Kinetic Technical": black canvas, electric blue (
#3b82f6) accents, tight typography - Dark / Light mode — dark by default, persisted in
localStorage - Internationalization — full EN / ES toggle via next-intl
- Live Spotify integration — now-playing widget polling every 30s
- Chess stats — live Lichess and Chess.com ratings via public APIs
- Scroll animations — Framer Motion
fadeInUpon viewport entry, respectsprefers-reduced-motion - Pre-commit formatting — Prettier via lint-staged on every commit
- Pre-push linting — ESLint + TypeScript validation via Husky
src/
├── app/
│ ├── [locale]/ # i18n routing (next-intl)
│ │ ├── layout.tsx
│ │ └── page.tsx # Home
│ └── api/
│ ├── spotify/now-playing/
│ └── chess/{lichess,chesscom}/
├── components/
│ ├── layout/ # Navbar, Footer, ThemeToggle
│ ├── home/ # Hero, LiveMetrics, SelectedWorks
│ └── ui/ # Chip, SectionTitle, Divider
├── hooks/ # use-now-playing, use-chess-stats
├── lib/ # spotify.ts, chess.ts, utils.ts
├── types/ # Shared TypeScript interfaces
└── messages/ # en.json, es.json
pnpm install
cp .env.example .env.local # fill in your credentials
pnpm devOpen http://localhost:3000.
# Spotify (Authorization Code flow)
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
SPOTIFY_REFRESH_TOKEN=
# Chess
LICHESS_USERNAME=
CHESSCOM_USERNAME=
# AI Chatbot (optional)
ANTHROPIC_API_KEY=
# Site
NEXT_PUBLIC_SITE_URL=https://dieramirezma.devpnpm dev # Start dev server
pnpm build # Production build
pnpm lint # ESLint + TypeScript check
pnpm format # Prettier write
pnpm format:check # Prettier check- No
any— TypeScript strict, all types insrc/types/index.ts - No semicolons — Prettier enforces
"semi": false - Single quotes in TS/JS, double quotes in JSX attributes
- Absolute imports via
@/alias, never relative../../ - No barrel
index.tsunless the directory has 4+ related exports - No unnecessary comments — code is self-documenting
© 2024 Diego Nicolas Ramirez Maldonado