The **Federated Social Pinning Service** is a cooperative, semi-automated network designed to keep important files alive on IPFS by combining free-tier pinning services, homelab nodes, institutional nodes, and trusted social agreements.
It is a core module of the broader Anarchive initiative, responsible for **redundancy, resilience, and archival integrity** of culturally or scientifically significant digital assets.
# Architecture Overview
Federated Pinning consists of multiple cooperating layers:
- Social Layer — human trust, reciprocal pinning favors, federated identity
- Pinning Services — coordination with public IPFS pinning APIs
- Homelab Nodes — decentralized, self-hosted IPFS nodes (Raspberry Pi, NAS, etc.)
- Verification Mesh — automated proof-of-presence, re-pinning, and reporting
- Metadata and Naming — YAML/Back Matter + Federated Wiki JSON for canonical naming and social indexing
- Cluster Optionals — optional IPFS Cluster deployments for syncing trusted peer nodes
Each of these layers can be implemented gradually. Together they form a **socially-coordinated, semi-automated IPFS-based redundancy network**.
# Core Functions
- Pin Distribution: Coordinate uploads to multiple public and private pinning services
- Social Reciprocity: Use federated wiki identity and mutual agreements to ensure community pinning
- Integrity Checks: Use scheduled checks to verify pin presence and alert if files are at risk
- Content Naming: Use IPFS multihash filenames and Back Matter YAML to assign stable identifiers
- Perspective Forking: Allow people to fork canonical files with additional context, notes, or localization
# Stakeholders
- Archivists: Curate and upload files to the Anarchive
- Pinning Allies: Individuals or institutions who agree to pin selected files
- Verifiers: Agents or tools that periodically check file availability
- Consumers: End users who access media via wiki pages or public gateways
- Libraries: Institutions that provide long-term node hosting and pinning capacity
- Anarchive Maintainers: Oversee the coordination layer and trust graph
# Domain Design (Graphviz)
```dot
digraph FederatedSocialPinning {
node [shape=box, style=filled, fillcolor=lightgray];
Archivist -> CanonicalFile;
CanonicalFile -> "IPFS Hash";
"IPFS Hash" -> "Pinning Service" [label="upload"];
"IPFS Hash" -> "Homelab Node" [label="pin"];
"IPFS Hash" -> "Institutional Node" [label="mirror"];
"IPFS Hash" -> "Verifier" [label="check"];
"Federated Wiki Page" -> CanonicalFile [label="links"];
"Federated Wiki Page" -> Notes [label="forked with"];
Notes -> "IPFS Hash";
"Pinning Ally" -> "IPFS Hash" [label="pins"];
"Verifier" -> AlertSystem [label="alerts"];
AlertSystem -> Archivist [label="notifies"];
Archivist -> "Pinning Ally" [label="requests help"];
"Anarchive Maintainer" -> "Trust Graph";
"Trust Graph" -> "Pinning Ally";
"Trust Graph" -> "Homelab Node";
}
```
# Next Steps
- Define YAML `Back Matter` format for pin metadata → Metadata and Naming
- Describe public API coordination logic → Pinning Services
- Outline social trust rules and reciprocity ledger → Social Layer
- Write homelab setup guide and node script → Homelab Nodes
- Build watchdog check loop and alerting → Verification Mesh
This modular design allows different contributors and communities to participate at their own comfort level while building toward a resilient, federated preservation web.
digraph FederatedSocialPinning {
node [shape=box, style=filled, fillcolor=lightgray];
// Social Layer Context
subgraph cluster_social {
label = "Social Layer";
style = filled;
color = lightblue;
Archivist;
"Pinning Ally";
"Anarchive Maintainer";
"Trust Graph";
}
// Metadata Context
subgraph cluster_metadata {
label = "Metadata and Naming";
style = filled;
color = lightyellow;
CanonicalFile;
"IPFS Hash";
Notes;
"Federated Wiki Page";
}
// Pinning Infrastructure Context
subgraph cluster_pinning {
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Verification Context
subgraph cluster_verification {
label = "Verification Mesh";
style = filled;
color = lightcoral;
Verifier;
AlertSystem;
}
// External Actors
subgraph cluster_consumers {
label = "Consumers";
style = filled;
color = white;
Consumers;
}
// Relationships (edges)
Archivist -> CanonicalFile;
CanonicalFile -> "IPFS Hash";
"IPFS Hash" -> "Pinning Service" [label="upload"];
"IPFS Hash" -> "Homelab Node" [label="pin"];
"IPFS Hash" -> "Institutional Node" [label="mirror"];
"IPFS Hash" -> Verifier [label="check"];
"Federated Wiki Page" -> CanonicalFile [label="links"];
"Federated Wiki Page" -> Notes [label="forked with"];
Notes -> "IPFS Hash";
"Pinning Ally" -> "IPFS Hash" [label="pins"];
Verifier -> AlertSystem [label="alerts"];
AlertSystem -> Archivist [label="notifies"];
Archivist -> "Pinning Ally" [label="requests help"];
"Anarchive Maintainer" -> "Trust Graph";
"Trust Graph" -> "Pinning Ally";
"Trust Graph" -> "Homelab Node";
CanonicalFile -> Consumers [label="accessed by"];
}
digraph PinningServicesContext {
node [shape=box, style=filled, fillcolor=lightgray];
// Pinning Services Context (focused subgraph)
subgraph cluster_pinning {
tooltip = "Pinning Services";
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Metadata Context (label only)
subgraph cluster_metadata {
tooltip = "Metadata and Naming";
label = "Metadata and Naming";
style = filled;
color = lightyellow;
}
// Social Layer Context (label only)
subgraph cluster_social {
tooltip = "Social Layer";
label = "Social Layer";
style = filled;
color = lightblue;
}
// Edges to other domains (from Pinning Services)
"Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"];
"Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"];
"Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"];
}
digraph FederatedSocialPinning {
node [shape=box, style=filled, fillcolor=lightgray];
// Social Layer Context
subgraph cluster_social {
tooltip = "Social Layer";
label = "Social Layer";
style = filled;
color = lightblue;
Archivist;
"Pinning Ally";
"Anarchive Maintainer";
"Trust Graph";
}
// Metadata Context
subgraph cluster_metadata {
tooltip = "Metadata and Naming";
label = "Metadata and Naming";
style = filled;
color = lightyellow;
CanonicalFile;
"IPFS Hash";
Notes;
"Federated Wiki Page";
}
// Pinning Infrastructure Context
subgraph cluster_pinning {
tooltip = "Pinning Services";
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Verification Context
subgraph cluster_verification {
tooltip = "Verification Mesh";
label = "Verification Mesh";
style = filled;
color = lightcoral;
Verifier;
AlertSystem;
}
// Consumer Context
subgraph cluster_consumers {
tooltip = "Consumers";
label = "Consumers";
style = filled;
color = white;
Consumers;
}
// Relationships (edges)
Archivist -> CanonicalFile;
CanonicalFile -> "IPFS Hash";
"IPFS Hash" -> "Pinning Service" [label="upload"];
"IPFS Hash" -> "Homelab Node" [label="pin"];
"IPFS Hash" -> "Institutional Node" [label="mirror"];
"IPFS Hash" -> Verifier [label="check"];
"Federated Wiki Page" -> CanonicalFile [label="links"];
"Federated Wiki Page" -> Notes [label="forked with"];
Notes -> "IPFS Hash";
"Pinning Ally" -> "IPFS Hash" [label="pins"];
Verifier -> AlertSystem [label="alerts"];
AlertSystem -> Archivist [label="notifies"];
Archivist -> "Pinning Ally" [label="requests help"];
"Anarchive Maintainer" -> "Trust Graph";
"Trust Graph" -> "Pinning Ally";
"Trust Graph" -> "Homelab Node";
CanonicalFile -> Consumers [label="accessed by"];
}
digraph PinningServicesContext {
node [shape=box, style=filled, fillcolor=lightgray];
// Pinning Services Context (focused subgraph)
subgraph cluster_pinning {
tooltip = "Pinning Services";
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Metadata Context (label only)
subgraph cluster_metadata {
tooltip = "Metadata and Naming";
label = "Metadata and Naming";
style = filled;
color = lightyellow;
}
// Social Layer Context (label only)
subgraph cluster_social {
tooltip = "Social Layer";
label = "Social Layer";
style = filled;
color = lightblue;
}
// Edges to other domains (from Pinning Services)
"Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"];
"Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"];
"Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"];
}
digraph PinningServicesContext {
node [shape=box, style=filled, fillcolor=lightgray];
// Pinning Services Context (focused subgraph)
subgraph cluster_pinning {
tooltip = "Pinning Services";
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Metadata Context (label only, yellow)
subgraph cluster_metadata {
tooltip = "Metadata and Naming";
label = "Metadata and Naming";
style = filled;
color = lightyellow;
}
// Social Layer Context (label only, blue)
subgraph cluster_social {
tooltip = "Social Layer";
label = "Social Layer";
style = filled;
color = lightblue;
}
// Edges to other domains (from Pinning Services)
"Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"];
"Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"];
"Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"];
}
digraph PinningServicesContext {
node [shape=box, style=filled, fillcolor=lightgray];
// Pinning Services Domain (full detail)
subgraph cluster_pinning {
tooltip = "Pinning Services";
label = "Pinning Services";
style = filled;
color = lightgreen;
"Pinning Service";
"Homelab Node";
"Institutional Node";
}
// Linked domains as colored label nodes
"Metadata and Naming" [fillcolor=lightyellow, style=filled, tooltip="Metadata and Naming"];
"Social Layer" [fillcolor=lightblue, style=filled, tooltip="Social Layer"];
// Cross-domain links
"Pinning Service" -> "Metadata and Naming" [label="uses CID"];
"Homelab Node" -> "Social Layer" [label="pinned by allies"];
"Institutional Node" -> "Social Layer" [label="mirrored by institutions"];
}
The **Federated Social Pinning Service** is a cooperative, semi-automated network designed to keep important files alive on IPFS by combining free-tier pinning services, homelab nodes, institutional nodes, and trusted social agreements.
- Social Pinning Metadata
It is a core module of the broader Anarchive initiative, responsible for **redundancy, resilience, and archival integrity** of culturally or scientifically significant digital assets.
# Architecture Overview Federated Pinning consists of multiple cooperating layers: - Social Layer — human trust, reciprocal pinning favors, federated identity - Pinning Services — coordination with public IPFS pinning APIs - Homelab Nodes — decentralized, self-hosted IPFS nodes (Raspberry Pi, NAS, etc.) - Verification Mesh — automated proof-of-presence, re-pinning, and reporting - Metadata and Naming — YAML/Back Matter + Federated Wiki JSON for canonical naming and social indexing - Cluster Optionals — optional IPFS Cluster deployments for syncing trusted peer nodes Each of these layers can be implemented gradually. Together they form a **socially-coordinated, semi-automated IPFS-based redundancy network**. # Core Functions - Pin Distribution: Coordinate uploads to multiple public and private pinning services - Social Reciprocity: Use federated wiki identity and mutual agreements to ensure community pinning - Integrity Checks: Use scheduled checks to verify pin presence and alert if files are at risk - Content Naming: Use IPFS multihash filenames and Back Matter YAML to assign stable identifiers - Perspective Forking: Allow people to fork canonical files with additional context, notes, or localization # Stakeholders - Archivists: Curate and upload files to the Anarchive - Pinning Allies: Individuals or institutions who agree to pin selected files - Verifiers: Agents or tools that periodically check file availability - Consumers: End users who access media via wiki pages or public gateways - Libraries: Institutions that provide long-term node hosting and pinning capacity - Anarchive Maintainers: Oversee the coordination layer and trust graph # Domain Design (Graphviz) ```dot digraph FederatedSocialPinning { node [shape=box, style=filled, fillcolor=lightgray]; Archivist -> CanonicalFile; CanonicalFile -> "IPFS Hash"; "IPFS Hash" -> "Pinning Service" [label="upload"]; "IPFS Hash" -> "Homelab Node" [label="pin"]; "IPFS Hash" -> "Institutional Node" [label="mirror"]; "IPFS Hash" -> "Verifier" [label="check"]; "Federated Wiki Page" -> CanonicalFile [label="links"]; "Federated Wiki Page" -> Notes [label="forked with"]; Notes -> "IPFS Hash"; "Pinning Ally" -> "IPFS Hash" [label="pins"]; "Verifier" -> AlertSystem [label="alerts"]; AlertSystem -> Archivist [label="notifies"]; Archivist -> "Pinning Ally" [label="requests help"]; "Anarchive Maintainer" -> "Trust Graph"; "Trust Graph" -> "Pinning Ally"; "Trust Graph" -> "Homelab Node"; } ``` # Next Steps - Define YAML `Back Matter` format for pin metadata → Metadata and Naming - Describe public API coordination logic → Pinning Services - Outline social trust rules and reciprocity ledger → Social Layer - Write homelab setup guide and node script → Homelab Nodes - Build watchdog check loop and alerting → Verification Mesh This modular design allows different contributors and communities to participate at their own comfort level while building toward a resilient, federated preservation web.
digraph FederatedSocialPinning { node [shape=box, style=filled, fillcolor=lightgray]; // Social Layer Context subgraph cluster_social { label = "Social Layer"; style = filled; color = lightblue; Archivist; "Pinning Ally"; "Anarchive Maintainer"; "Trust Graph"; } // Metadata Context subgraph cluster_metadata { label = "Metadata and Naming"; style = filled; color = lightyellow; CanonicalFile; "IPFS Hash"; Notes; "Federated Wiki Page"; } // Pinning Infrastructure Context subgraph cluster_pinning { label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Verification Context subgraph cluster_verification { label = "Verification Mesh"; style = filled; color = lightcoral; Verifier; AlertSystem; } // External Actors subgraph cluster_consumers { label = "Consumers"; style = filled; color = white; Consumers; } // Relationships (edges) Archivist -> CanonicalFile; CanonicalFile -> "IPFS Hash"; "IPFS Hash" -> "Pinning Service" [label="upload"]; "IPFS Hash" -> "Homelab Node" [label="pin"]; "IPFS Hash" -> "Institutional Node" [label="mirror"]; "IPFS Hash" -> Verifier [label="check"]; "Federated Wiki Page" -> CanonicalFile [label="links"]; "Federated Wiki Page" -> Notes [label="forked with"]; Notes -> "IPFS Hash"; "Pinning Ally" -> "IPFS Hash" [label="pins"]; Verifier -> AlertSystem [label="alerts"]; AlertSystem -> Archivist [label="notifies"]; Archivist -> "Pinning Ally" [label="requests help"]; "Anarchive Maintainer" -> "Trust Graph"; "Trust Graph" -> "Pinning Ally"; "Trust Graph" -> "Homelab Node"; CanonicalFile -> Consumers [label="accessed by"]; }
digraph PinningServicesContext { node [shape=box, style=filled, fillcolor=lightgray]; // Pinning Services Context (focused subgraph) subgraph cluster_pinning { tooltip = "Pinning Services"; label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Metadata Context (label only) subgraph cluster_metadata { tooltip = "Metadata and Naming"; label = "Metadata and Naming"; style = filled; color = lightyellow; } // Social Layer Context (label only) subgraph cluster_social { tooltip = "Social Layer"; label = "Social Layer"; style = filled; color = lightblue; } // Edges to other domains (from Pinning Services) "Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"]; "Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"]; "Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"]; }
digraph FederatedSocialPinning { node [shape=box, style=filled, fillcolor=lightgray]; // Social Layer Context subgraph cluster_social { tooltip = "Social Layer"; label = "Social Layer"; style = filled; color = lightblue; Archivist; "Pinning Ally"; "Anarchive Maintainer"; "Trust Graph"; } // Metadata Context subgraph cluster_metadata { tooltip = "Metadata and Naming"; label = "Metadata and Naming"; style = filled; color = lightyellow; CanonicalFile; "IPFS Hash"; Notes; "Federated Wiki Page"; } // Pinning Infrastructure Context subgraph cluster_pinning { tooltip = "Pinning Services"; label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Verification Context subgraph cluster_verification { tooltip = "Verification Mesh"; label = "Verification Mesh"; style = filled; color = lightcoral; Verifier; AlertSystem; } // Consumer Context subgraph cluster_consumers { tooltip = "Consumers"; label = "Consumers"; style = filled; color = white; Consumers; } // Relationships (edges) Archivist -> CanonicalFile; CanonicalFile -> "IPFS Hash"; "IPFS Hash" -> "Pinning Service" [label="upload"]; "IPFS Hash" -> "Homelab Node" [label="pin"]; "IPFS Hash" -> "Institutional Node" [label="mirror"]; "IPFS Hash" -> Verifier [label="check"]; "Federated Wiki Page" -> CanonicalFile [label="links"]; "Federated Wiki Page" -> Notes [label="forked with"]; Notes -> "IPFS Hash"; "Pinning Ally" -> "IPFS Hash" [label="pins"]; Verifier -> AlertSystem [label="alerts"]; AlertSystem -> Archivist [label="notifies"]; Archivist -> "Pinning Ally" [label="requests help"]; "Anarchive Maintainer" -> "Trust Graph"; "Trust Graph" -> "Pinning Ally"; "Trust Graph" -> "Homelab Node"; CanonicalFile -> Consumers [label="accessed by"]; }
digraph PinningServicesContext { node [shape=box, style=filled, fillcolor=lightgray]; // Pinning Services Context (focused subgraph) subgraph cluster_pinning { tooltip = "Pinning Services"; label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Metadata Context (label only) subgraph cluster_metadata { tooltip = "Metadata and Naming"; label = "Metadata and Naming"; style = filled; color = lightyellow; } // Social Layer Context (label only) subgraph cluster_social { tooltip = "Social Layer"; label = "Social Layer"; style = filled; color = lightblue; } // Edges to other domains (from Pinning Services) "Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"]; "Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"]; "Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"]; }
digraph PinningServicesContext { node [shape=box, style=filled, fillcolor=lightgray]; // Pinning Services Context (focused subgraph) subgraph cluster_pinning { tooltip = "Pinning Services"; label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Metadata Context (label only, yellow) subgraph cluster_metadata { tooltip = "Metadata and Naming"; label = "Metadata and Naming"; style = filled; color = lightyellow; } // Social Layer Context (label only, blue) subgraph cluster_social { tooltip = "Social Layer"; label = "Social Layer"; style = filled; color = lightblue; } // Edges to other domains (from Pinning Services) "Pinning Service" -> "Metadata and Naming" [ltail=cluster_pinning, lhead=cluster_metadata, label="uses CID"]; "Homelab Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="pinned by allies"]; "Institutional Node" -> "Social Layer" [ltail=cluster_pinning, lhead=cluster_social, label="mirrored by institutions"]; }
digraph PinningServicesContext { node [shape=box, style=filled, fillcolor=lightgray]; // Pinning Services Domain (full detail) subgraph cluster_pinning { tooltip = "Pinning Services"; label = "Pinning Services"; style = filled; color = lightgreen; "Pinning Service"; "Homelab Node"; "Institutional Node"; } // Linked domains as colored label nodes "Metadata and Naming" [fillcolor=lightyellow, style=filled, tooltip="Metadata and Naming"]; "Social Layer" [fillcolor=lightblue, style=filled, tooltip="Social Layer"]; // Cross-domain links "Pinning Service" -> "Metadata and Naming" [label="uses CID"]; "Homelab Node" -> "Social Layer" [label="pinned by allies"]; "Institutional Node" -> "Social Layer" [label="mirrored by institutions"]; }
# See - Focused Context Diagrams