CMS
Aug 2025
At Goodwish
Client work — described generically
Multi-tenant Headless CMS
Versioned pages with snapshot rollback, scheduled publishing, preview tokens and SEO-safe slug history.
Role
Backend engineer
Stack
- Django
- DRF
- MySQL
- Celery
- Redis
- Docker
Evidence
- Merged pull requests
- 2
- Commits
- 33
The problem
What this had to solve.
A content platform serving multiple tenants needed editors to publish confidently: schedule a page for later, preview unpublished content on a shareable link, and undo a bad edit completely — without breaking the URLs search engines had already indexed.
What I built
My contribution.
- 01
Built a CMS domain with pages, metadata, sections, media, versions, nested serializers, CRUD viewsets, filtering, search and publish/unpublish actions.
- 02
Implemented soft delete, tenant scoping, audit tracking, scheduled publication, HTML sanitisation, preview tokens, caching, slug history and SEO redirects.
- 03
Added full snapshot rollback for page content and fixed database transaction, uniqueness, audit-integrity and MySQL constraint issues.
The hard part
Rollback has to include the children
Versioning a page row is easy; a page is not a row. It is a tree of sections, media references and metadata. Restoring an old version means restoring that whole tree atomically, or you get a headline from Tuesday above a body from Friday. I snapshotted the composed structure rather than the individual records, and kept old slugs pointing at the page through redirect history so a rollback never costs the client their search ranking.