Files
andwati.com/README.md
T
andwati ec6401ac38 Replace Astro/Strapi site with Next.js static export
- Fresh structure: Next.js App Router + Tailwind v4 at the repo root, exported
  as static files (output: export) and served by static-web-server
- Remove the Strapi CMS, Astro app, Pagefind search, comments, old scripts,
  Lighthouse config and compose files; content in content/ is now plain
  markdown with YAML frontmatter
- Pages: About, Writing, Reading (3D bookshelf) and Portfolio, styled after
  adammaj.com
- SEO: metadata and canonicals, JSON-LD, generated OG images, sitemap, robots,
  RSS and JSON feeds, llms.txt
- Umami via PUBLIC_UMAMI_SCRIPT_URL / PUBLIC_UMAMI_WEBSITE_ID (build args)
- Dockerfile builds the export and serves it with sws.toml (security headers,
  clean URLs, .well-known, OG image content type, immutable asset caching)
- Prettier and cspell for content with a husky/lint-staged pre-commit hook
- Old redirect list dropped to start from a clean slate
2026-09-30 12:48:14 +03:00

1.3 KiB

andwati.com

Personal site: about, writing, reading and portfolio. Next.js (App Router) with Tailwind CSS v4, exported as static files and served by static-web-server.

Develop

pnpm install
pnpm dev

Content

Everything lives in content/ as markdown with YAML frontmatter:

  • content/about.md is the home page
  • content/writing/*.md are posts (title, description, date, tags)
  • content/reading/*.md are books and papers
  • content/portfolio/*.md are projects

Covers go in public/covers/<slug>.jpg. Math ($...$), code fences, callouts and YouTube embeds are supported.

Checks

pnpm check           # Biome (code) + Prettier and cspell (content)
pnpm format:content  # format markdown

A pre-commit hook runs these on staged files. Add project words to .cspell/words.txt.

Analytics

Umami is loaded when both variables are set at build time:

PUBLIC_UMAMI_SCRIPT_URL=https://analytics.andwati.com/script.js
PUBLIC_UMAMI_WEBSITE_ID=...

Deploy

docker build -t andwati-site \
  --build-arg PUBLIC_UMAMI_SCRIPT_URL=... \
  --build-arg PUBLIC_UMAMI_WEBSITE_ID=... .

The image builds the static export (out/) and serves it with sws.toml (security headers, clean URLs, .well-known). In Dokploy, pass the two Umami variables as build args.