FOSSCast

Press publish.
The rest is
already built.

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.

Home Hosts

Two nerds, one microphone

The Nightly Build

Free software, argued about properly.

Apple Spotify RSS

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.

Now you drive

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.

One episode, and then it is everywhere

You add an episode. FOSSCast does the rest of it without being asked.

  1. Your page is written

    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.

  2. The feed goes out

    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.

  3. The apps come and get it

    Every podcast app pulls the feed on its own schedule. Your listeners get the episode without doing anything, wherever they already listen.

  4. You see what happened

    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.

Counted, never followed

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.

All of it, free, on your own machine

There is no self-hosted edition and a better one. This is the product.

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.

Getting paid

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.

Bring your back catalog

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.

Media anywhere

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.

Fits the server you already have

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.

One instance, one podcast

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.

And the small things, which are most of the work

  • Editing saves itself: podcast details, hosts, episodes, design
  • Deleting always takes a second, deliberate click
  • Drafts and dated episodes stay hidden until their moment
  • Seasons, trailers and bonus episodes, properly tagged
  • An embeddable player for any episode
  • Chapters typed as plain lines of text
  • Password reset by email, or from the command line
  • A read-only demo mode for showing the thing off
  • Every uploaded image gets a small web copy made for it
  • Pages are plain HTML and one stylesheet: no framework, no build step

Questions people actually ask

What does it cost to run?

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.

Can I leave?

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.

Do my listeners get tracked?

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.

Which browser should I use?

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.

Do I need to know Docker?

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.

Is video supported?

Yes. Episodes can be audio or video, hosted here or anywhere reachable by URL, and the page picks the right player.

Does it record or edit?

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.

How do I update it?

Two commands, and your data is in a named volume that is left alone: docker compose pull then docker compose up -d.

Two minutes, if you have a machine

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.

Read the source

docker-compose.yml
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.