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.


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.
JSON API endpoints
App screens, listener and admin
Arabic tech shows live
Public episodes published
Six systems that turn a topic into a published episode — and six that make it a pleasure to listen to.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
- Topic to episode
- Two-host dialogue
- Model picker
- Multi-speaker TTS
- OpenAI voice path
- Script-first mode
- MP3 output
- Segment stitching
- WAV conversion command
- Live progress
- AI chapter generation
- Manual chapter editor
- Chapter list in player
- Blurred-cover backdrop
- Canvas scrubber
- ±15 s skip
- Playback speed
- Lock-screen controls
- Persistent mini-player
- Resume per device
- Continue listening
- Bookmarks
- History
- Show likes
- Show grid
- Latest episodes
- Search overlay
- Play and view counts
- AI SEO fields
- Server-rendered episode pages
- PodcastSeries / PodcastEpisode JSON-LD
- Share cards
- RSS per show
- Sitemap & robots
- Shows & episodes CRUD
- Soft delete & restore
- Episode colour themes
- Site settings
- Arabic / English setting
- Google sign-in
- Admin and guest roles
- Guest invites
- Approve & suspend
- Anonymous listening
- Analytics overview
- Analytics aggregation
- Token usage per episode
- Cost dashboard
- Database queue
- Queue monitor
- Audit log
- Local or R2 storage
- Storage connection test
- Installable PWA
- Network-first data
- Cached covers
- iOS viewport fixes
- Dark, neon design
58 capabilities — one Laravel install, one SQLite file, your own server.
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.
| Pods | NotebookLM | Wondercraft | Podcastle | Buzzsprout | |
|---|---|---|---|---|---|
| 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 | ✓ | ○ | ○ | ○ | ○ |
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.