[{"data":1,"prerenderedAt":1069},["ShallowReactive",2],{"navigation_docs":3,"-concepts-templates":144,"-concepts-templates-surround":1064},[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":75,"body":146,"description":1056,"extension":1057,"links":1058,"meta":1059,"navigation":1060,"path":76,"seo":1061,"stem":77,"__hash__":1063},"docs\u002F2.concepts\u002F8.templates.md",{"type":147,"value":148,"toc":1049},"minimark",[149,179,232,266,277,282,295,325,347,356,359,486,497,501,526,530,552,556,563,598,608,612,619,627,631,878,898,901,955,962,1036,1045],[150,151,152,153,157,158,162,163,166,167,170,171,174,175,178],"p",{},"A ",[154,155,156],"strong",{},"project template"," is a small directory of ordinary files (a compose file,\nan ",[159,160,161],"code",{},"ant.yaml",", an ",[159,164,165],{},".env.example",") plus a ",[159,168,169],{},"template.yaml"," that declares its\nmetadata and the values a user can fill in. ",[159,172,173],{},"ant nest new"," renders one into a\nnew project folder; the dashboard's ",[154,176,177],{},"Add project → Template"," does the same\nthrough the shared library.",[180,181,186],"pre",{"className":182,"code":183,"language":184,"meta":185,"style":185},"language-sh shiki shiki-themes material-theme-lighter github-light github-dark","ant nest templates sync                          # import the Dokploy catalog\nant nest templates list                          # (--json)\nant nest templates search postgres               # (--tag, --refresh, --limit, --json)\nant nest templates show ackee                    # metadata and variables (--json)\nant nest new ackee                               # → ~\u002F.ant-apps\u002Fackee\nant nest new ackee ~\u002Fstacks\u002Fackee --group apps   # choose folder and group\nant nest new ackee --var HOST_PORT=5433          # set a template variable\n","sh","",[159,187,188,196,202,208,214,220,226],{"__ignoreMap":185},[189,190,193],"span",{"class":191,"line":192},"line",1,[189,194,195],{},"ant nest templates sync                          # import the Dokploy catalog\n",[189,197,199],{"class":191,"line":198},2,[189,200,201],{},"ant nest templates list                          # (--json)\n",[189,203,205],{"class":191,"line":204},3,[189,206,207],{},"ant nest templates search postgres               # (--tag, --refresh, --limit, --json)\n",[189,209,211],{"class":191,"line":210},4,[189,212,213],{},"ant nest templates show ackee                    # metadata and variables (--json)\n",[189,215,217],{"class":191,"line":216},5,[189,218,219],{},"ant nest new ackee                               # → ~\u002F.ant-apps\u002Fackee\n",[189,221,223],{"class":191,"line":222},6,[189,224,225],{},"ant nest new ackee ~\u002Fstacks\u002Fackee --group apps   # choose folder and group\n",[189,227,229],{"class":191,"line":228},7,[189,230,231],{},"ant nest new ackee --var HOST_PORT=5433          # set a template variable\n",[150,233,234,236,237,240,241,240,244,247,248,251,252,255,256,240,259,247,262,265],{},[159,235,173],{}," also takes ",[159,238,239],{},"--app",", ",[159,242,243],{},"--target-machine",[159,245,246],{},"--force",", and ",[159,249,250],{},"--json",";\n",[159,253,254],{},"templates sync"," takes ",[159,257,258],{},"--repo",[159,260,261],{},"--ref",[159,263,264],{},"--dir"," (convert a local checkout\ninstead of cloning).",[150,267,268,269,272,273,276],{},"The catalog is what you import with ",[159,270,271],{},"ant nest templates sync"," (the Dokploy\nblueprints, below) plus any templates in ",[159,274,275],{},"~\u002F.ant\u002Ftemplates","; listing downloads\nnothing.",[278,279,281],"h2",{"id":280},"the-dokploy-catalog","The Dokploy catalog",[150,283,284,286,287,294],{},[159,285,271],{}," imports the Dokploy open-source blueprints\n(",[288,289,293],"a",{"href":290,"rel":291},"https:\u002F\u002Fgithub.com\u002FDokploy\u002Ftemplates",[292],"nofollow","Dokploy\u002Ftemplates",", several hundred\nstacks) as ant templates:",[180,296,298],{"className":182,"code":297,"language":184,"meta":185,"style":185},"ant nest templates search postgres       # search Dokploy's catalog (cached 24h)\nant nest templates search --tag database\nant nest templates add plausible         # fetch one template\nant nest new plausible                   # fetches it on demand if not local\nant nest templates sync                  # or import the whole catalog (offline use)\n",[159,299,300,305,310,315,320],{"__ignoreMap":185},[189,301,302],{"class":191,"line":192},[189,303,304],{},"ant nest templates search postgres       # search Dokploy's catalog (cached 24h)\n",[189,306,307],{"class":191,"line":198},[189,308,309],{},"ant nest templates search --tag database\n",[189,311,312],{"class":191,"line":204},[189,313,314],{},"ant nest templates add plausible         # fetch one template\n",[189,316,317],{"class":191,"line":210},[189,318,319],{},"ant nest new plausible                   # fetches it on demand if not local\n",[189,321,322],{"class":191,"line":216},[189,323,324],{},"ant nest templates sync                  # or import the whole catalog (offline use)\n",[150,326,327,330,331,334,335,338,339,342,343,346],{},[159,328,329],{},"search"," reads Dokploy's published catalog; ",[159,332,333],{},"new \u003Cid>"," (and ",[159,336,337],{},"templates add",")\ndownloads just that blueprint, converts it, and caches it under\n",[159,340,341],{},"~\u002F.ant\u002Ftemplates-dokploy",". You do not need a full sync for one stack. The\ndashboard's ",[154,344,345],{},"Add → Template"," does the same: it lists the whole catalog and\nfilters it as you type, and downloads a template when you pick it. The catalog\nis bundled with ant and cached after a fetch, so the list still works when the\nindex cannot be reached.",[150,348,349,350,352,353,355],{},"They land in ",[159,351,341],{}," and are listed with your own\n",[159,354,275],{},"; your own template overrides an imported one with the same\nid.",[150,357,358],{},"The conversion adapts Dokploy's model to ant's:",[360,361,362,377,391,405,422,446],"ul",{},[363,364,365,368,369,372,373,376],"li",{},[154,366,367],{},"Ports."," Dokploy routes through a shared Traefik on the compose network and\nservices only ",[159,370,371],{},"expose"," their port. ant's Caddy routes to a host port, so each\nrouted service gets a published loopback port (",[159,374,375],{},"\"3000:3000\"","); change it if it\nclashes with something else on the machine.",[363,378,379,382,383,386,387,390],{},[154,380,381],{},"Variables."," Dokploy ",[159,384,385],{},"${password}"," values become generated secrets written\nto the project's ",[159,388,389],{},".env","; other values become defaults.",[363,392,393,396,397,400,401,404],{},[154,394,395],{},"Domains."," ",[159,398,399],{},"[[config.domains]]"," become ant deployment domains (a local\n",[159,402,403],{},"\u003Capp>.localhost"," by default; add a real domain for a nest).",[363,406,407,396,410,413,414,417,418,421],{},[154,408,409],{},"Config files.",[159,411,412],{},"[[config.mounts]]"," are written under ",[159,415,416],{},"files\u002F"," and the\ncompose's ",[159,419,420],{},"..\u002Ffiles\u002F…"," binds are pointed at them; the loaded file is\ngitignored because it may hold a generated secret.",[363,423,424,396,427,430,431,434,435,437,438,441,442,445],{},[154,425,426],{},"Env & secrets.",[159,428,429],{},"[config.env]"," entries (table or ",[159,432,433],{},"env = […]"," array) are\napplied to the stack; a ",[159,436,385],{}," becomes a generated secret variable and\n",[159,439,440],{},"${domain}"," the local host. Values that reference other variables\n(",[159,443,444],{},"https:\u002F\u002F${host}",") resolve at instantiation; secrets are never inlined into\nthe compose.",[363,447,448,455,456,240,459,462,463,466,467,470,471,240,474,477,478,481,482,485],{},[154,449,450,451,454],{},"Swarm ",[159,452,453],{},"deploy:","."," Compose-honored keys (",[159,457,458],{},"replicas",[159,460,461],{},"resources",") are kept,\n",[159,464,465],{},"restart_policy"," becomes ",[159,468,469],{},"restart",", and Swarm-only keys (",[159,472,473],{},"mode",[159,475,476],{},"placement",",\nupdate\u002Frollback config) are dropped. A top-level ",[159,479,480],{},"name:"," and per-service\n",[159,483,484],{},"container_name:"," are removed, since ant namespaces per project.",[150,487,488,489,492,493,496],{},"Blueprints ant cannot represent (for example a Traefik label with a ",[159,490,491],{},"{{...}}","\ntemplate, or anything ant's template loader rejects) are ",[154,494,495],{},"skipped",", so a bad\nblueprint never breaks the catalog. Values that Dokploy composes from other\nvariables (a URL built from a password) may need a small edit after creation.",[278,498,500],{"id":499},"where-projects-are-created","Where projects are created",[150,502,503,504,507,508,511,512,515,516,519,520,522,523,525],{},"Without a directory argument, a new project goes to ",[159,505,506],{},"~\u002F.ant-apps\u002F\u003Capp>",", or\n",[159,509,510],{},"\u002Fetc\u002Fant\u002Fapps\u002F\u003Capp>"," when ant runs as root (e.g. on a server). Set\n",[159,513,514],{},"ANT_APPS_DIR"," to override the root. The directory is created on the machine\nrunning ",[159,517,518],{},"ant",": ",[159,521,243],{}," records a deploy target in ",[159,524,161],{},"; it does\nnot move the files.",[278,527,529],{"id":528},"generated-values","Generated values",[150,531,532,533,535,536,539,540,543,544,547,548,551],{},"Secrets are generated per project and written to the project's ",[159,534,389],{}," file with\nmode ",[159,537,538],{},"0600",", alongside a ",[159,541,542],{},".gitignore"," that keeps it out of git. Compose reads\nthat file for ",[159,545,546],{},"${VAR}"," interpolation, and ant injects it for container\ntemplates that declare ",[159,549,550],{},"env_file: [.env]",". The CLI and the dashboard show\ngenerated values once, at creation time.",[278,553,555],{"id":554},"databases-are-marked-as-such","Databases are marked as such",[150,557,558,559,562],{},"A template sets the project's ",[159,560,561],{},"kind",":",[180,564,568],{"className":565,"code":566,"language":567,"meta":185,"style":185},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# ant.yaml\napp: postgres\nkind: database\n","yaml",[159,569,570,576,589],{"__ignoreMap":185},[189,571,572],{"class":191,"line":192},[189,573,575],{"class":574},"sutJx","# ant.yaml\n",[189,577,578,582,585],{"class":191,"line":198},[189,579,581],{"class":580},"sQzsp","app",[189,583,562],{"class":584},"sP7_E",[189,586,588],{"class":587},"s_sjI"," postgres\n",[189,590,591,593,595],{"class":191,"line":204},[189,592,561],{"class":580},[189,594,562],{"class":584},[189,596,597],{"class":587}," database\n",[150,599,600,601,604,605,607],{},"The dashboard presents a ",[159,602,603],{},"database"," project without the source-build surfaces\n(made-up Dockerfile fields, image-keep counts) while keeping every deploy\nfeature (environments, domains, volumes, resources) available. A project\nwithout ",[159,606,561],{}," is an ordinary app.",[278,609,611],{"id":610},"authoring-a-template","Authoring a template",[150,613,614,615,618],{},"Place a directory in ",[159,616,617],{},"~\u002F.ant\u002Ftemplates\u002F\u003Cid>\u002F",". It overrides an imported template\nwith the same id. The layout:",[180,620,625],{"className":621,"code":623,"language":624},[622],"language-text","~\u002F.ant\u002Ftemplates\u002Fmy-db\u002F\n  template.yaml        # metadata + variable schema (never copied)\n  docker-compose.yml   # rendered into the project\n  ant.yaml             # rendered\n  .env.example         # rendered\n","text",[159,626,623],{"__ignoreMap":185},[150,628,629,562],{},[159,630,169],{},[180,632,634],{"className":565,"code":633,"language":567,"meta":185,"style":185},"name: My DB\ndescription: A database with a generated password.\nkind: database          # or app\napp: mydb               # default app\u002Ffolder name\nrun: compose            # or container\ntags: [database, postgres]\nport: 5432              # default port, recorded on the project\nresolve: true           # resolve {{VAR}} in files at instantiation\nvariables:\n  - key: MYDB_USER\n    label: Database user\n    default: app\n    required: false\n  - key: HOST_PORT\n    type: port\n    default: \"5432\"\n  - key: MYDB_PASSWORD\n    generate: password  # generated at instantiation\n    secret: true        # written only to .env\n",[159,635,636,646,656,668,680,693,714,728,743,752,766,777,788,799,811,822,839,851,865],{"__ignoreMap":185},[189,637,638,641,643],{"class":191,"line":192},[189,639,640],{"class":580},"name",[189,642,562],{"class":584},[189,644,645],{"class":587}," My DB\n",[189,647,648,651,653],{"class":191,"line":198},[189,649,650],{"class":580},"description",[189,652,562],{"class":584},[189,654,655],{"class":587}," A database with a generated password.\n",[189,657,658,660,662,665],{"class":191,"line":204},[189,659,561],{"class":580},[189,661,562],{"class":584},[189,663,664],{"class":587}," database",[189,666,667],{"class":574},"          # or app\n",[189,669,670,672,674,677],{"class":191,"line":210},[189,671,581],{"class":580},[189,673,562],{"class":584},[189,675,676],{"class":587}," mydb",[189,678,679],{"class":574},"               # default app\u002Ffolder name\n",[189,681,682,685,687,690],{"class":191,"line":216},[189,683,684],{"class":580},"run",[189,686,562],{"class":584},[189,688,689],{"class":587}," compose",[189,691,692],{"class":574},"            # or container\n",[189,694,695,698,700,703,705,708,711],{"class":191,"line":222},[189,696,697],{"class":580},"tags",[189,699,562],{"class":584},[189,701,702],{"class":584}," [",[189,704,603],{"class":587},[189,706,707],{"class":584},",",[189,709,710],{"class":587}," postgres",[189,712,713],{"class":584},"]\n",[189,715,716,719,721,725],{"class":191,"line":228},[189,717,718],{"class":580},"port",[189,720,562],{"class":584},[189,722,724],{"class":723},"srdBf"," 5432",[189,726,727],{"class":574},"              # default port, recorded on the project\n",[189,729,731,734,736,740],{"class":191,"line":730},8,[189,732,733],{"class":580},"resolve",[189,735,562],{"class":584},[189,737,739],{"class":738},"syTEX"," true",[189,741,742],{"class":574},"           # resolve {{VAR}} in files at instantiation\n",[189,744,746,749],{"class":191,"line":745},9,[189,747,748],{"class":580},"variables",[189,750,751],{"class":584},":\n",[189,753,755,758,761,763],{"class":191,"line":754},10,[189,756,757],{"class":584},"  -",[189,759,760],{"class":580}," key",[189,762,562],{"class":584},[189,764,765],{"class":587}," MYDB_USER\n",[189,767,769,772,774],{"class":191,"line":768},11,[189,770,771],{"class":580},"    label",[189,773,562],{"class":584},[189,775,776],{"class":587}," Database user\n",[189,778,780,783,785],{"class":191,"line":779},12,[189,781,782],{"class":580},"    default",[189,784,562],{"class":584},[189,786,787],{"class":587}," app\n",[189,789,791,794,796],{"class":191,"line":790},13,[189,792,793],{"class":580},"    required",[189,795,562],{"class":584},[189,797,798],{"class":738}," false\n",[189,800,802,804,806,808],{"class":191,"line":801},14,[189,803,757],{"class":584},[189,805,760],{"class":580},[189,807,562],{"class":584},[189,809,810],{"class":587}," HOST_PORT\n",[189,812,814,817,819],{"class":191,"line":813},15,[189,815,816],{"class":580},"    type",[189,818,562],{"class":584},[189,820,821],{"class":587}," port\n",[189,823,825,827,829,833,836],{"class":191,"line":824},16,[189,826,782],{"class":580},[189,828,562],{"class":584},[189,830,832],{"class":831},"sjJ54"," \"",[189,834,835],{"class":587},"5432",[189,837,838],{"class":831},"\"\n",[189,840,842,844,846,848],{"class":191,"line":841},17,[189,843,757],{"class":584},[189,845,760],{"class":580},[189,847,562],{"class":584},[189,849,850],{"class":587}," MYDB_PASSWORD\n",[189,852,854,857,859,862],{"class":191,"line":853},18,[189,855,856],{"class":580},"    generate",[189,858,562],{"class":584},[189,860,861],{"class":587}," password",[189,863,864],{"class":574},"  # generated at instantiation\n",[189,866,868,871,873,875],{"class":191,"line":867},19,[189,869,870],{"class":580},"    secret",[189,872,562],{"class":584},[189,874,739],{"class":738},[189,876,877],{"class":574},"        # written only to .env\n",[150,879,880,881,884,885,887,888,240,891,247,894,897],{},"A variable's ",[159,882,883],{},"type"," may be ",[159,886,718],{}," (validated as a port) or a plain string;\n",[159,889,890],{},"label",[159,892,893],{},"required",[159,895,896],{},"secret"," refine how it is prompted and rendered.",[150,899,900],{},"Two substitution syntaxes coexist:",[902,903,904,920],"table",{},[905,906,907],"thead",{},[908,909,910,914,917],"tr",{},[911,912,913],"th",{},"Syntax",[911,915,916],{},"Resolved",[911,918,919],{},"Use for",[921,922,923,940],"tbody",{},[908,924,925,931,934],{},[926,927,928],"td",{},[159,929,930],{},"{{KEY}}",[926,932,933],{},"at instantiation, inlined into the file",[926,935,936,937,939],{},"ports, names, ",[159,938,161],{}," fields",[908,941,942,947,952],{},[926,943,944],{},[159,945,946],{},"${KEY}",[926,948,949,950],{},"at deploy time, from the generated ",[159,951,389],{},[926,953,954],{},"secrets and any value a user may rotate",[150,956,957,958,961],{},"Templates are validated when they load (and by ",[159,959,960],{},"go test .\u002Finternal\u002Ftemplate","):",[360,963,964,971,980,993,1010,1018,1030,1033],{},[363,965,966,967,970],{},"the template id must match ",[159,968,969],{},"^[a-z0-9][a-z0-9._-]*$",";",[363,972,973,975,976,979],{},[159,974,161],{}," is required and must set ",[159,977,978],{},"deploy.build: none","; templates run\npre-built images;",[363,981,982,985,986,989,990,970],{},[159,983,984],{},"run:"," must be ",[159,987,988],{},"container"," or ",[159,991,992],{},"compose",[363,994,995,996,999,1000,507,1002,1005,1006,1009],{},"the compose file must not use ",[159,997,998],{},"container_name",", a top-level ",[159,1001,480],{},[159,1003,1004],{},"external: true"," networks\u002Fvolumes; compose's per-project namespace\n(",[159,1007,1008],{},"-p \u003Capp>-\u003Cenv>",") already keeps stacks apart;",[363,1011,1012,1014,1015,1017],{},[159,1013,389],{}," is reserved for ant's generated file, so ship ",[159,1016,165],{}," instead;",[363,1019,1020,1021,1023,1024,1026,1027,970],{},"a secret variable must use ",[159,1022,946],{},", never ",[159,1025,930],{},", and must also set\n",[159,1028,1029],{},"generate:",[363,1031,1032],{},"every declared variable must be referenced somewhere;",[363,1034,1035],{},"the default render must parse and load.",[150,1037,1038,1039,1041,1042,1044],{},"See ",[288,1040,66],{"href":67}," for what the generated ",[159,1043,161],{}," can do.",[1046,1047,1048],"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);}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 .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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--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":185,"searchDepth":198,"depth":198,"links":1050},[1051,1052,1053,1054,1055],{"id":280,"depth":198,"text":281},{"id":499,"depth":198,"text":500},{"id":528,"depth":198,"text":529},{"id":554,"depth":198,"text":555},{"id":610,"depth":198,"text":611},"Create a ready-to-deploy project from a catalog template.","md",null,{},{"icon":78},{"title":75,"description":1062},"Project templates scaffold a database or container stack with ant.yaml, a compose file, and generated secrets.","MMVJU2Fqui4anzUiXRO59nJkzdyQ4DetxVtymqxTwvk",[1065,1067],{"title":70,"path":71,"stem":72,"description":1066,"icon":73,"children":-1},"Divide a codebase into shared networks, env, and secrets.",{"title":80,"path":81,"stem":82,"description":1068,"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.",1791494556682]