import type { ProjectMeta } from "../types.js"; const project: ProjectMeta = { status: "draft", title: "My Website", ref: "/projects/my-site.html", startedAt: "2025-01-20", }; const content = <>
A decade ago I tried making my own website. I got a domain, wrote some code to generate my site, put some content on it and had big aspirations for what I would do with my very own place on the internet. Unfortunately that project lost steam more or less as soon as it started and was left abandoned gathering dust ever since.
This is my second attempt at making a website for myself. Inspired in large part when I surfed the small web and discovered personal pages like Melvian's beautiful site, the insanity that is MelonLand, and whole communities centred around small personal pages and projects like Nekoweb, and tidleverse.org.
I've decided to use my website as a place to experiment with a hybrid architecture that sits in-between a static site generator and a fully dynamic site. Instead of having custom code generate the whole response on every request, my code instead generates the HTML and then writes it to a folder just like a static site generator would, but in response to requests from web clients.
This has some interesting advantages:
Of course, this would only work for a site who's content changes only rarely. Which is precisely what I expect the vast majority of the content on my site to be: Content that once made is rarely revised.
I thought about options for languages and frameworks to build my site on and eventually settled on using TypeScript with JSX running on Node.js to generate static pages. I wanted my site to be as close to working with plain HTML as practical, while still being easy to compose and reuse different parts together.
I opted to use JSX because I don't want to gouge my eyes out writing HTML with pure JavaScript notation (something I incidentally have tried to do before). To represent the HTML as data I wrote antihtml, a tiny library that only does one thing: Treat HTML as a data structure that can be serialised.
What that means is that I write my content mostly as if it was plain HTML, but get to combine the parts that make up my site using JavaScript logic.
> export default { ...project, content };