- JavaScript 46.6%
- Go 32.4%
- Svelte 10.8%
- TypeScript 7.7%
- Python 1.5%
- Other 1%
Fedibook
Fedibook is an open-source, self-hosted social network inspired by the simplicity of early Facebook — with full ActivityPub federation support. Run your own instance and stay connected with Mastodon, Pixelfed, and every other Fediverse platform, all from a familiar friends-and-groups interface.
A live showcase instance is available at fedibook.net .
License: GNU Affero General Public License v3.0 (AGPL-3.0)
Features
Social graph
- Friends — mutual connections with a confirmation step. Friend posts can be shared with friends-only visibility, keeping them off public timelines and out of federation.
- Follows — one-directional subscriptions to any ActivityPub account on the Fediverse (Mastodon users, Pixelfed photographers, PeerTube channels, etc.). Their public posts appear in your feed.
- Mutual-follow upgrade — when a follow becomes mutual, Fedibook automatically promotes it to a full friendship.
- Follow import — paste a Mastodon follows CSV and Fedibook resolves each account across the Fediverse in batches, with real-time progress feedback.
Feed and posts
- Reverse-chronological feed mixing friends, follows, and group posts.
- Real-time updates via Server-Sent Events — a banner appears when new content arrives.
- Post visibility: Public (federated) or Friends-only (private).
- Image attachments with automatic resize on upload.
- Video support via an optional PeerTube integration.
- Post editing, deletion (with federated Delete activity), likes, shares (Announce), and threaded comments.
Groups
Groups are shared spaces that work like Facebook groups but are also full ActivityPub actors — users on Mastodon, Pixelfed, and other platforms can join and participate without a Fedibook account.
- Each group has a fediverse address of the form
@handle-grp@yourdomain.com, chosen (or auto-generated) at creation time and fixed thereafter. - Closed groups are publicly listed; joining requires admin approval.
- Hidden groups are invite-only and do not appear in any listing.
- Admins can invite any fediverse address — Fedibook resolves it automatically and sends a Follow activity to the remote actor.
- Remote members (Mastodon etc.) join by accepting the follow request in their own client; they receive group posts as Announce (boost) activities in their home timeline.
- Group posts from remote members are delivered as Direct Messages addressed to the group actor and fanned out to all members.
- A built-in Everyone system group automatically includes all local users — useful for instance-wide announcements.
Fediverse federation
- Full ActivityPub inbox/outbox for both user and group actors.
- HTTP Signature verification on all incoming activities.
- WebFinger discovery for users (
@user@domain) and groups (@handle-grp@domain). - NodeInfo endpoint for instance discovery.
- Supported incoming activity types:
Follow,Accept,Undo{Follow},Create{Note},Delete,Invite,Announce. - Outbound delivery via an asynchronous worker with three priority queues.
Administration
- Instance admin panel for user management and content moderation.
- Configurable registration modes: open, approval-required, or invitation-only.
- Optional email verification on signup.
- Admin-level post deletion.
Documentation
| Document | Audience |
|---|---|
| USER_GUIDE.md | End users — how to use every feature |
| dev_guide.md | Contributors and operators — architecture, data flows, gotchas |
What's included
The Docker Compose project bundles everything needed to run a production-ready instance:
| Service | Purpose |
|---|---|
| Traefik | Reverse proxy with automatic Let's Encrypt TLS and load balancing |
| PostgreSQL 16 | Primary database |
| Redis 7 | Job queue and token blacklist |
| App1 / App2 | Two identical Go API server instances behind the Traefik load balancer |
| Worker | Background job processor (single instance — two workers would compete for the same jobs) |
| Frontend | SvelteKit UI |
Before you start
Fedibook is designed to run on a dedicated server — a small VPS or cloud instance works great. The bundled setup takes over ports 80 and 443 and manages its own TLS certificates, so it assumes there is no other web proxy already running on the machine.
Minimum requirements:
- 2 GB RAM
- 10 GB disk
- Docker and Docker Compose v2
- A domain name pointed at the server
If you already run your own Traefik setup, you can remove the Traefik service from
docker-compose.ymland wire Fedibook into your existing proxy. The routing labels are already in place — you just need to attach the correct network.
Installation
1. Clone the repository
git clone https://codeberg.org/sindum/fedibook.git
cd fedibook
2. Create your configuration file
cp .env.example .env
Edit .env with your settings (see Configuration below).
Make STORAGE folder configured in .env writeable to allow media upload
3. Start the stack
docker compose up -d
Traefik will automatically obtain a TLS certificate for your domain. The application will be available at https://your-domain.com within a minute or so.
Updating
Use deploy.sh for zero-downtime updates:
./deploy.sh
The script pulls the latest code, builds fresh images, then performs a rolling restart so the site stays up throughout the deploy:
- Builds new images for all services.
- Restarts app1 and waits until it is healthy before continuing.
- Restarts app2 and waits until it is healthy before continuing.
- Restarts the worker (brief pause acceptable — it handles background jobs, not user traffic).
- Restarts the frontend.
Because two app instances run behind Traefik, there is always at least one healthy instance serving requests while the other restarts. If an instance does not become healthy within 60 seconds the script prints an error and stops rather than proceeding to the next step.
Database migrations run automatically on startup of the new app containers.
First-time or emergency restart:
docker compose up -d --buildstill works and will bring up everything from scratch, but it restarts all services simultaneously and causes a brief outage.
Configuration
Copy .env.example to .env and fill in the values. Here is a breakdown of each section:
Identity
| Variable | Description |
|---|---|
SITE_DOMAIN |
The domain your instance runs on — used in ActivityPub identifiers, WebFinger, and email links. Must match your DNS. |
STACK_NAME |
Docker Compose stack name, used internally for Traefik routing. Default: fedibook |
INSTANCE_NAME |
Display name shown in the UI and NodeInfo. |
INSTANCE_DESCRIPTION |
Short description of the instance. |
Application
| Variable | Description |
|---|---|
APP_SECRET_KEY |
Secret used to sign JWT tokens. Generate with openssl rand -hex 32. Never change this in production — it will invalidate all sessions. |
APP_ENV |
production or development |
LOG_LEVEL |
debug, info, warn, or error |
REGISTRATION_MODE |
open allows anyone to sign up. approval requires admin approval. |
EASY_SIGNUP |
Set to true to skip email verification. Useful for local testing, not recommended in production. |
Admin user
An admin account is created automatically on first startup using these values.
| Variable | Description |
|---|---|
ADMIN_USERNAME |
Username for the admin account |
ADMIN_FULL_NAME |
Display name |
ADMIN_EMAIL |
Email address |
ADMIN_PASSWORD |
Password — change this immediately after first login |
Database and Redis
The default values connect to the bundled PostgreSQL and Redis containers. Only change these if you are using external database services.
Email (SMTP)
| Variable | Description |
|---|---|
SMTP_HOST |
SMTP server hostname. Leave empty to disable email — a no-op mailer will log emails instead. |
SMTP_PORT |
587 for STARTTLS, 465 for TLS |
SMTP_USER / SMTP_PASSWORD |
SMTP credentials |
SMTP_FROM_ADDRESS |
The sender address used for outgoing emails |
Email is used for account verification and password resets. For testing without email, you can set EASY_SIGNUP=true to skip email verification entirely.
TLS
| Variable | Description |
|---|---|
ACME_EMAIL |
Email address for Let's Encrypt notifications (certificate expiry warnings etc.) |
Storage
| Variable | Description |
|---|---|
STORAGE_DRIVER |
local stores uploads on disk. s3 uses an S3-compatible object store. |
STORAGE_LOCAL_PATH |
Path for local uploads. Default: ./uploads in the data folder. |
PeerTube (optional)
If set, Fedibook will use a PeerTube instance for video uploads. Leave these commented out to disable video support.
PEERTUBE_URL=https://peertube.example.com
PEERTUBE_USERNAME=
PEERTUBE_PASSWORD=
Contributing
Contributions are welcome — bug fixes, features, documentation, and feedback alike.
See CONTRIBUTING.md for how to get started, the branch workflow, and coding conventions.
You can also follow the project and join the conversation at fedibook.net in the group "About the Fedibook project".