[{"data":1,"prerenderedAt":1168},["ShallowReactive",2],{"navigation_docs":3,"-docs-guide-create-template":145,"-docs-guide-create-template-surround":1163},[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":47,"body":147,"description":1157,"extension":1158,"links":1159,"meta":1160,"navigation":304,"path":48,"seo":1161,"stem":49,"__hash__":1162},"docs\u002Fdocs\u002F4.guide\u002F7.create-template.md",{"type":148,"value":149,"toc":1148},"minimark",[150,154,159,185,188,196,203,207,213,536,553,557,564,604,609,628,633,708,715,720,776,780,786,866,873,877,901,904,930,933,951,970,974,977,1056,1059,1077,1086,1090,1144],[151,152,153],"p",{},"This tutorial walks you through building a template end-to-end. By the end you will have a published Go CLI template that others can scaffold with a single command.",[155,156,158],"h2",{"id":157},"_1-create-the-scaffold","1. Create the scaffold",[160,161,166],"pre",{"className":162,"code":163,"language":164,"meta":165,"style":165},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","spin init my-go-cli\n","sh","",[167,168,169],"code",{"__ignoreMap":165},[170,171,174,178,182],"span",{"class":172,"line":173},"line",1,[170,175,177],{"class":176},"sBMFI","spin",[170,179,181],{"class":180},"sfazB"," init",[170,183,184],{"class":180}," my-go-cli\n",[151,186,187],{},"This writes a skeleton:",[160,189,194],{"className":190,"code":192,"language":193},[191],"language-text","my-go-cli\u002F\n  spin.toml\n  _base\u002F\n    file.txt.tmpl\n  README.md\n","text",[167,195,192],{"__ignoreMap":165},[151,197,198,199,202],{},"Delete ",[167,200,201],{},"_base\u002Ffile.txt.tmpl"," — we will write real files.",[155,204,206],{"id":205},"_2-add-params","2. Add params",[151,208,209,210,212],{},"Open ",[167,211,78],{}," and replace its contents:",[160,214,218],{"className":215,"code":216,"language":217,"meta":165,"style":165},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name = \"my-go-cli\"\ndescription = \"A minimal Go CLI starter\"\nlanguage = \"go\"\ntype = \"cli\"\nversion = \"0.1.0\"\n\n[params]\nproject_name = { type = \"text\", prompt = \"Project name\", default = \"myapp\" }\nmodule       = { type = \"text\", prompt = \"Go module path\", default = \"github.com\u002Fme\u002F{{ .project_name }}\" }\nport = { type = \"number\", prompt = \"Port\", default = 8080, min = 1024, max = 65535 }\nlicense = { type = \"license\", prompt = \"What license do you want?\", default = \"MIT\" }\n","toml",[167,219,220,239,254,269,284,299,306,318,373,421,487],{"__ignoreMap":165},[170,221,222,226,230,233,236],{"class":172,"line":173},[170,223,225],{"class":224},"sTEyZ","name ",[170,227,229],{"class":228},"sMK4o","=",[170,231,232],{"class":228}," \"",[170,234,235],{"class":180},"my-go-cli",[170,237,238],{"class":228},"\"\n",[170,240,242,245,247,249,252],{"class":172,"line":241},2,[170,243,244],{"class":224},"description ",[170,246,229],{"class":228},[170,248,232],{"class":228},[170,250,251],{"class":180},"A minimal Go CLI starter",[170,253,238],{"class":228},[170,255,257,260,262,264,267],{"class":172,"line":256},3,[170,258,259],{"class":224},"language ",[170,261,229],{"class":228},[170,263,232],{"class":228},[170,265,266],{"class":180},"go",[170,268,238],{"class":228},[170,270,272,275,277,279,282],{"class":172,"line":271},4,[170,273,274],{"class":224},"type ",[170,276,229],{"class":228},[170,278,232],{"class":228},[170,280,281],{"class":180},"cli",[170,283,238],{"class":228},[170,285,287,290,292,294,297],{"class":172,"line":286},5,[170,288,289],{"class":224},"version ",[170,291,229],{"class":228},[170,293,232],{"class":228},[170,295,296],{"class":180},"0.1.0",[170,298,238],{"class":228},[170,300,302],{"class":172,"line":301},6,[170,303,305],{"emptyLinePlaceholder":304},true,"\n",[170,307,309,312,315],{"class":172,"line":308},7,[170,310,311],{"class":228},"[",[170,313,314],{"class":176},"params",[170,316,317],{"class":228},"]\n",[170,319,321,324,326,329,332,334,336,338,341,344,347,349,351,354,356,358,361,363,365,368,370],{"class":172,"line":320},8,[170,322,323],{"class":224},"project_name ",[170,325,229],{"class":228},[170,327,328],{"class":228}," {",[170,330,331],{"class":224}," type ",[170,333,229],{"class":228},[170,335,232],{"class":228},[170,337,193],{"class":180},[170,339,340],{"class":228},"\"",[170,342,343],{"class":228},",",[170,345,346],{"class":224}," prompt ",[170,348,229],{"class":228},[170,350,232],{"class":228},[170,352,353],{"class":180},"Project name",[170,355,340],{"class":228},[170,357,343],{"class":228},[170,359,360],{"class":224}," default ",[170,362,229],{"class":228},[170,364,232],{"class":228},[170,366,367],{"class":180},"myapp",[170,369,340],{"class":228},[170,371,372],{"class":228}," }\n",[170,374,376,379,381,383,385,387,389,391,393,395,397,399,401,404,406,408,410,412,414,417,419],{"class":172,"line":375},9,[170,377,378],{"class":224},"module       ",[170,380,229],{"class":228},[170,382,328],{"class":228},[170,384,331],{"class":224},[170,386,229],{"class":228},[170,388,232],{"class":228},[170,390,193],{"class":180},[170,392,340],{"class":228},[170,394,343],{"class":228},[170,396,346],{"class":224},[170,398,229],{"class":228},[170,400,232],{"class":228},[170,402,403],{"class":180},"Go module path",[170,405,340],{"class":228},[170,407,343],{"class":228},[170,409,360],{"class":224},[170,411,229],{"class":228},[170,413,232],{"class":228},[170,415,416],{"class":180},"github.com\u002Fme\u002F{{ .project_name }}",[170,418,340],{"class":228},[170,420,372],{"class":228},[170,422,424,427,429,431,433,435,437,440,442,444,446,448,450,453,455,457,459,461,465,467,470,472,475,477,480,482,485],{"class":172,"line":423},10,[170,425,426],{"class":224},"port ",[170,428,229],{"class":228},[170,430,328],{"class":228},[170,432,331],{"class":224},[170,434,229],{"class":228},[170,436,232],{"class":228},[170,438,439],{"class":180},"number",[170,441,340],{"class":228},[170,443,343],{"class":228},[170,445,346],{"class":224},[170,447,229],{"class":228},[170,449,232],{"class":228},[170,451,452],{"class":180},"Port",[170,454,340],{"class":228},[170,456,343],{"class":228},[170,458,360],{"class":224},[170,460,229],{"class":228},[170,462,464],{"class":463},"sbssI"," 8080",[170,466,343],{"class":228},[170,468,469],{"class":224}," min ",[170,471,229],{"class":228},[170,473,474],{"class":463}," 1024",[170,476,343],{"class":228},[170,478,479],{"class":224}," max ",[170,481,229],{"class":228},[170,483,484],{"class":463}," 65535",[170,486,372],{"class":228},[170,488,490,493,495,497,499,501,503,506,508,510,512,514,516,519,521,523,525,527,529,532,534],{"class":172,"line":489},11,[170,491,492],{"class":224},"license ",[170,494,229],{"class":228},[170,496,328],{"class":228},[170,498,331],{"class":224},[170,500,229],{"class":228},[170,502,232],{"class":228},[170,504,505],{"class":180},"license",[170,507,340],{"class":228},[170,509,343],{"class":228},[170,511,346],{"class":224},[170,513,229],{"class":228},[170,515,232],{"class":228},[170,517,518],{"class":180},"What license do you want?",[170,520,340],{"class":228},[170,522,343],{"class":228},[170,524,360],{"class":224},[170,526,229],{"class":228},[170,528,232],{"class":228},[170,530,531],{"class":180},"MIT",[170,533,340],{"class":228},[170,535,372],{"class":228},[151,537,538,541,542,545,546,548,549,552],{},[167,539,540],{},"module"," uses a templated default: it fills in ",[167,543,544],{},"{{ .project_name }}"," from the value given to ",[167,547,110],{},". ",[167,550,551],{},"port"," enforces a range.",[155,554,556],{"id":555},"_3-write-template-files","3. Write template files",[151,558,559,560,563],{},"Create ",[167,561,562],{},"_base\u002Fmain.go.tmpl",":",[160,565,569],{"className":566,"code":567,"language":568,"meta":165,"style":165},"language-tmpl shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport \"fmt\"\n\nfunc main() {\n    fmt.Println(\"{{ .project_name }} listening on :{{ .port }}\")\n}\n","tmpl",[167,570,571,576,580,585,589,594,599],{"__ignoreMap":165},[170,572,573],{"class":172,"line":173},[170,574,575],{},"package main\n",[170,577,578],{"class":172,"line":241},[170,579,305],{"emptyLinePlaceholder":304},[170,581,582],{"class":172,"line":256},[170,583,584],{},"import \"fmt\"\n",[170,586,587],{"class":172,"line":271},[170,588,305],{"emptyLinePlaceholder":304},[170,590,591],{"class":172,"line":286},[170,592,593],{},"func main() {\n",[170,595,596],{"class":172,"line":301},[170,597,598],{},"    fmt.Println(\"{{ .project_name }} listening on :{{ .port }}\")\n",[170,600,601],{"class":172,"line":308},[170,602,603],{},"}\n",[151,605,559,606,563],{},[167,607,608],{},"_base\u002Fgo.mod.tmpl",[160,610,612],{"className":566,"code":611,"language":568,"meta":165,"style":165},"module {{ .module }}\n\ngo 1.22\n",[167,613,614,619,623],{"__ignoreMap":165},[170,615,616],{"class":172,"line":173},[170,617,618],{},"module {{ .module }}\n",[170,620,621],{"class":172,"line":241},[170,622,305],{"emptyLinePlaceholder":304},[170,624,625],{"class":172,"line":256},[170,626,627],{},"go 1.22\n",[151,629,559,630,563],{},[167,631,632],{},"_base\u002FLICENSE.tmpl",[160,634,636],{"className":566,"code":635,"language":568,"meta":165,"style":165},"{{- if eq .license \"MIT\" }}\nMIT License\n\nCopyright (c) {{ now \"2006\" }} {{ .project_name }}\n\nPermission is hereby granted, free of charge...\n{{- else if eq .license \"Apache-2.0\" }}\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http:\u002F\u002Fwww.apache.org\u002Flicenses\u002F\n{{- else }}\nAll rights reserved.\n{{- end }}\n",[167,637,638,643,648,652,657,661,666,671,675,680,685,690,696,702],{"__ignoreMap":165},[170,639,640],{"class":172,"line":173},[170,641,642],{},"{{- if eq .license \"MIT\" }}\n",[170,644,645],{"class":172,"line":241},[170,646,647],{},"MIT License\n",[170,649,650],{"class":172,"line":256},[170,651,305],{"emptyLinePlaceholder":304},[170,653,654],{"class":172,"line":271},[170,655,656],{},"Copyright (c) {{ now \"2006\" }} {{ .project_name }}\n",[170,658,659],{"class":172,"line":286},[170,660,305],{"emptyLinePlaceholder":304},[170,662,663],{"class":172,"line":301},[170,664,665],{},"Permission is hereby granted, free of charge...\n",[170,667,668],{"class":172,"line":308},[170,669,670],{},"{{- else if eq .license \"Apache-2.0\" }}\n",[170,672,673],{"class":172,"line":320},[170,674,305],{"emptyLinePlaceholder":304},[170,676,677],{"class":172,"line":375},[170,678,679],{},"                                 Apache License\n",[170,681,682],{"class":172,"line":423},[170,683,684],{},"                           Version 2.0, January 2004\n",[170,686,687],{"class":172,"line":489},[170,688,689],{},"                        http:\u002F\u002Fwww.apache.org\u002Flicenses\u002F\n",[170,691,693],{"class":172,"line":692},12,[170,694,695],{},"{{- else }}\n",[170,697,699],{"class":172,"line":698},13,[170,700,701],{},"All rights reserved.\n",[170,703,705],{"class":172,"line":704},14,[170,706,707],{},"{{- end }}\n",[151,709,710,711,714],{},"Notice the whitespace control: ",[167,712,713],{},"{{-"," eats the leading blank line so the output starts at the first character.",[151,716,559,717,563],{},[167,718,719],{},"_base\u002FREADME.md.tmpl",[160,721,723],{"className":566,"code":722,"language":568,"meta":165,"style":165},"# {{ .project_name | title }}\n\nA Go CLI project.\n\n## Usage\n\n```sh\ngo run .\n```\n\n- License: {{ .license }}\n",[167,724,725,730,734,739,743,748,752,757,762,767,771],{"__ignoreMap":165},[170,726,727],{"class":172,"line":173},[170,728,729],{},"# {{ .project_name | title }}\n",[170,731,732],{"class":172,"line":241},[170,733,305],{"emptyLinePlaceholder":304},[170,735,736],{"class":172,"line":256},[170,737,738],{},"A Go CLI project.\n",[170,740,741],{"class":172,"line":271},[170,742,305],{"emptyLinePlaceholder":304},[170,744,745],{"class":172,"line":286},[170,746,747],{},"## Usage\n",[170,749,750],{"class":172,"line":301},[170,751,305],{"emptyLinePlaceholder":304},[170,753,754],{"class":172,"line":308},[170,755,756],{},"```sh\n",[170,758,759],{"class":172,"line":320},[170,760,761],{},"go run .\n",[170,763,764],{"class":172,"line":375},[170,765,766],{},"```\n",[170,768,769],{"class":172,"line":423},[170,770,305],{"emptyLinePlaceholder":304},[170,772,773],{"class":172,"line":489},[170,774,775],{},"- License: {{ .license }}\n",[155,777,779],{"id":778},"_4-add-hooks","4. Add hooks",[151,781,782,783,785],{},"Back in ",[167,784,78],{},", add post-hooks to initialise the Go module and git:",[160,787,789],{"className":215,"code":788,"language":217,"meta":165,"style":165},"[[post]]\nrun = \"go mod init {{ .module }}\"\n\n[[post]]\nrun = \"go mod tidy\"\n\n[[post]]\nrun = \"git init && git add -A && git commit -m 'initial commit'\"\n",[167,790,791,802,816,820,828,841,845,853],{"__ignoreMap":165},[170,792,793,796,799],{"class":172,"line":173},[170,794,795],{"class":228},"[[",[170,797,798],{"class":176},"post",[170,800,801],{"class":228},"]]\n",[170,803,804,807,809,811,814],{"class":172,"line":241},[170,805,806],{"class":224},"run ",[170,808,229],{"class":228},[170,810,232],{"class":228},[170,812,813],{"class":180},"go mod init {{ .module }}",[170,815,238],{"class":228},[170,817,818],{"class":172,"line":256},[170,819,305],{"emptyLinePlaceholder":304},[170,821,822,824,826],{"class":172,"line":271},[170,823,795],{"class":228},[170,825,798],{"class":176},[170,827,801],{"class":228},[170,829,830,832,834,836,839],{"class":172,"line":286},[170,831,806],{"class":224},[170,833,229],{"class":228},[170,835,232],{"class":228},[170,837,838],{"class":180},"go mod tidy",[170,840,238],{"class":228},[170,842,843],{"class":172,"line":301},[170,844,305],{"emptyLinePlaceholder":304},[170,846,847,849,851],{"class":172,"line":308},[170,848,795],{"class":228},[170,850,798],{"class":176},[170,852,801],{"class":228},[170,854,855,857,859,861,864],{"class":172,"line":320},[170,856,806],{"class":224},[170,858,229],{"class":228},[170,860,232],{"class":228},[170,862,863],{"class":180},"git init && git add -A && git commit -m 'initial commit'",[170,865,238],{"class":228},[151,867,868,869,872],{},"Hook commands only support field access (",[167,870,871],{},"{{ .module }}","), not pipes or custom functions. If you need a transformed value, use shell tools instead.",[155,874,876],{"id":875},"_5-test-it","5. Test it",[160,878,880],{"className":162,"code":879,"language":164,"meta":165,"style":165},"spin new test-output --template .\u002Fmy-go-cli --dry-run\n",[167,881,882],{"__ignoreMap":165},[170,883,884,886,889,892,895,898],{"class":172,"line":173},[170,885,177],{"class":176},[170,887,888],{"class":180}," new",[170,890,891],{"class":180}," test-output",[170,893,894],{"class":180}," --template",[170,896,897],{"class":180}," .\u002Fmy-go-cli",[170,899,900],{"class":180}," --dry-run\n",[151,902,903],{},"This renders to a temp directory and lists the files. No hooks run. Check the output looks right, then test with params:",[160,905,907],{"className":162,"code":906,"language":164,"meta":165,"style":165},"spin new test-output --template .\u002Fmy-go-cli --param license=Apache-2.0 --print-params\n",[167,908,909],{"__ignoreMap":165},[170,910,911,913,915,917,919,921,924,927],{"class":172,"line":173},[170,912,177],{"class":176},[170,914,888],{"class":180},[170,916,891],{"class":180},[170,918,894],{"class":180},[170,920,897],{"class":180},[170,922,923],{"class":180}," --param",[170,925,926],{"class":180}," license=Apache-2.0",[170,928,929],{"class":180}," --print-params\n",[151,931,932],{},"Try the full interactive flow:",[160,934,936],{"className":162,"code":935,"language":164,"meta":165,"style":165},"spin new test-output --template .\u002Fmy-go-cli\n",[167,937,938],{"__ignoreMap":165},[170,939,940,942,944,946,948],{"class":172,"line":173},[170,941,177],{"class":176},[170,943,888],{"class":180},[170,945,891],{"class":180},[170,947,894],{"class":180},[170,949,950],{"class":180}," .\u002Fmy-go-cli\n",[151,952,953,954,957,958,961,962,965,966,969],{},"Answer the params form, review the hooks, press ",[167,955,956],{},"R"," then ",[167,959,960],{},"Run",". The project scaffolds into ",[167,963,964],{},".\u002Ftest-output",". Delete ",[167,967,968],{},"test-output"," between runs.",[155,971,973],{"id":972},"_6-publish","6. Publish",[151,975,976],{},"Push your template to a git repo:",[160,978,980],{"className":162,"code":979,"language":164,"meta":165,"style":165},"cd my-go-cli\ngit init && git add -A && git commit -m \"initial template\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FYOU\u002Fmy-go-cli.git\ngit push -u origin main\n",[167,981,982,990,1026,1041],{"__ignoreMap":165},[170,983,984,988],{"class":172,"line":173},[170,985,987],{"class":986},"s2Zo4","cd",[170,989,184],{"class":180},[170,991,992,995,997,1000,1003,1006,1009,1011,1013,1016,1019,1021,1024],{"class":172,"line":241},[170,993,994],{"class":176},"git",[170,996,181],{"class":180},[170,998,999],{"class":228}," &&",[170,1001,1002],{"class":176}," git",[170,1004,1005],{"class":180}," add",[170,1007,1008],{"class":180}," -A",[170,1010,999],{"class":228},[170,1012,1002],{"class":176},[170,1014,1015],{"class":180}," commit",[170,1017,1018],{"class":180}," -m",[170,1020,232],{"class":228},[170,1022,1023],{"class":180},"initial template",[170,1025,238],{"class":228},[170,1027,1028,1030,1033,1035,1038],{"class":172,"line":256},[170,1029,994],{"class":176},[170,1031,1032],{"class":180}," remote",[170,1034,1005],{"class":180},[170,1036,1037],{"class":180}," origin",[170,1039,1040],{"class":180}," https:\u002F\u002Fgithub.com\u002FYOU\u002Fmy-go-cli.git\n",[170,1042,1043,1045,1048,1051,1053],{"class":172,"line":271},[170,1044,994],{"class":176},[170,1046,1047],{"class":180}," push",[170,1049,1050],{"class":180}," -u",[170,1052,1037],{"class":180},[170,1054,1055],{"class":180}," main\n",[151,1057,1058],{},"Now anyone can scaffold from it:",[160,1060,1062],{"className":162,"code":1061,"language":164,"meta":165,"style":165},"spin new myapp --template https:\u002F\u002Fgithub.com\u002FYOU\u002Fmy-go-cli.git\n",[167,1063,1064],{"__ignoreMap":165},[170,1065,1066,1068,1070,1073,1075],{"class":172,"line":173},[170,1067,177],{"class":176},[170,1069,888],{"class":180},[170,1071,1072],{"class":180}," myapp",[170,1074,894],{"class":180},[170,1076,1040],{"class":180},[151,1078,1079,1080,1085],{},"To make it discoverable, ",[1081,1082,1084],"a",{"href":1083},"\u002Ftemplates\u002Fpublish","publish it in a registry",".",[155,1087,1089],{"id":1088},"what-you-learned","What you learned",[1091,1092,1093,1099,1109,1123,1128,1131,1141],"ul",{},[1094,1095,1096,1098],"li",{},[167,1097,78],{}," declares params, hooks, and includes.",[1094,1100,1101,1104,1105,1108],{},[167,1102,1103],{},"_base\u002F*.tmpl"," files use Go's ",[167,1106,1107],{},"text\u002Ftemplate"," with spin's helpers.",[1094,1110,1111,1114,1115,1118,1119,1122],{},[167,1112,1113],{},"{{ .param }}"," for field access, ",[167,1116,1117],{},"{{ if }}"," for conditions, ",[167,1120,1121],{},"{{ range }}"," for loops.",[1094,1124,1125,1127],{},[167,1126,713],{}," trims leading whitespace.",[1094,1129,1130],{},"Hooks are bare field access only — use shell for transformations.",[1094,1132,1133,1136,1137,1140],{},[167,1134,1135],{},"--dry-run"," and ",[167,1138,1139],{},"--print-params"," preview before you commit.",[1094,1142,1143],{},"Push to a git repo to publish.",[1145,1146,1147],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":165,"searchDepth":241,"depth":241,"links":1149},[1150,1151,1152,1153,1154,1155,1156],{"id":157,"depth":241,"text":158},{"id":205,"depth":241,"text":206},{"id":555,"depth":241,"text":556},{"id":778,"depth":241,"text":779},{"id":875,"depth":241,"text":876},{"id":972,"depth":241,"text":973},{"id":1088,"depth":241,"text":1089},"Create a spin template from scratch. Write a manifest, add params, write template files, add hooks, test it, and publish it.","md",null,{},{"title":47,"description":1157},"1vZkgtaxKiyxbxA30LNj_Kub4Js4nI1hZaezPiMcGWQ",[1164,1166],{"title":43,"path":44,"stem":45,"description":1165,"children":-1},"Common problems and how to fix them.",{"title":58,"path":59,"stem":60,"description":1167,"children":-1},"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...",1787755180240]