A podcast CMS built for those who want to keep control.

The problem

Publishing a podcast today means picking a side: Spotify, Apple, Acast, Ausha… Each platform locks creators into its ecosystem, dictates display rules, harvests listener data, and charges a monthly fee for basic features.

For an independent podcaster who wants to self-host their content, own their RSS feed, and customize their website, the options are either too heavy (WordPress + plugins) or too limited (static pages with no admin).

« I want to publish my episodes, see my stats, and have a site that looks decent — without becoming a devops engineer or paying €15/month for a podcast host. »

Alex — Independent podcaster · Weekly show · 2K listeners

UX approach

1. Research & framing

The starting point isn’t a technical spec — it’s a question: what is the shortest path from « I have an MP3 » to « my podcast is live »?

Analyzing existing solutions (Anchor, Podbean, WordPress + Seriously Simple Podcasting) revealed a recurring pattern: cluttered interfaces that drown the 3 essential actions — publish an episode, check stats, customize the site.

User journey — from MP3 to live

Upload MP3 → Fill metadata → Publish → RSS auto-generated → Live on all platforms

Guiding principle: Each screen should answer one question. If the user wonders « what am I supposed to do here? », the screen is doing too much.

2. Information architecture

The admin navigation was reduced to 7 entries (vs. 15–20 in a typical WordPress), organized by frequency of use:

Admin navigation map

Dashboard · Podcast · Episodes · Stats · Appearance · Security · RSS
← daily →    ← weekly →    ← rare →

  1. Dashboard — Overview: key stats, latest episode, quick actions. Answers « where am I? »
  2. Episodes — Create, edit, schedule. The heart of the tool. Audio + cover upload on one screen.
  3. Appearance — Colors, fonts, layout — all with live preview. No code to touch.
  4. Statistics — Plays per episode, trends, CSV export. No vanity metrics — only what’s useful.

3. Design decisions

Kept

  • Single-screen setup (no 5-step wizard)
  • Dark theme by default (studio context)
  • AJAX autosave on appearance settings
  • Persistent player on public pages
  • Auto-generated RSS feed
  • Zero-config: everything detected at setup

Discarded

  • No database (unnecessary complexity)
  • No plugin system (scope creep)
  • No multi-user (v1 = solo)
  • No third-party embedded player
  • No third-party tracking (privacy)
  • No JS framework (raw performance)

4. Micro-interactions & details

UX doesn’t stop at the sitemap. The details that make the difference:

  • Smooth page transitions — fade in/out between views, even without a SPA
  • Real-time font preview — preview text changes on the fly in the admin
  • Auto duration detection — ffprobe extracts duration on upload, no manual input
  • Clickable timestamps — in transcriptions, a click jumps to the exact moment in the player
  • Visual rate-limiting — on lockout, a countdown is shown instead of a generic error
  • Smart setup redirect — if no config exists, any URL redirects to installation

Technical choices serving UX

Every technical decision in Badal is driven by a user benefit, not an engineering preference:

Browser → Apache + .htaccess → PHP Router → Flat files (MD / YAML / JSON)

ChoiceUX benefit
Flat files instead of MySQLNo database to create. Backup = copy a folder. Migration = move files.
Zero npm/composer dependenciesNo « npm install » that fails. Upload, setup, it’s live.
CSS variables instead of SassThe theme changes in real-time in the browser. No build step.
PHP audio proxyPlay counting is transparent. No JS analytics, no cookie wall. Server-side only.

Audio proxy — transparent play counting

Player → /audio/ep.mp3 → PHP proxy (count + stream) → stats.json

Results

Setup time
< 30 sec

Dependencies
0

Languages
4

Database
None

Badal is in production at robotetdragon.com/badal. The source code is available on GitHub.

Brand & identity

The name Badal comes from Occitan [baˈðal] — « the opening », the gesture of opening one’s mouth wide to speak, to sing, or to stand in awe of a story. Rooted in the Latin batare, cousin of the Catalan badallar.

The calligraphic logo is a single continuous stroke — like a voice that flows without breaking. Two versions exist: the full wordmark and the « b » monogram used as favicon.

Wordmark
Monogram / Favicon

Badal is open source

A podcast CMS with no database, no subscription, no compromise.