Protocol Overview
PresenceNet is a decentralized protocol on the XRP Ledger (XRPL) for cryptographic proof of presence. Each mark records three things:
Together they let people and applications coordinate around verified presence, without surveillance or a central authority.
🌊 Presence
Cryptographic proof of "I was here" through minimal blockchain transactions
☁️ Memory
Append-only trails of your marks, recorded on-chain
⚡ Action
Volitional choice with stakes, enabling ritual-based coordination
Core Primitives
PresenceNet is made up of five interoperable primitives for verifying and coordinating presence:
Marks
Atomic units of presence. Signed, timestamped XRPL transactions (0.00001 XRP) proving "I was here."
Trails
Append-only ledgers of marks tied to a $handle. A continuous, user-controlled record of presence.
Rituals
Structured coordination patterns defining when, how, and who can mark. The grammar of presence.
Vaults
Multi-signature XRPL wallets governed by presence-based rules, not token ownership.
Chambers
Sealed memory containers created by rituals, preserving symbolic content for participants.
Marks
A Mark is the fundamental unit of presence in PresenceNet. Each mark is a cryptographically signed, timestamped transaction on the XRP Ledger that costs 0.00001 XRP.
Mark Schema
{
"markId": "uuid-or-cid",
"version": "1.0",
"timestamp": "2025-01-15T18:00:00Z",
"witness": "$alice",
"markType": "ritual",
"note": "Completed Circle Ritual",
"ritual": {
"ritualId": "circle_2025",
"participants": ["$alice", "$bob", "$mira"],
"threshold": 3
},
"signature": "0xabc123..."
}
Mark Types
- Self Mark: Personal reflection or commitment, witnessed by $witness
- Ritual Mark: Participation in a structured coordination pattern
- Vault Mark: Signature for multi-sig vault operations
- Public Mark: Openly witnessed presence at an event or moment
Properties
- Minimal cost: 0.00001 XRP keeps marking accessible to everyone
- Cryptographically Verified: Ed25519 signatures ensure authenticity
- Encrypted Memos: Optional AES-256 encrypted payloads for privacy
- Immutable: Once on XRPL, marks cannot be altered or deleted
- Erasable content: Mark contents are encrypted with keys each person controls. Destroying the key permanently erases the content, while the proof of presence remains on-chain.
Trails
A Trail is an append-only ledger of all marks associated with a $handle — a continuous, user-controlled record of presence over time.
Trail Properties
- Private by design: Mark contents are encrypted by default. Transaction metadata lives on the public XRP Ledger.
- Portable: Trails can be exported and synced across applications
- Verifiable: Cryptographic proofs enable selective disclosure
- Weighted: Trail weight accumulates through ritual completions
Trail-Based Logic
Rituals and Vaults use trail-based conditions to govern access:
{
"required_trail_depth": 30,
"required_marks": ["ritual_presence", "vault_signature"],
"mark_recency_window": "30d",
"requires_completion_of": ["initiation_2025"],
"custom_boolean_expression": "trail_weight >= 100"
}
Trail Indexing
Trails are indexed for efficient querying while preserving privacy:
- On-Chain: Mark transactions stored on XRPL
- Off-Chain Index: Metadata indexed in Firestore/IPFS
- Encrypted Content: Memo payloads encrypted client-side
- ZK-Proof Compatible: Future integration for trail verification without exposure
Rituals
Rituals are structured coordination patterns that define how presence is verified and coordinated. They replace static rules with explicit, action-bound signals.
Ritual Object Schema
Each ritual is defined by a comprehensive schema covering identity, timing, participants, eligibility, and outcomes:
{
"ritual_id": "circle_2025",
"ritual_version": "1.0",
"ritual_archetype": "circle",
"host_handle": "$mayowa",
"invited_handles": ["$alice", "$bob", "$mira"],
"start_time": "2025-06-01T18:00:00Z",
"end_time": "2025-06-01T20:00:00Z",
"required_mark_target": "$mayowa~presence",
"completion_condition": "minimum_marks: 3",
"linked_chamber": "vault:creativevault",
"biometric_required": false,
"recurring": false
}
Ritual Archetypes
Solo
Personal reflection, initiation, or commitment
Pairwise
Mutual witness between two parties
Circle
Time-bound collective presence
Open
Public participation without coordination
Chain
Sequential verification A → B → C
Ripple
Network propagation with depth limits
Ritual Mechanics
Rituals can exhibit transformative behaviors:
- Recursion: Auto-restart (e.g., weekly circle)
- Mutation: Morph into another ritual upon completion
- Replication: Spawn clones for new participants
- Merge: Combine multiple rituals into one
- Decay: Invalidate if not completed in time
- Sealing: Lock after N completions
Example Rituals
Witness Ritual
Mutual presence between two handles. Host marks participant, participant returns mark within 24h.
Circle Ritual
Group coordination with minimum participation threshold. Unlocks chamber upon completion.
Initiation Ritual
First mark to anchor a new trail. Biometric-verified self-mark via $witness.
Guardian Ritual
Witness-required validation. Participant marks guardian; guardian must acknowledge.
Vaults
Vaults are multi-signature XRPL wallets governed by presence-based rules rather than token ownership. They integrate with rituals to enable dynamic, behavior-bound access control.
Vault Integration Modes
Ritual-as-Key
Completing a ritual unlocks vault access
Ritual-as-Signature
Ritual marks count as vault signatures
Ritual-as-Governor
Ritual outcomes update vault rules
Ritual-as-Condition
Vault locked until rituals completed
Example: DAO Governance Vault
{
"vault_id": "dao_treasury",
"signers": ["$alice", "$bob", "$mira"],
"threshold": "2/3",
"governance_ritual": "circle_of_consensus_2025",
"role_requirements": {
"•signer": {
"grant_condition": "trail_weight >= 100",
"issuance": "ritual-issued"
}
}
}
In this setup, ritual completion grants •signer tags dynamically. Only those with active tags can sign vault transactions.
Chambers
Chambers are sealed memory containers created by advanced rituals. They preserve symbolic content (text, media, NFTs) accessible only to participants who completed the ritual.
Chamber Properties
- Private: Only ritual participants can access
- Immutable: Content cannot be altered after sealing
- Trail-Gated: Access requires proof of ritual completion in trail
- Durable: Stored on IPFS/Arweave for long-term persistence
Use Cases
Family Memory
Multi-generational ritual creates chamber with photos, letters, and stories for descendants
Community Archive
Group ritual seals shared experiences, accessible to all participants
Time Capsule
Delayed-reveal ritual unlocks chamber at future date
Trust Geometry
PresenceNet's encryption model follows the shape of real trust relationships — individual, bilateral, and group — so access maps to how people actually coordinate.
Three Trust Geometries
Point (Individual)
Structure: Self-contained, complete unto itself
Cryptography: Personal key derivation (only self can decrypt)
Example: "I commit to daily practice"
Line (Bilateral)
Structure: Two entities connected by direct relationship
Cryptography: ECDH shared secrets (both parties decrypt)
Example: "Thank you for your support"
Network (Collective)
Structure: Multiple entities with shared center
Cryptography: Group key distribution (all participants decrypt)
Example: "Completed ritual step 3"
Implementation Guide
PresenceNet is built on the XRP Ledger with additional infrastructure for trails, rituals, and chambers.
Technical Stack
- Blockchain: XRP Ledger (XRPL) for mark transactions
- Storage: IPFS/Arweave for chambers and trail archival
- Indexing: Firestore for trail metadata and ritual state
- Encryption: AES-256 for memos, Ed25519 for signatures
- SDK: JavaScript, Dart, Rust implementations
Developer Quickstart
// Define a ritual
const ritual = {
ritual_id: "starter_circle_2025",
ritual_archetype: "circle",
host_handle: "$dev",
invited_handles: ["$alice", "$bob"],
start_time: "2025-06-01T10:00:00Z",
end_time: "2025-06-01T12:00:00Z",
required_mark_target: "$dev~presence",
completion_condition: "minimum_marks: 2"
}
// Submit to PresenceNet
await createRitual(ritual)
// Submit a mark
await submitMark({
from: "$alice",
to: "$dev~presence",
ritual_id: "starter_circle_2025"
})
// Check trail
const trail = await checkTrail("$alice")
console.log(trail.weight) // Trail weight
Privacy Architecture
- Encrypted by Default: Mark memos use AES-256 encryption
- Proxy Routing: $handle-to-$handle transactions route through proxies
- Mutual Contacts: Rituals restrict access to verified $handles
- ZK-Proof Compatible: Future integration for trail verification without exposure