← ~/projects
$ cat ~/projects/daraitis-portfolio.mdx

daraitis.com

This site. Self-hosted portfolio with photos in Swift and projects as MDX in the repo.

Next.jsTypeScriptTailwindOpenStack SwiftCaddy

why

Most portfolio platforms either lock you in (Squarespace, Cargo) or want you to manage a CMS for the sake of it. I wanted something simple: a static-ish Next.js site that compiles MDX from the repo and serves photos from object storage I already run.

stack

  • Next.js 15 App Router + RSC for fast photo pages
  • MDX for project writeups (frontmatter + portable content)
  • Tailwind for the dark, monospace-leaning aesthetic
  • OpenStack Swift for photos — container daraitis.com, public-read via tempurl/ACL
  • sharp generates webp variants at upload time
  • Caddy fronts the app, handles daraitis.com → www.daraitis.com redirect + auto-TLS

upload flow

``bash pnpm upload-photo ./trip.jpg --collection iceland ``

CLI presigns a Swift PUT, uploads the original, runs sharp for thumb + display variants, and updates content/photos/collections.json. Same flow available via /admin/upload (basic auth) for one-offs.

photos

Photos live in Swift, not in the repo. collections.json holds metadata; Swift holds bytes. next/image remote-loads from Swift and serves through its optimizer.