Skip to content
blacklightPublic

About

A Mastodon-compatible ActivityPub implementation in Rust

Topics

Resources

Contributing

Stars

7 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

254 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

yonder

yonder

Build Status Codacy Badge Codacy Badge Github stars Github forks Last Commit License

🌟 Overview

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.

The Yonder home timeline on desktop

⚑ Features

πŸ“£ Posting & timelines

  • πŸ“ 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

πŸ“’ Social & federated

  • 🌐 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

🧳 Migration & portability

  • 🚚 Move in either direction β€” signed ActivityPub Move handling, 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

βš–οΈ Moderation & administration

  • πŸ›‘οΈ 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

πŸ› οΈ Platform

  • πŸ¦€ 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.json with 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

πŸ“¦ Installation

See installation page.

βš™οΈ Configuration

A single config.toml controls the instance β€” see config.toml.example for every documented key. Configuration resolves in this order (highest wins):

  1. Database overlays (config_overlays table, editable from the admin panel)
  2. YONDER_* environment variables β€” __ is the nesting separator, e.g. YONDER_INSTANCE__NAME for instance.name
  3. config.toml
  4. Built-in defaults

Run yonder config list to see every key in both config.toml and environment-variable form.

⚑ Running the service

yonder serve     # HTTP API + web UI (+ in-process jobs when jobs.enabled)
yonder worker    # the background job queues (production deployment)

Creating a user

# Docker
docker compose run --rm yonder user create --username alice --admin

# Cargo/binary install
yonder user create --username alice --admin

See docs/cli.md for the full command reference β€” users, domain blocks, relays, emoji, frontend installs, config overlays, migrations and ad-hoc job execution.

Web push notifications

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-keys

▢️ Testing the installation

curl https://your.instance/healthz
curl https://your.instance/api/v1/instance

Then 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'

🧩 Integrations

  • Mastodon clients β€” any app that speaks the Mastodon API (Tusky, Ivory, Elk, Phanpy, Mona, …) works against /api/v1 and /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 + /oauth flow, 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

API

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.

πŸ› οΈ Development

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/.

πŸ“œ License

Yonder is free software, released under the AGPL-3.0 license.

About

A Mastodon-compatible ActivityPub implementation in Rust

Topics

Resources

Contributing

Stars

7 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages