2026-02-05 20:37:08 +00:00
2026-01-03 00:58:28 +02:00
2025-12-21 23:16:39 +02:00
2026-02-04 19:08:44 +00:00
2026-01-26 17:15:51 +00:00
2026-01-28 17:42:13 +00:00
2026-01-28 17:42:13 +00:00
2026-01-28 17:42:13 +00:00
2025-12-25 18:57:18 +00:00
2025-12-25 18:57:18 +00:00
2026-01-28 21:51:31 +02:00
2026-01-04 13:00:27 +00:00

Tranquil PDS

A Personal Data Server for the AT Protocol.

Bluesky runs on a federated protocol called AT Protocol. Your account lives on a PDS, a server that stores your posts, profile, follows, and cryptographic keys. Bluesky hosts one for you at bsky.social, but you can run your own. Self-hosting means you control your data; you're not dependent on any company's servers, and your account + data is actually yours.

This particular PDS thrives under harsh conditions. It is a dandelion growing through the cracks in the sidewalk concrete.

It has full compatibility with Bluesky's reference PDS: same endpoints, same behavior, same client compatibility. Everything works: repo operations, blob storage, firehose, OAuth, handle resolution, account migration, the lot.

Another excellent PDS is Cocoon, written in go.

What's different about Tranquil PDS

It is a superset of the reference PDS, including: passkeys and 2FA (WebAuthn/FIDO2, TOTP, backup codes, trusted devices), SSO login and signup, did:web support (PDS-hosted subdomains or bring-your-own), multi-channel communication (email, discord, telegram, signal) for verification and alerts, granular OAuth scopes with a consent UI showing human-readable descriptions, app passwords with granular permissions (read-only, post-only, or custom scopes), account delegation (letting others manage an account with configurable permission levels), automatic backups (configurable retention and frequency, one-click restore), and a built-in web UI for account management, OAuth consent, repo browsing, and admin.

The PDS itself is a single small binary with no node/npm runtime. It requires postgres and stores blobs on the local filesystem. Valkey is optional (enables distributed rate limiting for multi-node setups).

Quick Start

cp .env.example .env
podman compose up -d
just run

Configuration

See .env.example for all configuration options.

Development

Run just to see available commands.

just test
just lint

Production Deployment

Quick Deploy (Docker/Podman Compose)

Edit .env.prod with your values. Generate secrets with openssl rand -base64 48.

cp .env.prod.example .env.prod
podman-compose -f docker-compose.prod.yaml up -d

Installation Guides

Guide Best For
Debian Debian 13+ with systemd
Containers Podman with quadlets or OpenRC
Kubernetes You know what you're doing

Maintainers to ping

Thanks

This project is very grateful to @nonbinary.computer, @juli.ee, @mary.my.id, and @baileytownsend.dev for their help and their code to lean on.

License

AGPL-3.0-or-later. Documentation is CC BY-SA 4.0. See LICENSE for details.

Description
No description provided
Readme 6.3 MiB
Languages
Rust 72.7%
Svelte 14.9%
TypeScript 10.4%
CSS 0.7%
Shell 0.6%
Other 0.6%