A community radio station's website, built around its schedule
What a radio station asks of a website: recurrence, not a calendar
Ask a content management system for a schedule and it gives you a calendar. A radio schedule is a different animal.
Programs recur on their own patterns:
- weekly
- fortnightly
- on the second Tuesday of the month
- on the last Sunday of the month
The listener does not care about the pattern. They want to know whether their program is on this week, and what is playing right now.
The station broadcasts programming by and for communities that commercial and public radio do not reach. It is volunteer-run and listener-sponsored, and a supporter can name the program they are backing when they subscribe.
Almost everything about how a station like this works becomes a requirement on its website: a presenter publishing their own show, decades of broadcasting that has to stay reachable.
Our part in the work: an engineering partner on a Drupal 11 rebuild
Drupal(Opens in a new tab/window) 7 reached end of life, so the station's platform needed a new home. A partner agency brought us in as their engineering partner for the rebuild.
Since 2025 we have worked alongside their team on a Drupal 11 build, providing:
- technical leadership
- platform architecture
- migration engineering
- the delivery process
The brief was never only to move the site. It was to make sure the parts that run every day keep running on their own.
A schedule that tells the truth: weekly, fortnightly and monthly recurrence
We modelled recurrence the way broadcast actually works. Each program carries its own pattern, down to last and second-to-last of the month, the 2 cases most systems quietly decline to handle. Upcoming episodes are generated ahead of time and refreshed automatically, so the schedule a listener sees stays in step with what goes to air.
Then there is the part that only appears once a station is on air. A program booked for 9 o'clock does not begin at 9 o'clock exactly.
Recordings start a little early and run a little long, and the platform matches each recording back to the program that produced it within a tolerance. Without that, the audio archive would be a pile of unlabelled files, and that archive is a large part of what a station with decades behind it actually is.
Bringing the archive across: a Drupal 7 migration with its history intact
The migration from Drupal 7 carried across:
- hundreds of programs with their history
- the station's members and volunteers
- the taxonomy that organises decades of broadcasting
- more than 1,000 redirects, so links people saved years ago still land where they expect
For a client, that reads as continuity: the archive, the people and the saved links arrive with the content, rather than being rebuilt by hand after launch.
Getting there meant joining 2 live databases in a single query, which Drupal does not do out of the box, and knowing where Drupal 7 keeps content that looks absent until you check the right table. Migrations fail quietly on details like that, so the ones this one turned up are written into the codebase.
Built so the station can run it: roles, automation and a live player
A community station's day belongs to its programs, not to its website. The routine work happens by itself:
- upcoming episodes appear ahead of time
- recordings are attributed to the shows that made them
- the schedule keeps itself current
- the program catalogue comes straight from the station's podcast platform rather than being retyped
The live player was built for the audio format the station actually broadcasts, so listening works from the first page. For a client, that reads as time back: the hours that would go into keeping a website current go into programming instead.
Permissions follow how a volunteer-run station is really organised, with presenters, announcers, program makers and station managers each holding exactly the access their part of the station needs. A presenter can publish their own show, and only their own show.
The build runs on Vortex(Opens in a new tab/window), our open-source Drupal project template, with automated end-to-end tests over the journeys that matter, written on our published Behat step library(Opens in a new tab/window).
Where it stands: a Drupal 11 platform in active build through 2026
This is current work: a Drupal 11 platform, actively being built out through 2026. The schedule, the archive, the volunteer roster and the sponsorship model are one system, and each has edge cases only a real station produces.
Hundreds of programs, decades of archive and more than 1,000 saved links, carried from Drupal 7 onto Drupal 11.
Getting them right once is what lets a station's team spend their time on programming rather than on the website.
For platforms kept running by volunteers
Everything on this page is 4 of our services running on one live platform: platform architecture for a schedule broadcast actually produces, custom development for the parts no module covers, migration engineering off Drupal 7, and the DevOps and hosting that keeps releases repeatable.
If you run a community broadcaster, a member-funded not-for-profit, or any organisation whose website is maintained between shifts by people with another job to do, this is the shape the engagement takes: routine work built to happen on its own, roles that match how the organisation is really staffed, and an archive that survives the move. Where budget is the constraint, the same engineering is available with AI-assisted delivery, at the same tested standard.
If your Drupal 7 site is still carrying the schedule, the archive or the membership your organisation runs on, tell us what it has to keep doing.