[{"data":1,"prerenderedAt":824},["ShallowReactive",2],{"navigation_docs_en":3,"-en-getting-started-first-module":342,"-en-getting-started-first-module-surround":819},[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":30,"body":344,"description":812,"extension":813,"links":814,"meta":815,"navigation":816,"path":31,"seo":817,"stem":32,"__hash__":818},"docs_en\u002Fen\u002F1.getting-started\u002F5.first-module.md",{"type":345,"value":346,"toc":808},"minimark",[347,356,549,554,584,596,602,739,758,769,773,778,804],[348,349,350,351,355],"p",{},"This page plays out the first step of the ",[352,353,354],"a",{"href":41},"shop sample application",": from an empty project to a booting module serving requests. Every command works the same in Fiber and chi projects: where the output differs, we show both.",[357,358,360,365,400,403,492,496,512,531,535],"steps",{"level":359},"4",[361,362,364],"h4",{"id":363},"generate-the-module","Generate the module",[366,367,372],"pre",{"className":368,"code":369,"language":370,"meta":371,"style":371},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem new module shop\n","sh","",[373,374,375],"code",{"__ignoreMap":371},[376,377,380,384,388,391,394,397],"span",{"class":378,"line":379},"line",1,[376,381,383],{"class":382},"sBMFI","go",[376,385,387],{"class":386},"sfazB"," tool",[376,389,390],{"class":386}," gpsystem",[376,392,393],{"class":386}," new",[376,395,396],{"class":386}," module",[376,398,399],{"class":386}," shop\n",[348,401,402],{},"This creates:",[404,405,406,422,437,460,471,482],"ul",{},[407,408,409,410,413,414,417,418,421],"li",{},"the entry point (",[373,411,412],{},"cmd\u002Fshop\u002Fmain.go","): with ",[373,415,416],{},"fiberx.Run"," in a Fiber project, ",[373,419,420],{},"chix.Run"," in a chi project;",[407,423,424,425,428,429,432,433,436],{},"the module wiring (",[373,426,427],{},"internal\u002Fmodules\u002Fshop\u002Fregister.go","): a ",[373,430,431],{},"Dependencies"," struct + an exported ",[373,434,435],{},"RegisterApi(router, deps)"," function;",[407,438,439,440,443,444,447,448,451,452,455,456,459],{},"an ",[373,441,442],{},"api"," surface under ",[373,445,446],{},"surfaces\u002Fapi\u002F",": a handler bound to the generated strict interface, a minimal ",[373,449,450],{},"service\u002F"," seam, a ",[373,453,454],{},"policy\u002F"," registry stub, plus a kept-empty ",[373,457,458],{},"http\u002Fmapper\u002F"," folder for your own code;",[407,461,462,463,466,467,470],{},"the module-level shared skeletons: ",[373,464,465],{},"core\u002F"," (home of the rules and sentinel errors the surfaces share) and ",[373,468,469],{},"repository\u002F"," (the module's single persistence layer);",[407,472,473,474,477,478,481],{},"the TypeSpec contract (",[373,475,476],{},"spec\u002Ftypespec\u002Fmodules\u002Fshop\u002F",") and the codegen config (",[373,479,480],{},"api\u002Foapi-codegen\u002Fshop-api.yaml",");",[407,483,484,485,488,489,491],{},"then registers everything via anchor insertions (",[373,486,487],{},"main.tsp",", ",[373,490,412],{},").",[361,493,495],{"id":494},"run-the-codegen-chain","Run the codegen chain",[366,497,499],{"className":368,"code":498,"language":370,"meta":371,"style":371},"mise run generate\n",[373,500,501],{"__ignoreMap":371},[376,502,503,506,509],{"class":378,"line":379},[376,504,505],{"class":382},"mise",[376,507,508],{"class":386}," run",[376,510,511],{"class":386}," generate\n",[348,513,514,515,518,519,522,523,526,527,530],{},"This compiles TypeSpec to OpenAPI (",[373,516,517],{},"api\u002Fopenapi\u002F","), runs oapi-codegen with the project's template set (the kit's vendored Fiber v3 templates for Fiber, upstream ",[373,520,521],{},"chi-server"," + the kit's strict overrides for chi), places the output under ",[373,524,525],{},"internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fhttp\u002Fgen\u002F",", tidies and builds. The sample handler implements the generated strict interface, so the project compiles immediately: spec\u002Fcode drift is a ",[352,528,529],{"href":88},"compile error",".",[361,532,534],{"id":533},"boot-it","Boot it",[366,536,538],{"className":368,"code":537,"language":370,"meta":371,"style":371},"go run .\u002Fcmd\u002Fshop\n",[373,539,540],{"__ignoreMap":371},[376,541,542,544,546],{"class":378,"line":379},[376,543,383],{"class":382},[376,545,508],{"class":386},[376,547,548],{"class":386}," .\u002Fcmd\u002Fshop\n",[550,551,553],"h2",{"id":552},"try-it","Try it",[555,556,557,571],"code-group",{},[366,558,561],{"className":368,"code":559,"filename":560,"language":370,"meta":371,"style":371},"curl localhost:3000\u002Fapi\u002Fv1\u002Fshop\u002F\n","request",[373,562,563],{"__ignoreMap":371},[376,564,565,568],{"class":378,"line":379},[376,566,567],{"class":382},"curl",[376,569,570],{"class":386}," localhost:3000\u002Fapi\u002Fv1\u002Fshop\u002F\n",[366,572,577],{"className":573,"code":574,"filename":575,"language":576,"meta":371,"style":371},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[]\n","response: 200","json",[373,578,579],{"__ignoreMap":371},[376,580,581],{"class":378,"line":379},[376,582,574],{"class":583},"sMK4o",[348,585,586,587,589,590,592,593,595],{},"The scaffold handler returns an empty list; replace its body once you've built the module's ",[373,588,465],{}," and ",[373,591,469],{}," layers, with the surface's ",[373,594,450],{}," seam serving from them.",[348,597,598,599,601],{},"Errors are RFC 9457 problem documents by default, in the same shape regardless of engine (",[352,600,118],{"href":119},"):",[555,603,604,616],{},[366,605,607],{"className":368,"code":606,"filename":560,"language":370,"meta":371,"style":371},"curl localhost:3000\u002Fapi\u002Fv1\u002Fnope\n",[373,608,609],{"__ignoreMap":371},[376,610,611,613],{"class":378,"line":379},[376,612,567],{"class":382},[376,614,615],{"class":386}," localhost:3000\u002Fapi\u002Fv1\u002Fnope\n",[366,617,620],{"className":573,"code":618,"filename":619,"language":576,"meta":371,"style":371},"{\n  \"type\": \"about:blank\",\n  \"title\": \"Not Found\",\n  \"status\": 404,\n  \"detail\": \"Not Found\",\n  \"instance\": \"\u002Fapi\u002Fv1\u002Fnope\"\n}\n","response: 404, application\u002Fproblem+json",[373,621,622,627,654,675,693,713,733],{"__ignoreMap":371},[376,623,624],{"class":378,"line":379},[376,625,626],{"class":583},"{\n",[376,628,630,633,637,640,643,646,649,651],{"class":378,"line":629},2,[376,631,632],{"class":583},"  \"",[376,634,636],{"class":635},"spNyl","type",[376,638,639],{"class":583},"\"",[376,641,642],{"class":583},":",[376,644,645],{"class":583}," \"",[376,647,648],{"class":386},"about:blank",[376,650,639],{"class":583},[376,652,653],{"class":583},",\n",[376,655,657,659,662,664,666,668,671,673],{"class":378,"line":656},3,[376,658,632],{"class":583},[376,660,661],{"class":635},"title",[376,663,639],{"class":583},[376,665,642],{"class":583},[376,667,645],{"class":583},[376,669,670],{"class":386},"Not Found",[376,672,639],{"class":583},[376,674,653],{"class":583},[376,676,678,680,683,685,687,691],{"class":378,"line":677},4,[376,679,632],{"class":583},[376,681,682],{"class":635},"status",[376,684,639],{"class":583},[376,686,642],{"class":583},[376,688,690],{"class":689},"sbssI"," 404",[376,692,653],{"class":583},[376,694,696,698,701,703,705,707,709,711],{"class":378,"line":695},5,[376,697,632],{"class":583},[376,699,700],{"class":635},"detail",[376,702,639],{"class":583},[376,704,642],{"class":583},[376,706,645],{"class":583},[376,708,670],{"class":386},[376,710,639],{"class":583},[376,712,653],{"class":583},[376,714,716,718,721,723,725,727,730],{"class":378,"line":715},6,[376,717,632],{"class":583},[376,719,720],{"class":635},"instance",[376,722,639],{"class":583},[376,724,642],{"class":583},[376,726,645],{"class":583},[376,728,729],{"class":386},"\u002Fapi\u002Fv1\u002Fnope",[376,731,732],{"class":583},"\"\n",[376,734,736],{"class":378,"line":735},7,[376,737,738],{"class":583},"}\n",[348,740,741,742,745,746,752,753,589,755,757],{},"Press ",[373,743,744],{},"Ctrl+C",": the server waits out in-flight requests, closes the pool, flushes telemetry and exits cleanly. That's the ",[352,747,748,751],{"href":74},[373,749,750],{},"app"," lifecycle"," at work, which both ",[373,754,416],{},[373,756,420],{}," sit on.",[348,759,760,761,764,765,768],{},"During development it's worth switching on the ",[352,762,763],{"href":228},"Monolog-style console log"," (",[373,766,767],{},"LOG_FORMAT=monolog","): you'll see error chains in the readable format you know from PHP.",[550,770,772],{"id":771},"where-to-next","Where to next",[348,774,775,776,642],{},"From here you can follow the path of the ",[352,777,354],{"href":41},[404,779,780,789,794,799],{},[407,781,782,783,786,787],{},"Another surface (e.g. ",[373,784,785],{},"admin","): ",[352,788,314],{"href":315},[407,790,791,792],{},"Adding endpoints: ",[352,793,324],{"href":325},[407,795,796,797],{},"An event, a listener and a scheduled job: ",[352,798,334],{"href":335},[407,800,801,802],{},"What exactly the chassis does: ",[352,803,68],{"href":69},[805,806,807],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":371,"searchDepth":629,"depth":629,"links":809},[810,811],{"id":552,"depth":629,"text":553},{"id":771,"depth":629,"text":772},"Generate a module, run the codegen chain and boot the service.","md",null,{},{"icon":33},{"title":30,"description":812},"QXhA3c_IyJ22BNZD0Y7JRmT04Eidr69vq2mhc7GGcPI",[820,822],{"title":25,"path":26,"stem":27,"description":821,"icon":28,"children":-1},"Prerequisites, accessing the private kit, and creating your first gpsystem project.",{"title":35,"path":36,"stem":37,"description":823,"icon":38,"children":-1},"The layout of a generated consumer project and the rules behind it.",1784668705406]