HarborFM

HarborFM

A free, open-source platform built as a modern alternative to Anchor.fm. Produce shows, publish episodes, assemble each from flexible segments-record or upload audio, record remote guests via WebRTC, insert intros and bumpers, edit with ease, export audio and RSS.

curl -fsSL https://raw.githubusercontent.com/LoganRickert/harborfm/main/install.sh | bash

When prompted, choose Caddy. Best for automatic HTTPS and dynamic or multiple hostnames - Caddy obtains and renews TLS certificates with no certbot. Ideal if you want custom subdomains per show or user. Works with or without WebRTC.

curl -fsSL https://raw.githubusercontent.com/LoganRickert/harborfm/main/install.sh | bash

When prompted, choose nginx and enter your domain and Let's Encrypt email. Best for a single domain: nginx, certbot for SSL, optional Fail2Ban. After install, run certbot once to get the cert; use a cron job to renew.

HARBORFM_SECRETS_KEY=$(openssl rand -base64 32)
JWT_SECRET=$(openssl rand -base64 32)

docker run --name harborfm -p 3001:3001 \
  -v harborfm-data:/data \
  -e HARBORFM_SECRETS_KEY="$HARBORFM_SECRETS_KEY" \
  -e JWT_SECRET="$JWT_SECRET" \
  ghcr.io/loganrickert/harborfm:latest

Runs HarborFM as a single container. Use Caddy or nginx on the host for HTTPS. Open http://localhost:3001 and complete the one-time setup from the container logs.

git clone https://github.com/LoganRickert/harborfm.git
cd harborfm
cd infrastructure/terraform/aws
cp terraform.tfvars.example terraform.tfvars
# Edit terraform.tfvars: ami_id, domain, admin_email, admin_password, etc.
./run.sh init
./run.sh apply

Deploys HarborFM on AWS EC2: one instance, security group, optional persistent data volume and Cloudflare DNS. Requires Terraform and AWS credentials. See QUICKSTART and infrastructure/terraform README for options (Debian 12 default, WebRTC, root + data EBS).

git clone https://github.com/LoganRickert/harborfm.git
cd harborfm
pnpm install
pnpm run db:migrate
pnpm run dev

Requires Node.js 22+, pnpm, ffmpeg, and audiowaveform. Open the URL shown in the terminal; use the one-time setup link from the server logs to create the admin account.

Docker Compose Install and First Podcast

Check out more tutorials on our YouTube

About

HarborFM is a free, open-source platform built as a modern alternative to Anchor.fm. Produce shows, publish episodes, and assemble each from segments-record or upload audio, record remote guests via WebRTC, insert intros and bumpers from your library, add chapters (Podcast 2.0), and export audio plus RSS. PWA support; install on your home screen.

Demo

Try HarborFM with the live demo. The login page shows the demo username and password, and the account includes several pre-made podcasts and episodes to explore.

Open the demo site

Screenshots

Dashboard, episode editor, public feed, and Podcast 2.0 tools. Click any image to open in a lightbox; click again to close.

Dashboard - your shows
Episodes - build from segments
Record a segment
Podcast delivery - S3, FTP, etc.
Library - intros, bumpers
Transcripts & LLM help
Support The Show
Episode Podcast 2.0 details
Feed transcript popup
Feed chapter markers

Features

Podcasts & episodes Create shows with metadata, artwork, categories. Add episodes with title, description, season/episode numbers. Episodes grouped as Draft, Scheduled, Published. Delete episode or podcast with confirm.
Segments Build each episode from segments: recorded clips or library assets. Non-destructive trim ranges and markers (None/Chapter/Soundbite); Add Silence Trims; Server Remove Silence and noise suppression. Trim, split, remove silence; ffmpeg concatenates to final audio.
Episode chapters Add, edit, delete chapters with color picker. Play from chapter time. Podcast 2.0: chapters.json and podcast:chapters in RSS; included in exports. Chapter markers on waveforms.
Soundbites Mark 15–120s clips on the final waveform or as segment markers. Edit start, duration, name, and color; play and download clips on the public feed. Podcast 2.0 podcast:soundbite in RSS.
Group calls Record remote guests via WebRTC. Host starts a call, guests join by link or 4-digit code; in-call chat, soundboard with waveform preview, settings panel. Recordings become segments.
Real-time collaboration Episode editor WebSocket; collaborators see live segment, call, and render updates. Transcript generation synced.
Library Upload reusable audio (intros, outros, bumpers). Tag and insert into any episode.
Transcripts Generate via Whisper ASR or upload SRT. Transcript editor with trim integration; trimmed text excluded from LLM. Optional LLM (Ollama or OpenAI) for summaries and copy suggestions.
RSS & export RSS feed per podcast with Podcast 2.0 chapters, soundbites, trailers, funding, podroll, and more. Deploy to S3, R2, FTP, SFTP, WebDAV, IPFS, SMB. Only changed files uploaded.
Page customizations Per-show public feed theme: pick a primary accent color, and toggle author, descriptions, Support The Show, recommended podcasts, cast, and reviews on podcast vs episode pages.
Reviews Listener reviews on public podcast and episode feeds. Optional approval, subscriber-only writing, spam checks, and admin moderation.
Recommended podcasts Podroll recommendations on the public feed. Paste an RSS URL to autofill feed GUID, title, cover, and home URL; emit Podcast 2.0 podcast:podroll in the show RSS.
Support The Show Multiple funding links (Podcast 2.0). Shown as a Support The Show panel on public podcast and episode pages when enabled.
Cast Add hosts and guests to podcasts and episodes. Assign per episode; cast shown on public feed.
Listen on & share Per-podcast links for Apple Podcasts, Spotify, Amazon Music, etc.; social links (X, Instagram, YouTube). Share button with embed options.
Auth & users First-user setup, registration, login, password reset. Optional 2FA (TOTP or email). Admin and user management. Public feed pages when enabled.
API keys Create API keys for programmatic access. Optional name and expiry. Keys hashed; raw key shown once on create.
Subscription tokens Per-podcast tokenized RSS for private or subscriber-only feeds. Subscriber-only episodes excluded from public RSS. Optional validity and limits.
Automatic DNS Optional Cloudflare integration: managed domains and subdomains so listeners use custom URLs. Link domain, managed domain, subdomain.
Collaborators Share shows with view, editor, or manager roles. Invite by email; optional platform invites for new users.
Contact page Built-in contact form; messages stored and optionally emailed to admins. Configurable from settings.
Analytics & GeoIP Podcast stats: RSS hits, episode requests, listens by location. Optional GeoLite2 for country/city.
Email & captcha Email verification, password reset. Optional captcha (reCAPTCHA or hCaptcha) for registration and reset.
Read-only accounts Per-user limits for podcasts, episodes, storage. Read-only accounts. Per-user transcription toggle.
Terraform Deploy via Terraform: AWS EC2 or Vultr. PM2, Caddy, or nginx; Let's Encrypt; optional WebRTC. Cloudflare DNS integration.

Tech stack

Monorepo (pnpm workspaces): shared (Zod schemas, types), server (Fastify API, SQLite with better-sqlite3, ffmpeg for audio), web (React, Vite, TanStack Query), webrtc-service (mediasoup for group calls, optional). Single Node process serves the API and static web app; no separate database server.

Project structure

harborfm/
├── server/         # API and app entry
├── web/            # React frontend
├── webrtc-service/ # WebRTC/mediasoup for group calls
├── shared/         # Shared schemas and types
├── Dockerfile      # Multi-stage build, Node + ffmpeg
└── pnpm-workspace.yaml

Requirements

For local dev: Node.js 22+, pnpm, ffmpeg, audiowaveform (e.g. brew install audiowaveform on macOS; on Linux, build from bbc/audiowaveform or use a package if available). The Docker image includes ffmpeg.

Open API docs (Swagger) GitHub