Client · CMS publish pipeline · live
Heavenly Healing
Osteopathy clinic site where the customer edits content in a Vue admin and publishes to a static public site — Handlebars render, Firebase Auth roles, and Cloudflare deploy — so marketing updates don’t need an engineer every time.
- Vue 3
- Vite
- Handlebars
- Firebase Auth / Functions
- Cloudflare
- Mailjet
Problem
A clinic needs a polished public site plus the ability to change copy themselves. A plain static site blocks the customer; a heavy CMS is overkill. They needed a publish pipeline with real roles, not a brochure HTML dump.
Approach
- Admin (Vue 3 + Vite) edits shared content schema in Firestore; Cloud Function publishPage evaluates editedAt vs publishedAt, renders full HTML via Handlebars templates/partials, and writes the public page.
- Firebase custom claims for domain-scoped roles (manager / admin / super-admin / suspended) with gated admin routes and user management APIs (createDomainAdmin, updateUserRole, promoteSuperAdmin, listDomainUsers).
- Shared @mhh/commons schema between admin and functions; Mailjet for password-reset mail; SEO/analytics on the live marketing site; Wrangler deploy to Cloudflare alongside Firebase Functions.
What I owned
- End-to-end publish pipeline design and Handlebars render path.
- RBAC model, secured functions, and admin UX for edit/publish.
- Production deploy path and content workflow the clinic can run without engineering per change.
Outcome
Live at heavenly-healing.com.au — clinic staff publish updates themselves; commits/publishes are attributable; the system is a CMS + RBAC product, not a one-shot brochure.