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 →
- Dashboard — Overview: key stats, latest episode, quick actions. Answers « where am I? »
- Episodes — Create, edit, schedule. The heart of the tool. Audio + cover upload on one screen.
- Appearance — Colors, fonts, layout — all with live preview. No code to touch.
- 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)
| Choice | UX benefit |
|---|---|
| Flat files instead of MySQL | No database to create. Backup = copy a folder. Migration = move files. |
| Zero npm/composer dependencies | No « npm install » that fails. Upload, setup, it’s live. |
| CSS variables instead of Sass | The theme changes in real-time in the browser. No build step. |
| PHP audio proxy | Play 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.
Badal is open source
A podcast CMS with no database, no subscription, no compromise.









