0%
← All works

Case study 02Postal Stationery Society of Australia2026

Australian Postal Stationery Society

A rebuild of a philatelic society’s ageing WordPress site as a Next.js site and admin CMS — three decades of journals migrated, made searchable, and handed to a volunteer to run without code.

  • CMS
  • Migration
  • Search
Australian Postal Stationery Society case study cover
Role
Full-stack development, Content migration, CMS design
Timeline
Aug – Oct 2026
Team
Solo build
Stack
Next.js 16, React 19, TypeScript, Supabase, Cloudflare R2, TipTap, Tailwind CSS

The brief

The Postal Stationery Society of Australia had decades of journals, handbooks and articles sitting behind an old WordPress site that only a developer could change. The society needed a site its volunteer administrator could run, and an archive members could actually search.

I rebuilt it on Next.js, Supabase and Cloudflare R2, migrated every legacy file, and designed the admin around the requests the administrator sent me.

What I built

  • A block-based CMS — hero, prose, link list, download, media and contact blocks — with drafts, previews, revision history and old-slug redirects
  • An admin-editable three-tier navigation with dropdowns, reordering and a live preview
  • A journal archive with member-only issues, plus galleries, news, downloads and a site-wide meeting notice
  • Full-text search across journal PDFs and slide decks, using OCR for scanned pages, indexed automatically on upload
  • Direct-to-R2 browser uploads through presigned URLs, with every file tracked in an asset registry
  • Member sign-up and roles, with an activity log for the admin team

Moving thirty years of files

Idempotent import scripts pulled every legacy file, registered it, uploaded it to R2 and rebuilt the journal records — parsing three decades of inconsistent filenames, double issues included. Issues from 2020 onwards, which had never been on the public site, were backfilled from the society’s records.

Switching download links to R2 is guarded: the publish step fetches a probe file anonymously and aborts unless the bytes match, so a misconfigured bucket can’t turn working links into broken ones.

Search is private by design. Extracted text stays server-side, and public search returns only short snippets and links to the files.

By the numbers

Legacy files migrated
207
Archive moved to R2
665 MB
Back-issue journals
103
Site in progress
Copied