[{"data":1,"prerenderedAt":926},["ShallowReactive",2],{"navigation_docs":3,"-get-started-project-structure":144,"-get-started-project-structure-surround":921},[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":25,"body":146,"description":913,"extension":914,"links":915,"meta":916,"navigation":917,"path":26,"seo":918,"stem":27,"__hash__":920},"docs\u002F1.get-started\u002F4.project-structure.md",{"type":147,"value":148,"toc":904},"minimark",[149,154,169,274,325,335,342,371,375,526,529,545,611,625,652,671,675,684,878,895,900],[150,151,153],"h2",{"id":152},"in-your-project","In your project",[155,156,157,161,162,168],"p",{},[158,159,160],"code",{},"ant nest init"," writes a single file, ",[163,164,165],"strong",{},[158,166,167],{},"ant.yaml",":",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","app: my-app\ndeploy:\n  build: dockerfile     # dockerfile | nixpacks | buildpacks | railpack | none\n  run: container        # container | compose | stack\n  port: 3000\n  # keep_images: 3\n  # use_machine_network: true   # join the machine-wide network\n# rollback:\n#   keep_releases: 5    # releases retained for `ant trail rollback`\n# machine: prod         # uncomment to target a remote nest\n","yaml","",[158,177,178,194,203,218,232,244,250,256,262,268],{"__ignoreMap":175},[179,180,183,187,190],"span",{"class":181,"line":182},"line",1,[179,184,186],{"class":185},"sQzsp","app",[179,188,168],{"class":189},"sP7_E",[179,191,193],{"class":192},"s_sjI"," my-app\n",[179,195,197,200],{"class":181,"line":196},2,[179,198,199],{"class":185},"deploy",[179,201,202],{"class":189},":\n",[179,204,206,209,211,214],{"class":181,"line":205},3,[179,207,208],{"class":185},"  build",[179,210,168],{"class":189},[179,212,213],{"class":192}," dockerfile",[179,215,217],{"class":216},"sutJx","     # dockerfile | nixpacks | buildpacks | railpack | none\n",[179,219,221,224,226,229],{"class":181,"line":220},4,[179,222,223],{"class":185},"  run",[179,225,168],{"class":189},[179,227,228],{"class":192}," container",[179,230,231],{"class":216},"        # container | compose | stack\n",[179,233,235,238,240],{"class":181,"line":234},5,[179,236,237],{"class":185},"  port",[179,239,168],{"class":189},[179,241,243],{"class":242},"srdBf"," 3000\n",[179,245,247],{"class":181,"line":246},6,[179,248,249],{"class":216},"  # keep_images: 3\n",[179,251,253],{"class":181,"line":252},7,[179,254,255],{"class":216},"  # use_machine_network: true   # join the machine-wide network\n",[179,257,259],{"class":181,"line":258},8,[179,260,261],{"class":216},"# rollback:\n",[179,263,265],{"class":181,"line":264},9,[179,266,267],{"class":216},"#   keep_releases: 5    # releases retained for `ant trail rollback`\n",[179,269,271],{"class":181,"line":270},10,[179,272,273],{"class":216},"# machine: prod         # uncomment to target a remote nest\n",[275,276,277,288,294,300,314],"ul",{},[278,279,280,283,284,287],"li",{},[158,281,282],{},"build"," selects the builder. ",[158,285,286],{},"none"," means the image is pre-built or comes from\nthe compose file.",[278,289,290,293],{},[158,291,292],{},"run"," selects how it runs: a single container, a compose project, or a stack.",[278,295,296,299],{},[158,297,298],{},"machine"," (optional) targets a registered remote machine by name.",[278,301,302,305,306,309,310,313],{},[158,303,304],{},"rollback"," configures release retention and the optional rollback hooks;\nimage retention is ",[158,307,308],{},"keep_images",", falling back to ",[158,311,312],{},"rollback.keep_releases",".",[278,315,316,317,320,321,324],{},"Environments (",[158,318,319],{},"local",", ",[158,322,323],{},"dev",", …) layer env vars, secrets, ports, and domains\non top of the base config.",[155,326,327,328,331,332,334],{},"See ",[329,330,61],"a",{"href":62}," for the full ",[158,333,167],{}," reference.",[150,336,338,339],{"id":337},"under-ant","Under ",[158,340,341],{},"~\u002F.ant",[155,343,344,345,347,348,351,352,355,356,359,360,363,364,367,368,313],{},"Ant keeps its state in ",[158,346,341],{},", split by role: the ",[163,349,350],{},"client"," state that ",[158,353,354],{},"ant","\nand ",[158,357,358],{},"ant ui"," own, and the ",[163,361,362],{},"worker"," state ",[158,365,366],{},"ant-worker"," owns under\n",[158,369,370],{},"~\u002F.ant\u002Fworker\u002F",[372,373,374],"h3",{"id":350},"Client",[376,377,378,391],"table",{},[379,380,381],"thead",{},[382,383,384,388],"tr",{},[385,386,387],"th",{},"Path",[385,389,390],{},"Holds",[392,393,394,405,427,437,450,460,476,493,503,513],"tbody",{},[382,395,396,402],{},[397,398,399],"td",{},[158,400,401],{},"~\u002F.ant\u002Fconfig.json",[397,403,404],{},"Machines (including the roster mirror), groups, project roots, UI settings, notifications, relay",[382,406,407,412],{},[397,408,409],{},[158,410,411],{},"~\u002F.ant\u002Fidentity",[397,413,414,415,418,419,422,423,426],{},"Your account keypair (written by ",[158,416,417],{},"ant colony signup",", restored by ",[158,420,421],{},"login","\u002F",[158,424,425],{},"import",")",[382,428,429,434],{},[397,430,431],{},[158,432,433],{},"~\u002F.ant\u002Fmachines\u002F\u003Cid>\u002Fidentity",[397,435,436],{},"The client-side copy of a machine's keypair, used to provision it",[382,438,439,444],{},[397,440,441],{},[158,442,443],{},"~\u002F.ant\u002Fdeployments.json",[397,445,446,447],{},"The deploy history shown by ",[158,448,449],{},"ant trail history",[382,451,452,457],{},[397,453,454],{},[158,455,456],{},"~\u002F.ant\u002Fdeploy-logs\u002F",[397,458,459],{},"Captured output per deploy event (history is capped at 200 entries, 500 lines each)",[382,461,462,473],{},[397,463,464,320,467,320,470],{},[158,465,466],{},"~\u002F.ant\u002Ftemplates",[158,468,469],{},"~\u002F.ant\u002Ftemplates-dokploy",[158,471,472],{},"~\u002F.ant\u002Fdokploy-index.json",[397,474,475],{},"Your templates and the imported Dokploy catalog",[382,477,478,483],{},[397,479,480],{},[158,481,482],{},"~\u002F.ant\u002Flocks\u002F",[397,484,485,486,320,489,492],{},"Transient operation locks (",[158,487,488],{},"caddy-\u003Chash>",[158,490,491],{},"local-deploy-\u003Chash>","), removed after use",[382,494,495,500],{},[397,496,497],{},[158,498,499],{},"~\u002F.ant\u002Fknown_hosts",[397,501,502],{},"SSH host keys pinned during provisioning",[382,504,505,510],{},[397,506,507],{},[158,508,509],{},"~\u002F.ant\u002Fcaddy\u002F",[397,511,512],{},"The managed local Caddy's PID (and a transient config while it starts)",[382,514,515,520],{},[397,516,517],{},[158,518,519],{},"~\u002F.ant\u002Flocal\u002F\u003Capp>\u002F\u003Cenv>\u002F",[397,521,522,523],{},"Legacy working directory; only read and removed by ",[158,524,525],{},"ant trail destroy",[372,527,528],{"id":362},"Worker",[155,530,531,532,534,535,537,538,540,541,544],{},"A machine running ",[158,533,366],{}," keeps its own state under ",[158,536,370],{},"\n(system installs run it as user ",[158,539,354],{},", so ",[158,542,543],{},"\u002Fhome\u002Fant\u002F.ant\u002Fworker\u002F","):",[376,546,547,555],{},[379,548,549],{},[382,550,551,553],{},[385,552,387],{},[385,554,390],{},[392,556,557,567,584,597],{},[382,558,559,564],{},[397,560,561],{},[158,562,563],{},"agent-identity",[397,565,566],{},"The machine's keypair, its NodeID",[382,568,569,574],{},[397,570,571],{},[158,572,573],{},"agent-state.json",[397,575,576,577,580,581,426],{},"The ",[163,578,579],{},"authoritative"," roster, used\u002Frevoked invites, and the bootstrap marker (a state import keeps the previous file as ",[158,582,583],{},".bak",[382,585,586,591],{},[397,587,588],{},[158,589,590],{},"audit.log",[397,592,593,594,426],{},"Hash-chained log of privileged RPCs (rotates to ",[158,595,596],{},"audit.log.1",[382,598,599,604],{},[397,600,601],{},[158,602,603],{},"remote-compose\u002F\u003Cproject>\u002F",[397,605,606,607,610],{},"Stored compose and stack files, plus ",[158,608,609],{},"secrets.env"," (0600) for a compose project",[155,612,613,614,616,617,620,621,624],{},"The roster shown by the CLI and dashboard is a mirror of ",[158,615,573],{},",\nrefreshed from the machine after each change; authorization always happens\nagainst the machine's copy. The worker's paths can be overridden with\n",[158,618,619],{},"--identity"," \u002F ",[158,622,623],{},"--state","; provisioning sets them explicitly.",[155,626,627,628,631,632,320,635,320,637,639,640,643,644,646,647,422,649,651],{},"A worker started with the default paths ",[163,629,630],{},"adopts pre-existing state"," after an\nupgrade: a ",[158,633,634],{},"~\u002F.ant\u002Fagent-identity",[158,636,573],{},[158,638,590],{},", and\n",[158,641,642],{},"remote-compose\u002F"," left by an older build move into ",[158,645,370],{},". Explicit\n",[158,648,619],{},[158,650,623],{}," flags are never moved, and a compose project deployed\nbefore the move is still found in place.",[155,653,654,655,658,659,662,663,355,665,668,669,313],{},"Config, identity, state, audit, and secret files are written ",[158,656,657],{},"0600"," (their\ndirectories ",[158,660,661],{},"0700","). The imported Dokploy catalog (",[158,664,472],{},[158,666,667],{},"~\u002F.ant\u002Ftemplates-dokploy\u002F",") is world-readable by design. Nothing is written\ninto your project except ",[158,670,167],{},[150,672,674],{"id":673},"machine-config-schema","Machine config schema",[155,676,677,679,680,683],{},[158,678,401],{}," is schema ",[163,681,682],{},"v2",". Projects, groups, and Caddy settings nest\nunder the machine they belong to:",[170,685,689],{"className":686,"code":687,"language":688,"meta":175,"style":175},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"version\": 2,\n  \"machines\": {\n    \"local\": {\n      \"caddy\": { \"auto_start\": true },\n      \"groups\": { \"backend\": { \"domains\": [\"example.com\"] } },\n      \"project_dirs\": [\"\u002Fhome\u002Fme\u002Fcode\u002Fapi\", \"\u002Fhome\u002Fme\u002Fcode\u002Fworker\"]\n    }\n  }\n}\n","json",[158,690,691,696,717,731,745,777,830,863,868,873],{"__ignoreMap":175},[179,692,693],{"class":181,"line":182},[179,694,695],{"class":189},"{\n",[179,697,698,702,706,709,711,714],{"class":181,"line":196},[179,699,701],{"class":700},"s39Yj","  \"",[179,703,705],{"class":704},"sseR_","version",[179,707,708],{"class":700},"\"",[179,710,168],{"class":189},[179,712,713],{"class":242}," 2",[179,715,716],{"class":189},",\n",[179,718,719,721,724,726,728],{"class":181,"line":205},[179,720,701],{"class":700},[179,722,723],{"class":704},"machines",[179,725,708],{"class":700},[179,727,168],{"class":189},[179,729,730],{"class":189}," {\n",[179,732,733,736,739,741,743],{"class":181,"line":220},[179,734,735],{"class":700},"    \"",[179,737,319],{"class":738},"sZMiF",[179,740,708],{"class":700},[179,742,168],{"class":189},[179,744,730],{"class":189},[179,746,747,750,753,755,757,760,763,767,769,771,774],{"class":181,"line":234},[179,748,749],{"class":700},"      \"",[179,751,752],{"class":242},"caddy",[179,754,708],{"class":700},[179,756,168],{"class":189},[179,758,759],{"class":189}," {",[179,761,762],{"class":700}," \"",[179,764,766],{"class":765},"swQdS","auto_start",[179,768,708],{"class":700},[179,770,168],{"class":189},[179,772,773],{"class":700}," true",[179,775,776],{"class":189}," },\n",[179,778,779,781,784,786,788,790,792,795,797,799,801,803,807,809,811,814,817,820,822,825,828],{"class":181,"line":246},[179,780,749],{"class":700},[179,782,783],{"class":242},"groups",[179,785,708],{"class":700},[179,787,168],{"class":189},[179,789,759],{"class":189},[179,791,762],{"class":700},[179,793,794],{"class":765},"backend",[179,796,708],{"class":700},[179,798,168],{"class":189},[179,800,759],{"class":189},[179,802,762],{"class":700},[179,804,806],{"class":805},"sAQsV","domains",[179,808,708],{"class":700},[179,810,168],{"class":189},[179,812,813],{"class":189}," [",[179,815,708],{"class":816},"sjJ54",[179,818,819],{"class":192},"example.com",[179,821,708],{"class":816},[179,823,824],{"class":189},"]",[179,826,827],{"class":189}," }",[179,829,776],{"class":189},[179,831,832,834,837,839,841,843,845,848,850,853,855,858,860],{"class":181,"line":252},[179,833,749],{"class":700},[179,835,836],{"class":242},"project_dirs",[179,838,708],{"class":700},[179,840,168],{"class":189},[179,842,813],{"class":189},[179,844,708],{"class":816},[179,846,847],{"class":192},"\u002Fhome\u002Fme\u002Fcode\u002Fapi",[179,849,708],{"class":816},[179,851,852],{"class":189},",",[179,854,762],{"class":816},[179,856,857],{"class":192},"\u002Fhome\u002Fme\u002Fcode\u002Fworker",[179,859,708],{"class":816},[179,861,862],{"class":189},"]\n",[179,864,865],{"class":181,"line":258},[179,866,867],{"class":189},"    }\n",[179,869,870],{"class":181,"line":264},[179,871,872],{"class":189},"  }\n",[179,874,875],{"class":181,"line":270},[179,876,877],{"class":189},"}\n",[155,879,880,881,883,884,887,888,422,890,422,892,894],{},"v1 configs are migrated on load: a top-level ",[158,882,319],{}," object is folded into\n",[158,885,886],{},"machines.local",", and the old flat ",[158,889,783],{},[158,891,836],{},[158,893,752],{}," are nested.",[155,896,327,897,899],{},[329,898,61],{"href":62}," for the full reference.",[901,902,903],"style",{},"html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sAQsV, html code.shiki .sAQsV{--shiki-light:#916B53;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":175,"searchDepth":196,"depth":196,"links":905},[906,907,912],{"id":152,"depth":196,"text":153},{"id":337,"depth":196,"text":908,"children":909},"Under ~\u002F.ant",[910,911],{"id":350,"depth":205,"text":374},{"id":362,"depth":205,"text":528},{"id":673,"depth":196,"text":674},"ant.yaml, the state under ~\u002F.ant, and what Ant writes where.","md",null,{},{"icon":28},{"title":25,"description":919},"How Ant lays out ant.yaml in your project and its state under ~\u002F.ant.","37y9H7stNsKv7Klc2ozH3ngszv6TPDXAZEih5CLd75g",[922,924],{"title":20,"path":21,"stem":22,"description":923,"icon":23,"children":-1},"Scaffold a config, check your tools, and deploy locally.",{"title":30,"path":31,"stem":32,"description":925,"icon":33,"children":-1},"The local web console: how to serve it, and what each page does.",1791494556237]