alex.bularca.me — personal dev blog (Astro, Cloudflare Workers static assets, Forgejo Actions)
- TypeScript 49.2%
- Astro 32.4%
- JavaScript 9.5%
- CSS 8.9%
|
All checks were successful
deploy / deploy (push) Successful in 58s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| public | ||
| src | ||
| .gitignore | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc | ||
| astro.config.mjs | ||
| lighthouserc.cjs | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| renovate.json | ||
| tsconfig.json | ||
| vitest.config.ts | ||
| wrangler.jsonc | ||
alex.bularca.me
Personal dev blog. Astro static site deployed to Cloudflare Workers static assets by
Forgejo Actions. Design spec lives in personal-infra/docs/superpowers/specs/2026-09-11-dev-blog-design.md.
Writing a post
- Create
src/content/posts/YYYY-MM-DD-my-slug.mdwith frontmatter:title,date,description,tags(optional),draft(optional, default false). - Commit on a branch, open a PR. CI posts a preview URL that includes drafts.
- Merge to
master. CI deploys to https://alex.bularca.me (drafts excluded).
No local tooling is required to publish. For live preview: npm ci && npm run dev.
Scripts
npm run build · npm run build:preview (includes drafts) · npm run check · npm test ·
npm run format:check · npm run lint:links · npm run lint:perf · npm run preview (real Worker locally)
Secrets (Forgejo → Settings → Actions → Secrets)
| Name | Source of truth |
|---|---|
CLOUDFLARE_API_TOKEN |
Vault (rivendell) secret/cloudflare/blog-deploy key api-token |
CLOUDFLARE_ACCOUNT_ID |
Vault (rivendell) secret/cloudflare/blog-deploy key account-id |
Nothing else reads them. To rebuild: read from Vault, paste into Forgejo repo secrets.
Gotchas
- Node 22 is required (system Node 23 fails Vitest's engine check); CI runs Node 22.
- Do not remove
vite.build.assetsInlineLimit: 0inastro.config.mjs— inlined component scripts are blocked by the CSP (script-src 'self') and the theme toggle/contents rail silently stop working. - Astro 7 strips newline whitespace between an expression and a sibling element; write
{' '}where a visible space is needed. - Analytics: GA4 loads only after opt-in via the consent card (
public/ga.js+ConsentBanner.astro); choice stored in localStorageanalytics-consent; footer 'cookies' link resets it; GPC/DNT browsers are never asked and never tracked.