Burak Çevik’s personal site, live at burak.pm. Plain HTML, CSS and JavaScript with a tiny build step and Cloudflare Pages Functions.
site/ the static site (copied to dist/ by the build)
index.html home page markup (English; the Turkish /tr page is generated)
content.js all copy for both languages and the project data
app.js home page behaviour: live queue, projects, songs, contact, command menu
admin.html/.js private admin panel at /admin
page.js theme toggle for the generated project pages
_headers security and cache headers; _routes.json limits where Functions run
functions/ Pages Functions (/api/*), shared code in functions/_lib
migrations/ D1 schema, applied in order
scripts/build.mjs builds dist/: /tr, /projects, one page per project, sitemap.xml, llms.txt
scripts/og.py link preview images for project pages (run after copy changes)
Cloudflare Pages builds every push to main with node scripts/build.mjs and serves dist/.
Local: node scripts/build.mjs && npx wrangler pages dev dist (put test secrets in .dev.vars).
SPOTIFY_CLIENT_SECRET, SPOTIFY_REFRESH_TOKEN (optional once connected from the admin panel)
TURNSTILE_SECRET, RESEND_API_KEY
IP_HASH_KEY keys the visitor codes used for rate limits (never store raw IPs)
SETTINGS_KEY seals secrets stored in D1 (the Spotify token from the admin panel)
ADMIN_SESSION_KEY signs admin sessions
https://burak.pm/admin mails a one time sign in link to NOTIFY_EMAIL. From there: messages, song suggestions (approve adds them to a Spotify playlist), visits, health, IndexNow and maintenance. Spotify must list https://burak.pm/api/admin/spotify/callback as a redirect URI.
Art in site/assets/art was generated with Higgsfield (GPT Image 2.5, Seedance 2.5).