A self-hosted podcast management platform built with PHP and SQLite. Automatically scans your media folder for MP3 files, extracts metadata, and generates a standards-compliant RSS feed for submission to podcast directories like Apple Podcasts and Spotify.
- Public Podcast Page — Responsive episode listing with HTML5 audio players
- Admin Dashboard — Manage episodes, upload artwork, and configure podcast settings
- Automatic Media Scanning — Drop MP3 files into the
media/folder and they appear automatically - RSS Feed Generation — iTunes-compatible RSS 2.0 feed ready for directory submission
- Episode Management — Edit titles, descriptions, artwork, publish dates, and episode ordering
- ID3 Metadata Extraction — Automatically reads duration, author, track number, and season info from MP3 tags (requires getID3)
- Secure Authentication — Bcrypt password hashing, CSRF protection, prepared SQL statements
- PHP 8.0+
- SQLite3 PHP extension
- A web server (Apache, Nginx, Caddy, etc.)
- getID3 library (optional, but recommended for metadata extraction)
git clone https://github.com/your-username/podforge.git
cd podforgecp -r . /var/www/html/podforge/The web server needs write access to:
chmod 755 media/ artwork/
chmod 644 *.phpThe SQLite database (database.sqlite) is created automatically in the project root on first access.
Download the latest release from github.com/JamesHeinrich/getID3 and place the getid3/ folder in the project root:
podforge/
└── getid3/
├── getid3.php
└── getid3.lib.php
Navigate to /register.php in your browser. Registration is only available when no users exist.
Password requirements: 8+ characters with uppercase, lowercase, a number, and a special character.
Log in to the dashboard and set your Base URL (e.g., https://podcasts.example.com). This is required for feed generation and media links to work correctly.
- Add your MP3 file to the
media/folder on the server. - Open the admin dashboard — it automatically scans for new files on page load.
- The episode appears in the list with metadata extracted from its ID3 tags.
- Edit the title, description, and artwork as needed.
| Resource | URL |
|---|---|
| Public page | https://your-domain.com/ |
| RSS feed | https://your-domain.com/feed.php |
Submit the RSS feed URL to podcast directories:
podforge/
├── index.php # Public podcast page
├── dashboard.php # Admin dashboard (requires login)
├── api.php # AJAX endpoints used by the dashboard
├── feed.php # RSS 2.0 feed generator
├── login.php # Login page
├── register.php # First-user registration
├── logout.php # Session termination
├── upload.php # Artwork upload handler
├── scanner.php # Media folder scanner with ID3 extraction
├── db.php # Database connection and schema initialization
├── media/ # Store your MP3 files here
├── artwork/ # Podcast and episode artwork storage
└── getid3/ # getID3 library (add manually)
All settings are managed through the dashboard.
| Setting | Description |
|---|---|
| Title | Your podcast's name |
| Description | Short summary shown on the public page and in directories |
| Author | Creator or organization name |
| Base URL | Full URL to where PodForge is hosted (no trailing slash) |
| Language | ISO 639 language code (default: en-us) |
| Category | iTunes podcast category |
| Podcast Type | episodic (recommended for most shows) or serial |
| Explicit | Mark content as explicit or clean |
| Cover Art | Minimum 1400×1400px JPEG or PNG recommended |
- After creating your admin account, the
/register.phpendpoint becomes inaccessible. - All forms are protected with CSRF tokens.
- SQL queries use PDO prepared statements.
- Sessions are regenerated on login to prevent session fixation.
MIT