Podscope podcast CMS
https://podscope.cc
- PHP 67.9%
- Blade 31.1%
- CSS 0.5%
- Shell 0.4%
- JavaScript 0.1%
Replaces the membership form's "Show (leave blank for all-shows plan)" field -- an error-prone "clear the field to trigger a special mode" -- with an explicit "All Shows (site-wide)" option at the top of the Applies-to dropdown. - "All Shows" is a membership *scope*, not a real show: it maps to the existing show_id = NULL representation via MembershipPlan::ALL_SHOWS sentinel + scopeToShowId()/showIdToScope() round-trip helpers, wired through the field's formatStateUsing/dehydrateStateUsing. No schema change; checkout/RSS/access logic (which key off subscriptionName()) are untouched. No pseudo-show record is ever created, so it never appears in show listings/nav/RSS. Tests: MembershipPlanScopeTest (helper round-trip both directions; Filament form-load asserts a NULL-show plan loads as All Shows and a show plan as its show). Full security suite green (71 tests). Verified on prod: helpers round-trip the real plans, form options build with All Shows first, create route loads. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YQvVNJ6gXHeg5ygBQ4BwQn |
||
|---|---|---|
| .claude/commands | ||
| app | ||
| bootstrap | ||
| config | ||
| database | ||
| public | ||
| resources | ||
| routes | ||
| storage | ||
| tests | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .npmrc | ||
| artisan | ||
| composer.json | ||
| composer.lock | ||
| install.sh | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| phpunit.xml | ||
| README.md | ||
| vite.config.js | ||
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
- Filament admin panel
- Backblaze B2 storage support
- Redis queue support
- Alpine.js frontend
Requirements
- PHP 8.4+
- 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
bash <(curl -fsSL https://git.podscope.cc/podscope/podscope/raw/branch/main/install.sh)
Manual Install
git clone https://git.podscope.cc/podscope/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 storage:link
npm install && npm run build
php artisan config:cache
php artisan route:cache
php artisan view:cache
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
MIT