Normal identities
Start with did:plc. The DID document identifies the
PDS and repo verification key; handles resolve through the usual
mechanisms.
Experimental protocol proposal
Farcaster identity and persistence, exposed as ordinary ATProto. No bridge required.
One logical PDS, many replaceable nodes. PurpleSky distributes an ATProto service across workers backed by shared Farcaster state. Your repository belongs to the shared substrate.
View protocol proposalIllustrative sequence. All nodes serve the same published head; labels are not live network status.
Existing ATProto implementations should not need to understand Farcaster.
01 / The idea
Farcaster as infrastructure. ATProto as the interface.
PurpleSky proposes a distributed ATProto PDS implementation backed by the Farcaster protocol. It explores what happens when one decentralized protocol consumes another as infrastructure.
This is protocol composition, not a service that copies Farcaster posts into a second social graph. PurpleSky would publish native ATProto records from its backing state. Clients, relays, and AppViews see an ordinary PDS.
One social graph, multiple storage substrates.
02 / Architecture
The network is the backend.
ATProto remains the interface.
did:plc:…PDS service endpoint
Stable endpoint · OAuth / XRPC / repo / sync / blob APIs
↔ ordinary clients, relays, AppViews, and other PDSsAuthorize · project · serve
Authorize · project · serve
Authorize · project · serve
Local databases, indexes, MSTs, and CAR caches are reconstructable materialized state.
Shared accepted mutations, ordering, and finality for deterministic repo transitions
A stable logical PDS endpoint in the DID document. Routing between workers does not change the DID or its advertised PDS.
Stateless or mostly materialized gateways. A healthy, authorized, caught-up node should authenticate the user, accept writes, reconstruct the repo, and serve standard APIs.
Canonical persistence and ordering come from the chosen network. Mutation admission, finality, retention, and recovery still require proof.
03 / Distributed state
The network is the PDS.
Precisely: PurpleSky presents a single logical PDS to ATProto while distributing its implementation across many nodes backed by shared Farcaster state.
Hosted PDS deployments can assign accounts to particular backends or shards. PurpleSky’s proposed authority is the shared substrate. A node is neither the identity authority nor the durable home of a repository.
Users migrate onto the PurpleSky logical PDS. Switching PurpleSky workers is routing or failover, not account migration.
If A receives “follow Bob” while B receives “post Hello,” both submit to the same ordering layer. Neither publishes an independently chosen repo head.
follow Bob
post Hello
#9001 follow#9002 postDeterministic repo transitions + normal ATProto signatures
Define ordering within each DID, commit boundaries, stable record keys, monotonic revisions, idempotency keys, retry behavior, and conflict/precondition handling. An accepted request must not become two commits when retried at another worker.
Nodes publish only after the agreed ordering/finality condition and signing step. A lagging or partitioned worker must catch up, forward, wait, or fail the request; it cannot claim to serve the current head or create an independent canonical fork.
The logical service also needs shared session/revocation semantics, consistent read watermarks, and resumable firehose cursors across node changes. Ordering mutations alone does not solve these service guarantees.
Canonical commit metadata and signed artifacts must be recoverable, so two workers serving the same revision return the same commit CID. Signer failover needs fencing to prevent competing publishers. These are open implementation problems.
04 / Compatibility
The PDS abstraction separates a repository’s public contract from its storage engine.
Start with did:plc. The DID document identifies the
PDS and repo verification key; handles resolve through the usual
mechanisms.
Standard records, a Merkle Search Tree, and a signed commit. Ordering and finality do not replace the account’s ATProto repo signature.
Repository specificationServe CAR exports and valid repository events, including resumable streams and identity/account changes. No Farcaster-aware consumer is required.
Sync specificationDID + verification keysigned repo commitMSTapp.bsky.* records
The compatibility claim is a design constraint to test. A full PDS also needs standard client auth, discovery, account lifecycle, blob handling, and operational behavior. No modification to ATProto itself is proposed.
05 / Identity and signing
A handle names the user. A DID identifies the account. Login authority, repo signing, and DID rotation have different jobs.
deanpierce.netHuman-readable handledid:plc:…Stable ATProto identity
Start with a normal did:plc, including an existing DID
brought by migration. Prove the FID ↔ DID binding; retain standard
ATProto client auth at the service boundary. No
did:farcaster is proposed.
DID/PLC rotation authority is separate from the operational repo key. It authorizes identity updates such as changing the PDS endpoint or verification key. Farcaster/ETH-assisted recovery and rotation, wallet-only accounts, and passkeys remain research.
Distributed repo signing is an open implementation problem. An initial proof can use one protected signer service, with explicit custody and access controls.
Longer-term candidates include threshold or distributed signing, delegated short-lived signing authority, secure/HSM-backed signing, and other compatible mechanisms.
These are research options, not established ATProto integrations. Delegation cannot assume consumers understand a new certificate chain or signature format.
Every externally visible repo commit must be a normal valid ATProto signed commit. Any signing arrangement must satisfy the accepted algorithm, key, encoding, and DID verification requirements.
ATProto cryptography06 / Account migration
The migration is from an ordinary PDS to the PurpleSky logical PDS. Moving between PurpleSky nodes should not be a migration at all.
deanpierce.netdid:plc:…Current PDSFor example, a Bluesky-hosted account
deanpierce.netdid:plc:…PurpleSky logical PDSDistributed nodes + shared Farcaster state
A custom domain handle can continue resolving to the same DID. The DID’s PDS service endpoint changes to PurpleSky; the operational repo verification key can change as part of an authorized migration.
The user need not extract the old PDS’s private signing key. Import the repository and blobs, authorize the identity update using the applicable DID/PLC authority, then coordinate activation and deactivation so only one PDS is authoritative.
Keeping the DID does not by itself copy content. Import and verify the repository, transfer blobs and relevant private preferences, and establish a shared bootstrap checkpoint from which every PurpleSky node can reconstruct. Retain custom-domain control and verify the handle binding.
Migration back to an ordinary PDS should retain the DID and repository too. Import/export, signing-key rotation, account cutover, and recovery when the old provider is unavailable remain prototype work.
ATProto account migration07 / Native participation
Follow, mention, reply. PurpleSky users and ordinary ATProto users should interact through the same records and references.
Can two fundamentally different storage architectures participate transparently in the same ATProto social graph?
08 / Integration depth
Start with interoperability.
Explore how deep the composition
can go.
Create ordinary ATProto repositories first; explore storing their blocks through the Farcaster network.
Simplest conceptual adapter and closest to conventional storage. Still needs a viable storage mechanism.
Use Farcaster as shared mutation infrastructure; deterministically project accepted state into a standard ATProto repository.
The replicated substrate is canonical. ATProto is its interoperable representation.
Could one user-signed social operation be meaningful to both protocols directly?
Do not start here. Identity, signing, repository, and message semantics differ today.
Conceptual projection operations, not existing Farcaster message types:
create app.bsky.feed.post/abc
update app.bsky.actor.profile/self
create app.bsky.graph.follow/xyz
delete app.bsky.feed.post/old
The event envelope would need record content, stable keys, authorization, ordering, timestamps, and versioned projection rules. The adapter must first establish how the chosen network accepts and retains these operations.
Identical records can reproduce the MST root. Identical signed commits additionally require fixed commit metadata and a signing strategy or retained signed commit bytes. Replay alone does not recover private signing keys.
Pruning, deletion, snapshots, media availability, and migration need explicit policies before this can be a durable source of truth.
09 / The distributed proof
did:plc.com.atproto.sync.getRepo.Account state belongs to PurpleSky’s shared substrate, not to a PurpleSky machine.
If an unmodified ATProto relay/AppView can consume and verify a PurpleSky repository, the abstraction is working. The distributed proof additionally requires another node to recover and continue that same repository.
Begin by validating the substrate and a protected signer. Then cover
profile, post, follow, updates/deletes, concurrent writes, retries,
restart/replay, and
com.atproto.sync.subscribeRepos resumption across
nodes. Compare record CIDs, MST roots, revisions, and signed commit
CIDs at the same publication watermark. Public AppView ingestion
still depends on discovery and service policies.
10 / Open research
These are design decisions to investigate, not capabilities already delivered.
Experimental / Proposal stage
The Rust workspace now includes node preflight, offline repository reconstruction, a localhost console, and Farcaster-backed password sessions. Live network reconstruction and a working stock-client experience remain unproved.
Protocol review, criticism, and small reproducible experiments are welcome.