[{"data":1,"prerenderedAt":826},["ShallowReactive",2],{"navigation_docs":3,"-remote-overview":144,"-remote-overview-surround":821},[4,35,84,109,124,134,139],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Get Started","\u002Fget-started","1.get-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fget-started\u002Fintroduction","1.get-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fget-started\u002Finstallation","1.get-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick start","\u002Fget-started\u002Fquickstart","1.get-started\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Project structure","\u002Fget-started\u002Fproject-structure","1.get-started\u002F4.project-structure","i-lucide-folder-tree",{"title":30,"path":31,"stem":32,"icon":33},"Dashboard","\u002Fget-started\u002Fdashboard","1.get-started\u002F5.dashboard","i-lucide-layout-dashboard",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Concepts","\u002Fconcepts","2.concepts",[40,45,50,55,60,65,69,74,79],{"title":41,"path":42,"stem":43,"icon":44},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Machines","\u002Fconcepts\u002Fmachines","2.concepts\u002F2.machines","i-lucide-server",{"title":51,"path":52,"stem":53,"icon":54},"Colony & users","\u002Fconcepts\u002Fcolony","2.concepts\u002F3.colony","i-lucide-users",{"title":56,"path":57,"stem":58,"icon":59},"Transport","\u002Fconcepts\u002Ftransport","2.concepts\u002F4.transport","i-lucide-network",{"title":61,"path":62,"stem":63,"icon":64},"Configuration","\u002Fconcepts\u002Fconfiguration","2.concepts\u002F5.configuration","i-lucide-settings",{"title":66,"path":67,"stem":68,"icon":23},"Deploy","\u002Fconcepts\u002Fdeploy","2.concepts\u002F6.deploy",{"title":70,"path":71,"stem":72,"icon":73},"Groups","\u002Fconcepts\u002Fgroups","2.concepts\u002F7.groups","i-lucide-boxes",{"title":75,"path":76,"stem":77,"icon":78},"Templates","\u002Fconcepts\u002Ftemplates","2.concepts\u002F8.templates","i-lucide-package-plus",{"title":80,"path":81,"stem":82,"icon":83},"Existing projects","\u002Fconcepts\u002Fexisting-projects","2.concepts\u002F9.existing-projects","i-lucide-folder-open",{"title":85,"path":86,"stem":87,"children":88,"page":34},"Remote","\u002Fremote","3.remote",[89,94,99,104],{"title":90,"path":91,"stem":92,"icon":93},"Remote machines","\u002Fremote\u002Foverview","3.remote\u002F1.overview","i-lucide-cloud",{"title":95,"path":96,"stem":97,"icon":98},"Remote deploy","\u002Fremote\u002Fdeploy","3.remote\u002F2.deploy","i-lucide-send",{"title":100,"path":101,"stem":102,"icon":103},"CI","\u002Fremote\u002Fci","3.remote\u002F3.ci","i-lucide-workflow",{"title":105,"path":106,"stem":107,"icon":108},"Tunnels","\u002Fremote\u002Ftunnel","3.remote\u002F4.tunnel","i-lucide-cable",{"title":110,"path":111,"stem":112,"children":113,"page":34},"Security","\u002Fsecurity","4.security",[114,119],{"title":115,"path":116,"stem":117,"icon":118},"Security model","\u002Fsecurity\u002Fmodel","4.security\u002F1.model","i-lucide-shield",{"title":120,"path":121,"stem":122,"icon":123},"Known issues","\u002Fsecurity\u002Fknown-issues","4.security\u002F2.known-issues","i-lucide-triangle-alert",{"title":125,"path":126,"stem":127,"children":128,"page":34},"Reference","\u002Freference","5.reference",[129],{"title":130,"path":131,"stem":132,"icon":133},"CLI reference","\u002Freference\u002Fcli","5.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"Changelog","\u002Fchangelog","changelog","i-lucide-history",{"title":140,"path":141,"stem":142,"icon":143},"Communities","\u002Fcommunities","communities","i-lucide-heart-handshake",{"id":145,"title":90,"body":146,"description":813,"extension":814,"links":815,"meta":816,"navigation":817,"path":91,"seo":818,"stem":92,"__hash__":820},"docs\u002F3.remote\u002F1.overview.md",{"type":147,"value":148,"toc":796},"minimark",[149,165,176,181,184,200,212,216,226,272,347,350,359,366,371,390,393,397,407,432,449,453,459,468,472,518,532,536,546,550,570,576,580,583,586,612,616,625,645,690,694,708,717,740,755,764,768,792],[150,151,152,153,160,161,164],"p",{},"A remote nest is a machine running ",[154,155,156],"strong",{},[157,158,159],"code",{},"ant-worker"," (the daemon built from\n",[157,162,163],{},"cmd\u002Fagent","). It accepts images, runs containers, applies compose files, and\nsets up routes.",[150,166,167,168,171,172,175],{},"ant reaches a machine by its ",[154,169,170],{},"iroh NodeID",", not by address: the address is only\na label. So getting a machine running is a two-channel job, ",[154,173,174],{},"SSH once to\nprovision, iroh forever after"," (no inbound ports).",[177,178,180],"h2",{"id":179},"prerequisite-sign-in","Prerequisite: sign in",[150,182,183],{},"The daemon is fail-closed, so it needs an owner NodeID to authorize callers, and\nthat owner must be your account. Provisioning requires a signed-in account:",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-sh shiki shiki-themes material-theme-lighter github-light github-dark","ant colony signup        # or: ant colony login --bundle ant-account.json\n","sh","",[157,192,193],{"__ignoreMap":190},[194,195,198],"span",{"class":196,"line":197},"line",1,[194,199,188],{},[150,201,202,203,206,207,211],{},"The dashboard can do this too: ",[154,204,205],{},"Settings → Ant account → Create account"," (or\n",[208,209,210],"em",{},"Sign in from a bundle","). ant uses your account NodeID as the machine's first\nowner and generates the machine's own NodeID for you.",[177,213,215],{"id":214},"address-only-recommended","Address only (recommended)",[150,217,218,219,221,222,225],{},"If all you have is an address, let ant provision over SSH. It generates the\nmachine identity, uploads ",[157,220,159],{},", installs Docker and Caddy, starts the\nworker as the unprivileged ",[157,223,224],{},"ant"," user, seeds the owner, registers the confirmed\nNodeID, and you are done:",[185,227,229],{"className":187,"code":228,"language":189,"meta":190,"style":190},"# key or SSH agent\nant nest machines add prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519\n\n# password (read from stdin, never argv)\necho \"$SSH_PASSWORD\" | ant nest machines add prod --host 173.87.3.89 --ssh-password-stdin\n\nant nest ping prod\n",[157,230,231,236,242,249,255,261,266],{"__ignoreMap":190},[194,232,233],{"class":196,"line":197},[194,234,235],{},"# key or SSH agent\n",[194,237,239],{"class":196,"line":238},2,[194,240,241],{},"ant nest machines add prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519\n",[194,243,245],{"class":196,"line":244},3,[194,246,248],{"emptyLinePlaceholder":247},true,"\n",[194,250,252],{"class":196,"line":251},4,[194,253,254],{},"# password (read from stdin, never argv)\n",[194,256,258],{"class":196,"line":257},5,[194,259,260],{},"echo \"$SSH_PASSWORD\" | ant nest machines add prod --host 173.87.3.89 --ssh-password-stdin\n",[194,262,264],{"class":196,"line":263},6,[194,265,248],{"emptyLinePlaceholder":247},[194,267,269],{"class":196,"line":268},7,[194,270,271],{},"ant nest ping prod\n",[150,273,274,275,278,279,278,282,278,285,288,289,292,293,296,297,278,300,303,304,278,307,310,311,314,315,278,318,321,322,325,326,278,329,332,333,336,337,339,340,343,344,346],{},"Flags: ",[157,276,277],{},"--id",", ",[157,280,281],{},"--hostname",[157,283,284],{},"--node-id",[157,286,287],{},"--ssh-user"," (default ",[157,290,291],{},"root","),\n",[157,294,295],{},"--ssh-port"," (default 22), ",[157,298,299],{},"--ssh-key",[157,301,302],{},"--ssh-password"," \u002F\n",[157,305,306],{},"--ssh-password-stdin",[157,308,309],{},"--docker-mode"," (",[157,312,313],{},"rootless"," default, ",[157,316,317],{},"group",[157,319,320],{},"proxy",",\n",[157,323,324],{},"none","), ",[157,327,328],{},"--no-caddy",[157,330,331],{},"--no-caddy-check",". The host may embed the port\n(",[157,334,335],{},"--host 203.0.113.7:2222","); an explicit ",[157,338,295],{}," wins over it.\nThe registry shows the machine's\n",[154,341,342],{},"own hostname"," (reported during provisioning); pass ",[157,345,281],{}," to override\nit, the address is only a fallback.",[150,348,349],{},"Re-run or refresh an already-registered machine with:",[185,351,353],{"className":187,"code":352,"language":189,"meta":190,"style":190},"ant nest bootstrap --machine prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519\n",[157,354,355],{"__ignoreMap":190},[194,356,357],{"class":196,"line":197},[194,358,352],{},[150,360,361,362,365],{},"SSH first contact is trusted (ant keeps its own ",[157,363,364],{},"~\u002F.ant\u002Fknown_hosts","), but a\nchanged host key is rejected. ant ships the machine identity it generated, so\nthe NodeID is known and pinned before any contact.",[367,368,370],"h3",{"id":369},"caddys-admin-api","Caddy's admin API",[150,372,373,374,377,378,381,382,385,386,389],{},"Ant programs routes through the machine's Caddy. The upstream package exposes\nthat API on a root-only unix socket whose permissions vary across restarts, so\nthe bootstrap points it at ",[157,375,376],{},"127.0.0.1:2019",", rewriting only the ",[157,379,380],{},"admin","\ndirective in ",[157,383,384],{},"\u002Fetc\u002Fcaddy\u002FCaddyfile"," (backup at ",[157,387,388],{},"\u002Fetc\u002Fcaddy\u002FCaddyfile.ant.bak",")\nand restarting Caddy. A host already serving that TCP address is left alone; if\nthe Caddyfile cannot be adjusted, ant falls back to the unix socket with a\nsystemd drop-in that grants the worker access.",[150,391,392],{},"The worker starts even when Caddy is unreachable (it warns and keeps serving\nmanagement, builds, and logs); deploys are refused with a clear message until\nCaddy answers again.",[177,394,396],{"id":395},"no-ssh-cloud-init","No SSH: cloud-init",[150,398,399,400,402,403,406],{},"For a machine you can only reach through a provider console, register it first\n(with ",[157,401,331],{},", since the daemon is not up yet), then print a\ncloud-init\u002Fuser-data script. It installs the worker from ",[157,404,405],{},"--worker-url",", lets\nthe daemon generate its own identity, and prints the NodeID to register:",[185,408,410],{"className":187,"code":409,"language":189,"meta":190,"style":190},"ant nest machines add prod --hostname prod.example.com --no-caddy-check\nant nest bootstrap --machine prod --cloud-init --worker-url https:\u002F\u002Fants-docs.pages.dev\u002Fdl\u002Fant\u002Fv0.1.0\u002Fant-worker-linux-amd64\n# paste the output as user-data; then read the NodeID from the console log:\nant nest machines add prod --hostname prod.example.com --node-id \u003Cid>\n",[157,411,412,417,422,427],{"__ignoreMap":190},[194,413,414],{"class":196,"line":197},[194,415,416],{},"ant nest machines add prod --hostname prod.example.com --no-caddy-check\n",[194,418,419],{"class":196,"line":238},[194,420,421],{},"ant nest bootstrap --machine prod --cloud-init --worker-url https:\u002F\u002Fants-docs.pages.dev\u002Fdl\u002Fant\u002Fv0.1.0\u002Fant-worker-linux-amd64\n",[194,423,424],{"class":196,"line":244},[194,425,426],{},"# paste the output as user-data; then read the NodeID from the console log:\n",[194,428,429],{"class":196,"line":251},[194,430,431],{},"ant nest machines add prod --hostname prod.example.com --node-id \u003Cid>\n",[150,433,434,436,437,440,441,444,445,448],{},[157,435,405],{}," is required with ",[157,438,439],{},"--cloud-init",": the target must fetch the\nworker binary directly, so pass the ",[157,442,443],{},"ant-worker-linux-\u003Carch>"," URL from a\nrelease (or a URL you host). Prefer\n",[157,446,447],{},"ant nest bootstrap --machine prod --host \u003Caddress>",", which uploads the locally\nbuilt worker and needs no hosting.",[177,450,452],{"id":451},"already-running-a-worker","Already running a worker",[150,454,455,456,458],{},"If ",[157,457,159],{}," is already installed and running (say, out of band), just\nregister its NodeID:",[185,460,462],{"className":187,"code":461,"language":189,"meta":190,"style":190},"ant nest machines add prod --hostname prod.example.com --node-id 7f2e91ac…\n",[157,463,464],{"__ignoreMap":190},[194,465,466],{"class":196,"line":197},[194,467,461],{},[177,469,471],{"id":470},"inspecting-and-operating-a-machine","Inspecting and operating a machine",[185,473,475],{"className":187,"code":474,"language":189,"meta":190,"style":190},"ant nest ping prod                       # reachable? (--timeout, default 20s)\nant nest audit --machine prod            # tamper-evident action log (--limit, --json)\nant nest state export --machine prod --out prod-state.json\nant nest state import --machine prod --file prod-state.json   # owner-only\nant nest identity show --machine prod    # the machine's NodeID\nant nest tunnel --machine prod --container app --port 8080    # forward over iroh\nant nest machines network prod --name ant-prod --driver bridge   # machine-wide network\nant nest groups network backend --name backend-net               # a group's network\n",[157,476,477,482,487,492,497,502,507,512],{"__ignoreMap":190},[194,478,479],{"class":196,"line":197},[194,480,481],{},"ant nest ping prod                       # reachable? (--timeout, default 20s)\n",[194,483,484],{"class":196,"line":238},[194,485,486],{},"ant nest audit --machine prod            # tamper-evident action log (--limit, --json)\n",[194,488,489],{"class":196,"line":244},[194,490,491],{},"ant nest state export --machine prod --out prod-state.json\n",[194,493,494],{"class":196,"line":251},[194,495,496],{},"ant nest state import --machine prod --file prod-state.json   # owner-only\n",[194,498,499],{"class":196,"line":257},[194,500,501],{},"ant nest identity show --machine prod    # the machine's NodeID\n",[194,503,504],{"class":196,"line":263},[194,505,506],{},"ant nest tunnel --machine prod --container app --port 8080    # forward over iroh\n",[194,508,509],{"class":196,"line":268},[194,510,511],{},"ant nest machines network prod --name ant-prod --driver bridge   # machine-wide network\n",[194,513,515],{"class":196,"line":514},8,[194,516,517],{},"ant nest groups network backend --name backend-net               # a group's network\n",[150,519,520,523,524,527,528,531],{},[157,521,522],{},"ant nest audit"," reports whether the hash chain verifies; ",[157,525,526],{},"ant nest state","\nbacks up and restores the roster and invites (import refuses a document with no\nusers unless ",[157,529,530],{},"--force",").",[177,533,535],{"id":534},"manual-plan","Manual plan",[150,537,538,541,542,545],{},[157,539,540],{},"ant nest bootstrap"," with no address prints the root-run steps for an operator to\napply by hand; the same script ant runs over SSH, plus the Docker\u002FCaddy steps.\nSee it for any machine with ",[157,543,544],{},"ant nest bootstrap --machine prod",".",[177,547,549],{"id":548},"add-users","Add users",[185,551,553],{"className":187,"code":552,"language":189,"meta":190,"style":190},"ant colony invite --role deployer --machine prod\n# on the other side:\nant colony join --token ant_inv_…\n",[157,554,555,560,565],{"__ignoreMap":190},[194,556,557],{"class":196,"line":197},[194,558,559],{},"ant colony invite --role deployer --machine prod\n",[194,561,562],{"class":196,"line":238},[194,563,564],{},"# on the other side:\n",[194,566,567],{"class":196,"line":244},[194,568,569],{},"ant colony join --token ant_inv_…\n",[150,571,572,573,545],{},"Invites are signed, machine-pinned, single-use, and redeemed server-side. See\n",[574,575,51],"a",{"href":52},[177,577,579],{"id":578},"no-inbound-ports","No inbound ports",[150,581,582],{},"Because iroh dials by NodeID and uses a relay for hole-punching, the machine does\nnot need an open inbound port. SSH is used only during provisioning; the\nsteady-state control plane is iroh.",[177,584,30],{"id":585},"dashboard",[150,587,588,589,592,593,596,597,600,601,604,605,608,609,611],{},"The same flow is on the ",[154,590,591],{},"Nest"," page: ",[154,594,595],{},"Add machine"," has an ",[208,598,599],{},"Already running","\nmode (paste the NodeID) and a ",[208,602,603],{},"Provision over SSH"," mode (address and\ncredentials, streamed progress). Each machine's ",[154,606,607],{},"Setup"," tab shows its NodeID\nand the bootstrap plan, and can re-provision. See the\n",[574,610,30],{"href":31}," page.",[177,613,615],{"id":614},"removing-ant-from-a-machine","Removing ant from a machine",[150,617,618,621,622,624],{},[157,619,620],{},"ant nest machines remove \u003Cid>"," only drops the local registry record. To reverse\nprovisioning on the machine itself (stop and delete ",[157,623,159],{},", its systemd\nunit, its binary, and the Caddy admin drop-in ant installed) decommission it\nover SSH:",[185,626,628],{"className":187,"code":627,"language":189,"meta":190,"style":190},"ant nest machines decommission prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519 --yes\nant nest machines decommission prod --host 173.87.3.89 --ssh-password-stdin --purge --yes\nant nest machines decommission prod --host 173.87.3.89 --ssh-key … --yes --keep-record\n",[157,629,630,635,640],{"__ignoreMap":190},[194,631,632],{"class":196,"line":197},[194,633,634],{},"ant nest machines decommission prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519 --yes\n",[194,636,637],{"class":196,"line":238},[194,638,639],{},"ant nest machines decommission prod --host 173.87.3.89 --ssh-password-stdin --purge --yes\n",[194,641,642],{"class":196,"line":244},[194,643,644],{},"ant nest machines decommission prod --host 173.87.3.89 --ssh-key … --yes --keep-record\n",[150,646,647,648,651,652,654,655,657,658,660,661,663,664,667,668,671,672,674,675,678,679,681,682,685,686,689],{},"Decommission is an SSH operation, so ",[157,649,650],{},"--host"," (plus ",[157,653,287],{},"\u002F",[157,656,295],{},"\u002F\n",[157,659,299],{}," or ",[157,662,306],{},") is required, along with ",[157,665,666],{},"--yes",". The\nhost may carry the port as ",[157,669,670],{},"host:port"," (e.g. ",[157,673,335],{},").\n",[157,676,677],{},"--purge"," also removes the worker user and its state (the machine identity and\nroster), every ant-managed container and image, and the networks ant created for\nit, leaving the host as it was before provisioning. Without ",[157,680,677],{},", the\nmachine keeps ",[157,683,684],{},"\u002Fhome\u002Fant",", so a later provision reuses the same identity and\nroster and your projects' domains keep resolving to the same NodeID.\n",[157,687,688],{},"--keep-record"," leaves the local registry entry in place.",[367,691,693],{"id":692},"leaving-ant-without-stopping-the-app","Leaving ant without stopping the app",[150,695,696,697,699,700,703,704,707],{},"Without ",[157,698,677],{},", the ant-managed containers keep running after the worker is\ngone. Add ",[157,701,702],{},"--handover"," to also export a plain Docker takeover bundle to the SSH\nuser's home (",[157,705,706],{},"~\u002Fant-handover\u002F","):",[185,709,711],{"className":187,"code":710,"language":189,"meta":190,"style":190},"ant nest machines decommission prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519 --handover --yes\n",[157,712,713],{"__ignoreMap":190},[194,714,715],{"class":196,"line":197},[194,716,710],{},[150,718,719,720,723,724,727,728,731,732,735,736,739],{},"The bundle contains a ",[157,721,722],{},"README.md",", a ",[157,725,726],{},"compose\u002F\u003Cproject>\u002Fdocker-compose.yml"," for\nevery remote compose project (plus its ",[157,729,730],{},"secrets.env",", 0600, when it has one),\na synthesized ",[157,733,734],{},"containers\u002F\u003Capp>\u002Fdocker-compose.yml"," for every standalone\ncontainer deploy, and ",[157,737,738],{},"caddy\u002FCaddyfile.ant-handover",", the routes ant\nprogrammed, rendered as Caddyfile blocks (one per domain, with the upstream\nports) so the domains keep working once ant is gone. The files carry no ant\nlabels, so you can take the app over with plain Docker:",[185,741,743],{"className":187,"code":742,"language":189,"meta":190,"style":190},"docker ps -a --filter \"label=computer.ants.managed=1\" --format '{{.Names}}' | xargs -r docker rm -f\ndocker compose -f containers\u002F\u003Capp>\u002Fdocker-compose.yml up -d\n",[157,744,745,750],{"__ignoreMap":190},[194,746,747],{"class":196,"line":197},[194,748,749],{},"docker ps -a --filter \"label=computer.ants.managed=1\" --format '{{.Names}}' | xargs -r docker rm -f\n",[194,751,752],{"class":196,"line":238},[194,753,754],{},"docker compose -f containers\u002F\u003Capp>\u002Fdocker-compose.yml up -d\n",[150,756,757,758,760,761,763],{},"The running containers stay up until you remove them, so the transition is\nreversible until you delete them. ",[157,759,702],{}," cannot be combined with\n",[157,762,677],{}," (purge deletes the workloads it would export).",[177,765,767],{"id":766},"next","Next",[769,770,771,776,780,784,788],"ul",{},[772,773,774],"li",{},[574,775,95],{"href":96},[772,777,778],{},[574,779,105],{"href":106},[772,781,782],{},[574,783,80],{"href":81},[772,785,786],{},[574,787,56],{"href":57},[772,789,790],{},[574,791,115],{"href":116},[793,794,795],"style",{},"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);}",{"title":190,"searchDepth":238,"depth":238,"links":797},[798,799,802,803,804,805,806,807,808,809,812],{"id":179,"depth":238,"text":180},{"id":214,"depth":238,"text":215,"children":800},[801],{"id":369,"depth":244,"text":370},{"id":395,"depth":238,"text":396},{"id":451,"depth":238,"text":452},{"id":470,"depth":238,"text":471},{"id":534,"depth":238,"text":535},{"id":548,"depth":238,"text":549},{"id":578,"depth":238,"text":579},{"id":585,"depth":238,"text":30},{"id":614,"depth":238,"text":615,"children":810},[811],{"id":692,"depth":244,"text":693},{"id":766,"depth":238,"text":767},"Register a machine, provision the worker, and authenticate.","md",null,{},{"icon":93},{"title":90,"description":819},"Set up a remote nest: install ant-worker, seed the first owner, and register the machine.","Xm4Zl_0DcpwNSt7G84uh8sNJDd1grSl55Vh1rpQmhAk",[822,824],{"title":80,"path":81,"stem":82,"description":823,"icon":83,"children":-1},"Bring a project, an image, or a machine that Ant did not create under management, and what deliberately stays out of scope.",{"title":95,"path":96,"stem":97,"description":825,"icon":98,"children":-1},"Build and run a project on a registered machine.",1791494556851]