Open Source & Self-Hosted

Your Podcast.
Your Members. Your Rules.

Podscope is a self-hosted podcast membership platform built on Laravel. Private RSS feeds, Stripe-powered subscriptions, Cloudflare Stream video, and full ownership of your content and subscriber data.

Get Started View Source
bash -- podscope setup
$git clone https://git.knowthenerds.com/gdadkisson/podscope
$cd podscope && composer install
$cp .env.example .env && php artisan key:generate
$php artisan migrate
 
✔ Podscope is ready. Open your browser and go.
Integrates With
💳
Stripe
☁️
Cloudflare Stream
🎙
Apple Podcasts
🎧
Spotify
🔥
Backblaze B2
📡
OP3 Stats
Everything You Need

Built for independent podcasters
who want to own their audience

No platform lock-in. No revenue share. No monthly SaaS bill. Just your podcast, your way.

Private RSS Feeds

Every paying member gets a unique feed URL that works with every podcast app. Cancel a subscription and the feed stops -- automatically, no manual action required.

Stripe Memberships

Create show-specific plans or an all-shows tier. Monthly recurring billing, automatic renewal, and a grace period on cancellation. All handled by Stripe.

Cloudflare Stream Video

Upload episode videos directly from the admin panel. Signed playback tokens keep videos locked to paid members -- no public URL, no workarounds.

Podcasting 2.0 Ready

Full namespace support: chapters, transcripts, persons, funding, soundbites, GUID, locked, medium, and more. Your feed works with every modern podcast app.

Flexible Storage

Store audio files and artwork on local disk or Backblaze B2 cloud storage. Switch between backends from settings -- no code changes, no file migrations.

Free Preview Windows

Let paid episodes breathe. Set a preview period so new episodes are publicly available for a configurable number of days before the paywall kicks in.

Stats and Tracking

OP3 prefix on public feeds for directory-level analytics. Internal play tracking on private feeds. A dedicated stats dashboard shows plays by episode, show, and type.

Filament Admin Panel

Manage shows, episodes, members, plans, pages, media, and settings from a clean, modern admin built on Filament 5. No clunky legacy CMS interface.

Simple By Design

Up and running in minutes

Podscope is a standard Laravel application. If you can run a PHP site, you can run Podscope.

1

Install

Clone the repo, run composer install, configure your .env file, and run migrations. Works on any server with PHP 8.4 and a queue worker.

2

Configure

Add your Stripe keys, connect Backblaze B2 or use local storage, set up Mailgun for notifications, and configure Cloudflare Stream if you want video.

3

Publish

Create your show, upload episodes, set up membership plans, and submit your RSS feed to Apple Podcasts and Spotify. Your members subscribe and get immediate access.

Tech Stack

Standard server requirements

Podscope runs on the same stack as any modern Laravel application. No exotic dependencies.

PHP 8.4+
PostgreSQL or MySQL
Redis
Supervisor (queue worker)
Nginx or Apache
Composer
SSL Certificate
Quick Start

From zero to live in minutes

A complete install from a fresh server. Full documentation covers CloudPanel, Nginx, and Supervisor configuration.

podscope -- installation
1 -- Clone the repository
git clone https://git.knowthenerds.com/gdadkisson/podscope
cd podscope
2 -- Install dependencies
composer install --no-dev --optimize-autoloader
3 -- Configure environment
cp .env.example .env
php artisan key:generate
# Edit .env -- set DB_*, STRIPE_*, MAIL_*, APP_URL
4 -- Database and storage
php artisan migrate
php artisan storage:link
5 -- Create admin account and launch
php artisan make:filament-user
php artisan queue:work # or configure Supervisor
✔ Visit /admin to get started
🎙

Built to be owned, not rented

Podscope is free to self-host. No monthly platform fee, no revenue share, no third-party holding your subscriber list hostage.

Browse the Source
What's New

Recent releases

Podscope is under active development. New features ship regularly.

v0.96

Imports can no longer record an episode whose upload failed, plus a missing-file

ImportEpisodeJob discarded the return value of writeStream() while both disks are configured throw=>false, so a failed upload returned false instead of raising and the job saved the episode anyway; file_size and duration were recorded from the temp file, so the DOWNLOAD had succeeded and only the up

v0.95

Fixed transcript links severed by editing the repeater, and pruned 25 orphaned o

mutateFormDataBeforeFill blanks file_path for transcripts not on the public disk (FileUpload can only render public-disk files) and the restore matched the record by ARRAY POSITION, guarded by an entry-count check. Adding or removing a row changed the count, the restore was skipped entirely, and the

v0.94

Episode deletion now actually removes its files. Root cause

the two delete paths were mirror images that each leaked exactly what the other cleaned. Episode::deleting removed transcripts + the CF Stream video but never audio_path/artwork_path; Show::deleting removed audio + artwork by hand, and because episodes.show_id is cascadeOnDelete the episode rows wen

v0.93

Estimated storage cost shipped (Administration > Storage, /admin/storage, admin-

:deleting never removes audio/artwork objects, so a DB sum under-reports exactly the files worth deleting. 6h cache, 5m negative cache on failure, 250k-object cap; breakdown by file type, by show, and unreferenced files, plus a Rescan action. Settings > Storage gained storage_cost_per_gb_month (defa

v0.92

Publish grace period shipped (owner request after accidentally publishing an epi

during the window the episode is invisible everywhere (single isPublished() gate -- site, both feeds, search, play endpoints), the edit form shows the go-live time, and a confirming "Publish Now" action skips the wait. Asymmetric publish-now detection (15 min past / 60 s future) so a form left open

v0.91

Admin responsiveness. Owner reported multi-second section-to-section admin navig

Filament SPA mode (navigation now Livewire-swaps instead of full page reloads -- the dominant cost was re-downloading/parsing panel assets per click); prod-side route:cache, view:cache, filament:optimize (component + Blade icon caches -- none existed); FPM pool ondemand->dynamic with warm spares and

v0.90

Per-show newsletter system shipped. Double opt-in email newsletters per show usi

Filament compose (RichEditor, images to B2), test-send-to-me, confirmed send with live recipient count, atomic no-double-send; public subscribe forms (Turnstile, fails closed -- verified live) on episode/show/archive pages when a show's newsletter_enabled toggle is on; verification emails with token

v0.89

Transcript search (phase 2) shipped + pre-existing data-loss bug fixed. Episode

extract-transcripts run on prod: 21/21 episodes indexed. Found and fixed a live data-loss bug during verification: EditEpisode nulled B2 transcript file_paths on form fill and never restored them on save, so any edit-save of a B2-transcript episode silently severed its transcript -- episodes 152 and