Personal website and portfolio for Cyan.
Warning
Redesign in progress. Some pages may be incomplete or broken.
Source for thayn.me, built without frameworks or bundlers.
The build is a Node.js script (build.js) that compiles Handlebars templates
and Markdown into static HTML/CSS/JS, deployed on Netlify. Pages, capsules and
the asset bundles come from the GachaKit
engine; the blog, feeds, webmentions and syndication are this repo's own.
Production dependencies: gachakit, @netlify/blobs, front-matter, handlebars,
marked.
- Capsules are self-contained components (HTML + CSS + JS) that compose into
pages. See
src/capsules/for the header, footer, ambient background, etc. - Blog posts are Markdown with YAML frontmatter, syndicated to Mastodon and Bluesky via Bridgy on deploy.
- Edge functions block AI crawlers. Serverless functions proxy Last.fm data and fetch webmentions.
- Reduce JS reliance. The CSP no longer allows inline styles. What remains
is moving JS-driven elements to native CSS where practical:
- mobile nav toggle →
popover - container width tracking the nav → intrinsic CSS sizing
- sliding nav highlight → anchor positioning
- footer slide after navigation → a view transition
- mobile nav toggle →
Requires Node.js >= v24.
npm install
npm run dev # build + serve at localhost:3000
npm run build # build only (outputs to ./public)
npm test # syndication policy tests
npm run lint # eslint
npm run format # prettier- Code: AGPL v3
- Content (text, images, media): CC BY-SA 4.0
If you reuse content, please attribute and keep derivatives under CC BY-SA 4.0.