Podscope podcast CMS https://podscope.cc
  • PHP 85.6%
  • Blade 12.9%
  • JavaScript 0.6%
  • CSS 0.5%
  • Shell 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
gdadkisson fedd9d7ed1 Make the public repo installable and stop publishing production details
From the public-repo audit (2026-10-01):
- deploy/ci.sh defaulted to the production server's root SSH target. The
  host now comes from CI_HOST or an untracked deploy/.ci-host.
- .claude/commands/release.md (production host, paths, the release
  runbook) is no longer tracked; the owner's local copy is unchanged.
- Install was impossible as documented: the clone URLs pointed at
  git.podscope.cc (no DNS record), nothing seeded the roles (so
  registration failed on the missing subscriber role), and there was no
  way to create a first admin. README and install.sh now give the real
  URL, RolesAndSettingsSeeder, and make:filament-user plus super_admin.
- Both told users to run config:cache, which Podscope forbids (settings
  are applied at runtime from the database). Removed, with a warning.
- npm install -> npm ci --ignore-scripts; no more bash <(curl ...).
- .env.example: the "Backblaze B2" block listed AWS_* keys but the b2 disk
  reads B2_*; added those and the Cloudflare Stream keys, and removed the
  duplicate FILESYSTEM_DISK. README PHP requirement matches composer.json.
- composer.json name/description were Laravel's skeleton values; renamed
  to inceptum/podscope with the lock content-hash recomputed to match.

Suite via ci.sh: 526 tests, 1 failure, the known baseline ExampleTest,
identical on the unmodified tree.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01GMpf6aGgpup94FciFDcMKk
2026-10-01 16:38:16 -04:00
app v1.08 -- MP3s with embedded cover art upload again 2026-09-26 11:37:57 -04:00
bootstrap v0.90 -- per-show newsletters (double opt-in, Mailgun, public archive) 2026-07-31 11:58:52 -04:00
config v1.09 -- feed buttons copy the feed address instead of opening it 2026-09-29 07:49:56 -04:00
database v1.03 -- mail can go out through the Mailgun API instead of SMTP 2026-09-21 08:47:48 -04:00
deploy Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
public v1.07 -- security: upgrade Filament, Livewire, Guzzle and commonmark past open advisories 2026-09-25 21:45:00 -04:00
resources v1.09 -- feed buttons copy the feed address instead of opening it 2026-09-29 07:49:56 -04:00
routes v1.01 -- transcripts keep their disk on a second save, and the old upload endpoint is gone 2026-09-20 17:27:53 -04:00
storage Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
tests v1.09 -- feed buttons copy the feed address instead of opening it 2026-09-29 07:49:56 -04:00
.editorconfig Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
.env.example Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
.gitattributes Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
.gitignore Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
.npmrc Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
artisan Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
composer.json Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
composer.lock Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
install.sh Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
LICENSE Add AGPL-3.0 license 2026-06-09 19:12:09 +00:00
package-lock.json Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
package.json Initial public release -- v0.1 2026-05-21 18:53:00 +00:00
phpunit.xml v0.97 -- membership price changes: timed grandfathering 2026-09-11 13:10:37 -04:00
README.md Make the public repo installable and stop publishing production details 2026-10-01 16:38:16 -04:00
vite.config.js v1.00 -- Themes: one for the site, and one per show if you want it 2026-09-20 16:36:36 -04:00

Podscope

A self-hosted podcast CMS and membership platform. Publish shows, manage episodes, accept paid memberships via Stripe, and distribute private RSS feeds to subscribers.

Features

  • Multi-show support
  • Episode management with Podcasting 2.0 metadata (persons, transcripts, chapters, soundbites)
  • Paid membership plans per show or site-wide (via Stripe / Laravel Cashier)
  • Private RSS feeds for subscribers
  • Free preview window for paid episodes
  • Episode play tracking and stats
  • Individual episode purchases
  • Public RSS feeds with OP3 tracking support
  • Themes for the public site, and a per-show theme that follows a show onto its episodes and its newsletter (presets, brand/accent colours, self-hosted fonts, logo, social image)
  • /live page embedding an Owncast stream, with an automatic on-air banner
  • Filament admin panel
  • Backblaze B2 storage support
  • Redis queue support
  • Alpine.js frontend

Requirements

  • PHP 8.3+ (8.4 recommended)
  • PostgreSQL 14+
  • Redis
  • Node.js 20+ (for asset compilation)
  • Composer
  • A Stripe account (for memberships and purchases)
  • A Backblaze B2 bucket (optional, for media storage)

Quick Install

git clone https://git.knowthenerds.com/Inceptum/podscope.git podscope-installer
bash podscope-installer/install.sh

The installer clones a fresh copy into ./podscope, installs PHP dependencies and creates .env, then prints the remaining steps (the same as Manual Install below). Read it before running it.

Manual Install

git clone https://git.knowthenerds.com/Inceptum/podscope.git
cd podscope
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
# Edit .env with your database, Stripe, and storage credentials
php artisan migrate --force
php artisan db:seed --class=RolesAndSettingsSeeder --force   # roles + default settings
php artisan storage:link
npm ci --ignore-scripts && npm run build
php artisan route:cache
php artisan view:cache

Never run php artisan config:cache: Podscope applies its settings from the database at runtime, and a cached config silently ignores them.

Create the first admin, then give it the super_admin role (the admin panel only admits staff roles, and registration gives new accounts the subscriber role):

php artisan make:filament-user
php artisan tinker --execute="App\Models\User::where('email', '[email protected]')->firstOrFail()->assignRole('super_admin');"

Then configure your web server to point at the public/ directory and set up a queue worker:

php artisan queue:work --sleep=3 --tries=3

Configuration

All site settings (name, artwork, RSS options) are managed in the Filament admin panel under Settings.

Key .env values:

Variable Description
APP_URL Your site URL (e.g. https://example.com)
DB_CONNECTION Set to pgsql
DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD PostgreSQL credentials
STRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET Stripe API keys
FILESYSTEM_DISK public for local storage or b2 for Backblaze
AWS_* / B2_* Backblaze B2 credentials if using cloud storage
REDIS_HOST Redis connection
MAIL_* Mail settings for transactional email

License

Podscope is free software under the GNU Affero General Public License v3.0 or later (see LICENSE). If you run a modified copy as a public website, the AGPL asks you to offer your changes to its users.