littleFedi | A small ActivityPub server written in Go
Skip to content
A lightweight ActivityPub server
One binary.<br>A whole fediverse server.
littleFedi is a small ActivityPub server written in Go. It ships as a single<br>static executable with a server-rendered web interface, a Mastodon-compatible<br>client API, a durable federation queue, moderation tools, and optional<br>PostgreSQL and S3 support. No runtime to install, no services to wire together.
Read the documentation<br>See what it does
Beta software. The source is not published yet.
Why this exists
I have spent a long time running servers for other people, and a good part of<br>the last few years running fediverse infrastructure for a community. What I<br>kept wanting was something I could put on a small machine, in a corner, and<br>then stop thinking about. No runtime to keep current, no database server to<br>babysit, no container stack, no build pipeline that breaks the week I am<br>travelling.
littleFedi is that. One static binary with an embedded database, an interface<br>that works with JavaScript switched off, and operations you can actually<br>follow: a health endpoint, a readiness endpoint, a queue you can look at, and<br>backups that restore. Small is where it starts, not where it stops: the same<br>binary takes PostgreSQL, object storage and several processes when you need<br>them. What it is really trying to be is the server you stop thinking about.
It is also written for the machines I actually use. FreeBSD, illumos, Linux,<br>NetBSD and OpenBSD each get their own operations guide and their own service<br>definitions, and none of them is treated as the default with the others<br>bolted on afterwards.
None of this is here to replace anything. It takes what the fediverse platforms<br>do well, fills a few gaps, and adds one more independent implementation, because<br>a monoculture is a bad outcome even when the single crop is a good one. More<br>plurality, more portability, less waste.
"Little" is meant affectionately, not as a measurement. littleFedi does not make<br>you choose in advance between a personal server and a large community: it can<br>grow with you. And it is not only trying to consume fewer resources. It is trying<br>to ask for fewer sacrifices: less given up in control, in understanding, in<br>portability, and in the freedom to pick the computer your own space lives on.
What you get
One static binary
Built with CGO disabled. No interpreter, no shared libraries, no external<br>database unless you want one. Copy it to the machine and run it.
Real federation
ActivityPub, WebFinger, shared inboxes, relays, RSA HTTP signing, RSA and<br>Ed25519 verification, and FEP-8b32 Object Integrity Proofs.
Chronological timelines
Home, local, federated, list, tag, direct and bubble, all in time order.<br>The one ranked view lives on a separate page you have to open on purpose.
Works without JavaScript
Pages are rendered on the server. Posting, reading, settings and<br>moderation all work with scripting off, and the composer keeps its plain<br>textarea fallback.
Mastodon-compatible API
OAuth, the REST API, WebSocket and SSE streaming, and Web Push. Clients<br>that already speak Mastodon connect to it.
Static blogs
Turn selected public posts into a plain static site with permalinks, an<br>Atom feed, hashtag indexes and four themes, without leaving the fediverse.
littleMesh
Federate from behind home NAT or CGNAT with no public address, no DNS<br>name and no inbound port. The transport changes, ActivityPub does not.
Ten themes and your own CSS
Four skins that dress the interface as a macOS, Plasma, GNOME or Xfce<br>application, four light and dark modes, and a per-account stylesheet.
SQLite or PostgreSQL
SQLite is embedded and needs nothing. PostgreSQL and S3 are build tags,<br>so the default binary never carries their dependencies.
Operations you can see
Health and readiness endpoints, Prometheus metrics, a durable queue with<br>retries, built-in backups, and written runbooks for when it goes wrong.
Small enough for a Pi, big enough for a cluster
There is one preset for constrained machines. Set low_power = true<br>and littleFedi picks one database connection, one queue worker, one image<br>decoder, a bounded memory cache, a 13 million pixel ceiling on decoded images,<br>a 1600 pixel cap on stored uploads, cheaper thumbnail resampling and no dynamic<br>gzip.
low_power = true
[media]<br>cache_remote = "off"
At the other end, build with make build-postgres-s3 and several<br>processes share one PostgreSQL database and one S3 bucket, with cross-process<br>streaming and exactly one process doing housekeeping. That profile works, but<br>read the caveats before you rely on it.
Numbers on this page describe defaults and presets, not benchmark results.<br>Measure on the device you actually own before making capacity claims.
Runs where you run
Every supported system has its own guide: where files go, which service manager<br>starts the process, which firewall admits the two public ports, and where the<br>logs land.
FreeBSD
illumos
Linux
Alpine...