[{"data":1,"prerenderedAt":834},["ShallowReactive",2],{"navigation":3,"\u002Fapps\u002Fiwacu":87,"\u002Fapps\u002Fiwacu-surround":829},[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":39,"body":89,"description":822,"extension":823,"links":824,"meta":825,"navigation":826,"path":40,"seo":827,"stem":41,"__hash__":828},"docs\u002F2.apps\u002F1.iwacu.md",{"type":90,"value":91,"toc":791},"minimark",[92,96,100,105,108,131,138,141,145,150,161,164,170,173,179,182,188,191,197,200,206,226,232,235,241,244,248,254,257,263,266,272,278,284,287,293,296,302,305,311,314,320,323,329,332,338,341,345,351,354,360,363,369,376,382,389,395,398,404,411,415,421,424,428,434,437,442,445,451,454,460,463,465,468,471,478,482,489,495,499,506,509,513,523,527,530,536,539,541,545,548,555,559,585,592,596,603,617,619,622,625,629,632,638,644,648,651,657,662,668,670,674,677,687,693,699,701,705,708,744,746,750,753,758,773,779,782,784,788],[93,94,39],"h1",{"id":95},"iwacu-family-tree",[97,98,99],"p",{},"Iwacu means \"home\" in Kinyarwanda. The app is a family tree builder, a communication tool, and a privacy-respecting group space for your family — in one place.",[101,102,104],"h2",{"id":103},"overview","Overview",[97,106,107],{},"The screen has three areas:",[109,110,111,119,125],"ul",{},[112,113,114,118],"li",{},[115,116,117],"strong",{},"The tree canvas"," — the visual representation of your family. Drag to pan, pinch or scroll to zoom.",[112,120,121,124],{},[115,122,123],{},"The terminal"," — at the bottom, collapsible. Every action in the app can be done from here.",[112,126,127,130],{},[115,128,129],{},"The side panel"," — opens on the right when you select a person or family.",[97,132,133,134,137],{},"A floating ",[115,135,136],{},"Script Editor"," button (📜) in the toolbar opens a separate panel where you can write, save, and run multi-line scripts.",[139,140],"hr",{},[101,142,144],{"id":143},"terminal-commands","Terminal commands",[146,147,149],"h3",{"id":148},"person-commands","Person commands",[151,152,157],"pre",{"className":153,"code":155,"language":156},[154],"language-text","person add \u003Calias> --first \u003Cname> [--last \u003Cname>] [--gender male|female|other] [--born YYYY-MM-DD] [--died YYYY-MM-DD]\n","text",[158,159,155],"code",{"__ignoreMap":160},"",[97,162,163],{},"Add a person to the tree. The alias is a short label you use in other commands.",[151,165,168],{"className":166,"code":167,"language":156},[154],"person find \u003Cquery>\n",[158,169,167],{"__ignoreMap":160},[97,171,172],{},"Search people by name. Returns a list of matches with their aliases.",[151,174,177],{"className":175,"code":176,"language":156},[154],"person show \u003Calias>\n",[158,178,176],{"__ignoreMap":160},[97,180,181],{},"Open the person's detail panel.",[151,183,186],{"className":184,"code":185,"language":156},[154],"person list\n",[158,187,185],{"__ignoreMap":160},[97,189,190],{},"List all people in the tree with their aliases and short details.",[151,192,195],{"className":193,"code":194,"language":156},[154],"person alias \u003CnewAlias> \u003CexistingAliasOrName>\n",[158,196,194],{"__ignoreMap":160},[97,198,199],{},"Give an existing person an additional alias. The second argument can be an existing alias or a partial first-name match.",[151,201,204],{"className":202,"code":203,"language":156},[154],"person edit \u003Calias> --first \u003Cname>\n",[158,205,203],{"__ignoreMap":160},[97,207,208,209,212,213,212,216,212,219,212,222,225],{},"Update a person's fields. You can update any combination of ",[158,210,211],{},"--first",", ",[158,214,215],{},"--last",[158,217,218],{},"--gender",[158,220,221],{},"--born",[158,223,224],{},"--died",".",[151,227,230],{"className":228,"code":229,"language":156},[154],"person delete \u003Calias>\n",[158,231,229],{"__ignoreMap":160},[97,233,234],{},"Permanently delete a person. This removes all their family memberships, bridges, personal alias, and any family aliases where they held a parent role. A confirmation summary is shown before the deletion executes.",[151,236,239],{"className":237,"code":238,"language":156},[154],"me \u003Calias>\n",[158,240,238],{"__ignoreMap":160},[97,242,243],{},"Set yourself as the focal person. Your alias will appear in group chats and on the connection map.",[146,245,247],{"id":246},"family-commands","Family commands",[151,249,252],{"className":250,"code":251,"language":156},[154],"family couple \u003CfamilyAlias> \u003Calias1> \u003Calias2> --first1 \u003Cname> --gender1 \u003Cmale|female> --first2 \u003Cname> --gender2 \u003Cmale|female> [--last1 ..] [--last2 ..] [--born1 ..] [--died1 ..] [--born2 ..] [--died2 ..] [--name \"Family Name\"]\n",[158,253,251],{"__ignoreMap":160},[97,255,256],{},"Create two people and a family node in one step. This is the fastest way to start a tree or add a new couple.",[151,258,261],{"className":259,"code":260,"language":156},[154],"family new \u003CfamilyAlias> \u003CparentAlias1> [parentAlias2 ...] [--name \"Family Name\"]\n",[158,262,260],{"__ignoreMap":160},[97,264,265],{},"Create a new family node from existing people.",[151,267,270],{"className":268,"code":269,"language":156},[154],"family child \u003CfamilyAlias> \u003CpersonAlias> [--first \u003Cname> --last \u003Cname> --gender .. --born ..]\n",[158,271,269],{"__ignoreMap":160},[97,273,274,275,277],{},"Add a child to a family. If ",[158,276,211],{}," is given, a new person is created on the spot; otherwise an existing alias is used.",[151,279,282],{"className":280,"code":281,"language":156},[154],"family marry \u003CnewFamilyAlias> \u003CchildAlias> \u003CspouseAlias> [--first .. --last .. --gender .. --born ..] [--name \"Family Name\"]\n",[158,283,281],{"__ignoreMap":160},[97,285,286],{},"Create a bridged family: someone who is already a child in one family starts their own. If the spouse does not exist yet, include the person flags to create them inline.",[151,288,291],{"className":289,"code":290,"language":156},[154],"family show \u003CfamilyAlias|personAlias>\n",[158,292,290],{"__ignoreMap":160},[97,294,295],{},"Open the family panel. Accepts person aliases too — it shows all the families that person belongs to.",[151,297,300],{"className":298,"code":299,"language":156},[154],"family open \u003CfamilyAlias>\n",[158,301,299],{"__ignoreMap":160},[97,303,304],{},"Open the family panel (members, chat, invite tabs).",[151,306,309],{"className":307,"code":308,"language":156},[154],"family list\n",[158,310,308],{"__ignoreMap":160},[97,312,313],{},"List all family nodes with their aliases.",[151,315,318],{"className":316,"code":317,"language":156},[154],"family chat \u003CfamilyAlias> \u003Cmessage>\n",[158,319,317],{"__ignoreMap":160},[97,321,322],{},"Send a message to a family group chat from the terminal.",[151,324,327],{"className":325,"code":326,"language":156},[154],"family invite \u003CfamilyAlias>\n",[158,328,326],{"__ignoreMap":160},[97,330,331],{},"Show the invite link for a family cell.",[151,333,336],{"className":334,"code":335,"language":156},[154],"family join \u003Cinvite-link>\n",[158,337,335],{"__ignoreMap":160},[97,339,340],{},"Join a family using an invite link.",[146,342,344],{"id":343},"tree-commands","Tree commands",[151,346,349],{"className":347,"code":348,"language":156},[154],"tree demo\n",[158,350,348],{"__ignoreMap":160},[97,352,353],{},"Load a sample Rwandan family tree to explore the app.",[151,355,358],{"className":356,"code":357,"language":156},[154],"tree clear\n",[158,359,357],{"__ignoreMap":160},[97,361,362],{},"Remove everything and start fresh.",[151,364,367],{"className":365,"code":366,"language":156},[154],"tree focus \u003CpersonAlias> [--origin]\n",[158,368,366],{"__ignoreMap":160},[97,370,371,372,375],{},"Navigate the tree canvas to a person. With ",[158,373,374],{},"--origin",", the view centres on their parents' family instead.",[151,377,380],{"className":378,"code":379,"language":156},[154],"tree export [--format yaml|json|script]\n",[158,381,379],{"__ignoreMap":160},[97,383,384,385,388],{},"Export the tree. The default format is YAML, which can be re-imported. Use ",[158,386,387],{},"--format script"," to export as a sequence of terminal commands that can reconstruct the tree from scratch — useful for version control, sharing, or running in the Script Editor.",[151,390,393],{"className":391,"code":392,"language":156},[154],"tree import\n",[158,394,392],{"__ignoreMap":160},[97,396,397],{},"Paste a YAML or JSON tree definition directly into the terminal to restore or merge a tree.",[151,399,402],{"className":400,"code":401,"language":156},[154],"tree merge\n",[158,403,401],{"__ignoreMap":160},[97,405,406,407,225],{},"Open the Merge dialog to connect your tree with a cousin's tree. See ",[408,409,410],"a",{"href":29},"Connect Branches",[146,412,414],{"id":413},"navigation-commands","Navigation commands",[151,416,419],{"className":417,"code":418,"language":156},[154],"go \u003Calias> [--origin]\n",[158,420,418],{"__ignoreMap":160},[97,422,423],{},"Navigate to a person or family by alias. Accepts person aliases, family aliases, or a partial first-name match.",[146,425,427],{"id":426},"alias-commands","Alias commands",[151,429,432],{"className":430,"code":431,"language":156},[154],"aliases\n",[158,433,431],{"__ignoreMap":160},[97,435,436],{},"List all current aliases — persons and families — with their full names.",[151,438,440],{"className":439,"code":194,"language":156},[154],[158,441,194],{"__ignoreMap":160},[97,443,444],{},"Assign a new alias to an existing person.",[151,446,449],{"className":447,"code":448,"language":156},[154],"unalias \u003Calias>\n",[158,450,448],{"__ignoreMap":160},[97,452,453],{},"Remove a person or family alias. Does not delete the person or family — only the short name.",[151,455,458],{"className":456,"code":457,"language":156},[154],"help\n",[158,459,457],{"__ignoreMap":160},[97,461,462],{},"Print a summary of available commands.",[139,464],{},[101,466,136],{"id":467},"script-editor",[97,469,470],{},"The Script Editor lets you write, save, and run multi-line scripts against the tree.",[97,472,473,474,477],{},"Open it with the ",[115,475,476],{},"📜"," button in the toolbar.",[146,479,481],{"id":480},"writing-a-script","Writing a script",[97,483,484,485,488],{},"Each line is a terminal command. Comments start with ",[158,486,487],{},"#",". Blank lines are ignored.",[151,490,493],{"className":491,"code":492,"language":156},[154],"# Build the Kamanzi family\nfamily couple gen1 father mother --first1 Habimana --gender1 male --first2 Uwera --gender2 female --name \"Kamanzi Family\"\nfamily child gen1 alice --first Alice --gender female --born 1998-06-12\nfamily child gen1 bob --first Bob --gender male --born 2001-03-04\n",[158,494,492],{"__ignoreMap":160},[146,496,498],{"id":497},"dry-run","Dry run",[97,500,501,502,505],{},"Click ",[115,503,504],{},"Dry Run"," to preview what the script would do without making any changes. Results appear line-by-line. Any error is highlighted. Nothing is saved. Aliases and tree data return to their state before the dry run when it finishes.",[97,507,508],{},"This is the safe way to test a script before running it for real.",[146,510,512],{"id":511},"saving-scripts","Saving scripts",[97,514,501,515,518,519,522],{},[115,516,517],{},"Save"," (💾) to give the script a name and save it to the local database. Saved scripts appear in the ",[115,520,521],{},"Library"," (📂). From the library you can load, run, or delete any script.",[146,524,526],{"id":525},"exporting-as-script","Exporting as script",[97,528,529],{},"To turn your current tree into a replayable script, run:",[151,531,534],{"className":532,"code":533,"language":156},[154],"tree export --format script\n",[158,535,533],{"__ignoreMap":160},[97,537,538],{},"The output is a sequence of commands in dependency order — parents before children, root families before bridged ones. Copy the output into the Script Editor to save it.",[139,540],{},[101,542,544],{"id":543},"device-sync","Device sync",[97,546,547],{},"Sync your tree across all your own devices without sharing access with anyone else.",[97,549,550,551,554],{},"Open ",[115,552,553],{},"Manage → Sync → My devices"," to set up device sync.",[146,556,558],{"id":557},"pairing-a-second-device","Pairing a second device",[560,561,562,572,582],"ol",{},[112,563,564,565,568,569,225],{},"On the first device, tap ",[115,566,567],{},"Enable sync"," then ",[115,570,571],{},"Show pair QR",[112,573,574,575,577,578,581],{},"On the second device, open ",[115,576,553],{}," and tap ",[115,579,580],{},"Scan pair QR"," (or paste the pair code manually).",[112,583,584],{},"Both devices connect to the same personal cell on the relay. Changes you make on one device appear on the other within seconds.",[97,586,587,588,591],{},"The pair code format is ",[158,589,590],{},"iwacu:\u002F\u002Fdevicesync\u002F\u003Cid>\u002F\u003Csecret>?relay=\u003Curl>",". The relay sees only the encrypted payload — it cannot read your tree.",[146,593,595],{"id":594},"connection-status","Connection status",[97,597,598,599,602],{},"A coloured dot next to ",[115,600,601],{},"My devices"," shows the connection state:",[109,604,605,611],{},[112,606,607,610],{},[115,608,609],{},"Green"," — connected and syncing",[112,612,613,616],{},[115,614,615],{},"Grey"," — not connected (relay unavailable or not yet paired)",[139,618],{},[101,620,129],{"id":621},"the-side-panel",[97,623,624],{},"Click on any person or family node in the tree to open the side panel.",[146,626,628],{"id":627},"person-view","Person view",[97,630,631],{},"Two tabs:",[97,633,634,637],{},[115,635,636],{},"Details"," — Shows the person's full name, birth\u002Fdeath dates, and which families they belong to (as child, as parent).",[97,639,640,643],{},[115,641,642],{},"Chat"," — A private direct message thread with that person. Messages are encrypted and delivered over the family cell. The person must have joined the tree via invitation to receive messages.",[146,645,647],{"id":646},"family-view","Family view",[97,649,650],{},"Three tabs:",[97,652,653,656],{},[115,654,655],{},"Members"," — Lists all parents and children in the family. Each member row has a 🔗 button to generate a personal invitation for that slot.",[97,658,659,661],{},[115,660,642],{}," — Group chat for all members of this family who have joined. Think of it as the family WhatsApp group, but one that cannot be read by anyone outside the family cell.",[97,663,664,667],{},[115,665,666],{},"Invite"," — Quick link to generate a family-level invitation. Use this when you want someone to join but have not yet decided which person record they are.",[139,669],{},[101,671,673],{"id":672},"invitations","Invitations",[97,675,676],{},"Two types of invitations exist:",[97,678,679,682,683,686],{},[115,680,681],{},"Person invitation"," — ties a new member to a specific record in the tree. Generate from ",[115,684,685],{},"Members → 🔗",". The recipient joins as that person.",[97,688,689,692],{},[115,690,691],{},"Family invitation"," — lets someone join the family cell without being assigned a specific person record yet. Use this for members you want to chat with before completing their record.",[97,694,695,696,698],{},"See ",[408,697,24],{"href":25}," for the full flow.",[139,700],{},[101,702,704],{"id":703},"touch-and-pointer-interactions","Touch and pointer interactions",[97,706,707],{},"On the tree canvas:",[109,709,710,720,728,734],{},[112,711,712,715,716,719],{},[115,713,714],{},"Hover \u002F tap a person chip"," to reveal a ",[115,717,718],{},"💬"," button — tap to open their chat tab directly.",[112,721,722,715,725,727],{},[115,723,724],{},"Hover \u002F tap a family card",[115,726,718],{}," button — tap to open the family group chat.",[112,729,730,733],{},[115,731,732],{},"Double-click \u002F double-tap"," a person chip to navigate to their origin family (parents).",[112,735,736,739,740,743],{},[115,737,738],{},"Ctrl+double-click"," (desktop) or ",[115,741,742],{},"long-press"," (touch) to navigate to their own family (children and spouse).",[139,745],{},[101,747,749],{"id":748},"data-persistence","Data persistence",[97,751,752],{},"Tree data is stored in a local SQLite database on your device. Changes are saved automatically after every action — you do not need to export manually to preserve your work between sessions.",[97,754,755],{},[115,756,757],{},"Export is still useful for:",[109,759,760,763,770],{},[112,761,762],{},"Sending your tree to another person or device without pairing",[112,764,765,766,769],{},"Version control — keep a ",[158,767,768],{},"tree.yaml"," in a folder you back up",[112,771,772],{},"Reconstructing the tree on a fresh install",[151,774,777],{"className":775,"code":776,"language":156},[154],"tree export --format yaml\n",[158,778,776],{"__ignoreMap":160},[97,780,781],{},"Copy the YAML and keep it somewhere safe. To restore, paste it directly into the terminal.",[139,783],{},[101,785,787],{"id":786},"cross-tree-bridges","Cross-tree bridges",[97,789,790],{},"After completing a tree merge with a cousin, a bridge appears in the tree as a dashed link between the shared ancestor and the cousin's branch. Click the cousin's person record to open a direct message thread with them — this works the same as messaging any other person in your own tree.",{"title":160,"searchDepth":792,"depth":793,"links":794},1,2,[795,796,804,810,814,818,819,820,821],{"id":103,"depth":793,"text":104},{"id":143,"depth":793,"text":144,"children":797},[798,800,801,802,803],{"id":148,"depth":799,"text":149},3,{"id":246,"depth":799,"text":247},{"id":343,"depth":799,"text":344},{"id":413,"depth":799,"text":414},{"id":426,"depth":799,"text":427},{"id":467,"depth":793,"text":136,"children":805},[806,807,808,809],{"id":480,"depth":799,"text":481},{"id":497,"depth":799,"text":498},{"id":511,"depth":799,"text":512},{"id":525,"depth":799,"text":526},{"id":543,"depth":793,"text":544,"children":811},[812,813],{"id":557,"depth":799,"text":558},{"id":594,"depth":799,"text":595},{"id":621,"depth":793,"text":129,"children":815},[816,817],{"id":627,"depth":799,"text":628},{"id":646,"depth":799,"text":647},{"id":672,"depth":793,"text":673},{"id":703,"depth":793,"text":704},{"id":748,"depth":793,"text":749},{"id":786,"depth":793,"text":787},"Everything the iwacu app can do. Commands, panels, script editor, device sync, invitations, tree merge, and data export.","md",null,{},true,{"title":39,"description":822},"CHorYF4PcAhcF1kKwis9sa__t4l1_vDHBrEydXTH8HA",[830,832],{"title":28,"path":29,"stem":30,"description":831,"children":-1},"How two cousins can connect their separate family trees. This requires meeting in person. It is designed that way.",{"title":43,"path":44,"stem":45,"description":833,"children":-1},"How to use isoko to buy and sell with people nearby. No accounts, no platform fees, no identity required.",1783593685810]