Skip to main content

Pleroma

Lightweight, efficient ActivityPub server. Run your own fediverse instance on minimal hardware.

Overview

Pleroma is a free, open-source social networking server implementing ActivityPub. Known for its efficiency, Pleroma can run on low-power devices like a Raspberry Pi while still providing full fediverse compatibility.

Key Features

Lightweight Design

Resource Comparison (approximate):

Mastodon: ████████████████████ 2GB+ RAM
Pleroma: ████ 512MB RAM

Mastodon: ████████████████████ Multi-container
Pleroma: ████ Single binary

Perfect for:
- Raspberry Pi
- Low-cost VPS
- Personal instances
- Resource-constrained environments

Full Federation

Pleroma federates with all ActivityPub servers:

┌──────────────────────────────────────────────────────┐
│ Fediverse │
├──────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ │
│ │Mastodon │ │ Pleroma │ │Pixelfed │ │
│ └────┬────┘ └────┬─────┘ └────┬────┘ │
│ │ │ │ │
│ └────────────┼──────────────┘ │
│ │ │
│ ActivityPub │
│ │ │
│ ┌────────────┼──────────────┐ │
│ │ │ │ │
│ ┌────┴────┐ ┌────┴─────┐ ┌────┴────┐ │
│ │PeerTube │ │ Misskey │ │Friendica│ │
│ └─────────┘ └──────────┘ └─────────┘ │
│ │
└──────────────────────────────────────────────────────┘

Mastodon API Compatibility

Use any Mastodon client with Pleroma:

// Same API works for both
const response = await fetch('https://pleroma.example/api/v1/timelines/home', {
headers: {
'Authorization': `Bearer ${accessToken}`
}
});

Supported clients:

  • Tusky (Android)
  • Toot! (iOS)
  • Pinafore (Web)
  • Fedilab (Android)
  • Any Mastodon-compatible app

Pleroma Extensions

Additional features beyond Mastodon API:

FeatureDescription
Custom reactionsEmoji reactions on posts
Quote postsQuote and comment
Bookmark foldersOrganize bookmarks
Rich mediaBetter embed handling
MRFMessage Rewrite Facility
ChatPleroma-specific chat

Message Rewrite Facility (MRF)

Powerful moderation through content filtering:

# Example MRF policy
defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
# Reject from specific instances
reject: ["spam.instance"],

# Media removal
media_removal: ["nsfw.instance"],

# Followers-only enforcement
followers_only: ["locked.instance"],

# Report forwarding
report_removal: []
end

Technical Stack

ComponentTechnology
LanguageElixir
FrameworkPhoenix
DatabasePostgreSQL
FrontendPleroma-FE (Vue.js)
ProtocolActivityPub

Installation

For Linux (glibc or musl) on x86/arm:

# Download latest release
wget https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=amd64-musl -O pleroma.zip

# Extract
unzip pleroma.zip -d /opt/pleroma

# Configure
cp /opt/pleroma/config/config.exs.example /opt/pleroma/config/prod.secret.exs

# Setup database
/opt/pleroma/bin/pleroma_ctl migrate

# Start
/opt/pleroma/bin/pleroma daemon

From Source

# Clone
git clone https://git.pleroma.social/pleroma/pleroma.git
cd pleroma

# Install dependencies
mix deps.get

# Configure
cp config/dev.exs.example config/dev.secret.exs
# Edit config/dev.secret.exs

# Setup database
mix ecto.create
mix ecto.migrate

# Start
mix phx.server

Docker

# docker-compose.yml
version: '3'
services:
db:
image: postgres:14-alpine
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: pleroma
POSTGRES_USER: pleroma
POSTGRES_PASSWORD: pleroma

pleroma:
image: git.pleroma.social:5050/pleroma/pleroma
depends_on:
- db
ports:
- "4000:4000"
volumes:
- ./uploads:/var/lib/pleroma/uploads
- ./static:/var/lib/pleroma/static
- ./config.exs:/etc/pleroma/config.exs

Package Managers

Available for:

  • YunoHost — One-click install
  • NixOS — Nix package
  • Arch Linux — AUR
  • Gentoo — GURU overlay

Raspberry Pi

Flash the community-maintained image:

# Download from github.com/guysoft/PleromaPi
# Flash to SD card
# Boot and configure

Configuration

Basic Setup

# config/prod.secret.exs

config :pleroma, Pleroma.Web.Endpoint,
url: [host: "pleroma.example.com", scheme: "https", port: 443]

config :pleroma, :instance,
name: "My Pleroma",
email: "admin@example.com",
description: "A cozy Pleroma instance",
limit: 5000, # Character limit
registrations_open: true

config :pleroma, Pleroma.Repo,
adapter: Ecto.Adapters.Postgres,
username: "pleroma",
password: "your_password",
database: "pleroma",
hostname: "localhost"

Federation Settings

config :pleroma, :mrf,
policies: [
Pleroma.Web.ActivityPub.MRF.SimplePolicy
]

config :pleroma, :mrf_simple,
reject: [],
accept: [],
media_removal: [],
media_nsfw: [],
federated_timeline_removal: []

Recent Updates (2.7+)

  • IPFS uploads — Decentralized file storage
  • Bookmark categories — Organize saves
  • Improved theming — Better customization
  • Quote posts — Added in 2.6
  • Custom emoji reactions — Added in 2.6

Comparison

FeaturePleromaMastodonMisskey
Memory usage~500MB~2GB+~1GB
Character limitConfigurable500 (default)Configurable
ReactionsCustom emoji❤️ onlyCustom
Quote postsYesNoYes
MRFYesLimitedNo
APIMastodon + extensionsMastodonOwn API

See Also