ffdcd35cea73d9b021da3e3c646dfb14e2b4e6cf
Renders the data file as category-grouped HTML. Pure string builder with guarded browser wiring so it is unit-testable in Node; escapes all text, skips invalid entries, and handles duplicate category slugs.
Personal Blog
A small static personal blog. No build step, no backend — plain HTML, CSS, and vanilla JavaScript.
Pages
index.html— home pagecontact.html— contact page (opens the visitor's mail client with the form fields pre-filled via amailto:link)
Development
Serve the directory with any static file server, e.g.:
python3 -m http.server 8000
Then open http://localhost:8000.
Tests
Tests use Node's built-in test runner (no dependencies to install):
npm test
Project layout
index.html Home page
contact.html Contact page
css/style.css Global + responsive styles
js/mailto.js Pure mailto: URL builder (unit tested)
js/contact.js Contact form wiring (browser + tests)
tests/ Node built-in test suite
.gitea/workflows/ ci.yml runs `npm test` on PRs and pushes to main
Languages
JavaScript
89%
TypeScript
9.9%
Dockerfile
1.1%