- π Overview
- β‘ Features
- π¦ Installation
- βοΈ Configuration
- β‘ Running the service
βΆοΈ Testing the installation- π§© Integrations
- API
- π οΈ Development
- π License
Yonder is a self-hosted, Mastodon-compatible ActivityPub server written in Rust β a whole social network in a single binary.
It speaks the Mastodon client API, so the apps you already use on your phone and desktop just work when pointed at your instance. It speaks ActivityPub, so your community federates with Mastodon, Akkoma, Pleroma and the rest of the Fediverse. And it speaks migration: moving an account to or from another server β followers, posts, media and all β is a first-class feature, not an afterthought.
- π Rich posts β plain text or Markdown, content warnings, polls, media attachments with editable alt text, scheduled posts, post editing and saved drafts
- π¬ Quotes & reactions β quote posts with author authorization and custom emoji reactions, on top of the usual replies, boosts and likes
- π Every timeline Mastodon has β home, local and federated feeds, hashtag timelines, and user-defined lists β with real-time updates over WebSocket streaming
- #οΈβ£ Hashtags that work for you β follow tags into your home feed,
trending tags, and server-side filters (
warn/hide/blur) that work across every timeline - π§΅ Threads that complete themselves β reply contexts are fetched on demand, and remote like/boost counts are resolved where the origin exposes them
- π Full ActivityPub federation via pubby-sdk β interoperates with Mastodon, Akkoma, Pleroma, Misskey and other Yonder instances
- π Mastodon-compatible API (v1 and v2) β point Tusky, Ivory, Elk, Phanpy or any Mastodon client at your instance and log in
- βοΈ Private conversations β direct messages as conversations, not just posts with a lock icon
- π Notifications your way β real-time in-app notifications, Web Push, and email, with per-type preferences
- π Custom emoji β per-instance emoji and emoji packs, rendered consistently in posts, profiles and reactions
- π Feeds & embeds β RSS 2.0 and Atom feeds for profiles, tags and lists; oEmbed/embeddable status cards; Webmentions in both directions
- π Move in either direction β signed ActivityPub
Movehandling, follower migration with retries and progress tracking, and moved-account banners, compatible with Mastodon and Akkoma - π¦ Your data is yours β Mastodon-compatible export archives (posts, media, lists, bookmarks, follows, blocksβ¦) with signed download links β and suspended accounts still get export-only access
- π₯ Import from anywhere β pull your archive, or connect a remote Mastodon/Akkoma account over OAuth and import posts, bookmarks, favourites, follows and more β preserving timestamps and provenance
- π Identity that survives β profile fields, link verification and moved-account markers all travel with you
- π‘οΈ User-side tools β mutes, blocks, reports (optionally forwarded
to the remote instance via
Flag), and server-side content filters - ποΈ Instance-side tools β user limiting and suspension, domain blocks, federation relays, and an admin panel for users, emoji, settings and audit logs
- πͺ Every registration policy β open, invite-only, approval-required or closed, plus invite management
- π Truly international β the bundled web UI ships in five languages including full RTL support, with light and dark themes
- π¦ One Rust binary β no Ruby, no Elixir, no sprawling dependency tree; PostgreSQL + Redis are the only services
- π OAuth2 provider β authorization-code + PKCE, device flow, password and client-credentials grants, plus scoped, revocable API tokens for your own scripts
- π₯οΈ Pluggable frontends β the bundled web UI is just the default; alternative frontends can be installed alongside it
- π Open API β OpenAPI 3 spec at
/openapi.jsonwith bundled Swagger UI at/swagger-ui - π Safety by default β argon2id passwords, SSRF-guarded remote fetches, Redis-backed rate limits, and durable at-least-once federation delivery
See installation page.
A single config.toml controls the instance β see
config.toml.example for every documented key.
Configuration resolves in this order (highest wins):
- Database overlays (
config_overlaystable, editable from the admin panel) YONDER_*environment variables β__is the nesting separator, e.g.YONDER_INSTANCE__NAMEforinstance.nameconfig.toml- Built-in defaults
Run yonder config list to see every key in both config.toml and
environment-variable form.
yonder serve # HTTP API + web UI (+ in-process jobs when jobs.enabled)
yonder worker # the background job queues (production deployment)# Docker
docker compose run --rm yonder user create --username alice --admin
# Cargo/binary install
yonder user create --username alice --adminSee docs/cli.md for the full command reference β
users, domain blocks, relays, emoji, frontend installs, config
overlays, migrations and ad-hoc job execution.
Before exposing the instance to browsers, generate the Web Push VAPID
keys once and add them to .env (or config.toml):
docker compose run --rm yonder webpush generate-keys
# or: yonder webpush generate-keyscurl https://your.instance/healthz
curl https://your.instance/api/v1/instanceThen open the instance in a browser, sign in, and check that your profile resolves remotely:
curl 'https://mastodon.social/.well-known/webfinger?resource=acct:you@your.instance'- Mastodon clients β any app that speaks the Mastodon API
(Tusky, Ivory, Elk, Phanpy, Mona, β¦) works against
/api/v1and/api/v2 - Feed readers β profiles, tags and lists expose RSS 2.0 and Atom
feeds with
<link rel="alternate">discovery - OAuth2 apps β register third-party applications via the standard
/api/v1/apps+/oauthflow, or issue scoped API tokens from the settings UI - Blog & web β public posts emit Webmentions and answer incoming
ones; statuses can be embedded on external pages via
embed.js
A documented REST API under /api/v1 and /api/v2 β Mastodon-shaped
where Mastodon defines a contract, namespaced under yonder.* where it
doesn't. The OpenAPI 3 spec is served at /openapi.json and a bundled
Swagger UI lives at /swagger-ui.
The streaming WebSocket at /api/v1/streaming implements Mastodon's
subscribe/unsubscribe protocol β user, public, public:local,
hashtag and list streams.
Yonder is a Rust workspace (axum, sqlx, tokio) plus a Vue 3 +
TypeScript SPA in frontend/.
The code structure and the main components of the service are described
in docs/ARCHITECTURE.md. Developer
documentation lives in docs/development.md β
environment setup, migrations, the test harness, job-queue and HTTP
internals, and the release pipeline. Feature-by-feature API contracts
live alongside it in docs/.
Yonder is free software, released under the AGPL-3.0 license.
