Mirror of the Tranquil PDS (Tangled) source — used only as the stack/tranquil submodule for the croft PDS deployment. Do not use directly.
  • Rust 87.7%
  • Svelte 5.3%
  • TypeScript 4.9%
  • CSS 1.3%
  • Nix 0.3%
  • Other 0.5%
Find a file
2026-07-17 02:14:30 +02:00
.config feat(store): Clock trait for DST 2026-05-30 23:46:22 +03:00
.sqlx sqlx: add missing file 2026-06-29 08:31:30 +03:00
.tangled/workflows fix(ci): dont pass cachix cache name as a secret so it doesnt get redacted from CI logs 2026-05-17 17:07:34 +02:00
crates feat(config): add more default crawlers/relays 2026-07-15 08:58:35 +03:00
deploy fix(docs): install docs better 2026-05-26 09:49:59 +03:00
docs Fix(docs): Change symlinks to SSL cert files from absolute to relative 2026-06-15 11:04:59 +03:00
frontend fix: enable autocomplete in totp verification 2026-07-02 20:29:22 +03:00
migrations delegation: preset scopes grant identity & account 2026-06-27 23:11:24 +03:00
observability feat: docs tweaks & standalone frontend 2026-01-18 16:41:41 +00:00
scripts chore: add plc directory for local dev 2026-05-19 19:46:58 +03:00
.containerignore feat(store): Clock trait for DST 2026-05-30 23:46:22 +03:00
.envrc source .env in devshell if one is pressent 2025-12-28 13:09:01 +00:00
.gitignore feat(store): Clock trait for DST 2026-05-30 23:46:22 +03:00
Cargo.lock build: smaller faster prod container 2026-06-19 09:16:30 +03:00
Cargo.toml build: smaller faster prod container 2026-06-19 09:16:30 +03:00
config.dev.toml chore: add app service with cargo-watch 2026-05-19 19:46:58 +03:00
CONTRIBUTING.md feat(docs): first version of 'when PRing' section of contrib 2026-05-21 22:46:59 +03:00
default.nix fix(nix): allow fetch Git deps 2026-04-09 21:30:03 +00:00
docker-compose.prod.yaml build: smaller faster prod container 2026-06-19 09:16:30 +03:00
docker-compose.yaml fix(docs): install docs better 2026-05-26 09:49:59 +03:00
Dockerfile build: smaller faster prod container 2026-06-19 09:16:30 +03:00
Dockerfile.dev Move Dockerfile(s) from musl to glibc 2026-06-16 14:31:32 +03:00
example.toml plc: always keep signing key in rotationKeys 2026-06-26 18:52:12 +03:00
flake.lock chore: nix flake update 2026-07-17 02:14:30 +02:00
flake.nix feat(nix): pratice what i preach. expose lib.mkPackages 2026-06-07 22:14:27 +02:00
frontend.nix chore(nix): use fetcherVersion 4 of fetchPnmpDeps 2026-07-17 02:14:30 +02:00
justfile feat(store): Clock trait for DST 2026-05-30 23:46:22 +03:00
KNOWN_ISSUES.md General linting, document react-native-streamplace-oauth-problem 2026-01-05 23:08:25 +02:00
LICENSE add license information 2025-12-25 18:57:18 +00:00
LICENSE-AGPL-3.0-or-later add license information 2025-12-25 18:57:18 +00:00
LICENSE-CC-BY-SA-4.0 add license information 2025-12-25 18:57:18 +00:00
module.nix fix(nix): disable the nixpkgs tranquil module when the repo module is used 2026-06-17 11:53:58 +02:00
nginx.conf fix: container build should use all-in-one backend+frontend 2026-03-07 21:06:25 +00:00
pkgs.nix feat(nix): pratice what i preach. expose lib.mkPackages 2026-06-07 22:14:27 +02:00
README.md add ave.zone to contributors list in README 2026-06-06 01:42:54 +03:00
rust-toolchain.toml fix(tranquil-config): reject unknown keys in TlsConfig, bump rust 1.96 2026-05-29 09:39:14 +03:00
shell.nix fix(nix): provide a jemalloc build in the dev shell 2026-06-10 19:56:40 +02:00
test.nix nix: use systemd-nspawn tests 2026-06-22 20:31:06 +03:00
traefik.dev.yaml chore: add traefik for local dev certs and routing 2026-05-19 19:46:58 +03:00
TRANQUIL_OWN_DB_RFC.txt feat(rfc): outline tranquil-store idea for comment 2026-03-22 18:54:51 +02:00

Tranquil PDS

A Personal Data Server for the AT Protocol.

"A what for the what?" -> glad you asked: Bluesky, Tangled, and a bunch of other web applications use a federated protocol called AT Protocol (atproto). Your account lives on a PDS, a server that stores your posts, profile, follows, cryptographic keys, et cetera. The beauty is that a PDS is the only place your data lives permanently - so you can navigate any atproto app knowing that your data is yours and not getting locked behind any one app's walls.

We came together to make this PDS to enable and empower our users to better host their data on this shared protocol. All of our decisions as a project are guided by their usefulness to the community: PDS hosters and end-users both.

Comparatively: Bluesky the company created a "reference PDS" that we can self-host quite easily, and that's great, but Bluesky has an incentive to make software for themselves first & foremost, then secondly their software can be useful for us self-hosters. In contrast, Tranquil is not from a company, and will never be.

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: you can be notified via email, discord, telegram, and signal for verification and alerts
  • granular OAuth scopes with a consent UI that allows unchecking specific scopes
  • app passwords with the same granular permission scope system as OAuth
  • account delegation: letting others manage an account with configurable permission levels
  • a built-in web UI for account management, repo browsing, and admin

Unlike the ref PDS, Tranquil is a single binary with no nodejs runtime. That said, at time of writing, Tranquil does require postgres running separately.

Quick Start

cp example.toml config.toml
podman compose up db -d
just run

Configuration

See example.toml for all configuration options.

Note

The order of configuration precedence is: environment variables, then a config file passed via --config, then /etc/tranquil-pds/config.toml, then the built-in defaults. So you can use environment variables, or a config file, or both.

Development

Run just to see available commands.

just test
just lint

Nix users can enter a devshell with nix develop, or direnv allow to auto-enter via the bundled .envrc. Pre-built artifacts including the devshell are available from our binary cache.

Production Deployment

Quick Deploy (Docker/Podman Compose)

docker-compose.prod.yaml pulls the prebuilt image atcr.io/tranquil.farm/tranquil-pds:latest. Sign in to the registry first with podman login atcr.io. The Containers guide covers building from source.

cp example.toml config.toml

Edit config.toml with your values and generate secrets with openssl rand -base64 48. Set the postgres password to match docker-compose.prod.yaml. nginx needs a TLS certificate before it starts, so follow the wildcard cert steps in the Containers guide.

podman-compose -f docker-compose.prod.yaml up -d

Installation Guides

Community

"Let's connect!" or whatever linkedin-types say

We currently don't have a shared space to chat and organize Tranquil things, but we're very interested in changing that in the near future. What do you suggest? Anything but a discord server.

Core team

Amazing contributors

Tranquil PDS instances in the wild!

Special thanks

This project is very grateful to @nonbinary.computer, @juliet.paris, @mary.my.id, @baileytownsend.dev, and @ptr.pet 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.