[{"data":1,"prerenderedAt":894},["ShallowReactive",2],{"navigation_docs":3,"-docs-templates-anatomy":145,"-docs-templates-anatomy-surround":889},[4,8,12,16,51,81,103],{"title":5,"path":6,"stem":7},"Introduction","\u002Fdocs\u002Fintroduction","docs\u002F1.introduction",{"title":9,"path":10,"stem":11},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F2.getting-started",{"title":13,"path":14,"stem":15},"Environment variables","\u002Fdocs\u002Fenvironment-variables","docs\u002F3.environment-variables",{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":50},"Guide","i-lucide-book-open","\u002Fdocs\u002Fguide","docs\u002F4.guide",[22,26,30,34,38,42,46],{"title":23,"path":24,"stem":25},"Scaffold a project","\u002Fdocs\u002Fguide\u002Fscaffold","docs\u002F4.guide\u002F1.scaffold",{"title":27,"path":28,"stem":29},"Pin and manage templates","\u002Fdocs\u002Fguide\u002Fpin","docs\u002F4.guide\u002F2.pin",{"title":31,"path":32,"stem":33},"Update pinned templates","\u002Fdocs\u002Fguide\u002Fupdating","docs\u002F4.guide\u002F3.updating",{"title":35,"path":36,"stem":37},"Find templates","\u002Fdocs\u002Fguide\u002Fsearch","docs\u002F4.guide\u002F4.search",{"title":39,"path":40,"stem":41},"Manage registries","\u002Fdocs\u002Fguide\u002Fregistry","docs\u002F4.guide\u002F5.registry",{"title":43,"path":44,"stem":45},"Troubleshooting","\u002Fdocs\u002Fguide\u002Ftroubleshooting","docs\u002F4.guide\u002F6.troubleshooting",{"title":47,"path":48,"stem":49},"Build your first template","\u002Fdocs\u002Fguide\u002Fcreate-template","docs\u002F4.guide\u002F7.create-template",false,{"title":52,"icon":53,"path":54,"stem":55,"children":56,"page":50},"Templates","i-lucide-layout-template","\u002Fdocs\u002Ftemplates","docs\u002F5.templates",[57,61,65,69,73,77],{"title":58,"path":59,"stem":60},"Template anatomy","\u002Fdocs\u002Ftemplates\u002Fanatomy","docs\u002F5.templates\u002F1.anatomy",{"title":62,"path":63,"stem":64},"Template params","\u002Fdocs\u002Ftemplates\u002Fparams","docs\u002F5.templates\u002F2.params",{"title":66,"path":67,"stem":68},"Template rendering","\u002Fdocs\u002Ftemplates\u002Ftemplate-rendering","docs\u002F5.templates\u002F3.template-rendering",{"title":70,"path":71,"stem":72},"Hooks","\u002Fdocs\u002Ftemplates\u002Fhooks","docs\u002F5.templates\u002F4.hooks",{"title":74,"path":75,"stem":76},"Publish a template","\u002Fdocs\u002Ftemplates\u002Fpublish","docs\u002F5.templates\u002F5.publish",{"title":78,"path":79,"stem":80},"spin.toml","\u002Fdocs\u002Ftemplates\u002Fspin-toml","docs\u002F5.templates\u002F6.spin-toml",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":50},"Registries","i-lucide-database","\u002Fdocs\u002Fregistries","docs\u002F6.registries",[87,91,95,99],{"title":88,"path":89,"stem":90},"Registry anatomy","\u002Fdocs\u002Fregistries\u002Fanatomy","docs\u002F6.registries\u002F1.anatomy",{"title":92,"path":93,"stem":94},"Template metadata file","\u002Fdocs\u002Fregistries\u002Ftemplate-metadata","docs\u002F6.registries\u002F2.template-metadata",{"title":96,"path":97,"stem":98},"Run a registry","\u002Fdocs\u002Fregistries\u002Frun","docs\u002F6.registries\u002F3.run",{"title":100,"path":101,"stem":102},"registry.toml","\u002Fdocs\u002Fregistries\u002Fregistry-toml","docs\u002F6.registries\u002F4.registry-toml",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":50},"Commands","i-lucide-terminal","\u002Fdocs\u002Fcommands","docs\u002F7.commands",[109,113,117,121,125,129,133,137,141],{"title":110,"path":111,"stem":112},"spin new","\u002Fdocs\u002Fcommands\u002Fnew","docs\u002F7.commands\u002F1.new",{"title":114,"path":115,"stem":116},"spin add","\u002Fdocs\u002Fcommands\u002Fadd","docs\u002F7.commands\u002F2.add",{"title":118,"path":119,"stem":120},"spin list","\u002Fdocs\u002Fcommands\u002Flist","docs\u002F7.commands\u002F3.list",{"title":122,"path":123,"stem":124},"spin update","\u002Fdocs\u002Fcommands\u002Fupdate","docs\u002F7.commands\u002F4.update",{"title":126,"path":127,"stem":128},"spin remove","\u002Fdocs\u002Fcommands\u002Fremove","docs\u002F7.commands\u002F5.remove",{"title":130,"path":131,"stem":132},"spin search","\u002Fdocs\u002Fcommands\u002Fsearch","docs\u002F7.commands\u002F6.search",{"title":134,"path":135,"stem":136},"spin registry","\u002Fdocs\u002Fcommands\u002Fregistry","docs\u002F7.commands\u002F7.registry",{"title":138,"path":139,"stem":140},"spin init","\u002Fdocs\u002Fcommands\u002Finit","docs\u002F7.commands\u002F8.init",{"title":142,"path":143,"stem":144},"spin version","\u002Fdocs\u002Fcommands\u002Fversion","docs\u002F7.commands\u002F9.version",{"id":146,"title":58,"body":147,"description":883,"extension":884,"links":885,"meta":886,"navigation":353,"path":59,"seo":887,"stem":60,"__hash__":888},"docs\u002Fdocs\u002F5.templates\u002F1.anatomy.md",{"type":148,"value":149,"toc":867},"minimark",[150,155,163,188,191,199,209,230,235,239,245,248,531,536,553,559,563,569,596,602,628,634,649,655,681,685,711,715,724,728,742,841,850,857,863],[151,152,154],"h2",{"id":153},"quick-start","Quick start",[156,157,158,159,162],"p",{},"Create a template with ",[160,161,138],"code",{},":",[164,165,170],"pre",{"className":166,"code":167,"language":168,"meta":169,"style":169},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","spin init my-cli-template\n","sh","",[160,171,172],{"__ignoreMap":169},[173,174,177,181,185],"span",{"class":175,"line":176},"line",1,[173,178,180],{"class":179},"sBMFI","spin",[173,182,184],{"class":183},"sfazB"," init",[173,186,187],{"class":183}," my-cli-template\n",[156,189,190],{},"This writes:",[164,192,197],{"className":193,"code":195,"language":196},[194],"language-text","my-cli-template\u002F\n  spin.toml          # manifest\n  _base\u002F             # file tree rendered into the project\n    file.txt.tmpl\n  README.md\n","text",[160,198,195],{"__ignoreMap":169},[156,200,201,202,204,205,208],{},"Edit ",[160,203,78],{}," and ",[160,206,207],{},"_base\u002F"," to taste, then test it:",[164,210,212],{"className":166,"code":211,"language":168,"meta":169,"style":169},"spin new myapp .\u002Fmy-cli-template --dry-run\n",[160,213,214],{"__ignoreMap":169},[173,215,216,218,221,224,227],{"class":175,"line":176},[173,217,180],{"class":179},[173,219,220],{"class":183}," new",[173,222,223],{"class":183}," myapp",[173,225,226],{"class":183}," .\u002Fmy-cli-template",[173,228,229],{"class":183}," --dry-run\n",[231,232],"img",{"alt":233,"src":234},"A recorded terminal demo of creating a template with `spin init` and testing it.","\u002Fdemos\u002Ftemplate-init.gif",[151,236,238],{"id":237},"required-files","Required files",[240,241,243],"h3",{"id":242},"spintoml",[160,244,78],{},[156,246,247],{},"The manifest declares metadata, params, hooks, and include rules.",[164,249,253],{"className":250,"code":251,"language":252,"meta":169,"style":169},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name = \"my-cli-template\"\ndescription = \"A minimal CLI template\"\nversion = \"0.1.0\"\ntype = \"cli\"\nlanguage = \"go\"\nmin_spin_version = \"0.1.0\"\n\n[params]\nproject_name = { type = \"text\", prompt = \"Project name\", default = \"myproject\" }\nlicense = { type = \"license\", prompt = \"License\", default = \"MIT\" }\n\n[[pre]]\nrun = \"mkdir -p cmd\"\n\n[[post]]\nrun = \"echo 'Created {{ .project_name }}'\"\n","toml",[160,254,255,274,289,304,319,334,348,355,367,422,471,476,487,502,507,517],{"__ignoreMap":169},[173,256,257,261,265,268,271],{"class":175,"line":176},[173,258,260],{"class":259},"sTEyZ","name ",[173,262,264],{"class":263},"sMK4o","=",[173,266,267],{"class":263}," \"",[173,269,270],{"class":183},"my-cli-template",[173,272,273],{"class":263},"\"\n",[173,275,277,280,282,284,287],{"class":175,"line":276},2,[173,278,279],{"class":259},"description ",[173,281,264],{"class":263},[173,283,267],{"class":263},[173,285,286],{"class":183},"A minimal CLI template",[173,288,273],{"class":263},[173,290,292,295,297,299,302],{"class":175,"line":291},3,[173,293,294],{"class":259},"version ",[173,296,264],{"class":263},[173,298,267],{"class":263},[173,300,301],{"class":183},"0.1.0",[173,303,273],{"class":263},[173,305,307,310,312,314,317],{"class":175,"line":306},4,[173,308,309],{"class":259},"type ",[173,311,264],{"class":263},[173,313,267],{"class":263},[173,315,316],{"class":183},"cli",[173,318,273],{"class":263},[173,320,322,325,327,329,332],{"class":175,"line":321},5,[173,323,324],{"class":259},"language ",[173,326,264],{"class":263},[173,328,267],{"class":263},[173,330,331],{"class":183},"go",[173,333,273],{"class":263},[173,335,337,340,342,344,346],{"class":175,"line":336},6,[173,338,339],{"class":259},"min_spin_version ",[173,341,264],{"class":263},[173,343,267],{"class":263},[173,345,301],{"class":183},[173,347,273],{"class":263},[173,349,351],{"class":175,"line":350},7,[173,352,354],{"emptyLinePlaceholder":353},true,"\n",[173,356,358,361,364],{"class":175,"line":357},8,[173,359,360],{"class":263},"[",[173,362,363],{"class":179},"params",[173,365,366],{"class":263},"]\n",[173,368,370,373,375,378,381,383,385,387,390,393,396,398,400,403,405,407,410,412,414,417,419],{"class":175,"line":369},9,[173,371,372],{"class":259},"project_name ",[173,374,264],{"class":263},[173,376,377],{"class":263}," {",[173,379,380],{"class":259}," type ",[173,382,264],{"class":263},[173,384,267],{"class":263},[173,386,196],{"class":183},[173,388,389],{"class":263},"\"",[173,391,392],{"class":263},",",[173,394,395],{"class":259}," prompt ",[173,397,264],{"class":263},[173,399,267],{"class":263},[173,401,402],{"class":183},"Project name",[173,404,389],{"class":263},[173,406,392],{"class":263},[173,408,409],{"class":259}," default ",[173,411,264],{"class":263},[173,413,267],{"class":263},[173,415,416],{"class":183},"myproject",[173,418,389],{"class":263},[173,420,421],{"class":263}," }\n",[173,423,425,428,430,432,434,436,438,441,443,445,447,449,451,454,456,458,460,462,464,467,469],{"class":175,"line":424},10,[173,426,427],{"class":259},"license ",[173,429,264],{"class":263},[173,431,377],{"class":263},[173,433,380],{"class":259},[173,435,264],{"class":263},[173,437,267],{"class":263},[173,439,440],{"class":183},"license",[173,442,389],{"class":263},[173,444,392],{"class":263},[173,446,395],{"class":259},[173,448,264],{"class":263},[173,450,267],{"class":263},[173,452,453],{"class":183},"License",[173,455,389],{"class":263},[173,457,392],{"class":263},[173,459,409],{"class":259},[173,461,264],{"class":263},[173,463,267],{"class":263},[173,465,466],{"class":183},"MIT",[173,468,389],{"class":263},[173,470,421],{"class":263},[173,472,474],{"class":175,"line":473},11,[173,475,354],{"emptyLinePlaceholder":353},[173,477,479,482,484],{"class":175,"line":478},12,[173,480,481],{"class":263},"[[",[173,483,164],{"class":179},[173,485,486],{"class":263},"]]\n",[173,488,490,493,495,497,500],{"class":175,"line":489},13,[173,491,492],{"class":259},"run ",[173,494,264],{"class":263},[173,496,267],{"class":263},[173,498,499],{"class":183},"mkdir -p cmd",[173,501,273],{"class":263},[173,503,505],{"class":175,"line":504},14,[173,506,354],{"emptyLinePlaceholder":353},[173,508,510,512,515],{"class":175,"line":509},15,[173,511,481],{"class":263},[173,513,514],{"class":179},"post",[173,516,486],{"class":263},[173,518,520,522,524,526,529],{"class":175,"line":519},16,[173,521,492],{"class":259},[173,523,264],{"class":263},[173,525,267],{"class":263},[173,527,528],{"class":183},"echo 'Created {{ .project_name }}'",[173,530,273],{"class":263},[240,532,534],{"id":533},"_base",[160,535,207],{},[156,537,538,539,541,542,545,546,549,550,552],{},"Every file inside ",[160,540,207],{}," is copied into the user's project. Files ending in ",[160,543,544],{},".tmpl"," are run through Go's ",[160,547,548],{},"text\u002Ftemplate"," with the resolved param values. The ",[160,551,544],{}," extension is stripped in the output.",[164,554,557],{"className":555,"code":556,"language":196},[194],"_base\u002F\n  README.md.tmpl      # rendered as README.md\n  go.mod.tmpl         # rendered as go.mod\n  .gitignore          # copied verbatim\n",[160,558,556],{"__ignoreMap":169},[151,560,562],{"id":561},"optional-files","Optional files",[240,564,566],{"id":565},"_pre",[160,567,568],{},"_pre\u002F",[156,570,571,572,574,575,578,579,581,582,584,585,587,588,592,593,595],{},"The ",[160,573,568],{}," directory holds assets your ",[160,576,577],{},"[[pre]]"," hooks need. ",[160,580,180],{}," copies ",[160,583,568],{}," verbatim into the generated project as ",[160,586,568],{}," ",[589,590,591],"strong",{},"before"," the pre-hooks run, so the hooks can reference those files even though ",[160,594,207],{}," has not been written yet:",[164,597,600],{"className":598,"code":599,"language":196},[194],"my-template\u002F\n  spin.toml\n  _base\u002F\n  _pre\u002F\n    init.sh\n",[160,601,599],{"__ignoreMap":169},[164,603,605],{"className":250,"code":604,"language":252,"meta":169,"style":169},"[[pre]]\nrun = \"bash _pre\u002Finit.sh\"\n",[160,606,607,615],{"__ignoreMap":169},[173,608,609,611,613],{"class":175,"line":176},[173,610,481],{"class":263},[173,612,164],{"class":179},[173,614,486],{"class":263},[173,616,617,619,621,623,626],{"class":175,"line":276},[173,618,492],{"class":259},[173,620,264],{"class":263},[173,622,267],{"class":263},[173,624,625],{"class":183},"bash _pre\u002Finit.sh",[173,627,273],{"class":263},[240,629,631],{"id":630},"_post",[160,632,633],{},"_post\u002F",[156,635,571,636,574,638,641,642,581,644,584,646,648],{},[160,637,633],{},[160,639,640],{},"[[post]]"," hooks need: setup scripts, binaries, patch files, etc. ",[160,643,180],{},[160,645,633],{},[160,647,633],{}," before running the post-hooks:",[164,650,653],{"className":651,"code":652,"language":196},[194],"my-template\u002F\n  spin.toml\n  _base\u002F\n  _post\u002F\n    setup.sh\n",[160,654,652],{"__ignoreMap":169},[164,656,658],{"className":250,"code":657,"language":252,"meta":169,"style":169},"[[post]]\nrun = \"bash _post\u002Fsetup.sh\"\n",[160,659,660,668],{"__ignoreMap":169},[173,661,662,664,666],{"class":175,"line":176},[173,663,481],{"class":263},[173,665,514],{"class":179},[173,667,486],{"class":263},[173,669,670,672,674,676,679],{"class":175,"line":276},[173,671,492],{"class":259},[173,673,264],{"class":263},[173,675,267],{"class":263},[173,677,678],{"class":183},"bash _post\u002Fsetup.sh",[173,680,273],{"class":263},[240,682,684],{"id":683},"asset-directory-notes","Asset directory notes",[686,687,688,700,708],"ul",{},[689,690,691,692,204,694,696,697,699],"li",{},"Files in ",[160,693,568],{},[160,695,633],{}," are copied verbatim (",[160,698,544],{}," suffix is ignored).",[689,701,702,703,204,705,707],{},"Every file in ",[160,704,568],{},[160,706,633],{}," is executed automatically as the last pre-hook and post-hook steps, sorted alphabetically.",[689,709,710],{},"Both directories remain in the generated project. Remove them in a hook if you do not want them in the final output.",[240,712,714],{"id":713},"non-template-files","Non-template files",[156,716,717,718,720,721,723],{},"Any file in ",[160,719,207],{}," without a ",[160,722,544],{}," suffix is copied verbatim into the project.",[151,725,727],{"id":726},"conditional-files-and-directories","Conditional files and directories",[156,729,730,731,734,735,737,738,741],{},"Use ",[160,732,733],{},"[[include]]"," rules in ",[160,736,78],{}," to include whole files or directories only when a param is true. For example, include a ",[160,739,740],{},".github\u002F"," directory only when the user opts into CI:",[164,743,745],{"className":250,"code":744,"language":252,"meta":169,"style":169},"[params]\nci = { type = \"bool\", prompt = \"Include CI?\", default = true }\n\n[[include]]\npath = \".github\u002F**\"\nif = \"{{ .ci }}\"\n",[160,746,747,755,800,804,813,827],{"__ignoreMap":169},[173,748,749,751,753],{"class":175,"line":176},[173,750,360],{"class":263},[173,752,363],{"class":179},[173,754,366],{"class":263},[173,756,757,760,762,764,766,768,770,773,775,777,779,781,783,786,788,790,792,794,798],{"class":175,"line":276},[173,758,759],{"class":259},"ci ",[173,761,264],{"class":263},[173,763,377],{"class":263},[173,765,380],{"class":259},[173,767,264],{"class":263},[173,769,267],{"class":263},[173,771,772],{"class":183},"bool",[173,774,389],{"class":263},[173,776,392],{"class":263},[173,778,395],{"class":259},[173,780,264],{"class":263},[173,782,267],{"class":263},[173,784,785],{"class":183},"Include CI?",[173,787,389],{"class":263},[173,789,392],{"class":263},[173,791,409],{"class":259},[173,793,264],{"class":263},[173,795,797],{"class":796},"sfNiH"," true",[173,799,421],{"class":263},[173,801,802],{"class":175,"line":291},[173,803,354],{"emptyLinePlaceholder":353},[173,805,806,808,811],{"class":175,"line":306},[173,807,481],{"class":263},[173,809,810],{"class":179},"include",[173,812,486],{"class":263},[173,814,815,818,820,822,825],{"class":175,"line":321},[173,816,817],{"class":259},"path ",[173,819,264],{"class":263},[173,821,267],{"class":263},[173,823,824],{"class":183},".github\u002F**",[173,826,273],{"class":263},[173,828,829,832,834,836,839],{"class":175,"line":336},[173,830,831],{"class":259},"if ",[173,833,264],{"class":263},[173,835,267],{"class":263},[173,837,838],{"class":183},"{{ .ci }}",[173,840,273],{"class":263},[156,842,843,844,849],{},"See the ",[845,846,848],"a",{"href":847},".\u002Fspin-toml#include","spin.toml reference"," for the full syntax.",[151,851,853,854,856],{"id":852},"what-spin-does-not-care-about","What ",[160,855,180],{}," does not care about",[156,858,859,860,862],{},"The language, framework, build tool, test runner, and dependency manager are entirely up to the template author. ",[160,861,180],{}," only owns the load\u002Fprompt\u002Frender\u002Fhook pipeline.",[864,865,866],"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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":169,"searchDepth":276,"depth":276,"links":868},[869,870,874,880,881],{"id":153,"depth":276,"text":154},{"id":237,"depth":276,"text":238,"children":871},[872,873],{"id":242,"depth":291,"text":78},{"id":533,"depth":291,"text":207},{"id":561,"depth":276,"text":562,"children":875},[876,877,878,879],{"id":565,"depth":291,"text":568},{"id":630,"depth":291,"text":633},{"id":683,"depth":291,"text":684},{"id":713,"depth":291,"text":714},{"id":726,"depth":276,"text":727},{"id":852,"depth":276,"text":882},"What spin does not care about","A template is a directory with a spin.toml manifest and a base\u002F tree. spin loads it, collects params, renders the tree, runs pre-hooks, writes the files, run...","md",null,{},{"title":58,"description":883},"9Tp3-xKJFP-g5a6L79gFA1BqfbVWFyPrQ1tb4Y6hyQ8",[890,892],{"title":47,"path":48,"stem":49,"description":891,"children":-1},"Create a spin template from scratch. Write a manifest, add params, write template files, add hooks, test it, and publish it.",{"title":62,"path":63,"stem":64,"description":893,"children":-1},"Params are the questions a template asks the user. They are declared in spin.toml under [params].",1787755180240]