CACTUS Association — Presentation Site with an Editorial Workflow
A presentation site for an academic association: pages edited from a block CMS, events and news, a three-role editorial workflow, and an activity log the application cannot rewrite.
Visit live site
The Challenge
The CACTUS Academic Research Association in Tourism and Services, founded in 2008, kept its entire online presence on a Blogspot blog untouched since April 2013 — six pages and two posts, roughly 8,100 characters in total. Events and announcements could only be published by the single person holding the blog account. On top of that, the CACTUS name today covers three separate entities — the association, ASE's research centre and the academic journal — and the old copy blurred them, crediting the association with work that was not its own.
Our Solution
We built a new site on Next.js 16 and PostgreSQL where every public page is edited from the admin panel as a set of blocks. Publishing runs through a three-role workflow: the writer drafts, the moderator reviews on a diff screen and publishes, the administrator has everything — and even an edit to an already-published item stays invisible on the site until it is approved. The guarantees that matter are enforced in the database rather than in code: the app connects with a role that has no DDL rights, and the activity log is append-only through REVOKE and triggers, so not even the application can rewrite its own history. The legacy content was migrated with every source verified individually, and work belonging to the research centre or the journal is labelled as such.
Features
- Block-based CMS for eight editable pages
- Events and calls for papers, with calendar (.ics) export
- News, announcements and a per-tag archive
- Three-role editorial workflow: writer, moderator, administrator
- Edits to published items reach the site only after approval
- Append-only activity log, enforced at the PostgreSQL level
- Media library with optimised images and role-based invitations
- Automated backups, a redirect table and a sitemap