[{"data":1,"prerenderedAt":817},["ShallowReactive",2],{"navigation_docs_en":3,"-en-cli-new-module":342,"-en-cli-new-module-surround":812},[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":309,"body":344,"description":805,"extension":806,"links":807,"meta":808,"navigation":809,"path":310,"seo":810,"stem":311,"__hash__":811},"docs_en\u002Fen\u002F9.cli\u002F3.new-module.md",{"type":345,"value":346,"toc":799},"minimark",[347,408,428,433,568,572,614,618,637,712,736,740,779,791,795],[348,349,354],"pre",{"className":350,"code":351,"language":352,"meta":353,"style":353},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem new module \u003Cname> [--surface \u003Cname>]\n","sh","",[355,356,357],"code",{"__ignoreMap":353},[358,359,362,366,370,373,376,379,383,386,390,393,396,399,401,403,405],"span",{"class":360,"line":361},"line",1,[358,363,365],{"class":364},"sBMFI","go",[358,367,369],{"class":368},"sfazB"," tool",[358,371,372],{"class":368}," gpsystem",[358,374,375],{"class":368}," new",[358,377,378],{"class":368}," module",[358,380,382],{"class":381},"sMK4o"," \u003C",[358,384,385],{"class":368},"nam",[358,387,389],{"class":388},"sTEyZ","e",[358,391,392],{"class":381},">",[358,394,395],{"class":388}," [--surface ",[358,397,398],{"class":381},"\u003C",[358,400,385],{"class":368},[358,402,389],{"class":388},[358,404,392],{"class":381},[358,406,407],{"class":368},"]\n",[409,410,411,412,415,416,419,420,423,424,427],"p",{},"Run inside a project (the CLI walks up to ",[355,413,414],{},"gpsystem.yaml","). The module name must be lowercase letters\u002Fdigits: it becomes a Go package name, directory name and URL segment. The same rule applies to the first surface's name (",[355,417,418],{},"--surface",", default ",[355,421,422],{},"api","; the old ",[355,425,426],{},"--domain"," flag still works as a deprecated alias).",[429,430,432],"h2",{"id":431},"what-it-generates","What it generates",[434,435,436,455,477,507,528,540,546],"ul",{},[437,438,439,442,443,446,447,450,451,454],"li",{},[355,440,441],{},"cmd\u002F\u003Cname>\u002Fmain.go",": the ~20-line entry point calling ",[355,444,445],{},"fiberx.Run"," (or ",[355,448,449],{},"chix.Run"," for ",[355,452,453],{},"--engine chi"," projects)",[437,456,457,460,461,464,465,468,469,472,473,476],{},[355,458,459],{},"internal\u002Fmodules\u002F\u003Cname>\u002Fregister.go",": ",[355,462,463],{},"Dependencies"," struct + one exported ",[355,466,467],{},"Register\u003CSurface>(router, deps)"," function per surface (e.g. ",[355,470,471],{},"RegisterApi",", ",[355,474,475],{},"RegisterWeb",")",[437,478,479,480,482,483,486,487,490,491,494,495,498,499,502,503,506],{},"One first surface (default ",[355,481,422],{},") under ",[355,484,485],{},"surfaces\u002F\u003Csurface>\u002F",": a handler implementing the generated strict interface (its sample ",[355,488,489],{},"List"," calls a minimal ",[355,492,493],{},"service\u002F"," seam), a ",[355,496,497],{},"policy\u002F"," registry stub, plus a kept-empty ",[355,500,501],{},"http\u002Fmapper\u002F"," directory (",[355,504,505],{},".gitkeep",") for your own code",[437,508,509,510,513,514,517,518,521,522,527],{},"The module-level shared skeletons: ",[355,511,512],{},"core\u002F"," (home of the rules, entities and sentinel errors shared by the surfaces, with an ",[355,515,516],{},"ErrNotFound"," example) and ",[355,519,520],{},"repository\u002F"," (the module's single persistence layer); the first surface stamps these, later ",[523,524,525],"a",{"href":315},[355,526,314],{}," calls skip them",[437,529,530,460,533,536,537],{},[355,531,532],{},"spec\u002Ftypespec\u002Fmodules\u002F\u003Cname>\u002F",[355,534,535],{},"\u003Csurface>.tsp"," with a sample operation + ",[355,538,539],{},"models\u002F\u003Csurface>.tsp",[437,541,542,545],{},[355,543,544],{},"api\u002Foapi-codegen\u002F\u003Cname>-\u003Csurface>.yaml"," codegen config wired to the project's template set",[437,547,548,549,552,553,556,557,560,561,564,565,476],{},"The module's app service in ",[355,550,551],{},"compose.yml",": built from the project's ",[355,554,555],{},"Dockerfile"," (",[355,558,559],{},"target: development","), wired with ",[355,562,563],{},"depends_on"," on postgres\u002Fredis\u002Fmigrate, dual Traefik routers with path-based routing (see ",[523,566,304],{"href":567},"\u002Fen\u002Fcli\u002Fnew-project#module-routing-path-based-not-subdomain",[429,569,571],{"id":570},"anchor-insertions","Anchor insertions",[434,573,574,583,595,605],{},[437,575,576,579,580,476],{},[355,577,578],{},"main.tsp"," ← module imports (",[355,581,582],{},"gpsystem:modules",[437,584,585,587,588,591,592,476],{},[355,586,441],{}," ← the ",[355,589,590],{},"\u003Cname>.Register\u003CSurface>(api, deps)"," call (",[355,593,594],{},"gpsystem:registrations",[437,596,597,600,601,604],{},[355,598,599],{},"register.go"," ← a per-surface ",[355,602,603],{},"Register\u003CSurface>"," function + imports (rendered, then goimports-formatted)",[437,606,607,609,610,613],{},[355,608,551],{}," ← the module service at the ",[355,611,612],{},"gpsystem:services"," anchor",[429,615,617],{"id":616},"compose-backfill-on-an-older-project","Compose backfill on an older project",[409,619,620,621,472,625,627,628,630,631,633,634,636],{},"In a project freshly generated by ",[523,622,623],{"href":305},[355,624,304],{},[355,626,551],{}," and ",[355,629,555],{}," already exist, so ",[355,632,309],{}," only inserts the module service. On an older project (generated before the compose stack was introduced), ",[355,635,309],{}," backfills what it can:",[434,638,639,648,665,684,694],{},[437,640,641,642,627,644,647],{},"Creates ",[355,643,555],{},[355,645,646],{},".dockerignore"," if they're missing.",[437,649,650,651,654,655,654,658,661,662,664],{},"Inserts the ",[355,652,653],{},"mailpit","\u002F",[355,656,657],{},"rustfs",[355,659,660],{},"rustfs-init"," backing services at the ",[355,663,612],{}," anchor (idempotent, re-running does not duplicate them).",[437,666,667,668,670,671,674,675,678,679,683],{},"If ",[355,669,551],{}," has a postgres ",[355,672,673],{},"pg_isready"," healthcheck, the module service is inserted at the anchor too; if not (a ",[355,676,677],{},"service_healthy"," dependency on a healthcheck-less postgres would break compose), the module service's YAML is only ",[680,681,682],"strong",{},"printed"," to the terminal for manual insertion.",[437,685,686,687,654,690,693],{},"The top-level ",[355,688,689],{},"networks:",[355,691,692],{},"volumes:"," section (proxynet, rustfsdata, gomodcache, gocache) has no anchor either, so it's also only printed; insert it by hand.",[437,695,667,696,699,700,703,704,707,708,711],{},[355,697,698],{},".env.example"," still has ",[355,701,702],{},"DB_HOST=localhost",", a warning line flags that the app now runs inside compose and ",[355,705,706],{},"DB_HOST"," should become ",[355,709,710],{},"postgres",".",[409,713,714,715,717,718,654,720,722,723,728,729,732,733,735],{},"If the backfill's printed-manual-insertion fallbacks pile up (no ",[355,716,673],{}," healthcheck, missing ",[355,719,689],{},[355,721,692],{},"), it's often simpler to run ",[523,724,725],{"href":281},[355,726,727],{},"add compose"," ",[355,730,731],{},"--force"," and get a clean ",[355,734,551],{}," rebuilt from the manifest instead of patching the old one by hand.",[429,737,739],{"id":738},"after-generation","After generation",[348,741,743],{"className":350,"code":742,"language":352,"meta":353,"style":353},"mise run generate    # tsp → OpenAPI → strict server code → build\ngo run .\u002Fcmd\u002F\u003Cname>\n",[355,744,745,760],{"__ignoreMap":353},[358,746,747,750,753,756],{"class":360,"line":361},[358,748,749],{"class":364},"mise",[358,751,752],{"class":368}," run",[358,754,755],{"class":368}," generate",[358,757,759],{"class":758},"sHwdD","    # tsp → OpenAPI → strict server code → build\n",[358,761,763,765,767,770,772,774,776],{"class":360,"line":762},2,[358,764,365],{"class":364},[358,766,752],{"class":368},[358,768,769],{"class":368}," .\u002Fcmd\u002F",[358,771,398],{"class":381},[358,773,385],{"class":368},[358,775,389],{"class":388},[358,777,778],{"class":381},">\n",[409,780,781,782,784,785,787,788,790],{},"The skeleton has no persistence yet: build the shared rules in the module's ",[355,783,512],{}," package and the persistence in the module-level ",[355,786,520],{},", and call them from the handler through the surface's ",[355,789,493],{}," seam.",[792,793,794],"tip",{},"The skeleton compiles and serves immediately (including correct problem+json error responses), so you can wire CI and deployment before writing business logic.",[796,797,798],"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 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 .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 .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}",{"title":353,"searchDepth":762,"depth":762,"links":800},[801,802,803,804],{"id":431,"depth":762,"text":432},{"id":570,"depth":762,"text":571},{"id":616,"depth":762,"text":617},{"id":738,"depth":762,"text":739},"Generate a module (entry point, first surface, contract) into the current project.","md",null,{},{"icon":312},{"title":309,"description":805},"CT-0epPP0KXYACddbCAsQsrJ_t8zhDbBjvwykWUrG9A",[813,815],{"title":304,"path":305,"stem":306,"description":814,"icon":307,"children":-1},"Generate a complete consumer project skeleton, with engine and database choices.",{"title":314,"path":315,"stem":316,"description":816,"icon":317,"children":-1},"Add another surface (parallel HTTP bundle) to an existing module, under any name.",1784668713368]