TM

← All work

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.