Overview
This proposal introduces the community.lexicon.calendar.transfer record type for the ATProtocol ecosystem. This record serves as a “sidecar” mechanism to indicate when a community.lexicon.calendar.event record has been transferred from one owner to another, enabling seamless event ownership transitions in decentralized calendar systems.
Problem Statement
In decentralized social networks, events are often created by community members on behalf of organizers who may not yet be present on the network. When the actual event organizer joins the platform, they need a way to claim ownership of their events while maintaining referential integrity and providing clear transfer provenance.
Current challenges include:
- No standardized way to indicate event ownership transfers
- Difficulty redirecting users from original to canonical event records
- Lack of cryptographic verification for transfer authenticity
- Potential confusion about which event record is authoritative
Proposed Solution
The community.lexicon.calendar.transfer record type provides a standardized mechanism for event ownership transfers. When an event is transferred, the original owner creates a transfer record using the same record key as the original event, containing:
- A strong reference to the new canonical event record
- Optional cryptographic signatures from the new owner accepting the transfer
Technical Specification
Record Type
community.lexicon.calendar.transfer
Schema Definition
{
"lexicon": 1,
"id": "community.lexicon.calendar.transfer",
"defs": {
"main": {
"type": "record",
"description": "A record indicating that a calendar event has been transferred to another owner",
"key": "tid",
"record": {
"type": "object",
"required": ["subject"],
"properties": {
"subject": {
"type": "ref",
"ref": "com.atproto.repo.strongRef",
"description": "Strong reference to the new canonical event record"
},
"signatures": {
"type": "array",
"description": "Optional attestations from the new owner accepting the transfer",
"items": {
"type": "ref",
"ref": "#transferAcceptance"
}
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When the transfer record was created"
}
}
}
},
"transferAcceptance": {
"type": "object",
"description": "Cryptographic attestation of transfer acceptance",
"required": ["issuer", "issuedAt", "signature"],
"properties": {
"issuer": {
"type": "string",
"format": "did",
"description": "DID of the new event owner"
},
"issuedAt": {
"type": "string",
"format": "datetime",
"description": "When the acceptance was signed"
},
"signature": {
"type": "string",
"description": "Cryptographic signature proving acceptance"
}
}
}
}
}
Example Record
{
"$type": "community.lexicon.calendar.transfer",
"subject": {
"$type": "com.atproto.repo.strongRef",
"uri": "at://did:plc:cbkjy5n7bk3ax2wplmtjofq2/community.lexicon.calendar.event/3lukj4a4ho72a",
"cid": "bafyreiezhxevee3oa6coizlkyqzngqmkwrxnrsl7vvgx3omzb3ys4nlv2i"
},
"signatures": [
{
"$type": "community.lexicon.calendar.transferAcceptance",
"issuer": "did:plc:cbkjy5n7bk3ax2wplmtjofq2",
"issuedAt": "2025-07-25T16:39:00.000Z",
"signature": "u56lN...e5KZg"
}
],
"createdAt": "2025-07-25T16:39:00.000Z"
}
Implementation Flow
Transfer Process
- Original Event Creation: Nick creates an event record with record key
3lukj4a4ho72a - Event Duplication: Boris joins the network and creates his own event record with the same semantic content
- Transfer Record Creation: Nick creates a
community.lexicon.calendar.transferrecord using the same record key (3lukj4a4ho72a) - Signature Generation: Boris signs an acceptance attestation to verify the transfer authenticity
- Record Publication: The transfer record is published to Nick’s PDS
Client Implementation
When displaying an event record, clients should:
- Check for a corresponding transfer record with the same record key
- If a transfer record exists, prioritize displaying the transferred event
- Show transfer provenance information to users
- Verify signatures when present to ensure transfer authenticity
Use Cases
Primary Use Case: Proxy Event Creation
- Community member creates event for external organizer
- Organizer joins network and wants to claim their event
- Transfer mechanism provides clear ownership transition
Secondary Use Cases
- Event organization handoffs within teams
- Migrating events between different organizational accounts
- Correcting incorrectly attributed events
Security Considerations
Signature Verification
- Signatures should be verified against the new owner’s public key
- Clients should clearly indicate unverified transfers
- Multiple signatures can provide additional confidence
Record Key Collision
- Transfer records use the same record key as original events
- This creates a clear 1:1 relationship but requires careful handling
- Clients must differentiate between event and transfer record types
Malicious Transfers
- Anyone can create transfer records pointing to arbitrary events
- Signature verification is crucial for authenticity
- Clients should allow users to ignore suspicious transfers
Implementation Considerations
Client UX
- Clear visual indicators for transferred events
- Option to view both original and transferred events
- Transfer history and provenance information
PDS Storage
- Transfer records are stored separately from event records
- Same record key but different record type
- Standard ATProtocol record management applies
Indexing and Discovery
- Transfer records should be indexed alongside event records
- Search systems should consider transfer relationships
- Feed algorithms should prioritize canonical event versions
Conclusion
The community.lexicon.calendar.transfer record type provides a robust, secure mechanism for event ownership transfers in decentralized calendar systems. By leveraging ATProtocol’s existing infrastructure and adding cryptographic verification, this proposal enables seamless event transitions while maintaining data integrity and user trust.
The sidecar approach ensures backward compatibility while providing clear upgrade paths for enhanced functionality. Implementation can begin immediately with basic transfer support, with additional features added incrementally based on community needs.