[ Case Study · AI Podcast Platform ]

Pods

Type a topic, get a two-voice podcast episode, published with SEO — a self-hosted Laravel 13 and Vue 3 platform that generates, publishes and plays Arabic tech shows.

Client
In-house product
Engagement
In-house product: design, AI pipeline and full-stack build
Disciplines
Product · AI Audio · Laravel · Vue
Year
2026
Live
pod.mrzakaria.com
Pods listening app with a frosted Now Playing screen over a blurred episode cover — light modePods listening app with a frosted Now Playing screen over a blurred episode cover — dark mode
01 · Overview

A podcast without a studio, a microphone or an editing timeline.

Pods is a self-hosted AI podcast platform built by RAIN as an in-house product. RAIN wanted to publish Arabic-language tech podcasts without a recording studio, voice talent or hours of editing — and to own the whole stack while doing it: no per-episode hosting fees, no third-party player, and full control over the SEO pages and the storage behind them. The answer is a single application that does three jobs. It is a generator: an admin types a topic, and a queued job writes a two-host dialogue script, voices both hosts, converts the result to MP3 and publishes it. It is a CMS: shows, episodes, chapters, guests, analytics and costs are managed from one admin screen. And it is a listening app: a dark, iOS-style progressive web app with a frosted Now Playing screen, a mini-player that follows you across pages, resume-where-you-left-off, chapters, bookmarks and history. It is live at pod.mrzakaria.com as "MrZaKaRiA Pods — أثير التقنية", serving Arabic tech shows on operating systems, artificial intelligence, cybersecurity, hardware and miscellaneous sciences.

Under the hood, Pods is a Laravel 13 monolith serving a Vue 3 single-page app, a JSON API of 61 endpoints, server-rendered pages for crawlers, an RSS feed per show and a dynamic sitemap. All AI work runs in queued jobs on Laravel's database queue. Google Gemini writes the script and renders it with multi-speaker text-to-speech, with OpenAI's tts-1 available as an alternative voice path; ffmpeg turns the audio into MP3; Groq fills in the SEO fields; and Browsershot renders a share card for every episode, with a PHP GD fallback. Every token used is logged against its episode, so the cost of each show stays visible. Data lives in a single SQLite file, audio and covers on local disk or Cloudflare R2 — switchable from the admin with a connection test — and the whole thing runs on a plain Apache server behind Cloudflare. Listeners sign in with Google through Firebase when they want bookmarks and history; anyone can simply press play.

By the numbers
61

JSON API endpoints

9

App screens, listener and admin

5

Arabic tech shows live

13

Public episodes published

02 · Architecture & Design

Six systems that turn a topic into a published episode — and six that make it a pleasure to listen to.

01

Topic-to-episode pipeline

One queued job takes a topic through script, voices, MP3, SEO and share card. Progress is written to the episode and polled by the admin, so a long render never blocks the screen.

02

Two-host script writer

Gemini writes a natural dialogue between two hosts. The admin picks the model — Gemini 2.5 Pro, 2.5 Flash, 2.0 Flash or 1.5 Flash — trading depth against speed and cost.

03

Multi-speaker voices

Gemini's multi-speaker text-to-speech voices both hosts in one pass. An OpenAI tts-1 path voices segment by segment instead, and ffmpeg stitches the pieces together.

04

Script first, audio second

A two-phase flow lets the admin generate and review the script before paying for audio. ffmpeg converts the result to MP3, and a command converts any older WAV files.

05

SEO on autopilot

Groq fills each episode's slug, meta description and schema fields. Browsershot renders a share card from a template page, falling back to PHP GD when a headless browser is not available.

06

Cost you can see

Every call's token usage is logged per episode against a price table for Gemini, OpenAI and Groq models, and a cost dashboard in the admin adds it up.

07

Frosted Now Playing

The episode cover becomes a heavily blurred, saturated backdrop under a glass panel, with a canvas scrubber, ±15 s skip, playback speed and a chapters list. Each episode carries its own colour theme.

08

Listening that remembers

Playback position is saved per device, a mini-player persists across every page, and lock-screen controls come through the Media Session API. History, bookmarks and "continue listening" pick up where you stopped.

09

Pages built for crawlers

The app is a single-page app, but every show and episode also has a server-rendered page with PodcastSeries and PodcastEpisode JSON-LD, Open Graph and Twitter tags, plus RSS, a sitemap and robots rules.

10

PWA with careful caching

A Workbox service worker serves shows and the latest episodes network-first, caches covers, and deliberately leaves audio network-only, so episodes always stream fresh from the server.

11

Storage you can move

Audio and covers live on local disk through an Apache alias or on Cloudflare R2. The switch is an admin setting with a connection test, not a redeploy.

12

One admin, one screen

Generation, shows, episodes, chapters, guests, analytics, token costs, audit log and the queue monitor all live in a single admin CMS, behind sign-in and an admin role.

03 · Everything inside

A generator, a CMS and a player in one install.

Everything needed to go from an idea to a published, findable, listenable episode — and to keep track of what it cost. Hover any capability for what it does.

AI generation06
  • Topic to episode
  • Two-host dialogue
  • Model picker
  • Multi-speaker TTS
  • OpenAI voice path
  • Script-first mode
Audio04
  • MP3 output
  • Segment stitching
  • WAV conversion command
  • Live progress
Chapters03
  • AI chapter generation
  • Manual chapter editor
  • Chapter list in player
Player06
  • Blurred-cover backdrop
  • Canvas scrubber
  • ±15 s skip
  • Playback speed
  • Lock-screen controls
  • Persistent mini-player
Listener library05
  • Resume per device
  • Continue listening
  • Bookmarks
  • History
  • Show likes
Discovery04
  • Show grid
  • Latest episodes
  • Search overlay
  • Play and view counts
SEO & feeds06
  • AI SEO fields
  • Server-rendered episode pages
  • PodcastSeries / PodcastEpisode JSON-LD
  • Share cards
  • RSS per show
  • Sitemap & robots
Content admin05
  • Shows & episodes CRUD
  • Soft delete & restore
  • Episode colour themes
  • Site settings
  • Arabic / English setting
Guests & access05
  • Google sign-in
  • Admin and guest roles
  • Guest invites
  • Approve & suspend
  • Anonymous listening
Analytics & cost04
  • Analytics overview
  • Analytics aggregation
  • Token usage per episode
  • Cost dashboard
Operations05
  • Database queue
  • Queue monitor
  • Audit log
  • Local or R2 storage
  • Storage connection test
App shell05
  • Installable PWA
  • Network-first data
  • Cached covers
  • iOS viewport fixes
  • Dark, neon design

58 capabilities — one Laravel install, one SQLite file, your own server.

04 · How it competes

Generate it, publish it, own it.

AI audio tools generate episodes but leave publishing to someone else; podcast hosts publish episodes but leave creation to you. Pods does both on its own server. Marks for other products reflect their standard offerings in general terms.

vs. NotebookLM Audio Overviews
Starts from a topic and ends with a published episode on your own site — with RSS, SEO pages and a player — instead of an audio file in a notebook.
vs. Wondercraft
No per-seat or per-minute subscription: you pay only for the AI usage, and a dashboard shows that cost per episode.
vs. Podcastle
Built for publishing without recording at all — scripts and both voices are generated — with the listening app included.
vs. Buzzsprout & Podbean
The hosting, the player, the SEO pages and the storage are all yours — on your server, local disk or Cloudflare R2.
Feature-by-feature
PodsNotebookLMWondercraftPodcastleBuzzsprout
AI-generated episode from a prompt✓○✓○—
Two-host dialogue✓✓✓○—
Self-hosted, you own the data✓————
Public listening site and player✓—○○✓
RSS feed per show✓—○○✓
Episode pages with JSON-LD✓———○
AI-written SEO metadata✓—○○○
Chapters and bookmarks for listeners✓———○
Per-episode AI cost tracking✓————
Bring your own storage (disk or R2)✓————
No platform subscription✓○○○○
✓ included  ·  ○ partial / paid add-on  ·  — not available
05 · Outcome

Five Arabic tech shows, published without a microphone.

Pods replaces a studio, two presenters and an editing timeline with a form and a queue. A topic becomes a two-host episode with an SEO page, a share card and an RSS entry, and every token it consumed is on record. Listeners get an app that feels native on a phone — a frosted player, a mini-player that never gets in the way, and a memory of where they stopped. Built in-house by RAIN on Laravel 13 and Vue 3, with no per-episode hosting fees and full ownership of the audio, the pages and the data.

Version 1.0.0 shipped on 24 March 2026, and three more releases followed by 28 March, up to 1.3.0. That release history is mostly about reliability on real phones: fixes for audio that failed to play in iOS Safari, loading spinners that never ended, the iPhone viewport-height problem, and a storage link that broke on every deploy, replaced by an Apache alias. Pods has been live at pod.mrzakaria.com since late March 2026, behind Cloudflare with HSTS, and on 2 October 2026 it was serving five Arabic tech shows and thirteen public episodes. A broader multi-provider generation layer is in development and is not part of this case study, which covers only what is live. No listener, retention or cost-per-episode figures are published, so none are claimed here.

Pods — FAQ

Pods is a self-hosted AI podcast platform built in-house by RAIN Design Studio in Casablanca. It generates two-host episodes from a topic, publishes them with SEO pages and RSS, and plays them in an iOS-style web app. It is live at pod.mrzakaria.com with Arabic-language tech shows.

A queued Laravel job asks Google Gemini for a two-host dialogue script, voices it with Gemini's multi-speaker text-to-speech (or OpenAI tts-1 as an alternative), and converts it to MP3 with ffmpeg. Groq then fills the SEO fields and a share card is rendered for the episode.

Yes. A two-phase flow generates the script first and renders the audio as a second step, so the admin can check the text before any voice generation is paid for.

Every AI call's token usage is logged against the episode it served, and a price table for Gemini, OpenAI and Groq models turns that into an estimated cost on the admin dashboard.

Alongside the single-page app, every show and episode has a server-rendered page with PodcastSeries or PodcastEpisode JSON-LD, Open Graph and Twitter tags. Each show has an RSS feed, and the site publishes a dynamic sitemap and robots rules.

A standard Apache server with PHP, ffmpeg and a database queue worker. Data lives in a single SQLite file, and audio and covers can be stored on local disk or on Cloudflare R2, switchable from the admin.

Want a product like this?

Custom projects from $10,000, monthly plans from $7,500. Kickoff within 3–5 business days.