A warm, modern personal website with a built-in content management system. Show off your projects, the websites you’ve built, write journal posts, share a photo gallery, and link to Buy Me a Coffee — all editable from a password-protected admin panel, no code required.
Built with Next.js (App Router), TypeScript, Tailwind CSS, and the
built-in node:sqlite database (no native build step).
npm install
npm run dev
Then open:
The dev password is changeme (set in .env.local). Change it before deploying.
# .env.local
ADMIN_PASSWORD=your-strong-password
SESSION_SECRET=<a long random string>
Generate a session secret:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Sign in at /admin, then:
All content and uploaded images live in the data/ folder
(data/app.db and data/uploads/). Back this folder up to keep your content.
This app needs a server with persistent disk (for the SQLite DB and uploads), so use a host like Railway, Render, Fly.io, or your own VPS rather than a purely serverless platform.
npm run build
npm run start # serves on PORT (default 3000)
Set these environment variables on your host:
| Variable | Purpose |
|---|---|
ADMIN_PASSWORD |
Your admin login password |
SESSION_SECRET |
Long random string for sessions |
Mount a persistent volume at data/ so your posts, settings, and images survive
restarts and deploys.
src/
app/
(site)/ Public pages: home, about, projects, websites, blog, gallery
admin/ CMS dashboard + server actions (auth-protected)
login/ Admin sign-in
uploads/ Serves uploaded images from data/uploads
components/ Nav, Footer, cards, admin forms
lib/ db, auth, settings, content queries, uploads
data/ SQLite database + uploaded images (gitignored)
Made with care. ☕