The source for https://www.dana.lol — Dana's personal site and blog. It's a static site built with Middleman.
Ruby 3.4 is pinned in .tool-versions (managed with mise):
mise install
bundle install
bundle exec middleman serverThe dev server runs at http://localhost:4567.
Common tasks live in the Taskfile (task --list for the full set):
task build # build the static site
task release:stage # build + deploy to Cloudflare Pages staging
task release:prod # build + deploy to Cloudflare Pages productionThe site deploys to Cloudflare Pages via wrangler. The legacy S3 + CloudFront setup (cloudformation/, the *:s3 tasks) is retained only as a rollback fallback.
Branch flow:
mainis the only long-lived branch — feature PRs target it and squash-merge (the PR title becomes the commit subject, so it must be a Conventional Commit). Every PR gets a preview deploy at<branch>.dana-lol-staging.pages.dev(seetesting.yml), and every merge deploys staging (staging.yml).- Releases are cut by release-please, which maintains a standing release PR on
mainwith the next version andCHANGELOG.mdentry computed from the conventional commits. Merging that PR tagsvX.Y.Z, publishes the GitHub Release, and triggers the production deploy (release.yml).
The site is static, but the Cloudflare Worker in worker/ backs the contact page and /ama: POST /contact mails each submission to Dana through a send_email binding locked to that one address. The same worker is the post-from-phone inbox (task post:drain). Deploy it with task post:worker:deploy.