Personal portfolio site built with Next.js (App Router), React, Tailwind CSS v4, and next-intl for localized routes. Content lives in content/ as Markdown and JSON.
| Package | Version (see package.json) |
|---|---|
| React / React DOM | 19.x (^19.0.0) |
| Next.js | 15.2.6 |
| TypeScript | 5.7.x |
| Tailwind CSS | 4.x |
To see the exact versions installed in your tree:
pnpm list react react-dom next- App Router – Server components, static generation for pages and articles, API route for the contact form.
- Internationalization – English and Latvian (locale codes:
/en,/lv) via next-intl. Legacy/fr/**URLs redirect to/lv/**. - Content – Section pages and articles from Markdown; projects, FAQ, and stack from JSON under
content/. - Contact form – Optional email delivery with Resend when an API key is set.
- Analytics – Optional Plausible via
NEXT_PUBLIC_*variables. - Styling – Tailwind CSS v4, dark theme, responsive layout, Geist/Manrope-style typography.
- Tooling – TypeScript, ESLint (
eslint-config-next),pnpmas the package manager.
- Node.js 20+ (recommended)
- pnpm 9+ (
corepack enableor install from pnpm.io). This repo lists pnpm inpackageManager; usingnpm installon a pnpm layout can trigger npm bugs (e.g.edgesOut). Preferpnpm install.
-
Clone this repository.
-
Install dependencies
pnpm install
-
Environment variables
cp .env.example .env
Variable Purpose DATABASE_URLOptional Neon Postgres (pooled URI). Enables DB logging for admin image uploads and a portfolio_projectstable for future CMS sync.CMS_SECRETPassword for /admincontent editor.RESEND_API_KEYorNUXT_PRIVATE_RESEND_API_KEYEnables /api/emails/sendfor the contact form.NEXT_PUBLIC_PLAUSIBLE_DOMAINPlausible site domain; if unset, analytics script is not loaded. NEXT_PUBLIC_PLAUSIBLE_SCRIPTOptional override for self-hosted Plausible (defaults to https://plausible.io/js/script.js).After setting
DATABASE_URL, create tables once (with dependencies installed viapnpm install):pnpm run db:migrate
-
Development server
pnpm dev
Open http://localhost:3000 — you will be redirected to a locale (e.g.
/en). -
Production build
pnpm build pnpm start
| Command | Description |
|---|---|
pnpm dev |
Dev server (Turbopack). |
pnpm build |
Production build. |
pnpm start |
Run the production server (after build). |
pnpm lint |
ESLint. |
pnpm typecheck |
TypeScript check (tsc --noEmit). |
pnpm run db:migrate |
Create Neon tables (needs DATABASE_URL). |
src/app/– App Router:[locale]routes, layouts, API routes.src/components/– React UI components.src/lib/– Site config, content loaders, MDC-style block parsing for section markdown.src/messages/– next-intl JSON messages (en,lv).content/–en/andlv/markdown + JSON (projects, FAQ);stack.jsonsupplies linked tool names on About (minimal text list).public/icons/– SVG icons for social and any non-About uses; About stack is text-only on the site.
Site-specific copy (name, socials, meeting link, SEO defaults) is in src/lib/site-config.ts.
- Section pages use numbered markdown files (for example
content/en/1.index.md) with::block/#slotsections; these are parsed insrc/lib/mdc.ts. - Article images in frontmatter should prefer
https://raw.githubusercontent.com/...URLs fornext/imageoptimization;github.comblob URLs are allowed innext.config.tsbut raw URLs are more reliable.
Apache-2.0 (see repository license file).