[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"navigation":3,"\u002Fself-hosting\u002Ftor":87,"\u002Fself-hosting\u002Ftor-surround":506},[4,32,51,69],{"title":5,"path":6,"stem":7,"children":8,"icon":31},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11,15,19,23,27],{"title":10,"path":6,"stem":7},"What is this?",{"title":12,"path":13,"stem":14},"Before You Begin","\u002Fgetting-started\u002Fbefore-you-begin","1.getting-started\u002F2.before-you-begin",{"title":16,"path":17,"stem":18},"Install the Apps","\u002Fgetting-started\u002Finstall","1.getting-started\u002F3.install",{"title":20,"path":21,"stem":22},"Your First Family Tree","\u002Fgetting-started\u002Fyour-first-tree","1.getting-started\u002F4.your-first-tree",{"title":24,"path":25,"stem":26},"Invite Family Members","\u002Fgetting-started\u002Finvite-family","1.getting-started\u002F5.invite-family",{"title":28,"path":29,"stem":30},"Connect Family Branches","\u002Fgetting-started\u002Fconnect-branches","1.getting-started\u002F6.connect-branches","i-lucide-footprints",{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":50},"Apps","i-lucide-smartphone","\u002Fapps","2.apps",[38,42,46],{"title":39,"path":40,"stem":41},"Iwacu — Family Tree","\u002Fapps\u002Fiwacu","2.apps\u002F1.iwacu",{"title":43,"path":44,"stem":45},"Isoko — Local Marketplace","\u002Fapps\u002Fisoko","2.apps\u002F2.isoko",{"title":47,"path":48,"stem":49},"Abantu — Community Governance","\u002Fapps\u002Fabantu","2.apps\u002F3.abantu",false,{"title":52,"icon":53,"path":54,"stem":55,"children":56,"page":50},"Self-Hosting","i-lucide-server","\u002Fself-hosting","3.self-hosting",[57,61,65],{"title":58,"path":59,"stem":60},"Self-Hosting Overview","\u002Fself-hosting\u002Foverview","3.self-hosting\u002F1.overview",{"title":62,"path":63,"stem":64},"Deploy the Relay Server","\u002Fself-hosting\u002Frelay","3.self-hosting\u002F2.relay",{"title":66,"path":67,"stem":68},"Configure Tor Hidden Service","\u002Fself-hosting\u002Ftor","3.self-hosting\u002F3.tor",{"title":70,"icon":71,"path":72,"stem":73,"children":74,"page":50},"Privacy & Security","i-lucide-shield","\u002Fprivacy","4.privacy",[75,79,83],{"title":76,"path":77,"stem":78},"How Privacy Works Here","\u002Fprivacy\u002Fhow-it-works","4.privacy\u002F1.how-it-works",{"title":80,"path":81,"stem":82},"Device Security","\u002Fprivacy\u002Fdevice","4.privacy\u002F2.device",{"title":84,"path":85,"stem":86},"Under Pressure","\u002Fprivacy\u002Fcoercion","4.privacy\u002F3.coercion",{"id":88,"title":66,"body":89,"description":499,"extension":500,"links":501,"meta":502,"navigation":503,"path":67,"seo":504,"stem":68,"__hash__":505},"docs\u002F3.self-hosting\u002F3.tor.md",{"type":90,"value":91,"toc":492},"minimark",[92,96,105,108,121,126,141,160,164,198,204,225,228,236,243,261,264,280,284,287,306,309,343,346,350,356,362,368,371,382,386,395,419,425,428,485,488],[93,94,66],"h1",{"id":95},"configure-tor-hidden-service",[97,98,99,100,104],"p",{},"When your relay runs as a Tor hidden service, the server's IP address is never revealed to anyone who receives an invitation. The relay is reachable only at a ",[101,102,103],"code",{},".onion"," address.",[97,106,107],{},"This matters because:",[109,110,111,115,118],"ul",{},[112,113,114],"li",{},"Someone who intercepts the invitation link cannot find or block your server.",[112,116,117],{},"The server's location is not tied to you personally.",[112,119,120],{},"The person opening the link cannot accidentally reveal the server's IP to their ISP.",[122,123,125],"h2",{"id":124},"how-this-is-set-up","How this is set up",[97,127,128,129,132,133,136,137,140],{},"The ",[101,130,131],{},"docker-compose.yml"," in ",[101,134,135],{},"infra\u002Frelay"," includes a ",[101,138,139],{},"tor"," service. When started, it:",[142,143,144,150,157],"ol",{},[112,145,146,147,149],{},"Generates a unique ",[101,148,103],{}," key and address (stored in a Docker volume so it persists across restarts).",[112,151,152,153,156],{},"Creates a hidden service that forwards ",[101,154,155],{},".onion:80"," traffic to the relay container on port 3000.",[112,158,159],{},"Binds no host ports — the relay is unreachable from the public internet except through Tor.",[122,161,163],{"id":162},"start-with-tor","Start with Tor",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker compose up -d tor relay\n","bash","",[101,172,173],{"__ignoreMap":170},[174,175,178,182,186,189,192,195],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"sBMFI","docker",[174,183,185],{"class":184},"sfazB"," compose",[174,187,188],{"class":184}," up",[174,190,191],{"class":184}," -d",[174,193,194],{"class":184}," tor",[174,196,197],{"class":184}," relay\n",[97,199,200,201,203],{},"Wait about 30 seconds for Tor to bootstrap. Then read the ",[101,202,103],{}," address:",[165,205,207],{"className":167,"code":206,"language":169,"meta":170,"style":170},"docker exec relay_tor_1 cat \u002Fvar\u002Flib\u002Ftor\u002Fhidden_service\u002Fhostname\n",[101,208,209],{"__ignoreMap":170},[174,210,211,213,216,219,222],{"class":176,"line":177},[174,212,181],{"class":180},[174,214,215],{"class":184}," exec",[174,217,218],{"class":184}," relay_tor_1",[174,220,221],{"class":184}," cat",[174,223,224],{"class":184}," \u002Fvar\u002Flib\u002Ftor\u002Fhidden_service\u002Fhostname\n",[97,226,227],{},"You will see something like:",[165,229,234],{"className":230,"code":232,"language":233},[231],"language-text","abc123xyz789....onion\n","text",[101,235,232],{"__ignoreMap":170},[97,237,238,239,242],{},"Copy this address. Update your ",[101,240,241],{},".env",":",[165,244,246],{"className":167,"code":245,"language":169,"meta":170,"style":170},"RELAY_BASE_URL=http:\u002F\u002Fabc123xyz789....onion\n",[101,247,248],{"__ignoreMap":170},[174,249,250,254,258],{"class":176,"line":177},[174,251,253],{"class":252},"sTEyZ","RELAY_BASE_URL",[174,255,257],{"class":256},"sMK4o","=",[174,259,260],{"class":184},"http:\u002F\u002Fabc123xyz789....onion\n",[97,262,263],{},"Restart the relay:",[165,265,267],{"className":167,"code":266,"language":169,"meta":170,"style":170},"docker compose restart relay\n",[101,268,269],{"__ignoreMap":170},[174,270,271,273,275,278],{"class":176,"line":177},[174,272,181],{"class":180},[174,274,185],{"class":184},[174,276,277],{"class":184}," restart",[174,279,197],{"class":184},[122,281,283],{"id":282},"test-the-hidden-service","Test the hidden service",[97,285,286],{},"From a machine with Tor installed (or using Tor Browser):",[165,288,290],{"className":167,"code":289,"language":169,"meta":170,"style":170},"curl --socks5-hostname 127.0.0.1:9050 http:\u002F\u002Fabc123...onion\u002Fhealth\n",[101,291,292],{"__ignoreMap":170},[174,293,294,297,300,303],{"class":176,"line":177},[174,295,296],{"class":180},"curl",[174,298,299],{"class":184}," --socks5-hostname",[174,301,302],{"class":184}," 127.0.0.1:9050",[174,304,305],{"class":184}," http:\u002F\u002Fabc123...onion\u002Fhealth\n",[97,307,308],{},"Expected:",[165,310,314],{"className":311,"code":312,"language":313,"meta":170,"style":170},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"status\": \"ok\" }\n","json",[101,315,316],{"__ignoreMap":170},[174,317,318,321,324,328,331,333,335,338,340],{"class":176,"line":177},[174,319,320],{"class":256},"{",[174,322,323],{"class":256}," \"",[174,325,327],{"class":326},"spNyl","status",[174,329,330],{"class":256},"\"",[174,332,242],{"class":256},[174,334,323],{"class":256},[174,336,337],{"class":184},"ok",[174,339,330],{"class":256},[174,341,342],{"class":256}," }\n",[97,344,345],{},"If you get a connection error, wait another 30 seconds. Tor hidden services take a moment to propagate.",[122,347,349],{"id":348},"sharing-onion-links","Sharing .onion links",[97,351,352,353,355],{},"A ",[101,354,103],{}," link looks like this:",[165,357,360],{"className":358,"code":359,"language":233},[231],"http:\u002F\u002Fabc123xyz789....onion\u002Fi\u002FTOKEN\n",[101,361,359],{"__ignoreMap":170},[97,363,364,365,367],{},"When a user taps this link, their device needs to be able to connect to the Tor network. The iwacu app handles this automatically — it routes ",[101,366,103],{}," addresses through its built-in Tor client.",[97,369,370],{},"Users who do not have iwacu installed will see the landing page via Tor Browser, or get a fallback message asking them to install the app first.",[372,373,376],"callout",{"color":374,"icon":375},"sky","i-lucide-info",[97,377,378,379,381],{},"You can share ",[101,380,103],{}," links over WhatsApp, SMS, or any messaging platform. The link is meaningless to anyone without iwacu or a Tor-capable browser. The platform cannot see what the link leads to.",[122,383,385],{"id":384},"keeping-your-onion-address","Keeping your .onion address",[97,387,128,388,390,391,394],{},[101,389,103],{}," address is derived from a cryptographic key stored in the ",[101,392,393],{},"tor-data"," Docker volume. As long as this volume persists, your address stays the same.",[165,396,398],{"className":167,"code":397,"language":169,"meta":170,"style":170},"docker volume ls | grep tor\n",[101,399,400],{"__ignoreMap":170},[174,401,402,404,407,410,413,416],{"class":176,"line":177},[174,403,181],{"class":180},[174,405,406],{"class":184}," volume",[174,408,409],{"class":184}," ls",[174,411,412],{"class":256}," |",[174,414,415],{"class":180}," grep",[174,417,418],{"class":184}," tor\n",[97,420,421,422,424],{},"Do not delete this volume. If you lose it, your ",[101,423,103],{}," address is gone permanently and you will need to redistribute a new address to everyone who has the old one.",[97,426,427],{},"Back up the volume data:",[165,429,431],{"className":167,"code":430,"language":169,"meta":170,"style":170},"docker run --rm -v relay_tor-data:\u002Fdata -v $(pwd):\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Ftor-data-backup.tar.gz \u002Fdata\n",[101,432,433,470],{"__ignoreMap":170},[174,434,435,437,440,443,446,449,451,454,458,461,464,467],{"class":176,"line":177},[174,436,181],{"class":180},[174,438,439],{"class":184}," run",[174,441,442],{"class":184}," --rm",[174,444,445],{"class":184}," -v",[174,447,448],{"class":184}," relay_tor-data:\u002Fdata",[174,450,445],{"class":184},[174,452,453],{"class":256}," $(",[174,455,457],{"class":456},"s2Zo4","pwd",[174,459,460],{"class":256},")",[174,462,463],{"class":184},":\u002Fbackup",[174,465,466],{"class":184}," alpine",[174,468,469],{"class":252}," \\\n",[174,471,473,476,479,482],{"class":176,"line":472},2,[174,474,475],{"class":184},"  tar",[174,477,478],{"class":184}," czf",[174,480,481],{"class":184}," \u002Fbackup\u002Ftor-data-backup.tar.gz",[174,483,484],{"class":184}," \u002Fdata\n",[97,486,487],{},"Store this backup off the server. A server failure without a backup means starting over with a new address.",[489,490,491],"style",{},"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":170,"searchDepth":177,"depth":472,"links":493},[494,495,496,497,498],{"id":124,"depth":472,"text":125},{"id":162,"depth":472,"text":163},{"id":282,"depth":472,"text":283},{"id":348,"depth":472,"text":349},{"id":384,"depth":472,"text":385},"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.","md",null,{},true,{"title":66,"description":499},"44fzO_DS9L5SeiT0rkcPzcJintEZ7qSkX-XV2o6Y7ZQ",[507,509],{"title":62,"path":63,"stem":64,"description":508,"children":-1},"How to run the invite relay with Docker Compose. Takes about 15 minutes on a fresh server.",{"title":76,"path":77,"stem":78,"description":510,"children":-1},"What is protected, what is not, and exactly why. No marketing language.",1783593685810]