Getting Started
PinePods is a Rust based podcast management system that manages podcasts with multi-user support and relies on a central database with clients to connect to it. It's browser based and your podcasts and settings follow you from device to device due to everything being stored on the server. You can subscribe to podcasts and even hosts for podcasts with the help of the PodPeopleDB. It works on mobile devices and can also sync with a Nextcloud server or gpodder compatible sync server so you can use external apps like Antennapod as well!
Features
Pinepods is a complete podcast management system and allows you to play, download, and keep track of podcasts you (or any of your users) enjoy. It allows for searching and subscribing to hosts and podcasts using The Podcast Index or Itunes and provides a modern looking UI to browse through shows and episodes. In addition, Pinepods provides simple user management and can be used by multiple users at once using a browser or app version. Everything is saved into a MySQL or Postgres database including user settings, podcasts and episodes. It's fully self-hosted, open-sourced, and I provide an option to use a hosted search API or you can also get one from the Podcast Index and use your own. There's even many different themes to choose from! Everything is fully dockerized and I provide a simple guide found below explaining how to install and run Pinepods on your own system.
Try it out! ⚡
I maintain an instance of Pinepods that's publicly accessible for testing over at try.pinepods.online. Feel free to make an account there and try it out before making your own server instance. This is not intended as a permanant method of using Pinepods and it's expected you run your own server so accounts will often be deleted from there.
Installing :runner:
There's potentially a few steps to getting Pinepods fully installed. After you get your server up and running fully you can also install the client editions of your choice. The server install of Pinepods runs a server and a browser client over a port of your choice in order to be accessible on the web. With the client installs you simply give the client your server url to connect to the database and then sign in.
Server Installation 💾
First, the server. You have multiple options for deploying Pinepods:
You can also choose to use MySQL/MariaDB or Postgres as your database. Examples for both are provided below.
Docker Compose
User Permissions
Pinepods can run with specific user permissions to ensure downloaded files are accessible on the host system. This is controlled through two environment variables:
PUID
: Process User ID (defaults to 1000 if not set)PGID
: Process Group ID (defaults to 1000 if not set)
To find your user's UID and GID, run:
id -u # Your UID
id -g # Your GID
Compose File - PostgreSQL (Recommended)
services:
db:
container_name: db
image: postgres:latest
environment:
POSTGRES_DB: pinepods_database
POSTGRES_USER: postgres
POSTGRES_PASSWORD: myS3curepass
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- /home/user/pinepods/pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: always
valkey:
image: valkey/valkey:8-alpine
ports:
- "6379:6379"
pinepods:
image: madeofpendletonwool/pinepods:latest
ports:
- "8040:8040"
environment:
# Basic Server Info
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
PEOPLE_API_URL: 'https://people.pinepods.online'
HOSTNAME: 'http://localhost:8040'
# Default Admin User Information
USERNAME: myadminuser01
PASSWORD: myS3curepass
FULLNAME: Pinepods Admin
EMAIL: user@pinepods.online
# Database Vars
DB_TYPE: postgresql
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: myS3curepass
DB_NAME: pinepods_database
# Valkey Settings
VALKEY_HOST: valkey
VALKEY_PORT: 6379
# Enable or Disable Debug Mode for additional Printing
DEBUG_MODE: false
PUID: ${UID:-911}
PGID: ${GID:-911}
# Add timezone configuration
TZ: "America/New_York"
volumes:
# Mount the download and backup locations on the server
- /home/user/pinepods/downloads:/opt/pinepods/downloads
- /home/user/pinepods/backups:/opt/pinepods/backups
# Timezone volumes, HIGHLY optional. Read the timezone notes below
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
depends_on:
- db
- valkey
Compose File - MariaDB (Alternative)
services:
db:
container_name: db
image: mariadb:latest
command: --wait_timeout=1800
environment:
MYSQL_TCP_PORT: 3306
MYSQL_ROOT_PASSWORD: myS3curepass
MYSQL_DATABASE: pinepods_database
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_INIT_CONNECT: 'SET @@GLOBAL.max_allowed_packet=64*1024*1024;'
volumes:
- /home/user/pinepods/sql:/var/lib/mysql
ports:
- "3306:3306"
restart: always
valkey:
image: valkey/valkey:8-alpine
ports:
- "6379:6379"
pinepods:
image: madeofpendletonwool/pinepods:latest
ports:
- "8040:8040"
environment:
# Basic Server Info
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
PEOPLE_API_URL: 'https://people.pinepods.online'
HOSTNAME: 'http://localhost:8040'
# Default Admin User Information
USERNAME: myadminuser01
PASSWORD: myS3curepass
FULLNAME: Pinepods Admin
EMAIL: user@pinepods.online
# Database Vars
DB_TYPE: mariadb
DB_HOST: db
DB_PORT: 3306
DB_USER: root
DB_PASSWORD: myS3curepass
DB_NAME: pinepods_database
# Valkey Settings
VALKEY_HOST: valkey
VALKEY_PORT: 6379
# Enable or Disable Debug Mode for additional Printing
DEBUG_MODE: false
PUID: ${UID:-911}
PGID: ${GID:-911}
# Add timezone configuration
TZ: "America/New_York"
volumes:
# Mount the download and backup locations on the server
- /home/user/pinepods/downloads:/opt/pinepods/downloads
- /home/user/pinepods/backups:/opt/pinepods/backups
# Timezone volumes, HIGHLY optional. Read the timezone notes below
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
depends_on:
- db
- valkey
Make sure you change these variables to variables specific to yourself at a minimum.
# The url you hit the site at. Only used for sharing rss feeds
HOSTNAME: 'http://localhost:8040'
# These next 4 are optional. They allow you to set an admin without setting on the first boot
USERNAME: pinepods
PASSWORD: password
FULLNAME: John Pinepods
EMAIL: john@pinepods.com
# DB vars should match your values for the db you set up above
DB_TYPE: postgresql
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: myS3curepass
DB_NAME: pinepods_database
Most of those are pretty obvious, but let's break a couple of them down.
Admin User Info
First of all, the USERNAME, PASSWORD, FULLNAME, and EMAIL vars are your details for your default admin account. This account will have admin credentails and will be able to log in right when you start up the app. Once started you'll be able to create more users and even more admins but you need an account to kick things off on. If you don't specify credentials in the compose file it will create an account with a random password for you but I would recommend just creating one for yourself.
Note on the Search API
Let's talk quickly about the searching API. This allows you to search for new podcasts and it queries either itunes or the podcast index for new podcasts. The podcast index requires an api key while itunes does not. If you'd rather not mess with the api at all simply set the API_URL to the one below.
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
Above is an api that I maintain. I do not guarantee 100% uptime on this api though, it should be up most of the time besides a random internet or power outage here or there. A better idea though, and what I would honestly recommend is to maintain your own api. It's super easy. Check out the API docs for more information on doing this. Link Below -
https://www.pinepods.online/docs/API/search_api
Timezone Configuration
PinePods supports displaying timestamps in your local timezone instead of UTC. This helps improve readability and prevents confusion when viewing timestamps such as "last sync" times in the gpodder API. Note that this configuration is specifically for logs. Each user sets their own timezone settings on first login. That is seperate from this server timezone config.
Setting the Timezone
You have two main options for configuring the timezone in PinePods:
Option 1: Using the TZ Environment Variable (Recommended)
Add the TZ
environment variable to your docker-compose.yml file:
services:
pinepods:
image: madeofpendletonwool/pinepods:latest
environment:
# Other environment variables...
TZ: "America/Chicago" # Set your preferred timezone
This method works consistently across all operating systems (Linux, macOS, Windows) and is the recommended approach.
Option 2: Mounting Host Timezone Files (Linux Only)
On Linux systems, you can mount the host's timezone files:
services:
pinepods:
image: madeofpendletonwool/pinepods:latest
volumes:
# Other volumes...
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
Note: This method only works reliably on Linux hosts. For macOS and Windows users, please use the TZ environment variable (Option 1).
Priority
If both methods are used:
- The TZ environment variable takes precedence
- Mounted timezone files are used as a fallback
Common Timezone Values
Here are some common timezone identifiers:
America/New_York
- Eastern TimeAmerica/Chicago
- Central TimeAmerica/Denver
- Mountain TimeAmerica/Los_Angeles
- Pacific TimeEurope/London
- United KingdomEurope/Berlin
- Central EuropeAsia/Tokyo
- JapanAustralia/Sydney
- Australia Eastern
For a complete list of valid timezone identifiers, see the IANA Time Zone Database.
Troubleshooting Timezones
I'm on macOS and timezone settings aren't working
macOS uses a different timezone file format than Linux. You must use the TZ environment variable method on macOS.