A modern, fast, gpodder.net-compatible podcast sync server written in Rust.
Sync your podcast subscriptions and episode progress across AntennaPod, gPodder, Kasts, and any client that supports the gpodder.net API.
*.up.sql from migrations directory, no hardcoded filenames# Build
cargo build --release
# Initialize database and create an admin user
./target/release/rpodder migrate
./target/release/rpodder user create myuser mypassword --admin
# Start the server
./target/release/rpodder serve
The server starts on http://localhost:3005. Point your podcast app at this URL.
docker compose --profile sqlite up -d
# Create a user
docker compose exec rpodder-sqlite rpodder user create myuser mypassword --admin
docker compose --profile release up -d
All settings can be set via environment variables or a TOML config file:
| Env var | Default | Description |
|---|---|---|
RPODDER_DATABASE_URL |
sqlite://rpodder.db |
Database connection URL |
RPODDER_HOST |
127.0.0.1 |
Bind address |
RPODDER_PORT |
3005 |
Bind port |
RPODDER_RUN_MIGRATIONS |
false |
Run migrations on startup |
RPODDER_REGISTRATION |
open |
open / closed / invite |
RPODDER_SMTP_HOST |
SMTP server for email features | |
RPODDER_OAUTH_ISSUER_URL |
OIDC issuer URL for SSO | |
RPODDER_OAUTH_CLIENT_ID |
OAuth2 client ID | |
RPODDER_OAUTH_CLIENT_SECRET |
OAuth2 client secret | |
RPODDER_OAUTH_ADMIN_GROUP |
OIDC group name for admin role | |
RPODDER_BASE_URL |
Public URL for OAuth callbacks and emails | |
RPODDER_PODCASTINDEX_KEY |
Podcast Index API key (free) | |
RPODDER_PODCASTINDEX_SECRET |
Podcast Index API secret |
Or use a config file: rpodder -c config.toml serve
See config/rpodder.example.toml for an example.
rpodder serve # Start the server
rpodder migrate # Run database migrations
rpodder user create <username> <password> # Create a user
rpodder user create <username> <password> --admin # Create an admin user
rpodder user delete <username> # Deactivate a user
rpodder repair # Rebuild FTS5 index (SQLite)
Settings → Synchronization → Choose provider → gpodder.net
Server: http://your-server:3005 • Username/Password as created above
Settings → Synchronization → Custom server
http://your-server:3005
Preferences → gpodder.net → Server URL: http://your-server:3005
| Endpoint | Description |
|---|---|
POST /api/2/auth/{user}/login.json |
Login (HTTP Basic Auth) |
GET/PUT /subscriptions/{user}/{device}.{json,opml,txt} |
Subscription sync |
GET/POST /api/2/subscriptions/{user}/{device}.json |
Delta subscription sync |
GET/POST /api/2/episodes/{user}.json |
Episode action sync |
GET/POST /api/2/devices/{user}/{device}.json |
Device management |
GET /api/2/me |
Current user info |
POST /api/2/me/password |
Change password |
GET /api/2/me/upgrades |
HTTPS upgrade suggestions |
POST /api/2/register |
Public registration |
POST /api/2/password-reset |
Request password reset |
GET /search.json?q=... |
Podcast search |
GET /toplist/{count}.json |
Top podcasts |
GET /api/admin/users |
Admin: list users |
GET /api/admin/stats |
Admin: server statistics |
GET /health |
Health check |
See docs/API_REFERENCE.md for the complete API surface.
sudo cp target/release/rpodder /usr/local/bin/
sudo cp config/rpodder.service /etc/systemd/system/
sudo useradd -r -s /bin/false rpodder
sudo mkdir -p /var/lib/rpodder /usr/share/rpodder
sudo cp -r migrations /usr/share/rpodder/
sudo chown rpodder:rpodder /var/lib/rpodder
sudo systemctl enable --now rpodder
AGPL-3.0-or-later