[{"data":1,"prerenderedAt":1197},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-installation":342,"-en-getting-started-installation-surround":1192},[4,45,61,96,132,166,196,217,241,265],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F10.reference",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F10.reference\u002F1.configuration","i-lucide-settings",{"title":57,"path":58,"stem":59,"icon":60},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F10.reference\u002F2.dependencies","i-lucide-package",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[67,72,77,82,86,91],{"title":68,"path":69,"stem":70,"icon":71},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture","i-lucide-layers",{"title":73,"path":74,"stem":75,"icon":76},"Application lifecycle","\u002Fen\u002Fconcepts\u002Fapplication-lifecycle","en\u002F2.concepts\u002F2.application-lifecycle","i-lucide-power",{"title":78,"path":79,"stem":80,"icon":81},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F3.error-model","i-lucide-shield-alert",{"title":52,"path":83,"stem":84,"icon":85},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F4.configuration","i-lucide-settings-2",{"title":87,"path":88,"stem":89,"icon":90},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F5.codegen-pipeline","i-lucide-file-json",{"title":92,"path":93,"stem":94,"icon":95},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F6.design-patterns","i-lucide-puzzle",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":44},"HTTP & Routing","i-lucide-globe","\u002Fen\u002Fhttp","en\u002F3.http",[102,107,112,117,122,127],{"title":103,"path":104,"stem":105,"icon":106},"The server core","\u002Fen\u002Fhttp\u002Fserver","en\u002F3.http\u002F1.server","i-lucide-server",{"title":108,"path":109,"stem":110,"icon":111},"The Fiber engine","\u002Fen\u002Fhttp\u002Ffiber","en\u002F3.http\u002F2.fiber","i-lucide-zap",{"title":113,"path":114,"stem":115,"icon":116},"The chi engine","\u002Fen\u002Fhttp\u002Fchi","en\u002F3.http\u002F3.chi","i-lucide-route",{"title":118,"path":119,"stem":120,"icon":121},"Error responses","\u002Fen\u002Fhttp\u002Ferror-responses","en\u002F3.http\u002F4.error-responses","i-lucide-octagon-alert",{"title":123,"path":124,"stem":125,"icon":126},"Validation","\u002Fen\u002Fhttp\u002Fvalidation","en\u002F3.http\u002F5.validation","i-lucide-badge-check",{"title":128,"path":129,"stem":130,"icon":131},"Pagination","\u002Fen\u002Fhttp\u002Fpagination","en\u002F3.http\u002F6.pagination","i-lucide-list-ordered",{"title":133,"icon":134,"path":135,"stem":136,"children":137,"page":44},"Database","i-lucide-database","\u002Fen\u002Fdatabase","en\u002F4.database",[138,142,147,151,156,161],{"title":139,"path":140,"stem":141,"icon":134},"Overview","\u002Fen\u002Fdatabase\u002Foverview","en\u002F4.database\u002F1.overview",{"title":143,"path":144,"stem":145,"icon":146},"pgx","\u002Fen\u002Fdatabase\u002Fpgx","en\u002F4.database\u002F2.pgx","i-lucide-plug",{"title":148,"path":149,"stem":150,"icon":71},"bun","\u002Fen\u002Fdatabase\u002Fbun","en\u002F4.database\u002F3.bun",{"title":152,"path":153,"stem":154,"icon":155},"Transactions","\u002Fen\u002Fdatabase\u002Ftransactions","en\u002F4.database\u002F4.transactions","i-lucide-git-merge",{"title":157,"path":158,"stem":159,"icon":160},"Migrations","\u002Fen\u002Fdatabase\u002Fmigrations","en\u002F4.database\u002F5.migrations","i-lucide-file-stack",{"title":162,"path":163,"stem":164,"icon":165},"Seeders","\u002Fen\u002Fdatabase\u002Fseeding","en\u002F4.database\u002F6.seeding","i-lucide-sprout",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":44},"Async & Background","i-lucide-workflow","\u002Fen\u002Fasync","en\u002F5.async",[172,176,181,186,191],{"title":173,"path":174,"stem":175,"icon":131},"Queue","\u002Fen\u002Fasync\u002Fqueue","en\u002F5.async\u002F1.queue",{"title":177,"path":178,"stem":179,"icon":180},"Events","\u002Fen\u002Fasync\u002Fevents","en\u002F5.async\u002F2.events","i-lucide-radio",{"title":182,"path":183,"stem":184,"icon":185},"Outbox","\u002Fen\u002Fasync\u002Foutbox","en\u002F5.async\u002F3.outbox","i-lucide-inbox",{"title":187,"path":188,"stem":189,"icon":190},"Scheduling","\u002Fen\u002Fasync\u002Fscheduler","en\u002F5.async\u002F4.scheduler","i-lucide-calendar-clock",{"title":192,"path":193,"stem":194,"icon":195},"Worker","\u002Fen\u002Fasync\u002Fworker","en\u002F5.async\u002F5.worker","i-lucide-cog",{"title":197,"icon":198,"path":199,"stem":200,"children":201,"page":44},"Security","i-lucide-shield-check","\u002Fen\u002Fsecurity","en\u002F6.security",[202,207,212],{"title":203,"path":204,"stem":205,"icon":206},"Authentication","\u002Fen\u002Fsecurity\u002Fauthentication","en\u002F6.security\u002F1.authentication","i-lucide-key-round",{"title":208,"path":209,"stem":210,"icon":211},"RBAC","\u002Fen\u002Fsecurity\u002Frbac","en\u002F6.security\u002F2.rbac","i-lucide-users",{"title":213,"path":214,"stem":215,"icon":216},"Policies","\u002Fen\u002Fsecurity\u002Fpolicies","en\u002F6.security\u002F3.policies","i-lucide-gavel",{"title":218,"icon":219,"path":220,"stem":221,"children":222,"page":44},"Observability","i-lucide-activity","\u002Fen\u002Fobservability","en\u002F7.observability",[223,226,231,236],{"title":139,"path":224,"stem":225,"icon":219},"\u002Fen\u002Fobservability\u002Foverview","en\u002F7.observability\u002F1.overview",{"title":227,"path":228,"stem":229,"icon":230},"Logging","\u002Fen\u002Fobservability\u002Flogging","en\u002F7.observability\u002F2.logging","i-lucide-scroll-text",{"title":232,"path":233,"stem":234,"icon":235},"OpenTelemetry","\u002Fen\u002Fobservability\u002Fopentelemetry","en\u002F7.observability\u002F3.opentelemetry","i-lucide-radar",{"title":237,"path":238,"stem":239,"icon":240},"Sentry","\u002Fen\u002Fobservability\u002Fsentry","en\u002F7.observability\u002F4.sentry","i-lucide-bug",{"title":242,"icon":243,"path":244,"stem":245,"children":246,"page":44},"Storage & Mail","i-lucide-hard-drive","\u002Fen\u002Fstorage-mail","en\u002F8.storage-mail",[247,251,256,261],{"title":248,"path":249,"stem":250,"icon":243},"Storage","\u002Fen\u002Fstorage-mail\u002Fstorage","en\u002F8.storage-mail\u002F1.storage",{"title":252,"path":253,"stem":254,"icon":255},"Email","\u002Fen\u002Fstorage-mail\u002Fmail","en\u002F8.storage-mail\u002F2.mail","i-lucide-mail",{"title":257,"path":258,"stem":259,"icon":260},"Notifications","\u002Fen\u002Fstorage-mail\u002Fnotifications","en\u002F8.storage-mail\u002F3.notifications","i-lucide-bell",{"title":262,"path":263,"stem":264,"icon":180},"Realtime","\u002Fen\u002Fstorage-mail\u002Frealtime","en\u002F8.storage-mail\u002F4.realtime",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F9.cli",[271,274,279,284,289,294,299,303,308,313,318,323,328,333,337],{"title":139,"path":272,"stem":273,"icon":267},"\u002Fen\u002Fcli\u002Foverview","en\u002F9.cli\u002F1.overview",{"title":275,"path":276,"stem":277,"icon":278},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F9.cli\u002F10.add-db","i-lucide-database-zap",{"title":280,"path":281,"stem":282,"icon":283},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F9.cli\u002F11.add-compose","i-lucide-container",{"title":285,"path":286,"stem":287,"icon":288},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F9.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":290,"path":291,"stem":292,"icon":293},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F9.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":295,"path":296,"stem":297,"icon":298},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F9.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":300,"path":301,"stem":302,"icon":165},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F9.cli\u002F15.add-seeder",{"title":304,"path":305,"stem":306,"icon":307},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F9.cli\u002F2.new-project","i-lucide-folder-plus",{"title":309,"path":310,"stem":311,"icon":312},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F9.cli\u002F3.new-module","i-lucide-blocks",{"title":314,"path":315,"stem":316,"icon":317},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F9.cli\u002F4.add-surface","i-lucide-layers-2",{"title":319,"path":320,"stem":321,"icon":322},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F9.cli\u002F5.add-core","i-lucide-box",{"title":324,"path":325,"stem":326,"icon":327},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F9.cli\u002F6.add-handler","i-lucide-webhook",{"title":329,"path":330,"stem":331,"icon":332},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F9.cli\u002F7.new-migration","i-lucide-file-plus",{"title":334,"path":335,"stem":336,"icon":195},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F9.cli\u002F8.worker-generators",{"title":338,"path":339,"stem":340,"icon":341},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F9.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"id":343,"title":25,"body":344,"description":1185,"extension":1186,"links":1187,"meta":1188,"navigation":1189,"path":26,"seo":1190,"stem":27,"__hash__":1191},"docs_en\u002Fen\u002F1.getting-started\u002F4.installation.md",{"type":345,"value":346,"toc":1175},"minimark",[347,352,418,422,438,443,446,541,557,582,586,589,596,617,628,632,641,699,713,717,734,740,744,754,898,912,916,1146,1150,1166,1171],[348,349,351],"h2",{"id":350},"prerequisites","Prerequisites",[353,354,355,368,377,391,399,412],"ul",{},[356,357,358,362,363,367],"li",{},[359,360,361],"strong",{},"Go 1.25+"," (Fiber v3 requires it; the ",[364,365,366],"code",{},"tool"," directive requires Go 1.24+)",[356,369,370,373,374],{},[359,371,372],{},"Node 24+"," with npm: for the TypeSpec compiler; generated projects pin this version in their ",[364,375,376],{},"mise.toml",[356,378,379,382,383,386,387,390],{},[359,380,381],{},"Docker",": the full dev stack (postgres, redis, mailpit, rustfs, app modules) runs from ",[364,384,385],{},"compose.yml","; docker compose ≥ 2.17 + BuildKit required (",[364,388,389],{},"additional_contexts"," + cache mounts in the Dockerfile)",[356,392,393,398],{},[359,394,395],{},[364,396,397],{},"docker network create proxynet",": the stack is exposed via Traefik labels on an external network shared across the workspace; one-time, shared across projects",[356,400,401,408,409,411],{},[402,403,407],"a",{"href":404,"rel":405},"https:\u002F\u002Fmise.jdx.dev",[406],"nofollow","mise"," is recommended; generated projects ship a ",[364,410,376],{}," with pinned tool versions and tasks",[356,413,414,417],{},[359,415,416],{},"Access to the kit repository",": the kit is private, so the Go toolchain needs extra configuration; the next section covers it",[348,419,421],{"id":420},"accessing-the-private-kit","Accessing the private kit",[423,424,425,426,429,430,433,434,437],"p",{},"The kit module (",[364,427,428],{},"github.com\u002Fgp-system\u002Fgpsystem",") lives in a private repository. By default the Go toolchain downloads through the public module proxy and verifies against the checksum database. Both fail for a private module, so without configuration both ",[364,431,432],{},"go run ...@latest"," and ",[364,435,436],{},"go mod tidy"," error out. Pick one of two paths.",[439,440,442],"h3",{"id":441},"local-checkout-for-kit-development","Local checkout (for kit development)",[423,444,445],{},"While the kit is pre-1.0 and under active development, this is the recommended path: it needs no git authentication and no Go configuration, because everything resolves locally.",[447,448,450,455,458,486,493],"steps",{"level":449},"4",[451,452,454],"h4",{"id":453},"get-the-kit","Get the kit",[423,456,457],{},"Clone the kit (or use an existing checkout):",[459,460,465],"pre",{"className":461,"code":462,"language":463,"meta":464,"style":464},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone git@github.com:gp-system\u002Fgpsystem.git \u002Fpath\u002Fto\u002Fgpsystem\n","sh","",[364,466,467],{"__ignoreMap":464},[468,469,472,476,480,483],"span",{"class":470,"line":471},"line",1,[468,473,475],{"class":474},"sBMFI","git",[468,477,479],{"class":478},"sfazB"," clone",[468,481,482],{"class":478}," git@github.com:gp-system\u002Fgpsystem.git",[468,484,485],{"class":478}," \u002Fpath\u002Fto\u002Fgpsystem\n",[451,487,489,490],{"id":488},"scaffold-from-source-with-kit-replace","Scaffold from source with ",[364,491,492],{},"--kit-replace",[459,494,496],{"className":461,"code":495,"language":463,"meta":464,"style":464},"go run \u002Fpath\u002Fto\u002Fgpsystem\u002Fcmd\u002Fgpsystem new project shop \\\n  --module-path github.com\u002Facme\u002Fshop \\\n  --kit-replace \u002Fpath\u002Fto\u002Fgpsystem\n",[364,497,498,522,533],{"__ignoreMap":464},[468,499,500,503,506,509,512,515,518],{"class":470,"line":471},[468,501,502],{"class":474},"go",[468,504,505],{"class":478}," run",[468,507,508],{"class":478}," \u002Fpath\u002Fto\u002Fgpsystem\u002Fcmd\u002Fgpsystem",[468,510,511],{"class":478}," new",[468,513,514],{"class":478}," project",[468,516,517],{"class":478}," shop",[468,519,521],{"class":520},"sTEyZ"," \\\n",[468,523,525,528,531],{"class":470,"line":524},2,[468,526,527],{"class":478},"  --module-path",[468,529,530],{"class":478}," github.com\u002Facme\u002Fshop",[468,532,521],{"class":520},[468,534,536,539],{"class":470,"line":535},3,[468,537,538],{"class":478},"  --kit-replace",[468,540,485],{"class":478},[423,542,543,545,546,549,550,553,554,556],{},[364,544,492],{}," writes a ",[364,547,548],{},"replace"," directive into the generated ",[364,551,552],{},"go.mod"," (resolving the given path to an absolute one), so ",[364,555,436],{}," resolves the kit from the local checkout: no network, no authentication.",[558,559,560,561,564,565,568,569,571,572,574,575,577,578,581],"warning",{},"When run from source (",[364,562,563],{},"go run ...\u002Fcmd\u002Fgpsystem","), the CLI cannot see a published kit version and records ",[364,566,567],{},"v0.0.0"," in ",[364,570,552],{},", which is why ",[364,573,492],{}," is mandatory for source-run scaffolding. Once the kit gets a published version, remove the ",[364,576,548],{}," line and update the ",[364,579,580],{},"require",".",[439,583,585],{"id":584},"private-repo-via-the-go-toolchain","Private repo via the Go toolchain",[423,587,588],{},"For teammates who use the kit but don't develop it: after a one-time setup, the Go toolchain works directly against the private GitHub repository.",[451,590,592,593],{"id":591},"_1-goprivate","1. ",[364,594,595],{},"GOPRIVATE",[459,597,599],{"className":461,"code":598,"language":463,"meta":464,"style":464},"go env -w GOPRIVATE=github.com\u002Fgp-system\u002F*\n",[364,600,601],{"__ignoreMap":464},[468,602,603,605,608,611,614],{"class":470,"line":471},[468,604,502],{"class":474},[468,606,607],{"class":478}," env",[468,609,610],{"class":478}," -w",[468,612,613],{"class":478}," GOPRIVATE=github.com\u002Fgp-system\u002F",[468,615,616],{"class":520},"*\n",[423,618,619,620,623,624,627],{},"For the matching path pattern this disables the module proxy ",[359,621,622],{},"and"," the checksum-database verification (no separate ",[364,625,626],{},"GONOSUMDB"," needed). From here on Go fetches the module straight from git.",[451,629,631],{"id":630},"_2-git-authentication","2. Git authentication",[423,633,634,635,637,638,640],{},"Under the hood ",[364,636,502],{}," clones with ",[364,639,475],{},", so git must be able to authenticate against GitHub. Two proven variants:",[642,643,644,690],"code-group",{},[459,645,648],{"className":461,"code":646,"filename":647,"language":463,"meta":464,"style":464},"# assuming your SSH key is registered in your GitHub account\ngit config --global url.\"git@github.com:\".insteadOf \"https:\u002F\u002Fgithub.com\u002F\"\n","SSH",[364,649,650,656],{"__ignoreMap":464},[468,651,652],{"class":470,"line":471},[468,653,655],{"class":654},"sHwdD","# assuming your SSH key is registered in your GitHub account\n",[468,657,658,660,663,666,669,673,676,678,681,684,687],{"class":470,"line":524},[468,659,475],{"class":474},[468,661,662],{"class":478}," config",[468,664,665],{"class":478}," --global",[468,667,668],{"class":478}," url.",[468,670,672],{"class":671},"sMK4o","\"",[468,674,675],{"class":478},"git@github.com:",[468,677,672],{"class":671},[468,679,680],{"class":478},".insteadOf",[468,682,683],{"class":671}," \"",[468,685,686],{"class":478},"https:\u002F\u002Fgithub.com\u002F",[468,688,689],{"class":671},"\"\n",[459,691,697],{"className":692,"code":694,"filename":695,"language":696,"meta":464},[693],"language-text","# fine-grained personal access token with read access to the kit repo\nmachine github.com\nlogin \u003Cgithub-username>\npassword \u003Cpersonal-access-token>\n","HTTPS + PAT (~\u002F.netrc)","text",[364,698,694],{"__ignoreMap":464},[700,701,702,703,708,709,712],"note",{},"If you use the ",[402,704,707],{"href":705,"rel":706},"https:\u002F\u002Fcli.github.com",[406],"GitHub CLI",", ",[364,710,711],{},"gh auth login"," sets up the git credential helper: in that case the git configuration above can be skipped.",[451,714,716],{"id":715},"_3-verify","3. Verify",[459,718,720],{"className":461,"code":719,"language":463,"meta":464,"style":464},"go run github.com\u002Fgp-system\u002Fgpsystem\u002Fcmd\u002Fgpsystem@latest version\n",[364,721,722],{"__ignoreMap":464},[468,723,724,726,728,731],{"class":470,"line":471},[468,725,502],{"class":474},[468,727,505],{"class":478},[468,729,730],{"class":478}," github.com\u002Fgp-system\u002Fgpsystem\u002Fcmd\u002Fgpsystem@latest",[468,732,733],{"class":478}," version\n",[423,735,736,737,739],{},"If it prints the kit module and version, the setup works: scaffolding and ",[364,738,436],{}," will work too.",[439,741,743],{"id":742},"ci-setup-github-actions","CI setup (GitHub Actions)",[423,745,746,747,749,750,753],{},"There is no interactive authentication in CI: alongside ",[364,748,595],{}," you need a token-based ",[364,751,752],{},"insteadOf"," rewrite.",[459,755,759],{"className":756,"code":757,"language":758,"meta":464,"style":464},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","env:\n  GOPRIVATE: github.com\u002Fgp-system\u002F*\n\nsteps:\n  - uses: actions\u002Fcheckout@v4\n  - uses: actions\u002Fsetup-go@v5\n    with:\n      go-version: \"1.25\"\n  - name: Grant access to the private kit\n    run: |\n      git config --global \\\n        url.\"https:\u002F\u002Fx-access-token:${{ secrets.KIT_READ_TOKEN }}@github.com\u002F\".insteadOf \\\n        \"https:\u002F\u002Fgithub.com\u002F\"\n  - run: go build .\u002F...\n","yaml",[364,760,761,770,781,787,794,808,820,828,843,856,868,874,880,886],{"__ignoreMap":464},[468,762,763,767],{"class":470,"line":471},[468,764,766],{"class":765},"swJcz","env",[468,768,769],{"class":671},":\n",[468,771,772,775,778],{"class":470,"line":524},[468,773,774],{"class":765},"  GOPRIVATE",[468,776,777],{"class":671},":",[468,779,780],{"class":478}," github.com\u002Fgp-system\u002F*\n",[468,782,783],{"class":470,"line":535},[468,784,786],{"emptyLinePlaceholder":785},true,"\n",[468,788,790,792],{"class":470,"line":789},4,[468,791,447],{"class":765},[468,793,769],{"class":671},[468,795,797,800,803,805],{"class":470,"line":796},5,[468,798,799],{"class":671},"  -",[468,801,802],{"class":765}," uses",[468,804,777],{"class":671},[468,806,807],{"class":478}," actions\u002Fcheckout@v4\n",[468,809,811,813,815,817],{"class":470,"line":810},6,[468,812,799],{"class":671},[468,814,802],{"class":765},[468,816,777],{"class":671},[468,818,819],{"class":478}," actions\u002Fsetup-go@v5\n",[468,821,823,826],{"class":470,"line":822},7,[468,824,825],{"class":765},"    with",[468,827,769],{"class":671},[468,829,831,834,836,838,841],{"class":470,"line":830},8,[468,832,833],{"class":765},"      go-version",[468,835,777],{"class":671},[468,837,683],{"class":671},[468,839,840],{"class":478},"1.25",[468,842,689],{"class":671},[468,844,846,848,851,853],{"class":470,"line":845},9,[468,847,799],{"class":671},[468,849,850],{"class":765}," name",[468,852,777],{"class":671},[468,854,855],{"class":478}," Grant access to the private kit\n",[468,857,859,862,864],{"class":470,"line":858},10,[468,860,861],{"class":765},"    run",[468,863,777],{"class":671},[468,865,867],{"class":866},"s7zQu"," |\n",[468,869,871],{"class":470,"line":870},11,[468,872,873],{"class":478},"      git config --global \\\n",[468,875,877],{"class":470,"line":876},12,[468,878,879],{"class":478},"        url.\"https:\u002F\u002Fx-access-token:${{ secrets.KIT_READ_TOKEN }}@github.com\u002F\".insteadOf \\\n",[468,881,883],{"class":470,"line":882},13,[468,884,885],{"class":478},"        \"https:\u002F\u002Fgithub.com\u002F\"\n",[468,887,889,891,893,895],{"class":470,"line":888},14,[468,890,799],{"class":671},[468,892,505],{"class":765},[468,894,777],{"class":671},[468,896,897],{"class":478}," go build .\u002F...\n",[423,899,900,903,904,907,908,911],{},[364,901,902],{},"KIT_READ_TOKEN"," is a fine-grained personal access token (or an organization fine-grained token) with ",[359,905,906],{},"read"," access to the kit repository only, stored as a repository secret. The built-in Actions ",[364,909,910],{},"GITHUB_TOKEN"," is not enough: it only grants access to the running repository, not to the kit's.",[348,913,915],{"id":914},"create-a-project","Create a project",[447,917,918,922,1006,1016,1041,1045,1060,1073,1077,1094,1098],{"level":449},[451,919,921],{"id":920},"scaffold","Scaffold",[642,923,924,969],{},[459,925,928],{"className":461,"code":926,"filename":927,"language":463,"meta":464,"style":464},"go run \u002Fpath\u002Fto\u002Fgpsystem\u002Fcmd\u002Fgpsystem new project shop \\\n  --module-path github.com\u002Facme\u002Fshop \\\n  --kit-replace \u002Fpath\u002Fto\u002Fgpsystem\ncd shop\n","Local checkout",[364,929,930,946,954,960],{"__ignoreMap":464},[468,931,932,934,936,938,940,942,944],{"class":470,"line":471},[468,933,502],{"class":474},[468,935,505],{"class":478},[468,937,508],{"class":478},[468,939,511],{"class":478},[468,941,514],{"class":478},[468,943,517],{"class":478},[468,945,521],{"class":520},[468,947,948,950,952],{"class":470,"line":524},[468,949,527],{"class":478},[468,951,530],{"class":478},[468,953,521],{"class":520},[468,955,956,958],{"class":470,"line":535},[468,957,538],{"class":478},[468,959,485],{"class":478},[468,961,962,966],{"class":470,"line":789},[468,963,965],{"class":964},"s2Zo4","cd",[468,967,968],{"class":478}," shop\n",[459,970,973],{"className":461,"code":971,"filename":972,"language":463,"meta":464,"style":464},"go run github.com\u002Fgp-system\u002Fgpsystem\u002Fcmd\u002Fgpsystem@latest \\\n  new project shop --module-path github.com\u002Facme\u002Fshop\ncd shop\n","Private repo",[364,974,975,985,1000],{"__ignoreMap":464},[468,976,977,979,981,983],{"class":470,"line":471},[468,978,502],{"class":474},[468,980,505],{"class":478},[468,982,730],{"class":478},[468,984,521],{"class":520},[468,986,987,990,992,994,997],{"class":470,"line":524},[468,988,989],{"class":478},"  new",[468,991,514],{"class":478},[468,993,517],{"class":478},[468,995,996],{"class":478}," --module-path",[468,998,999],{"class":478}," github.com\u002Facme\u002Fshop\n",[468,1001,1002,1004],{"class":470,"line":535},[468,1003,965],{"class":964},[468,1005,968],{"class":478},[423,1007,1008,1009,1012,1013,1015],{},"The ",[364,1010,1011],{},"--module-path"," becomes your ",[364,1014,552],{}," module and every generated import path. Pick it carefully, it is expensive to change later.",[423,1017,1018,1019,1022,1023,1026,1027,1030,1031,1033,1034,1037,1038,1040],{},"Two more decisions are made here: ",[364,1020,1021],{},"--engine fiber|chi"," selects the HTTP engine (default: ",[364,1024,1025],{},"fiber","), ",[364,1028,1029],{},"--db pgx|bun"," the database layer (default: ",[364,1032,143],{},"). Both are recorded in the ",[364,1035,1036],{},"gpsystem.yaml"," manifest and every later generation follows them: details on the ",[402,1039,304],{"href":305}," page.",[451,1042,1044],{"id":1043},"resolve-dependencies","Resolve dependencies",[459,1046,1048],{"className":461,"code":1047,"language":463,"meta":464,"style":464},"go mod tidy\n",[364,1049,1050],{"__ignoreMap":464},[468,1051,1052,1054,1057],{"class":470,"line":471},[468,1053,502],{"class":474},[468,1055,1056],{"class":478}," mod",[468,1058,1059],{"class":478}," tidy\n",[423,1061,1062,1063,1065,1066,1069,1070,1072],{},"This also resolves the ",[364,1064,366],{}," directives, so from now on the CLI runs as ",[364,1067,1068],{},"go tool gpsystem",": pinned to a version recorded in your ",[364,1071,552],{},", identical for everyone on the team.",[451,1074,1076],{"id":1075},"install-the-typespec-toolchain","Install the TypeSpec toolchain",[459,1078,1080],{"className":461,"code":1079,"language":463,"meta":464,"style":464},"mise run setup   # npm ci \u002F npm install\n",[364,1081,1082],{"__ignoreMap":464},[468,1083,1084,1086,1088,1091],{"class":470,"line":471},[468,1085,407],{"class":474},[468,1087,505],{"class":478},[468,1089,1090],{"class":478}," setup",[468,1092,1093],{"class":654},"   # npm ci \u002F npm install\n",[451,1095,1097],{"id":1096},"start-the-local-dev-stack","Start the local dev stack",[459,1099,1101],{"className":461,"code":1100,"language":463,"meta":464,"style":464},"cp .env.example .env               # set USER_ID\u002FGROUP_ID to id -u \u002F id -g\ndocker network create proxynet     # one-time\nmise run dev                       # build + start the full stack (postgres, redis, mailpit, rustfs, ...)\n",[364,1102,1103,1117,1134],{"__ignoreMap":464},[468,1104,1105,1108,1111,1114],{"class":470,"line":471},[468,1106,1107],{"class":474},"cp",[468,1109,1110],{"class":478}," .env.example",[468,1112,1113],{"class":478}," .env",[468,1115,1116],{"class":654},"               # set USER_ID\u002FGROUP_ID to id -u \u002F id -g\n",[468,1118,1119,1122,1125,1128,1131],{"class":470,"line":524},[468,1120,1121],{"class":474},"docker",[468,1123,1124],{"class":478}," network",[468,1126,1127],{"class":478}," create",[468,1129,1130],{"class":478}," proxynet",[468,1132,1133],{"class":654},"     # one-time\n",[468,1135,1136,1138,1140,1143],{"class":470,"line":535},[468,1137,407],{"class":474},[468,1139,505],{"class":478},[468,1141,1142],{"class":478}," dev",[468,1144,1145],{"class":654},"                       # build + start the full stack (postgres, redis, mailpit, rustfs, ...)\n",[348,1147,1149],{"id":1148},"what-you-get","What you get",[423,1151,1152,1153,1155,1156,1159,1160,1163,1164,581],{},"A complete project skeleton: ",[364,1154,1036],{}," manifest, TypeSpec sources under ",[364,1157,1158],{},"spec\u002Ftypespec\u002F",", codegen configuration and the chosen engine's oapi-codegen templates under ",[364,1161,1162],{},"api\u002Foapi-codegen\u002F"," (the kit's full template set for Fiber, minimal overrides for chi), env-based configuration, compose file, lint config and mise tasks. The full tree is described in ",[402,1165,35],{"href":36},[423,1167,1168,1169,581],{},"There are no modules yet. Create the first one next: ",[402,1170,30],{"href":31},[1172,1173,1174],"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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":464,"searchDepth":524,"depth":524,"links":1176},[1177,1178,1183,1184],{"id":350,"depth":524,"text":351},{"id":420,"depth":524,"text":421,"children":1179},[1180,1181,1182],{"id":441,"depth":535,"text":442},{"id":584,"depth":535,"text":585},{"id":742,"depth":535,"text":743},{"id":914,"depth":524,"text":915},{"id":1148,"depth":524,"text":1149},"Prerequisites, accessing the private kit, and creating your first gpsystem project.","md",null,{},{"icon":28},{"title":25,"description":1185},"9_HGUIp2MnhvrYnWf_ejhdlGgrOd7LgTRQE4EVw0mtk",[1193,1195],{"title":21,"path":22,"stem":23,"description":1194,"icon":19,"children":-1},"A concept-by-concept mapping between Symfony and gpsystem.",{"title":30,"path":31,"stem":32,"description":1196,"icon":33,"children":-1},"Generate a module, run the codegen chain and boot the service.",1784668701128]