Your hosts, properly introduced
Every host gets a photo, a role and a write-up: a card on your Hosts page and a page of their own. Two of you or twenty, in the order you choose. They travel in the feed as well, so apps can put a face to a voice.
FOSSCast turns a podcast into a proper website: a page for every episode, a page for every host, and a feed every app accepts. On your own server, free, for ever.
Two nerds, one microphone
The Nightly Build
Free software, argued about properly.
42 · The one about init systems
18 Aug 2026 · 54 min
41 · Everything is a file, apparently
11 Aug 2026 · 61 min
Sam Smith
host
Ada Byron
co-host
Restyling itself, live. Not a screenshot.
That is the one control the Look tab has, and the page above is responding to it. Every other shade is worked out from the color you pick, in light and in dark, including a link color walked darker or lighter until it clears 4.5:1 against the page, so nothing you choose can end up unreadable.
Color
Eight here to try; in the dashboard it is any hex code you like, with a tagline and a footer line of your own beside it.
You add an episode. FOSSCast does the rest of it without being asked.
An episode page with your notes, your chapters and a player, and the podcast's front page updated, both plain HTML that a search engine can read.
Full iTunes namespace, Podcasting 2.0 transcripts, chapters, people and funding, real file sizes and durations. A feed check tells you what Apple and Spotify still want.
Every podcast app pulls the feed on its own schedule. Your listeners get the episode without doing anything, wherever they already listen.
Months as bars, days as a curve, a heatmap of when people listen, and how long an episode keeps earning. Counted on your server, from numbers that cannot be joined back to a person.
There is no analytics service in the loop, no third-party font, no script from anybody else, and no cookie for a listener. The charts are drawn on your own machine from counters that hold a total and nothing else.
A download means the audio reached a device. It does not mean anybody listened, because podcast apps fetch new episodes automatically for everyone subscribed. Apple and Spotify can tell you more than that, and it is worth knowing why: they wrote the app, so they can watch what happens inside it, and they can only see the listening that happens there. That is the whole reason they want your podcast heard in their app and nowhere else. Anybody who simply serves a file, this software included, sees a request and nothing after it.
So the number here says downloads, because downloads is what it counts.
There is no self-hosted edition and a better one. This is the product.
Every host gets a photo, a role and a write-up: a card on your Hosts page and a page of their own. Two of you or twenty, in the order you choose. They travel in the feed as well, so apps can put a face to a voice.
Patreon, Buy Me a Coffee, Ko-fi, Liberapay, GitHub Sponsors, Open Collective and PayPal. Paste your page, get a button on your site and a funding tag in the feed. No account yet? Each one has a sign-up link beside it.
Paste your current RSS feed and every episode comes across with its metadata and its identity, GUIDs and all, so directories treat the move as the same podcast rather than a new one.
Upload to the machine this runs on, or point at a file you host somewhere else. Both are first class, and the download is counted here either way. Range requests are handled properly, so players seek instantly.
The bundled Caddy is commented out in the compose file, so it cannot take ports 80 and 443 from a proxy you already run. nginx, Apache, a Cloudflare Tunnel, a tailnet-only instance behind Tailscale: point any of them at 127.0.0.1:3100.
A decision, not a shortcut. One podcast per instance keeps the whole thing small enough to read in an afternoon and to trust with your audience. Running three podcasts? Run three instances. They are tiny.
Nothing beyond the machine. FOSSCast is AGPL v3 and always will be. A small VPS handles a podcast comfortably; bandwidth is the only thing that scales with your audience.
Yes, and it is deliberately easy. Your episodes are files on your disk and your data is plain JSON beside them. Your feed is a standard RSS feed with a stable GUID, so moving elsewhere is a DNS change and a redirect.
No. There is no analytics service, no third-party font, no script from anyone else, and no cookie for a listener. Download counts come from your own server logs, by episode, not by person.
For listening and reading, any of them. For the admin side, a Chromium-based browser such as Chrome, Brave or Edge is the one to reach for: artwork is resized in the browser before it is uploaded, and those handle it best. Firefox and Safari work; they are simply the ones tested least.
You need to be able to paste a file and run one command. If that already sounds like a bad evening, the hosted option exists precisely for you.
Yes. Episodes can be audio or video, hosted here or anywhere reachable by URL, and the page picks the right player.
No, and that is deliberate. FOSSCast is the published podcast: the feed, the website and the numbers. Making the episode is a different job for a different tool, so your public site stays small, fast and hard to break.
Two commands, and your data is in a named volume that is left alone: docker compose pull then docker compose up -d.
Linux, Docker, a domain pointed at it, ports 80 and 443 open.
Paste this into docker-compose.yml and run
docker compose up -d. The certificate arrives on its
own.
There is no login in this file. Open the site in a browser and set your own email and password, with a passkey and a second factor offered in the same minute. Nothing to look up and no code to find: the first person to open an unclaimed FOSSCast claims it, and after that there is no second sign-up from anywhere.
Which means: do it as soon as it is running. Until it is
claimed, anybody who can reach the address could claim it instead.
On a home network that is a minute and nobody is looking. If the
port is open to the internet before you get there, keep it shut
until you have claimed it, or start FOSSCast with
REQUIRE_SETUP_CODE=1 and it will print a code in its
own log and ask for it first.
No checkout, no build step, no
.env, no Caddyfile. The bundled Caddy is commented
out: take the hashes off it for a certificate of your own, or leave
them and point nginx, Apache, a Cloudflare Tunnel or Tailscale at
the app instead.
If you would rather not run a server, the people who write FOSSCast will host it for you: Castmorphic runs this same software, and paying for it is what funds the work here. It is an alternative to self-hosting, not a better version of it.
services: app: image: buildmorphic.com/fosscast:latest restart: unless-stopped # Nothing here by default. REQUIRE_SETUP_CODE: "1" makes the first # run print a code and demand it, for an instance whose port is open # to the world before anybody has claimed it. # environment: # REQUIRE_SETUP_CODE: "1" # Your own proxy dials this. Behind the bundled Caddy below it is # simply unused, so it is right either way. ports: - "127.0.0.1:3100:3100" volumes: - fosscast_data:/data read_only: true tmpfs: - /tmp cap_drop: [ALL] security_opt: - no-new-privileges:true pids_limit: 256 healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3100/healthz"] interval: 30s timeout: 5s retries: 3 logging: &log driver: json-file options: max-size: "10m" max-file: "3" # HTTPS, and the certificate, done for you. Already running nginx, # Apache, a tunnel or any other proxy on this machine? Leave this # commented out and point yours at 127.0.0.1:3100. Otherwise take the # "# " off every line from here to the bottom of the file and put your # domain in the one place it is named. # # That name is Caddy's, not FOSSCast's: a certificate has to be asked # for before anything is running, so the proxy cannot read it out of # FOSSCast's settings. It is the only thing in this file anybody edits.# caddy:# image: caddy:2-alpine# restart: unless-stopped# command: caddy reverse-proxy --from podcast.example.com --to app:3100# ports:# - "80:80"# - "443:443"# volumes:# - caddy_data:/data# - caddy_config:/config# cap_drop: [ALL]# cap_add: [NET_BIND_SERVICE]# security_opt:# - no-new-privileges:true# pids_limit: 256# logging: *logvolumes: fosscast_data:# caddy_data:# caddy_config:
The one line you change, and only if you use the bundled proxy: a certificate has to be asked for in a name before FOSSCast is running. The grayed block at the foot is that HTTPS - take the hashes off it if nothing else is fronting this machine.