[{"data":1,"prerenderedAt":1321},["ShallowReactive",2],{"navigation":3,"\u002Fv0\u002Frelays\u002Frelay":489,"\u002Fv0\u002Frelays\u002Frelay-surround":1316},[4,287],{"title":5,"path":6,"stem":7,"children":8,"icon":286},"v1 · in progress","\u002Fv1","1.v1\u002F01.index",[9,11,46],{"title":10,"path":6,"stem":7},"The current guide",{"title":12,"path":13,"stem":14,"children":15,"icon":45},"Communities","\u002Fv1\u002Fcommunities","1.v1\u002F03.communities\u002F1.index",[16,17,21,25,29,33,37,41],{"title":12,"path":13,"stem":14},{"title":18,"path":19,"stem":20},"Decide together","\u002Fv1\u002Fcommunities\u002Fdecide-together","1.v1\u002F03.communities\u002F2.decide-together",{"title":22,"path":23,"stem":24},"Protocols","\u002Fv1\u002Fcommunities\u002Fprotocols","1.v1\u002F03.communities\u002F3.protocols",{"title":26,"path":27,"stem":28},"Features and settings","\u002Fv1\u002Fcommunities\u002Ffeatures","1.v1\u002F03.communities\u002F4.features",{"title":30,"path":31,"stem":32},"Custodians and the community key","\u002Fv1\u002Fcommunities\u002Fcustodians","1.v1\u002F03.communities\u002F5.custodians",{"title":34,"path":35,"stem":36},"Projects","\u002Fv1\u002Fcommunities\u002Fprojects","1.v1\u002F03.communities\u002F6.projects",{"title":38,"path":39,"stem":40},"Between communities","\u002Fv1\u002Fcommunities\u002Fbetween-communities","1.v1\u002F03.communities\u002F7.between-communities",{"title":42,"path":43,"stem":44},"Messages, relays and storage","\u002Fv1\u002Fcommunities\u002Fmessages-and-storage","1.v1\u002F03.communities\u002F8.messages-and-storage","i-lucide-users",{"title":47,"path":48,"stem":49,"children":50,"icon":285},"Technical reference","\u002Fv1\u002Freference","1.v1\u002F12.reference\u002F1.index",[51,52,274,278,282],{"title":47,"path":48,"stem":49},{"title":53,"path":54,"stem":55,"children":56},"Packages","\u002Fv1\u002Freference\u002Fpackages","1.v1\u002F12.reference\u002F2.packages\u002F1.index",[57,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270],{"title":53,"path":54,"stem":55},{"title":59,"path":60,"stem":61},"aes-gcm","\u002Fv1\u002Freference\u002Fpackages\u002Faes-gcm","1.v1\u002F12.reference\u002F2.packages\u002Faes-gcm",{"title":63,"path":64,"stem":65},"agreements","\u002Fv1\u002Freference\u002Fpackages\u002Fagreements","1.v1\u002F12.reference\u002F2.packages\u002Fagreements",{"title":67,"path":68,"stem":69},"auth-sdk","\u002Fv1\u002Freference\u002Fpackages\u002Fauth-sdk","1.v1\u002F12.reference\u002F2.packages\u002Fauth-sdk",{"title":71,"path":72,"stem":73},"blind-tokens","\u002Fv1\u002Freference\u002Fpackages\u002Fblind-tokens","1.v1\u002F12.reference\u002F2.packages\u002Fblind-tokens",{"title":75,"path":76,"stem":77},"blob-store","\u002Fv1\u002Freference\u002Fpackages\u002Fblob-store","1.v1\u002F12.reference\u002F2.packages\u002Fblob-store",{"title":79,"path":80,"stem":81},"broadcast-medium","\u002Fv1\u002Freference\u002Fpackages\u002Fbroadcast-medium","1.v1\u002F12.reference\u002F2.packages\u002Fbroadcast-medium",{"title":83,"path":84,"stem":85},"capacitor-keystore","\u002Fv1\u002Freference\u002Fpackages\u002Fcapacitor-keystore","1.v1\u002F12.reference\u002F2.packages\u002Fcapacitor-keystore",{"title":87,"path":88,"stem":89},"capacitor-tor","\u002Fv1\u002Freference\u002Fpackages\u002Fcapacitor-tor","1.v1\u002F12.reference\u002F2.packages\u002Fcapacitor-tor",{"title":91,"path":92,"stem":93},"capacitor-unifiedpush","\u002Fv1\u002Freference\u002Fpackages\u002Fcapacitor-unifiedpush","1.v1\u002F12.reference\u002F2.packages\u002Fcapacitor-unifiedpush",{"title":95,"path":96,"stem":97},"capture-inbox","\u002Fv1\u002Freference\u002Fpackages\u002Fcapture-inbox","1.v1\u002F12.reference\u002F2.packages\u002Fcapture-inbox",{"title":99,"path":100,"stem":101},"clan","\u002Fv1\u002Freference\u002Fpackages\u002Fclan","1.v1\u002F12.reference\u002F2.packages\u002Fclan",{"title":103,"path":104,"stem":105},"community-core","\u002Fv1\u002Freference\u002Fpackages\u002Fcommunity-core","1.v1\u002F12.reference\u002F2.packages\u002Fcommunity-core",{"title":107,"path":108,"stem":109},"community-identity","\u002Fv1\u002Freference\u002Fpackages\u002Fcommunity-identity","1.v1\u002F12.reference\u002F2.packages\u002Fcommunity-identity",{"title":111,"path":112,"stem":113},"community-log","\u002Fv1\u002Freference\u002Fpackages\u002Fcommunity-log","1.v1\u002F12.reference\u002F2.packages\u002Fcommunity-log",{"title":115,"path":116,"stem":117},"community-plugin-api","\u002Fv1\u002Freference\u002Fpackages\u002Fcommunity-plugin-api","1.v1\u002F12.reference\u002F2.packages\u002Fcommunity-plugin-api",{"title":119,"path":120,"stem":121},"corroboration","\u002Fv1\u002Freference\u002Fpackages\u002Fcorroboration","1.v1\u002F12.reference\u002F2.packages\u002Fcorroboration",{"title":123,"path":124,"stem":125},"cover-traffic-scheduler","\u002Fv1\u002Freference\u002Fpackages\u002Fcover-traffic-scheduler","1.v1\u002F12.reference\u002F2.packages\u002Fcover-traffic-scheduler",{"title":127,"path":128,"stem":129},"demo-family-tree","\u002Fv1\u002Freference\u002Fpackages\u002Fdemo-family-tree","1.v1\u002F12.reference\u002F2.packages\u002Fdemo-family-tree",{"title":131,"path":132,"stem":133},"device-link","\u002Fv1\u002Freference\u002Fpackages\u002Fdevice-link","1.v1\u002F12.reference\u002F2.packages\u002Fdevice-link",{"title":135,"path":136,"stem":137},"device-scanner","\u002Fv1\u002Freference\u002Fpackages\u002Fdevice-scanner","1.v1\u002F12.reference\u002F2.packages\u002Fdevice-scanner",{"title":139,"path":140,"stem":141},"did-e2e","\u002Fv1\u002Freference\u002Fpackages\u002Fdid-e2e","1.v1\u002F12.reference\u002F2.packages\u002Fdid-e2e",{"title":143,"path":144,"stem":145},"directory-listings","\u002Fv1\u002Freference\u002Fpackages\u002Fdirectory-listings","1.v1\u002F12.reference\u002F2.packages\u002Fdirectory-listings",{"title":147,"path":148,"stem":149},"ecosystem-cli","\u002Fv1\u002Freference\u002Fpackages\u002Fecosystem-cli","1.v1\u002F12.reference\u002F2.packages\u002Fecosystem-cli",{"title":151,"path":152,"stem":153},"endscroll","\u002Fv1\u002Freference\u002Fpackages\u002Fendscroll","1.v1\u002F12.reference\u002F2.packages\u002Fendscroll",{"title":155,"path":156,"stem":157},"ephemeral-share","\u002Fv1\u002Freference\u002Fpackages\u002Fephemeral-share","1.v1\u002F12.reference\u002F2.packages\u002Fephemeral-share",{"title":159,"path":160,"stem":161},"example-community-plugin","\u002Fv1\u002Freference\u002Fpackages\u002Fexample-community-plugin","1.v1\u002F12.reference\u002F2.packages\u002Fexample-community-plugin",{"title":163,"path":164,"stem":165},"family","\u002Fv1\u002Freference\u002Fpackages\u002Ffamily","1.v1\u002F12.reference\u002F2.packages\u002Ffamily",{"title":167,"path":168,"stem":169},"geo","\u002Fv1\u002Freference\u002Fpackages\u002Fgeo","1.v1\u002F12.reference\u002F2.packages\u002Fgeo",{"title":171,"path":172,"stem":173},"geo-claims","\u002Fv1\u002Freference\u002Fpackages\u002Fgeo-claims","1.v1\u002F12.reference\u002F2.packages\u002Fgeo-claims",{"title":175,"path":176,"stem":177},"geo-packs","\u002Fv1\u002Freference\u002Fpackages\u002Fgeo-packs","1.v1\u002F12.reference\u002F2.packages\u002Fgeo-packs",{"title":179,"path":180,"stem":181},"geo-vue","\u002Fv1\u002Freference\u002Fpackages\u002Fgeo-vue","1.v1\u002F12.reference\u002F2.packages\u002Fgeo-vue",{"title":183,"path":184,"stem":185},"historical-date","\u002Fv1\u002Freference\u002Fpackages\u002Fhistorical-date","1.v1\u002F12.reference\u002F2.packages\u002Fhistorical-date",{"title":187,"path":188,"stem":189},"identity","\u002Fv1\u002Freference\u002Fpackages\u002Fidentity","1.v1\u002F12.reference\u002F2.packages\u002Fidentity",{"title":191,"path":192,"stem":193},"identity-scope","\u002Fv1\u002Freference\u002Fpackages\u002Fidentity-scope","1.v1\u002F12.reference\u002F2.packages\u002Fidentity-scope",{"title":195,"path":196,"stem":197},"inquiry-board","\u002Fv1\u002Freference\u002Fpackages\u002Finquiry-board","1.v1\u002F12.reference\u002F2.packages\u002Finquiry-board",{"title":199,"path":200,"stem":201},"inzira","\u002Fv1\u002Freference\u002Fpackages\u002Finzira","1.v1\u002F12.reference\u002F2.packages\u002Finzira",{"title":203,"path":204,"stem":205},"isoko-client","\u002Fv1\u002Freference\u002Fpackages\u002Fisoko-client","1.v1\u002F12.reference\u002F2.packages\u002Fisoko-client",{"title":207,"path":208,"stem":209},"link-room","\u002Fv1\u002Freference\u002Fpackages\u002Flink-room","1.v1\u002F12.reference\u002F2.packages\u002Flink-room",{"title":211,"path":212,"stem":213},"notices","\u002Fv1\u002Freference\u002Fpackages\u002Fnotices","1.v1\u002F12.reference\u002F2.packages\u002Fnotices",{"title":215,"path":216,"stem":217},"one-time-mailbox","\u002Fv1\u002Freference\u002Fpackages\u002Fone-time-mailbox","1.v1\u002F12.reference\u002F2.packages\u002Fone-time-mailbox",{"title":219,"path":220,"stem":221},"portable-entitlements","\u002Fv1\u002Freference\u002Fpackages\u002Fportable-entitlements","1.v1\u002F12.reference\u002F2.packages\u002Fportable-entitlements",{"title":223,"path":224,"stem":225},"protocol-catalog","\u002Fv1\u002Freference\u002Fpackages\u002Fprotocol-catalog","1.v1\u002F12.reference\u002F2.packages\u002Fprotocol-catalog",{"title":227,"path":228,"stem":229},"protocol-core","\u002Fv1\u002Freference\u002Fpackages\u002Fprotocol-core","1.v1\u002F12.reference\u002F2.packages\u002Fprotocol-core",{"title":231,"path":232,"stem":233},"redact","\u002Fv1\u002Freference\u002Fpackages\u002Fredact","1.v1\u002F12.reference\u002F2.packages\u002Fredact",{"title":235,"path":236,"stem":237},"relay-envelope","\u002Fv1\u002Freference\u002Fpackages\u002Frelay-envelope","1.v1\u002F12.reference\u002F2.packages\u002Frelay-envelope",{"title":239,"path":240,"stem":241},"requirements","\u002Fv1\u002Freference\u002Fpackages\u002Frequirements","1.v1\u002F12.reference\u002F2.packages\u002Frequirements",{"title":243,"path":244,"stem":245},"signed-request","\u002Fv1\u002Freference\u002Fpackages\u002Fsigned-request","1.v1\u002F12.reference\u002F2.packages\u002Fsigned-request",{"title":247,"path":248,"stem":249},"storage","\u002Fv1\u002Freference\u002Fpackages\u002Fstorage","1.v1\u002F12.reference\u002F2.packages\u002Fstorage",{"title":251,"path":252,"stem":253},"suite-identity","\u002Fv1\u002Freference\u002Fpackages\u002Fsuite-identity","1.v1\u002F12.reference\u002F2.packages\u002Fsuite-identity",{"title":255,"path":256,"stem":257},"testimony","\u002Fv1\u002Freference\u002Fpackages\u002Ftestimony","1.v1\u002F12.reference\u002F2.packages\u002Ftestimony",{"title":259,"path":260,"stem":261},"testimony-qa","\u002Fv1\u002Freference\u002Fpackages\u002Ftestimony-qa","1.v1\u002F12.reference\u002F2.packages\u002Ftestimony-qa",{"title":263,"path":264,"stem":265},"trust-graph","\u002Fv1\u002Freference\u002Fpackages\u002Ftrust-graph","1.v1\u002F12.reference\u002F2.packages\u002Ftrust-graph",{"title":267,"path":268,"stem":269},"web-session","\u002Fv1\u002Freference\u002Fpackages\u002Fweb-session","1.v1\u002F12.reference\u002F2.packages\u002Fweb-session",{"title":271,"path":272,"stem":273},"webauthn-lock","\u002Fv1\u002Freference\u002Fpackages\u002Fwebauthn-lock","1.v1\u002F12.reference\u002F2.packages\u002Fwebauthn-lock",{"title":275,"path":276,"stem":277},"Apps","\u002Fv1\u002Freference\u002Fapps","1.v1\u002F12.reference\u002F3.apps",{"title":279,"path":280,"stem":281},"Services","\u002Fv1\u002Freference\u002Fservices","1.v1\u002F12.reference\u002F4.services",{"title":22,"path":283,"stem":284},"\u002Fv1\u002Freference\u002Fprotocols","1.v1\u002F12.reference\u002F5.protocols","i-lucide-library","i-lucide-book-open",{"title":288,"icon":289,"path":290,"stem":291,"children":292,"page":470},"v0 · summer 2026","i-lucide-archive","\u002Fv0","2.v0",[293,329,365,401,436,452,471],{"title":294,"path":295,"stem":296,"children":297,"icon":328},"Getting Started","\u002Fv0\u002Fgetting-started","2.v0\u002F1.getting-started\u002F1.index",[298,300,304,308,312,316,320,324],{"title":299,"path":295,"stem":296},"What is this?",{"title":301,"path":302,"stem":303},"Web, Desktop, or Mobile","\u002Fv0\u002Fgetting-started\u002Faccess-methods","2.v0\u002F1.getting-started\u002F2.access-methods",{"title":305,"path":306,"stem":307},"Before You Begin","\u002Fv0\u002Fgetting-started\u002Fbefore-you-begin","2.v0\u002F1.getting-started\u002F3.before-you-begin",{"title":309,"path":310,"stem":311},"Install the Apps","\u002Fv0\u002Fgetting-started\u002Finstall","2.v0\u002F1.getting-started\u002F4.install",{"title":313,"path":314,"stem":315},"F-Droid, Explained","\u002Fv0\u002Fgetting-started\u002Ffdroid","2.v0\u002F1.getting-started\u002F5.fdroid",{"title":317,"path":318,"stem":319},"Your First Family Tree","\u002Fv0\u002Fgetting-started\u002Fyour-first-tree","2.v0\u002F1.getting-started\u002F6.your-first-tree",{"title":321,"path":322,"stem":323},"Invite Family Members","\u002Fv0\u002Fgetting-started\u002Finvite-family","2.v0\u002F1.getting-started\u002F7.invite-family",{"title":325,"path":326,"stem":327},"Connect Family Branches","\u002Fv0\u002Fgetting-started\u002Fconnect-branches","2.v0\u002F1.getting-started\u002F8.connect-branches","i-lucide-footprints",{"title":330,"path":331,"stem":332,"children":333,"icon":45},"Abantu","\u002Fv0\u002Fabantu","2.v0\u002F2.abantu\u002F1.index",[334,336,339,342,345,349,353,357,361],{"title":335,"path":331,"stem":332},"Abantu — Community Governance",{"title":12,"path":337,"stem":338},"\u002Fv0\u002Fabantu\u002Fcommunities","2.v0\u002F2.abantu\u002F2.communities",{"title":22,"path":340,"stem":341},"\u002Fv0\u002Fabantu\u002Fprotocols","2.v0\u002F2.abantu\u002F3.protocols",{"title":34,"path":343,"stem":344},"\u002Fv0\u002Fabantu\u002Fprojects","2.v0\u002F2.abantu\u002F4.projects",{"title":346,"path":347,"stem":348},"Proposals and Roles","\u002Fv0\u002Fabantu\u002Fproposals-and-roles","2.v0\u002F2.abantu\u002F5.proposals-and-roles",{"title":350,"path":351,"stem":352},"Sync and Relay","\u002Fv0\u002Fabantu\u002Fsync-and-relay","2.v0\u002F2.abantu\u002F6.sync-and-relay",{"title":354,"path":355,"stem":356},"Identity and Devices","\u002Fv0\u002Fabantu\u002Fidentity-and-devices","2.v0\u002F2.abantu\u002F7.identity-and-devices",{"title":358,"path":359,"stem":360},"Data and Privacy","\u002Fv0\u002Fabantu\u002Fprivacy","2.v0\u002F2.abantu\u002F8.privacy",{"title":362,"path":363,"stem":364},"Plugins and Extensibility","\u002Fv0\u002Fabantu\u002Fplugins-and-extensibility","2.v0\u002F2.abantu\u002F9.plugins-and-extensibility",{"title":366,"path":367,"stem":368,"children":369,"icon":400},"Iwacu","\u002Fv0\u002Fiwacu","2.v0\u002F3.iwacu\u002F1.index",[370,372,376,380,384,388,392,396],{"title":371,"path":367,"stem":368},"Iwacu — Family Tree",{"title":373,"path":374,"stem":375},"Terminal Commands","\u002Fv0\u002Fiwacu\u002Fterminal-commands","2.v0\u002F3.iwacu\u002F2.terminal-commands",{"title":377,"path":378,"stem":379},"Manage Page and Sync","\u002Fv0\u002Fiwacu\u002Fmanage-and-sync","2.v0\u002F3.iwacu\u002F3.manage-and-sync",{"title":381,"path":382,"stem":383},"Family History and the Atlas","\u002Fv0\u002Fiwacu\u002Fhistory-and-atlas","2.v0\u002F3.iwacu\u002F4.history-and-atlas",{"title":385,"path":386,"stem":387},"Script Editor","\u002Fv0\u002Fiwacu\u002Fscript-editor","2.v0\u002F3.iwacu\u002F5.script-editor",{"title":389,"path":390,"stem":391},"Inviting and Connecting","\u002Fv0\u002Fiwacu\u002Finviting-and-connecting","2.v0\u002F3.iwacu\u002F6.inviting-and-connecting",{"title":393,"path":394,"stem":395},"Desktop App and Devices","\u002Fv0\u002Fiwacu\u002Fdesktop-and-devices","2.v0\u002F3.iwacu\u002F7.desktop-and-devices",{"title":397,"path":398,"stem":399},"Reference","\u002Fv0\u002Fiwacu\u002Freference","2.v0\u002F3.iwacu\u002F8.reference","i-lucide-trees",{"title":402,"path":403,"stem":404,"children":405,"icon":435},"Isoko","\u002Fv0\u002Fisoko","2.v0\u002F4.isoko\u002F1.index",[406,408,411,415,419,423,427,431],{"title":407,"path":403,"stem":404},"Isoko — Local Marketplace",{"title":22,"path":409,"stem":410},"\u002Fv0\u002Fisoko\u002Fprotocols","2.v0\u002F4.isoko\u002F2.protocols",{"title":412,"path":413,"stem":414},"Listings and Messaging","\u002Fv0\u002Fisoko\u002Flistings-and-messaging","2.v0\u002F4.isoko\u002F3.listings-and-messaging",{"title":416,"path":417,"stem":418},"Tracked Deliveries","\u002Fv0\u002Fisoko\u002Fdeliveries","2.v0\u002F4.isoko\u002F4.deliveries",{"title":420,"path":421,"stem":422},"Wallet and Reputation","\u002Fv0\u002Fisoko\u002Fwallet-and-reputation","2.v0\u002F4.isoko\u002F5.wallet-and-reputation",{"title":424,"path":425,"stem":426},"Market Cells","\u002Fv0\u002Fisoko\u002Fcells","2.v0\u002F4.isoko\u002F6.cells",{"title":428,"path":429,"stem":430},"Safety Scanner","\u002Fv0\u002Fisoko\u002Fsafety","2.v0\u002F4.isoko\u002F7.safety",{"title":432,"path":433,"stem":434},"Web Version, Privacy, and Limitations","\u002Fv0\u002Fisoko\u002Fweb-and-privacy","2.v0\u002F4.isoko\u002F8.web-and-privacy","i-lucide-store",{"title":437,"path":438,"stem":439,"children":440,"icon":451},"Playground","\u002Fv0\u002Fplayground","2.v0\u002F5.playground\u002F1.index",[441,443,447],{"title":442,"path":438,"stem":439},"Playground — Try It in the Browser",{"title":444,"path":445,"stem":446},"Using the Tutorials","\u002Fv0\u002Fplayground\u002Fusing-tutorials","2.v0\u002F5.playground\u002F2.using-tutorials",{"title":448,"path":449,"stem":450},"How Tutorials Are Made","\u002Fv0\u002Fplayground\u002Fbuilding-tutorials","2.v0\u002F5.playground\u002F3.building-tutorials","i-lucide-flask-conical",{"title":453,"icon":454,"path":455,"stem":456,"children":457,"page":470},"Relays","i-lucide-server","\u002Fv0\u002Frelays","2.v0\u002F6.relays",[458,462,466],{"title":459,"path":460,"stem":461},"Relays Overview","\u002Fv0\u002Frelays\u002Foverview","2.v0\u002F6.relays\u002F1.overview",{"title":463,"path":464,"stem":465},"Deploy a Relay Node","\u002Fv0\u002Frelays\u002Frelay","2.v0\u002F6.relays\u002F2.relay",{"title":467,"path":468,"stem":469},"Configure Tor Hidden Service","\u002Fv0\u002Frelays\u002Ftor","2.v0\u002F6.relays\u002F3.tor",false,{"title":472,"icon":473,"path":474,"stem":475,"children":476,"page":470},"Privacy & Security","i-lucide-shield","\u002Fv0\u002Fprivacy","2.v0\u002F7.privacy",[477,481,485],{"title":478,"path":479,"stem":480},"How Privacy Works Here","\u002Fv0\u002Fprivacy\u002Fhow-it-works","2.v0\u002F7.privacy\u002F1.how-it-works",{"title":482,"path":483,"stem":484},"Device Security","\u002Fv0\u002Fprivacy\u002Fdevice","2.v0\u002F7.privacy\u002F2.device",{"title":486,"path":487,"stem":488},"Under Pressure","\u002Fv0\u002Fprivacy\u002Fcoercion","2.v0\u002F7.privacy\u002F3.coercion",{"id":490,"title":463,"body":491,"description":1310,"extension":1311,"links":1312,"meta":1313,"navigation":655,"path":464,"seo":1314,"stem":465,"__hash__":1315},"docs\u002F2.v0\u002F6.relays\u002F2.relay.md",{"type":492,"value":493,"toc":1301},"minimark",[494,498,502,505,572,583,588,877,883,889,947,958,962,976,983,1020,1046,1052,1073,1076,1099,1110,1114,1131,1134,1159,1163,1168,1175,1201,1204,1208,1211,1215,1218,1262,1266,1297],[495,496,463],"h1",{"id":497},"deploy-a-relay-node",[499,500,501],"p",{},"Relays are optional — apps work fully offline. A relay is only needed for real-time sync between different devices. Anyone can run one; the relay sees only ciphertext and signed events.",[499,503,504],{},"There are three relays, one per app:",[506,507,508,527],"table",{},[509,510,511],"thead",{},[512,513,514,518,521,524],"tr",{},[515,516,517],"th",{},"Relay",[515,519,520],{},"Port",[515,522,523],{},"Storage",[515,525,526],{},"What it does",[528,529,530,545,558],"tbody",{},[512,531,532,536,539,542],{},[533,534,535],"td",{},"iwacu",[533,537,538],{},"4100",[533,540,541],{},"files",[533,543,544],{},"Store-and-forward for encrypted family-tree sync",[512,546,547,550,553,555],{},[533,548,549],{},"abantu",[533,551,552],{},"3002",[533,554,541],{},[533,556,557],{},"Event-log rooms for community sync",[512,559,560,563,566,569],{},[533,561,562],{},"isoko",[533,564,565],{},"4000",[533,567,568],{},"Redis",[533,570,571],{},"DIDComm messages, public listings, DID inboxes, protocol registry",[499,573,574,575,582],{},"This guide assumes a Linux server with Docker and Docker Compose installed. If not: ",[576,577,581],"a",{"href":578,"rel":579},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F",[580],"nofollow","docs.docker.com\u002Fengine\u002Finstall",".",[584,585,587],"h2",{"id":586},"get-the-code","Get the code",[589,590,591,736],"code-group",{},[592,593,599],"pre",{"className":594,"code":595,"filename":596,"language":597,"meta":598,"style":598},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# iwacu relay\ngit clone https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fiwacu.git\ncd iwacu\ndocker compose up -d\n\n# abantu relay\ngit clone https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fabantu.git\ncd abantu\u002Frelay\ndocker compose up -d\n\n# isoko relay\ngit clone https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fisoko.git\ncd isoko\u002Frelay\ndocker compose up -d --build\n","Codeberg","bash","",[600,601,602,611,625,635,650,657,663,673,681,692,697,703,713,721],"code",{"__ignoreMap":598},[603,604,607],"span",{"class":605,"line":606},"line",1,[603,608,610],{"class":609},"sHwdD","# iwacu relay\n",[603,612,614,618,622],{"class":605,"line":613},2,[603,615,617],{"class":616},"sBMFI","git",[603,619,621],{"class":620},"sfazB"," clone",[603,623,624],{"class":620}," https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fiwacu.git\n",[603,626,628,632],{"class":605,"line":627},3,[603,629,631],{"class":630},"s2Zo4","cd",[603,633,634],{"class":620}," iwacu\n",[603,636,638,641,644,647],{"class":605,"line":637},4,[603,639,640],{"class":616},"docker",[603,642,643],{"class":620}," compose",[603,645,646],{"class":620}," up",[603,648,649],{"class":620}," -d\n",[603,651,653],{"class":605,"line":652},5,[603,654,656],{"emptyLinePlaceholder":655},true,"\n",[603,658,660],{"class":605,"line":659},6,[603,661,662],{"class":609},"# abantu relay\n",[603,664,666,668,670],{"class":605,"line":665},7,[603,667,617],{"class":616},[603,669,621],{"class":620},[603,671,672],{"class":620}," https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fabantu.git\n",[603,674,676,678],{"class":605,"line":675},8,[603,677,631],{"class":630},[603,679,680],{"class":620}," abantu\u002Frelay\n",[603,682,684,686,688,690],{"class":605,"line":683},9,[603,685,640],{"class":616},[603,687,643],{"class":620},[603,689,646],{"class":620},[603,691,649],{"class":620},[603,693,695],{"class":605,"line":694},10,[603,696,656],{"emptyLinePlaceholder":655},[603,698,700],{"class":605,"line":699},11,[603,701,702],{"class":609},"# isoko relay\n",[603,704,706,708,710],{"class":605,"line":705},12,[603,707,617],{"class":616},[603,709,621],{"class":620},[603,711,712],{"class":620}," https:\u002F\u002Fcodeberg.org\u002Fphuman\u002Fisoko.git\n",[603,714,716,718],{"class":605,"line":715},13,[603,717,631],{"class":630},[603,719,720],{"class":620}," isoko\u002Frelay\n",[603,722,724,726,728,730,733],{"class":605,"line":723},14,[603,725,640],{"class":616},[603,727,643],{"class":620},[603,729,646],{"class":620},[603,731,732],{"class":620}," -d",[603,734,735],{"class":620}," --build\n",[592,737,740],{"className":594,"code":738,"filename":739,"language":597,"meta":598,"style":598},"# iwacu relay\ngit clone http:\u002F\u002F\u003Cgitea-onion>\u002Fpat\u002Fiwacu-nuxt.git\ncd iwacu-nuxt\ndocker compose up -d\n\n# abantu relay\ngit clone http:\u002F\u002F\u003Cgitea-onion>\u002Fpat\u002Fabantu.git\ncd abantu\u002Frelay\ndocker compose up -d\n\n# isoko relay\ngit clone http:\u002F\u002F\u003Cgitea-onion>\u002Fpat\u002Fisoko.git\ncd isoko\u002Frelay\ndocker compose up -d --build\n","Onion (Tor)",[600,741,742,746,772,779,789,793,797,816,822,832,836,840,859,865],{"__ignoreMap":598},[603,743,744],{"class":605,"line":606},[603,745,610],{"class":609},[603,747,748,750,752,755,759,762,766,769],{"class":605,"line":613},[603,749,617],{"class":616},[603,751,621],{"class":620},[603,753,754],{"class":620}," http:\u002F\u002F",[603,756,758],{"class":757},"sMK4o","\u003C",[603,760,761],{"class":620},"gitea-onio",[603,763,765],{"class":764},"sTEyZ","n",[603,767,768],{"class":757},">",[603,770,771],{"class":620},"\u002Fpat\u002Fiwacu-nuxt.git\n",[603,773,774,776],{"class":605,"line":627},[603,775,631],{"class":630},[603,777,778],{"class":620}," iwacu-nuxt\n",[603,780,781,783,785,787],{"class":605,"line":637},[603,782,640],{"class":616},[603,784,643],{"class":620},[603,786,646],{"class":620},[603,788,649],{"class":620},[603,790,791],{"class":605,"line":652},[603,792,656],{"emptyLinePlaceholder":655},[603,794,795],{"class":605,"line":659},[603,796,662],{"class":609},[603,798,799,801,803,805,807,809,811,813],{"class":605,"line":665},[603,800,617],{"class":616},[603,802,621],{"class":620},[603,804,754],{"class":620},[603,806,758],{"class":757},[603,808,761],{"class":620},[603,810,765],{"class":764},[603,812,768],{"class":757},[603,814,815],{"class":620},"\u002Fpat\u002Fabantu.git\n",[603,817,818,820],{"class":605,"line":675},[603,819,631],{"class":630},[603,821,680],{"class":620},[603,823,824,826,828,830],{"class":605,"line":683},[603,825,640],{"class":616},[603,827,643],{"class":620},[603,829,646],{"class":620},[603,831,649],{"class":620},[603,833,834],{"class":605,"line":694},[603,835,656],{"emptyLinePlaceholder":655},[603,837,838],{"class":605,"line":699},[603,839,702],{"class":609},[603,841,842,844,846,848,850,852,854,856],{"class":605,"line":705},[603,843,617],{"class":616},[603,845,621],{"class":620},[603,847,754],{"class":620},[603,849,758],{"class":757},[603,851,761],{"class":620},[603,853,765],{"class":764},[603,855,768],{"class":757},[603,857,858],{"class":620},"\u002Fpat\u002Fisoko.git\n",[603,860,861,863],{"class":605,"line":715},[603,862,631],{"class":630},[603,864,720],{"class":620},[603,866,867,869,871,873,875],{"class":605,"line":723},[603,868,640],{"class":616},[603,870,643],{"class":620},[603,872,646],{"class":620},[603,874,732],{"class":620},[603,876,735],{"class":620},[499,878,879,880],{},"Gitea onion: ",[600,881,882],{},"vzorzotnj2ouvs7vi3n5dkdnkjvklhoasvgferehl63tpy2ftfh34did.onion",[499,884,885],{},[886,887,888],"strong",{},"Live relay addresses:",[506,890,891,903],{},[509,892,893],{},[512,894,895,897,900],{},[515,896,517],{},[515,898,899],{},"HTTPS (default)",[515,901,902],{},"Onion (fallback, via Tor\u002FOrbot)",[528,904,905,919,933],{},[512,906,907,909,914],{},[533,908,535],{},[533,910,911],{},[600,912,913],{},"wss:\u002F\u002Fiwacurelay.paramira.org",[533,915,916],{},[600,917,918],{},"ws:\u002F\u002Fxijxk4pfwi7fd66qhjgyd73qg4ebct3fis357fg62p5qarfxxd3pkqqd.onion",[512,920,921,923,928],{},[533,922,549],{},[533,924,925],{},[600,926,927],{},"wss:\u002F\u002Fabanturelay.paramira.org",[533,929,930],{},[600,931,932],{},"ws:\u002F\u002Fbbxczm7ift34qf3botz53ukls22u23aiu2cbp2nxgpoagar474gmafqd.onion",[512,934,935,937,942],{},[533,936,562],{},[533,938,939],{},[600,940,941],{},"https:\u002F\u002Fisokorelay.paramira.org",[533,943,944],{},[600,945,946],{},"http:\u002F\u002Fjojqesyyk76xkqtnb7w2hunj2ao5ns3g3ijw7gwq4gnlb2ckupimryad.onion",[499,948,949,950,953,954,957],{},"The HTTPS hostnames are what the apps ship with as defaults. The onion addresses reach the same relays through Tor — switch to them in the app's relay settings if the clearnet domain is blocked where you are. Plain ",[600,951,952],{},"http","\u002F",[600,955,956],{},"ws"," over onion is safe: the hidden-service protocol provides end-to-end encryption and authentication itself.",[584,959,961],{"id":960},"the-isoko-relay","The isoko relay",[499,963,964,965,967,968,971,972,975],{},"The isoko relay differs from the other two: it ships as a three-service stack — the relay itself, a ",[886,966,568],{}," instance for storage (listings, DID inboxes, protocol adoption), and a ",[886,969,970],{},"Tor sidecar"," that exposes the relay as a hidden service. ",[600,973,974],{},"docker compose up -d --build"," starts all three.",[499,977,978,979,982],{},"Two optional environment variables (set them in a ",[600,980,981],{},".env"," file next to the compose file, or inline):",[506,984,985,995],{},[509,986,987],{},[512,988,989,992],{},[515,990,991],{},"Variable",[515,993,994],{},"Purpose",[528,996,997,1010],{},[512,998,999,1004],{},[533,1000,1001],{},[600,1002,1003],{},"RELAY_BASE_URL",[533,1005,1006,1007,1009],{},"The public URL clients see in invitation links (default ",[600,1008,941],{},")",[512,1011,1012,1017],{},[533,1013,1014],{},[600,1015,1016],{},"OPERATOR_DID",[533,1018,1019],{},"Your DID — lets you claim the daily +50 Community Credits hosting bonus in the app",[592,1021,1023],{"className":594,"code":1022,"language":597,"meta":598,"style":598},"OPERATOR_DID=did:iwacu:yourdid docker compose up -d --build\n",[600,1024,1025],{"__ignoreMap":598},[603,1026,1027,1029,1032,1035,1038,1040,1042,1044],{"class":605,"line":606},[603,1028,1016],{"class":764},[603,1030,1031],{"class":757},"=",[603,1033,1034],{"class":620},"did:iwacu:yourdid",[603,1036,1037],{"class":616}," docker",[603,1039,643],{"class":620},[603,1041,646],{"class":620},[603,1043,732],{"class":620},[603,1045,735],{"class":620},[499,1047,1048,1049,1051],{},"The isoko relay listens on port ",[886,1050,565],{}," for both HTTP and WebSocket, bound to loopback only — the public entry points are a TLS reverse proxy (nginx\u002FCaddy) in front of it and the Tor sidecar. The onion address (port 80 → relay) appears once Tor bootstraps:",[592,1053,1055],{"className":594,"code":1054,"language":597,"meta":598,"style":598},"docker exec isoko-relay-tor cat \u002Fvar\u002Flib\u002Ftor\u002Fisoko_relay\u002Fhostname\n",[600,1056,1057],{"__ignoreMap":598},[603,1058,1059,1061,1064,1067,1070],{"class":605,"line":606},[603,1060,640],{"class":616},[603,1062,1063],{"class":620}," exec",[603,1065,1066],{"class":620}," isoko-relay-tor",[603,1068,1069],{"class":620}," cat",[603,1071,1072],{"class":620}," \u002Fvar\u002Flib\u002Ftor\u002Fisoko_relay\u002Fhostname\n",[499,1074,1075],{},"Verify it is up:",[592,1077,1079],{"className":594,"code":1078,"language":597,"meta":598,"style":598},"curl http:\u002F\u002Flocalhost:4000\u002Fapi\u002Frelay\u002Finfo\ncurl http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fprotocols     # lists the system protocols\n",[600,1080,1081,1089],{"__ignoreMap":598},[603,1082,1083,1086],{"class":605,"line":606},[603,1084,1085],{"class":616},"curl",[603,1087,1088],{"class":620}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Frelay\u002Finfo\n",[603,1090,1091,1093,1096],{"class":605,"line":613},[603,1092,1085],{"class":616},[603,1094,1095],{"class":620}," http:\u002F\u002Flocalhost:4000\u002Fapi\u002Fprotocols",[603,1097,1098],{"class":609},"     # lists the system protocols\n",[499,1100,1101,1102,1105,1106,1109],{},"Share the relay URL with your community — members paste it into ",[886,1103,1104],{},"Settings → Relay"," in isoko, and into ",[886,1107,1108],{},"Settings → isoko marketplace relay"," in abantu (so published community protocols and adoptions flow to the same place).",[584,1111,1113],{"id":1112},"check-it-is-running","Check it is running",[592,1115,1117],{"className":594,"code":1116,"language":597,"meta":598,"style":598},"docker compose logs -f\n",[600,1118,1119],{"__ignoreMap":598},[603,1120,1121,1123,1125,1128],{"class":605,"line":606},[603,1122,640],{"class":616},[603,1124,643],{"class":620},[603,1126,1127],{"class":620}," logs",[603,1129,1130],{"class":620}," -f\n",[499,1132,1133],{},"The iwacu (port 4100) and abantu (port 3002) relays expose a WebSocket endpoint on loopback. You can verify with:",[592,1135,1137],{"className":594,"code":1136,"language":597,"meta":598,"style":598},"curl http:\u002F\u002Flocalhost:4100\u002Fhealth   # iwacu\ncurl http:\u002F\u002Flocalhost:3002          # abantu\n",[600,1138,1139,1149],{"__ignoreMap":598},[603,1140,1141,1143,1146],{"class":605,"line":606},[603,1142,1085],{"class":616},[603,1144,1145],{"class":620}," http:\u002F\u002Flocalhost:4100\u002Fhealth",[603,1147,1148],{"class":609},"   # iwacu\n",[603,1150,1151,1153,1156],{"class":605,"line":613},[603,1152,1085],{"class":616},[603,1154,1155],{"class":620}," http:\u002F\u002Flocalhost:3002",[603,1157,1158],{"class":609},"          # abantu\n",[584,1160,1162],{"id":1161},"expose-via-tor-hidden-service-recommended","Expose via Tor hidden service (recommended)",[499,1164,1165,1166,582],{},"For a censorship-resistant relay with no public IP or domain needed, see ",[576,1167,467],{"href":468},[499,1169,1170,1171,1174],{},"Once Tor is running, your relay's ",[600,1172,1173],{},".onion"," address will be in:",[592,1176,1178],{"className":594,"code":1177,"language":597,"meta":598,"style":598},"cat \u002Fvar\u002Flib\u002Ftor\u002F\u003Cservice-dir>\u002Fhostname\n",[600,1179,1180],{"__ignoreMap":598},[603,1181,1182,1185,1188,1190,1193,1196,1198],{"class":605,"line":606},[603,1183,1184],{"class":616},"cat",[603,1186,1187],{"class":620}," \u002Fvar\u002Flib\u002Ftor\u002F",[603,1189,758],{"class":757},[603,1191,1192],{"class":620},"service-di",[603,1194,1195],{"class":764},"r",[603,1197,768],{"class":757},[603,1199,1200],{"class":620},"\u002Fhostname\n",[499,1202,1203],{},"Share that address with your community — paste it into the relay field in the app's settings.",[584,1205,1207],{"id":1206},"expose-via-https-alternative","Expose via HTTPS (alternative)",[499,1209,1210],{},"Put the relay behind Caddy or nginx with a domain and TLS certificate. Add the public URL to the relay settings in the app.",[584,1212,1214],{"id":1213},"logs-and-privacy","Logs and privacy",[499,1216,1217],{},"The relay logs no token content, no IP addresses, and no user identifiers. The only output is startup messages and WebSocket connection events (connected \u002F disconnected).",[592,1219,1221],{"className":594,"code":1220,"language":597,"meta":598,"style":598},"docker compose logs -f    # follow logs\ndocker compose down       # stop\ndocker compose up -d      # start\n",[600,1222,1223,1237,1249],{"__ignoreMap":598},[603,1224,1225,1227,1229,1231,1234],{"class":605,"line":606},[603,1226,640],{"class":616},[603,1228,643],{"class":620},[603,1230,1127],{"class":620},[603,1232,1233],{"class":620}," -f",[603,1235,1236],{"class":609},"    # follow logs\n",[603,1238,1239,1241,1243,1246],{"class":605,"line":613},[603,1240,640],{"class":616},[603,1242,643],{"class":620},[603,1244,1245],{"class":620}," down",[603,1247,1248],{"class":609},"       # stop\n",[603,1250,1251,1253,1255,1257,1259],{"class":605,"line":627},[603,1252,640],{"class":616},[603,1254,643],{"class":620},[603,1256,646],{"class":620},[603,1258,732],{"class":620},[603,1260,1261],{"class":609},"      # start\n",[584,1263,1265],{"id":1264},"update","Update",[592,1267,1269],{"className":594,"code":1268,"language":597,"meta":598,"style":598},"git pull\ndocker compose build\ndocker compose up -d\n",[600,1270,1271,1278,1287],{"__ignoreMap":598},[603,1272,1273,1275],{"class":605,"line":606},[603,1274,617],{"class":616},[603,1276,1277],{"class":620}," pull\n",[603,1279,1280,1282,1284],{"class":605,"line":613},[603,1281,640],{"class":616},[603,1283,643],{"class":620},[603,1285,1286],{"class":620}," build\n",[603,1288,1289,1291,1293,1295],{"class":605,"line":627},[603,1290,640],{"class":616},[603,1292,643],{"class":620},[603,1294,646],{"class":620},[603,1296,649],{"class":620},[1298,1299,1300],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":598,"searchDepth":606,"depth":613,"links":1302},[1303,1304,1305,1306,1307,1308,1309],{"id":586,"depth":613,"text":587},{"id":960,"depth":613,"text":961},{"id":1112,"depth":613,"text":1113},{"id":1161,"depth":613,"text":1162},{"id":1206,"depth":613,"text":1207},{"id":1213,"depth":613,"text":1214},{"id":1264,"depth":613,"text":1265},"How to run an iwacu, abantu, or isoko relay with Docker Compose. Takes about 15 minutes on a fresh server.","md",null,{},{"title":463,"description":1310},"5D-TUvcqoS-yXaKymNpSz0RrcxVga-1o6qA1W29IeJs",[1317,1319],{"title":459,"path":460,"stem":461,"description":1318,"children":-1},"What it means to run your own relay server, why you might want to, and what is required.",{"title":467,"path":468,"stem":469,"description":1320,"children":-1},"How to make your relay reachable only via a .onion address. Nobody sees the server's IP — not the user, not their ISP, not the platform they use to share the link.",1791986799383]