[{"data":1,"prerenderedAt":1962},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-installation":493,"-docs-getting-started-installation-surround":1957},[4,46,135,218,257,292,355,377,420],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":45},"Getting Started","i-lucide-rocket","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"What is Heximon?","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F01.getting-started\u002F02.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002F01.getting-started\u002F03.quick-start","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Core Concepts","\u002Fdocs\u002Fgetting-started\u002Fcore-concepts","docs\u002F01.getting-started\u002F04.core-concepts","i-lucide-shapes",{"title":31,"path":32,"stem":33,"icon":34},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F01.getting-started\u002F05.examples","i-lucide-library",{"title":36,"path":37,"stem":38,"icon":39},"Where Next?","\u002Fdocs\u002Fgetting-started\u002Fwhere-next","docs\u002F01.getting-started\u002F06.where-next","i-lucide-signpost",{"title":41,"path":42,"stem":43,"icon":44},"Troubleshooting","\u002Fdocs\u002Fgetting-started\u002Ftroubleshooting","docs\u002F01.getting-started\u002F07.troubleshooting","i-lucide-life-buoy",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Essentials","i-lucide-boxes","\u002Fdocs\u002Fessentials","docs\u002F02.essentials",[52,56,61,66,71,76,81,86,91,96,101,105,110,115,120,125,130],{"title":53,"path":54,"stem":55,"icon":48},"Modules & DI","\u002Fdocs\u002Fessentials\u002Fmodules-and-di","docs\u002F02.essentials\u002F01.modules-and-di",{"title":57,"path":58,"stem":59,"icon":60},"Controllers","\u002Fdocs\u002Fessentials\u002Fcontrollers","docs\u002F02.essentials\u002F02.controllers","i-lucide-route",{"title":62,"path":63,"stem":64,"icon":65},"Validation & DTOs","\u002Fdocs\u002Fessentials\u002Fvalidation","docs\u002F02.essentials\u002F03.validation","i-lucide-shield-check",{"title":67,"path":68,"stem":69,"icon":70},"Contracts","\u002Fdocs\u002Fessentials\u002Fcontracts","docs\u002F02.essentials\u002F04.contracts","i-lucide-file-signature",{"title":72,"path":73,"stem":74,"icon":75},"REST Client","\u002Fdocs\u002Fessentials\u002Fclient","docs\u002F02.essentials\u002F05.client","i-lucide-plug",{"title":77,"path":78,"stem":79,"icon":80},"Database","\u002Fdocs\u002Fessentials\u002Fdatabase","docs\u002F02.essentials\u002F06.database","i-lucide-database",{"title":82,"path":83,"stem":84,"icon":85},"Drizzle ORM","\u002Fdocs\u002Fessentials\u002Fdrizzle","docs\u002F02.essentials\u002F07.drizzle","i-lucide-database-zap",{"title":87,"path":88,"stem":89,"icon":90},"Persistence & Transactions","\u002Fdocs\u002Fessentials\u002Fpersistence","docs\u002F02.essentials\u002F08.persistence","i-lucide-database-backup",{"title":92,"path":93,"stem":94,"icon":95},"Migrations","\u002Fdocs\u002Fessentials\u002Fmigrations","docs\u002F02.essentials\u002F09.migrations","i-lucide-git-branch",{"title":97,"path":98,"stem":99,"icon":100},"Authentication","\u002Fdocs\u002Fessentials\u002Fauthentication","docs\u002F02.essentials\u002F10.authentication","i-lucide-key-round",{"title":102,"path":103,"stem":104,"icon":65},"Permissions & scopes","\u002Fdocs\u002Fessentials\u002Fpermissions","docs\u002F02.essentials\u002F11.permissions",{"title":106,"path":107,"stem":108,"icon":109},"Error Handling","\u002Fdocs\u002Fessentials\u002Ferrors","docs\u002F02.essentials\u002F12.errors","i-lucide-triangle-alert",{"title":111,"path":112,"stem":113,"icon":114},"Testing a Heximon App","\u002Fdocs\u002Fessentials\u002Ftesting","docs\u002F02.essentials\u002F13.testing","i-lucide-flask-conical",{"title":116,"path":117,"stem":118,"icon":119},"Test app harness","\u002Fdocs\u002Fessentials\u002Fcreatetestapp","docs\u002F02.essentials\u002F14.createtestapp","i-lucide-test-tube",{"title":121,"path":122,"stem":123,"icon":124},"Logging & Observability","\u002Fdocs\u002Fessentials\u002Flogging","docs\u002F02.essentials\u002F17.logging","i-lucide-scroll-text",{"title":126,"path":127,"stem":128,"icon":129},"Context & Lifecycle","\u002Fdocs\u002Fessentials\u002Fcontext-and-lifecycle","docs\u002F02.essentials\u002F18.context-and-lifecycle","i-lucide-radio",{"title":131,"path":132,"stem":133,"icon":134},"Project Structure","\u002Fdocs\u002Fessentials\u002Fproject-structure","docs\u002F02.essentials\u002F19.project-structure","i-lucide-folder-tree",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":45},"Capabilities","i-lucide-sparkles","\u002Fdocs\u002Fcapabilities","docs\u002F03.capabilities",[141,145,150,155,160,164,169,174,179,184,188,193,198,203,208,213],{"title":142,"path":143,"stem":144,"icon":137},"Overview","\u002Fdocs\u002Fcapabilities\u002Foverview","docs\u002F03.capabilities\u002F01.overview",{"title":146,"path":147,"stem":148,"icon":149},"Events","\u002Fdocs\u002Fcapabilities\u002Fevents","docs\u002F03.capabilities\u002F02.events","i-lucide-radio-tower",{"title":151,"path":152,"stem":153,"icon":154},"Queue","\u002Fdocs\u002Fcapabilities\u002Fbackground-jobs","docs\u002F03.capabilities\u002F03.background-jobs","i-lucide-list-ordered",{"title":156,"path":157,"stem":158,"icon":159},"Scheduled Work","\u002Fdocs\u002Fcapabilities\u002Fscheduled-jobs","docs\u002F03.capabilities\u002F04.scheduled-jobs","i-lucide-clock",{"title":161,"path":162,"stem":163,"icon":85},"Caching","\u002Fdocs\u002Fcapabilities\u002Fcaching","docs\u002F03.capabilities\u002F05.caching",{"title":165,"path":166,"stem":167,"icon":168},"Key\u002FValue Storage","\u002Fdocs\u002Fcapabilities\u002Fkey-value","docs\u002F03.capabilities\u002F06.key-value","i-lucide-hard-drive",{"title":170,"path":171,"stem":172,"icon":173},"Blob Storage","\u002Fdocs\u002Fcapabilities\u002Fblob","docs\u002F03.capabilities\u002F07.blob","i-lucide-folder-open",{"title":175,"path":176,"stem":177,"icon":178},"Health & Readiness","\u002Fdocs\u002Fcapabilities\u002Fhealth","docs\u002F03.capabilities\u002F08.health","i-lucide-heart-pulse",{"title":180,"path":181,"stem":182,"icon":183},"Notifications","\u002Fdocs\u002Fcapabilities\u002Fnotifications","docs\u002F03.capabilities\u002F09.notifications","i-lucide-mail",{"title":185,"path":186,"stem":187,"icon":65},"Idempotency","\u002Fdocs\u002Fcapabilities\u002Fidempotency","docs\u002F03.capabilities\u002F10.idempotency",{"title":189,"path":190,"stem":191,"icon":192},"Security Hardening","\u002Fdocs\u002Fcapabilities\u002Fsecurity","docs\u002F03.capabilities\u002F11.security","i-lucide-shield",{"title":194,"path":195,"stem":196,"icon":197},"Observability & Tracing","\u002Fdocs\u002Fcapabilities\u002Fobservability","docs\u002F03.capabilities\u002F12.observability","i-lucide-activity",{"title":199,"path":200,"stem":201,"icon":202},"OpenAPI","\u002Fdocs\u002Fcapabilities\u002Fopenapi","docs\u002F03.capabilities\u002F13.openapi","i-lucide-book-marked",{"title":204,"path":205,"stem":206,"icon":207},"MCP Server","\u002Fdocs\u002Fcapabilities\u002Fmcp","docs\u002F03.capabilities\u002F14.mcp","i-lucide-bot",{"title":209,"path":210,"stem":211,"icon":212},"Schema DTOs","\u002Fdocs\u002Fcapabilities\u002Fschema","docs\u002F03.capabilities\u002F15.schema","i-lucide-file-json",{"title":214,"path":215,"stem":216,"icon":217},"Branded IDs","\u002Fdocs\u002Fcapabilities\u002Fbranded-ids","docs\u002F03.capabilities\u002F16.branded-ids","i-lucide-tag",{"title":219,"icon":220,"path":221,"stem":222,"children":223,"page":45},"Architecture","i-lucide-building","\u002Fdocs\u002Farchitecture","docs\u002F04.architecture",[224,227,232,237,242,247,252],{"title":142,"path":225,"stem":226,"icon":220},"\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F04.architecture\u002F01.overview",{"title":228,"path":229,"stem":230,"icon":231},"Domain-Driven Design","\u002Fdocs\u002Farchitecture\u002Fddd","docs\u002F04.architecture\u002F02.ddd","i-lucide-hexagon",{"title":233,"path":234,"stem":235,"icon":236},"CQRS","\u002Fdocs\u002Farchitecture\u002Fcqrs","docs\u002F04.architecture\u002F03.cqrs","i-lucide-split",{"title":238,"path":239,"stem":240,"icon":241},"Repository Pattern","\u002Fdocs\u002Farchitecture\u002Frepository-pattern","docs\u002F04.architecture\u002F04.repository-pattern","i-lucide-archive",{"title":243,"path":244,"stem":245,"icon":246},"Integration Events","\u002Fdocs\u002Farchitecture\u002Fintegration-events","docs\u002F04.architecture\u002F05.integration-events","i-lucide-send-horizontal",{"title":248,"path":249,"stem":250,"icon":251},"Saga Orchestration","\u002Fdocs\u002Farchitecture\u002Fsagas","docs\u002F04.architecture\u002F06.sagas","i-lucide-hourglass",{"title":253,"path":254,"stem":255,"icon":256},"Durable Workflows","\u002Fdocs\u002Farchitecture\u002Fworkflows","docs\u002F04.architecture\u002F07.workflows","i-lucide-workflow",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":45},"Realtime","i-lucide-cable","\u002Fdocs\u002Frealtime","docs\u002F05.realtime",[263,266,270,274,279,284,288],{"title":142,"path":264,"stem":265,"icon":259},"\u002Fdocs\u002Frealtime\u002Foverview","docs\u002F05.realtime\u002F01.overview",{"title":267,"path":268,"stem":269,"icon":129},"WebSockets","\u002Fdocs\u002Frealtime\u002Fwebsockets","docs\u002F05.realtime\u002F02.websockets",{"title":271,"path":272,"stem":273,"icon":70},"WebSocket Contracts","\u002Fdocs\u002Frealtime\u002Fwebsocket-contracts","docs\u002F05.realtime\u002F03.websocket-contracts",{"title":275,"path":276,"stem":277,"icon":278},"Server-Sent Events","\u002Fdocs\u002Frealtime\u002Fserver-sent-events","docs\u002F05.realtime\u002F04.server-sent-events","i-lucide-rss",{"title":280,"path":281,"stem":282,"icon":283},"Typed Clients","\u002Fdocs\u002Frealtime\u002Ftyped-clients","docs\u002F05.realtime\u002F05.typed-clients","i-lucide-plug-zap",{"title":285,"path":286,"stem":287,"icon":259},"AsyncAPI","\u002Fdocs\u002Frealtime\u002Fasyncapi","docs\u002F05.realtime\u002F06.asyncapi",{"title":289,"path":290,"stem":291,"icon":80},"Durable Objects","\u002Fdocs\u002Frealtime\u002Fdurable-objects","docs\u002F05.realtime\u002F07.durable-objects",{"title":293,"icon":294,"path":295,"stem":296,"children":297,"page":45},"Deploy","i-lucide-cloud-upload","\u002Fdocs\u002Fdeploy","docs\u002F06.deploy",[298,301,306,311,316,321,326,331,336,341,345,350],{"title":142,"path":299,"stem":300,"icon":6},"\u002Fdocs\u002Fdeploy\u002Foverview","docs\u002F06.deploy\u002F01.overview",{"title":302,"path":303,"stem":304,"icon":305},"Node","\u002Fdocs\u002Fdeploy\u002Fnode","docs\u002F06.deploy\u002F02.node","la:node-js",{"title":307,"path":308,"stem":309,"icon":310},"Cloudflare","\u002Fdocs\u002Fdeploy\u002Fcloudflare","docs\u002F06.deploy\u002F03.cloudflare","simple-icons:cloudflare",{"title":312,"path":313,"stem":314,"icon":315},"Vercel","\u002Fdocs\u002Fdeploy\u002Fvercel","docs\u002F06.deploy\u002F04.vercel","ri:vercel-fill",{"title":317,"path":318,"stem":319,"icon":320},"Netlify","\u002Fdocs\u002Fdeploy\u002Fnetlify","docs\u002F06.deploy\u002F05.netlify","i-simple-icons-netlify",{"title":322,"path":323,"stem":324,"icon":325},"AWS Lambda","\u002Fdocs\u002Fdeploy\u002Faws-lambda","docs\u002F06.deploy\u002F06.aws-lambda","hugeicons:aws-lambda",{"title":327,"path":328,"stem":329,"icon":330},"Deno Deploy","\u002Fdocs\u002Fdeploy\u002Fdeno-deploy","docs\u002F06.deploy\u002F07.deno-deploy","simple-icons:denodeploy",{"title":332,"path":333,"stem":334,"icon":335},"Nitro","\u002Fdocs\u002Fdeploy\u002Fnitro","docs\u002F06.deploy\u002F08.nitro","i-unjs-nitro",{"title":337,"path":338,"stem":339,"icon":340},"Nuxt","\u002Fdocs\u002Fdeploy\u002Fnuxt","docs\u002F06.deploy\u002F09.nuxt","i-devicon-nuxt",{"title":342,"path":343,"stem":344,"icon":236},"Mixed-runtime split","\u002Fdocs\u002Fdeploy\u002Fmixed-runtime-split","docs\u002F06.deploy\u002F10.mixed-runtime-split",{"title":346,"path":347,"stem":348,"icon":349},"Hosts","\u002Fdocs\u002Fdeploy\u002Fhosts","docs\u002F06.deploy\u002F11.hosts","i-lucide-map",{"title":351,"path":352,"stem":353,"icon":354},"Cross-service events","\u002Fdocs\u002Fdeploy\u002Fcross-service-events","docs\u002F06.deploy\u002F12.cross-service-events","i-lucide-network",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":45},"CLI","i-lucide-terminal","\u002Fdocs\u002Fcli","docs\u002F07.cli",[361,365,369,373],{"title":362,"path":363,"stem":364,"icon":357},"The heximon CLI","\u002Fdocs\u002Fcli\u002Foverview","docs\u002F07.cli\u002F01.overview",{"title":366,"path":367,"stem":368,"icon":137},"Create a New App","\u002Fdocs\u002Fcli\u002Fcreate","docs\u002F07.cli\u002F02.create",{"title":370,"path":371,"stem":372,"icon":95},"Migrations from the CLI","\u002Fdocs\u002Fcli\u002Fmigrations","docs\u002F07.cli\u002F03.migrations",{"title":374,"path":375,"stem":376,"icon":6},"Deploying a Heximon app","\u002Fdocs\u002Fcli\u002Fdeploy","docs\u002F07.cli\u002F04.deploy",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":45},"Under the Hood","i-lucide-wrench","\u002Fdocs\u002Funder-the-hood","docs\u002F08.under-the-hood",[383,388,393,397,402,407,411,415],{"title":384,"path":385,"stem":386,"icon":387},"How the Compiler Works","\u002Fdocs\u002Funder-the-hood\u002Fhow-the-compiler-works","docs\u002F08.under-the-hood\u002F01.how-the-compiler-works","i-lucide-cog",{"title":389,"path":390,"stem":391,"icon":392},"Compiler","\u002Fdocs\u002Funder-the-hood\u002Fextending-the-compiler","docs\u002F08.under-the-hood\u002F02.extending-the-compiler","i-lucide-cpu",{"title":394,"path":395,"stem":396,"icon":357},"Compiler Diagnostics","\u002Fdocs\u002Funder-the-hood\u002Fcompiler-diagnostics","docs\u002F08.under-the-hood\u002F03.compiler-diagnostics",{"title":398,"path":399,"stem":400,"icon":401},"Library Mode","\u002Fdocs\u002Funder-the-hood\u002Flibrary-mode","docs\u002F08.under-the-hood\u002F04.library-mode","i-lucide-package",{"title":403,"path":404,"stem":405,"icon":406},"Other bundlers","\u002Fdocs\u002Funder-the-hood\u002Falternate-bundlers","docs\u002F08.under-the-hood\u002F05.alternate-bundlers","i-lucide-blocks",{"title":408,"path":409,"stem":410,"icon":401},"Packages","\u002Fdocs\u002Funder-the-hood\u002Fpackages","docs\u002F08.under-the-hood\u002F06.packages",{"title":412,"path":413,"stem":414,"icon":207},"AI Skills","\u002Fdocs\u002Funder-the-hood\u002Fai-and-agents","docs\u002F08.under-the-hood\u002F07.ai-and-agents",{"title":416,"path":417,"stem":418,"icon":419},"Advanced DI","\u002Fdocs\u002Funder-the-hood\u002Fadvanced-di","docs\u002F08.under-the-hood\u002F08.advanced-di","i-lucide-git-fork",{"title":421,"icon":422,"path":423,"stem":424,"children":425,"page":45},"Recipes","i-lucide-book-open-check","\u002Fdocs\u002Frecipes","docs\u002F09.recipes",[426,431,436,440,444,448,452,456,460,465,469,474,479,484,488],{"title":427,"path":428,"stem":429,"icon":430},"Send an Email","\u002Fdocs\u002Frecipes\u002Fsend-an-email","docs\u002F09.recipes\u002F01.send-an-email","i-lucide-send",{"title":432,"path":433,"stem":434,"icon":435},"Upload a File","\u002Fdocs\u002Frecipes\u002Fupload-a-file","docs\u002F09.recipes\u002F02.upload-a-file","i-lucide-upload",{"title":437,"path":438,"stem":439,"icon":24},"Cache an Expensive Call","\u002Fdocs\u002Frecipes\u002Fcache-an-expensive-call","docs\u002F09.recipes\u002F03.cache-an-expensive-call",{"title":441,"path":442,"stem":443,"icon":154},"Paginate a List","\u002Fdocs\u002Frecipes\u002Fpaginate-a-list","docs\u002F09.recipes\u002F04.paginate-a-list",{"title":445,"path":446,"stem":447,"icon":65},"Protect Admin Routes","\u002Fdocs\u002Frecipes\u002Fprotect-admin-routes","docs\u002F09.recipes\u002F05.protect-admin-routes",{"title":449,"path":450,"stem":451,"icon":178},"Health Probes and a Nightly Job","\u002Fdocs\u002Frecipes\u002Fhealth-probes-and-a-nightly-job","docs\u002F09.recipes\u002F06.health-probes-and-a-nightly-job",{"title":453,"path":454,"stem":455,"icon":80},"Build a CRUD API","\u002Fdocs\u002Frecipes\u002Fcrud-api","docs\u002F09.recipes\u002F07.crud-api",{"title":457,"path":458,"stem":459,"icon":100},"Add Authentication","\u002Fdocs\u002Frecipes\u002Fadd-authentication","docs\u002F09.recipes\u002F08.add-authentication",{"title":461,"path":462,"stem":463,"icon":464},"Background Jobs","\u002Fdocs\u002Frecipes\u002Fbackground-jobs","docs\u002F09.recipes\u002F09.background-jobs","i-lucide-timer",{"title":466,"path":467,"stem":468,"icon":149},"Decouple Features with Events","\u002Fdocs\u002Frecipes\u002Fevent-driven-module","docs\u002F09.recipes\u002F10.event-driven-module",{"title":470,"path":471,"stem":472,"icon":473},"Build a DDD Aggregate","\u002Fdocs\u002Frecipes\u002Fddd-aggregate","docs\u002F09.recipes\u002F11.ddd-aggregate","i-lucide-box",{"title":475,"path":476,"stem":477,"icon":478},"Publish a Feature Package","\u002Fdocs\u002Frecipes\u002Ffeature-package","docs\u002F09.recipes\u002F12.feature-package","i-lucide-package-open",{"title":480,"path":481,"stem":482,"icon":483},"Reliable Integration Events","\u002Fdocs\u002Frecipes\u002Freliable-integration-events","docs\u002F09.recipes\u002F13.reliable-integration-events","i-lucide-inbox",{"title":485,"path":486,"stem":487,"icon":95},"Reactive Choreography","\u002Fdocs\u002Frecipes\u002Freactive-choreography","docs\u002F09.recipes\u002F14.reactive-choreography",{"title":489,"path":490,"stem":491,"icon":492},"Build a Production CRUD API","\u002Fdocs\u002Frecipes\u002Fproduction-crud-api","docs\u002F09.recipes\u002F15.production-crud-api","i-lucide-layers",{"id":494,"title":16,"body":495,"description":1950,"extension":1951,"links":1952,"meta":1953,"navigation":1954,"path":17,"seo":1955,"stem":18,"__hash__":1956},"docs\u002Fdocs\u002F01.getting-started\u002F02.installation.md",{"type":496,"value":497,"toc":1940},"minimark",[498,502,507,522,602,610,614,652,667,671,686,805,836,840,858,996,1086,1107,1128,1134,1138,1150,1410,1436,1478,1482,1497,1623,1664,1670,1674,1677,1690,1808,1813,1890,1905,1909,1936],[499,500,501],"p",{},"Adopting Heximon costs three packages, one plugin line in your Vite config, and one small config\nfile — there's no entry file to write, no decorators to enable, and no runtime container to wire up.",[503,504,506],"h2",{"id":505},"the-fast-path-scaffold-it","The fast path: scaffold it",[499,508,509,513,514,517,518,521],{},[510,511,512],"code",{},"pnpm create heximon"," generates all of the setup below — the packages, the Vite config, the\n",[510,515,516],{},"heximon.config.ts"," config file, and TypeScript — into a working app you can ",[510,519,520],{},"pnpm dev"," immediately.",[523,524,525,553,570,586],"code-group",{},[526,527,533],"pre",{"className":528,"code":529,"filename":530,"language":531,"meta":532,"style":532},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm create heximon my-app\n","pnpm","bash","",[510,534,535],{"__ignoreMap":532},[536,537,540,543,547,550],"span",{"class":538,"line":539},"line",1,[536,541,530],{"class":542},"sBMFI",[536,544,546],{"class":545},"sfazB"," create",[536,548,549],{"class":545}," heximon",[536,551,552],{"class":545}," my-app\n",[526,554,557],{"className":528,"code":555,"filename":556,"language":531,"meta":532,"style":532},"npm create heximon@latest my-app\n","npm",[510,558,559],{"__ignoreMap":532},[536,560,561,563,565,568],{"class":538,"line":539},[536,562,556],{"class":542},[536,564,546],{"class":545},[536,566,567],{"class":545}," heximon@latest",[536,569,552],{"class":545},[526,571,574],{"className":528,"code":572,"filename":573,"language":531,"meta":532,"style":532},"yarn create heximon my-app\n","yarn",[510,575,576],{"__ignoreMap":532},[536,577,578,580,582,584],{"class":538,"line":539},[536,579,573],{"class":542},[536,581,546],{"class":545},[536,583,549],{"class":545},[536,585,552],{"class":545},[526,587,590],{"className":528,"code":588,"filename":589,"language":531,"meta":532,"style":532},"bun create heximon my-app\n","bun",[510,591,592],{"__ignoreMap":532},[536,593,594,596,598,600],{"class":538,"line":539},[536,595,589],{"class":542},[536,597,546],{"class":545},[536,599,549],{"class":545},[536,601,552],{"class":545},[499,603,604,605,609],{},"See ",[606,607,608],"a",{"href":367},"Create a new app"," for the template and validator choices. The rest of this\npage is for adding Heximon to a project by hand, or bolting it onto one you already have.",[503,611,613],{"id":612},"check-prerequisites","Check prerequisites",[615,616,617,625,631],"ul",{},[618,619,620,624],"li",{},[621,622,623],"strong",{},"Node.js"," 24+",[618,626,627,628,630],{},"A package manager — ",[621,629,530],{}," 10+ is recommended and is what Heximon's own CI verifies; npm, yarn, and Bun\nare expected to work but aren't CI-verified yet",[618,632,633,636,637,640,641,647,648,651],{},[621,634,635],{},"TypeScript"," 5.9+ in strict mode — type-checking is your job (via your IDE or ",[510,638,639],{},"tsgo","); Heximon's own\ncompiler reads your source with ",[606,642,646],{"href":643,"rel":644},"https:\u002F\u002Foxc.rs",[645],"nofollow","oxc",", so it never needs ",[510,649,650],{},"tsc"," to build",[499,653,654,655,658,659,662,663,666],{},"Heximon needs ",[621,656,657],{},"no decorator flags"," — it's decorator-free by design, so leave ",[510,660,661],{},"experimentalDecorators"," and\n",[510,664,665],{},"emitDecoratorMetadata"," off. Discovery comes from a class being listed in a module, not from metadata.",[503,668,670],{"id":669},"install-the-packages","Install the packages",[499,672,673,674,677,678,681,682,685],{},"A minimal HTTP app needs three packages: the kernel (",[510,675,676],{},"runtime","), the HTTP layer (",[510,679,680],{},"http","), and the build\nplugin (",[510,683,684],{},"build",") that hosts the compiler and dev server.",[523,687,688,722,750,777],{},[526,689,691],{"className":528,"code":690,"filename":530,"language":531,"meta":532,"style":532},"pnpm add @heximon\u002Fruntime @heximon\u002Fhttp\npnpm add -D @heximon\u002Fbuild vite-plus\n",[510,692,693,706],{"__ignoreMap":532},[536,694,695,697,700,703],{"class":538,"line":539},[536,696,530],{"class":542},[536,698,699],{"class":545}," add",[536,701,702],{"class":545}," @heximon\u002Fruntime",[536,704,705],{"class":545}," @heximon\u002Fhttp\n",[536,707,709,711,713,716,719],{"class":538,"line":708},2,[536,710,530],{"class":542},[536,712,699],{"class":545},[536,714,715],{"class":545}," -D",[536,717,718],{"class":545}," @heximon\u002Fbuild",[536,720,721],{"class":545}," vite-plus\n",[526,723,725],{"className":528,"code":724,"filename":556,"language":531,"meta":532,"style":532},"npm install @heximon\u002Fruntime @heximon\u002Fhttp\nnpm install -D @heximon\u002Fbuild vite-plus\n",[510,726,727,738],{"__ignoreMap":532},[536,728,729,731,734,736],{"class":538,"line":539},[536,730,556],{"class":542},[536,732,733],{"class":545}," install",[536,735,702],{"class":545},[536,737,705],{"class":545},[536,739,740,742,744,746,748],{"class":538,"line":708},[536,741,556],{"class":542},[536,743,733],{"class":545},[536,745,715],{"class":545},[536,747,718],{"class":545},[536,749,721],{"class":545},[526,751,753],{"className":528,"code":752,"filename":573,"language":531,"meta":532,"style":532},"yarn add @heximon\u002Fruntime @heximon\u002Fhttp\nyarn add -D @heximon\u002Fbuild vite-plus\n",[510,754,755,765],{"__ignoreMap":532},[536,756,757,759,761,763],{"class":538,"line":539},[536,758,573],{"class":542},[536,760,699],{"class":545},[536,762,702],{"class":545},[536,764,705],{"class":545},[536,766,767,769,771,773,775],{"class":538,"line":708},[536,768,573],{"class":542},[536,770,699],{"class":545},[536,772,715],{"class":545},[536,774,718],{"class":545},[536,776,721],{"class":545},[526,778,780],{"className":528,"code":779,"filename":589,"language":531,"meta":532,"style":532},"bun add @heximon\u002Fruntime @heximon\u002Fhttp\nbun add -d @heximon\u002Fbuild vite-plus\n",[510,781,782,792],{"__ignoreMap":532},[536,783,784,786,788,790],{"class":538,"line":539},[536,785,589],{"class":542},[536,787,699],{"class":545},[536,789,702],{"class":545},[536,791,705],{"class":545},[536,793,794,796,798,801,803],{"class":538,"line":708},[536,795,589],{"class":542},[536,797,699],{"class":545},[536,799,800],{"class":545}," -d",[536,802,718],{"class":545},[536,804,721],{"class":545},[499,806,807,810,811,814,815,818,819,818,822,818,825,818,828,831,832,835],{},[510,808,809],{},"vite-plus"," is the build toolchain (it brings Vite along), so it goes in ",[510,812,813],{},"devDependencies"," next to the\nplugin. Add the other layers — ",[510,816,817],{},"contract",", ",[510,820,821],{},"cqrs",[510,823,824],{},"domain",[510,826,827],{},"drizzle",[510,829,830],{},"auth",", and the rest — only when you\nreach for them; each ships its own compiler plugin and runtime classes. The\n",[606,833,834],{"href":409},"Packages overview"," has the full list.",[503,837,839],{"id":838},"configure-vite","Configure Vite",[499,841,842,843,846,847,850,851,853,854,857],{},"The ",[510,844,845],{},"heximon()"," plugin runs the compiler over ",[510,848,849],{},"src\u002F"," and serves the generated app. Register the plugin with\nno arguments — all compiler configuration lives in ",[510,852,516],{}," next to it, where you list\none compiler plugin per feature — here just ",[510,855,856],{},"HttpPlugin"," for the HTTP layer.",[526,859,864],{"className":860,"code":861,"filename":862,"language":863,"meta":532,"style":532},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import heximon from \"@heximon\u002Fbuild\u002Fvite\";\nimport { defineConfig } from \"vite-plus\";\n\nexport default defineConfig({\n  plugins: [heximon()],\n  server: { port: 3000 },\n});\n","vite.config.ts","ts",[510,865,866,892,916,923,941,963,985],{"__ignoreMap":532},[536,867,868,872,876,879,883,886,889],{"class":538,"line":539},[536,869,871],{"class":870},"s7zQu","import",[536,873,875],{"class":874},"sTEyZ"," heximon ",[536,877,878],{"class":870},"from",[536,880,882],{"class":881},"sMK4o"," \"",[536,884,885],{"class":545},"@heximon\u002Fbuild\u002Fvite",[536,887,888],{"class":881},"\"",[536,890,891],{"class":881},";\n",[536,893,894,896,899,902,905,908,910,912,914],{"class":538,"line":708},[536,895,871],{"class":870},[536,897,898],{"class":881}," {",[536,900,901],{"class":874}," defineConfig",[536,903,904],{"class":881}," }",[536,906,907],{"class":870}," from",[536,909,882],{"class":881},[536,911,809],{"class":545},[536,913,888],{"class":881},[536,915,891],{"class":881},[536,917,919],{"class":538,"line":918},3,[536,920,922],{"emptyLinePlaceholder":921},true,"\n",[536,924,926,929,932,935,938],{"class":538,"line":925},4,[536,927,928],{"class":870},"export",[536,930,931],{"class":870}," default",[536,933,901],{"class":934},"s2Zo4",[536,936,937],{"class":874},"(",[536,939,940],{"class":881},"{\n",[536,942,944,948,951,954,957,960],{"class":538,"line":943},5,[536,945,947],{"class":946},"swJcz","  plugins",[536,949,950],{"class":881},":",[536,952,953],{"class":874}," [",[536,955,956],{"class":934},"heximon",[536,958,959],{"class":874},"()]",[536,961,962],{"class":881},",\n",[536,964,966,969,971,973,976,978,982],{"class":538,"line":965},6,[536,967,968],{"class":946},"  server",[536,970,950],{"class":881},[536,972,898],{"class":881},[536,974,975],{"class":946}," port",[536,977,950],{"class":881},[536,979,981],{"class":980},"sbssI"," 3000",[536,983,984],{"class":881}," },\n",[536,986,988,991,994],{"class":538,"line":987},7,[536,989,990],{"class":881},"}",[536,992,993],{"class":874},")",[536,995,891],{"class":881},[526,997,999],{"className":860,"code":998,"filename":516,"language":863,"meta":532,"style":532},"import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\n\nexport default defineHeximonConfig({\n  plugins: [new HttpPlugin()],\n});\n",[510,1000,1001,1023,1045,1049,1061,1078],{"__ignoreMap":532},[536,1002,1003,1005,1007,1010,1012,1014,1016,1019,1021],{"class":538,"line":539},[536,1004,871],{"class":870},[536,1006,898],{"class":881},[536,1008,1009],{"class":874}," defineHeximonConfig",[536,1011,904],{"class":881},[536,1013,907],{"class":870},[536,1015,882],{"class":881},[536,1017,1018],{"class":545},"@heximon\u002Fbuild",[536,1020,888],{"class":881},[536,1022,891],{"class":881},[536,1024,1025,1027,1029,1032,1034,1036,1038,1041,1043],{"class":538,"line":708},[536,1026,871],{"class":870},[536,1028,898],{"class":881},[536,1030,1031],{"class":874}," HttpPlugin",[536,1033,904],{"class":881},[536,1035,907],{"class":870},[536,1037,882],{"class":881},[536,1039,1040],{"class":545},"@heximon\u002Fhttp\u002Fcompiler",[536,1042,888],{"class":881},[536,1044,891],{"class":881},[536,1046,1047],{"class":538,"line":918},[536,1048,922],{"emptyLinePlaceholder":921},[536,1050,1051,1053,1055,1057,1059],{"class":538,"line":925},[536,1052,928],{"class":870},[536,1054,931],{"class":870},[536,1056,1009],{"class":934},[536,1058,937],{"class":874},[536,1060,940],{"class":881},[536,1062,1063,1065,1067,1069,1072,1074,1076],{"class":538,"line":943},[536,1064,947],{"class":946},[536,1066,950],{"class":881},[536,1068,953],{"class":874},[536,1070,1071],{"class":881},"new",[536,1073,1031],{"class":934},[536,1075,959],{"class":874},[536,1077,962],{"class":881},[536,1079,1080,1082,1084],{"class":538,"line":965},[536,1081,990],{"class":881},[536,1083,993],{"class":874},[536,1085,891],{"class":881},[499,1087,1088,1089,1091,1092,1095,1096,1099,1100,1103,1104,1106],{},"The split is deliberate: ",[510,1090,845],{}," registers the build hook, while the compiler options — ",[510,1093,1094],{},"plugins",", the\noptional ",[510,1097,1098],{},"root"," module, ",[510,1101,1102],{},"wiringMode"," — live in ",[510,1105,516],{},".",[499,1108,1109,1110,1113,1114,818,1117,818,1120,1123,1124,1127],{},"As your app grows, you list more plugins there: ",[510,1111,1112],{},"[new HttpPlugin(), new CqrsPlugin(), new DomainEventsPlugin()]",". Each feature page shows the plugin it needs. ",[510,1115,1116],{},"vp dev",[510,1118,1119],{},"vp build",[510,1121,1122],{},"vp test","\n(",[510,1125,1126],{},"createTestApp","), and every host all read this same file, so the config is declared once no matter how\nyou run the app.",[499,1129,1130,1131,1133],{},"You don't write a ",[510,1132,1098],{}," entry: with it omitted, the single root module — the one no other module imports —\nis auto-discovered as your app. Each feature page that adds a plugin reuses this exact config.",[503,1135,1137],{"id":1136},"configure-typescript","Configure TypeScript",[499,1139,1140,1141,1145,1146,1149],{},"Heximon is strict and ESM-only. Strictness here sharpens ",[1142,1143,1144],"em",{},"your"," type-checking — the Heximon compiler itself\nparses with oxc and never reads your ",[510,1147,1148],{},"tsconfig.json",". The options below are the ones that matter; extend\nyour team's base config for the rest.",[526,1151,1155],{"className":1152,"code":1153,"filename":1148,"language":1154,"meta":532,"style":532},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"verbatimModuleSyntax\": true,\n    \"strict\": true,\n    \"noUncheckedIndexedAccess\": true,\n    \"skipLibCheck\": true,\n    \"noEmit\": true,\n    \"lib\": [\"ES2022\", \"DOM\", \"DOM.Iterable\"]\n  },\n  \"include\": [\"src\", \"src\u002F.heximon\u002F**\u002F*\", \"vite.config.ts\", \"test\"]\n}\n","json",[510,1156,1157,1161,1177,1198,1217,1237,1251,1264,1278,1292,1306,1349,1355,1404],{"__ignoreMap":532},[536,1158,1159],{"class":538,"line":539},[536,1160,940],{"class":881},[536,1162,1163,1166,1170,1172,1174],{"class":538,"line":708},[536,1164,1165],{"class":881},"  \"",[536,1167,1169],{"class":1168},"spNyl","compilerOptions",[536,1171,888],{"class":881},[536,1173,950],{"class":881},[536,1175,1176],{"class":881}," {\n",[536,1178,1179,1182,1185,1187,1189,1191,1194,1196],{"class":538,"line":918},[536,1180,1181],{"class":881},"    \"",[536,1183,1184],{"class":542},"target",[536,1186,888],{"class":881},[536,1188,950],{"class":881},[536,1190,882],{"class":881},[536,1192,1193],{"class":545},"ESNext",[536,1195,888],{"class":881},[536,1197,962],{"class":881},[536,1199,1200,1202,1205,1207,1209,1211,1213,1215],{"class":538,"line":925},[536,1201,1181],{"class":881},[536,1203,1204],{"class":542},"module",[536,1206,888],{"class":881},[536,1208,950],{"class":881},[536,1210,882],{"class":881},[536,1212,1193],{"class":545},[536,1214,888],{"class":881},[536,1216,962],{"class":881},[536,1218,1219,1221,1224,1226,1228,1230,1233,1235],{"class":538,"line":943},[536,1220,1181],{"class":881},[536,1222,1223],{"class":542},"moduleResolution",[536,1225,888],{"class":881},[536,1227,950],{"class":881},[536,1229,882],{"class":881},[536,1231,1232],{"class":545},"bundler",[536,1234,888],{"class":881},[536,1236,962],{"class":881},[536,1238,1239,1241,1244,1246,1248],{"class":538,"line":965},[536,1240,1181],{"class":881},[536,1242,1243],{"class":542},"verbatimModuleSyntax",[536,1245,888],{"class":881},[536,1247,950],{"class":881},[536,1249,1250],{"class":881}," true,\n",[536,1252,1253,1255,1258,1260,1262],{"class":538,"line":987},[536,1254,1181],{"class":881},[536,1256,1257],{"class":542},"strict",[536,1259,888],{"class":881},[536,1261,950],{"class":881},[536,1263,1250],{"class":881},[536,1265,1267,1269,1272,1274,1276],{"class":538,"line":1266},8,[536,1268,1181],{"class":881},[536,1270,1271],{"class":542},"noUncheckedIndexedAccess",[536,1273,888],{"class":881},[536,1275,950],{"class":881},[536,1277,1250],{"class":881},[536,1279,1281,1283,1286,1288,1290],{"class":538,"line":1280},9,[536,1282,1181],{"class":881},[536,1284,1285],{"class":542},"skipLibCheck",[536,1287,888],{"class":881},[536,1289,950],{"class":881},[536,1291,1250],{"class":881},[536,1293,1295,1297,1300,1302,1304],{"class":538,"line":1294},10,[536,1296,1181],{"class":881},[536,1298,1299],{"class":542},"noEmit",[536,1301,888],{"class":881},[536,1303,950],{"class":881},[536,1305,1250],{"class":881},[536,1307,1309,1311,1314,1316,1318,1320,1322,1325,1327,1330,1332,1335,1337,1339,1341,1344,1346],{"class":538,"line":1308},11,[536,1310,1181],{"class":881},[536,1312,1313],{"class":542},"lib",[536,1315,888],{"class":881},[536,1317,950],{"class":881},[536,1319,953],{"class":881},[536,1321,888],{"class":881},[536,1323,1324],{"class":545},"ES2022",[536,1326,888],{"class":881},[536,1328,1329],{"class":881},",",[536,1331,882],{"class":881},[536,1333,1334],{"class":545},"DOM",[536,1336,888],{"class":881},[536,1338,1329],{"class":881},[536,1340,882],{"class":881},[536,1342,1343],{"class":545},"DOM.Iterable",[536,1345,888],{"class":881},[536,1347,1348],{"class":881},"]\n",[536,1350,1352],{"class":538,"line":1351},12,[536,1353,1354],{"class":881},"  },\n",[536,1356,1358,1360,1363,1365,1367,1369,1371,1374,1376,1378,1380,1383,1385,1387,1389,1391,1393,1395,1397,1400,1402],{"class":538,"line":1357},13,[536,1359,1165],{"class":881},[536,1361,1362],{"class":1168},"include",[536,1364,888],{"class":881},[536,1366,950],{"class":881},[536,1368,953],{"class":881},[536,1370,888],{"class":881},[536,1372,1373],{"class":545},"src",[536,1375,888],{"class":881},[536,1377,1329],{"class":881},[536,1379,882],{"class":881},[536,1381,1382],{"class":545},"src\u002F.heximon\u002F**\u002F*",[536,1384,888],{"class":881},[536,1386,1329],{"class":881},[536,1388,882],{"class":881},[536,1390,862],{"class":545},[536,1392,888],{"class":881},[536,1394,1329],{"class":881},[536,1396,882],{"class":881},[536,1398,1399],{"class":545},"test",[536,1401,888],{"class":881},[536,1403,1348],{"class":881},[536,1405,1407],{"class":538,"line":1406},14,[536,1408,1409],{"class":881},"}\n",[499,1411,1412,1414,1415,1417,1418,1420,1421,1423,1424,1426,1427,1429,1430,1432,1433,1435],{},[510,1413,1243],{}," keeps type-only imports explicit, and ",[510,1416,1299],{}," is correct because the ",[510,1419,845],{},"\nplugin — not ",[510,1422,650],{}," — produces the running code. ",[510,1425,1257],{}," and ",[510,1428,1271],{}," are what let the\ncompiler trust your constructor signatures as the dependency declaration. The first compile adds the\n",[510,1431,1382],{}," include entry to your ",[510,1434,1148],{}," for you.",[1437,1438,1440,1460],"callout",{"type":1439},"info",[499,1441,1442,1448,1449,1451,1452,1455,1456,1459],{},[621,1443,1444,1447],{},[510,1445,1446],{},"import type"," is fine for an injected dependency."," Under ",[510,1450,1243],{},", your IDE may auto-import a\nconstructor-injected class as ",[510,1453,1454],{},"import type { UsersRepository }",". That's harmless: the compiler reads class\n",[1142,1457,1458],{},"identity"," from your source, so it resolves a type-only import exactly like a value import — there is no runtime\ncontainer, and the generated wiring imports the class itself.",[499,1461,1462,1463,1466,1467,1470,1471,1474,1475,1106],{},"You only need a ",[1142,1464,1465],{},"value"," import where the class also appears in a value position: listed in a module's\n",[510,1468,1469],{},"providers",", or named in a ",[510,1472,1473],{},"useFactory","\u002F",[510,1476,1477],{},"useValue",[503,1479,1481],{"id":1480},"add-the-scripts","Add the scripts",[499,1483,1484,1487,1488,1492,1493,1496],{},[510,1485,1486],{},"vp"," is the ",[606,1489,809],{"href":1490,"rel":1491},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fvite-plus",[645]," task runner — no global install needed.\nMark the package as ESM with ",[510,1494,1495],{},"\"type\": \"module\""," and wire up dev, check, build, and test.",[526,1498,1501],{"className":1152,"code":1499,"filename":1500,"language":1154,"meta":532,"style":532},"{\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vp dev\",\n    \"build\": \"vp build\",\n    \"check\": \"vp check\",\n    \"test\": \"vitest --run\"\n  }\n}\n","package.json",[510,1502,1503,1507,1526,1539,1558,1576,1596,1614,1619],{"__ignoreMap":532},[536,1504,1505],{"class":538,"line":539},[536,1506,940],{"class":881},[536,1508,1509,1511,1514,1516,1518,1520,1522,1524],{"class":538,"line":708},[536,1510,1165],{"class":881},[536,1512,1513],{"class":1168},"type",[536,1515,888],{"class":881},[536,1517,950],{"class":881},[536,1519,882],{"class":881},[536,1521,1204],{"class":545},[536,1523,888],{"class":881},[536,1525,962],{"class":881},[536,1527,1528,1530,1533,1535,1537],{"class":538,"line":918},[536,1529,1165],{"class":881},[536,1531,1532],{"class":1168},"scripts",[536,1534,888],{"class":881},[536,1536,950],{"class":881},[536,1538,1176],{"class":881},[536,1540,1541,1543,1546,1548,1550,1552,1554,1556],{"class":538,"line":925},[536,1542,1181],{"class":881},[536,1544,1545],{"class":542},"dev",[536,1547,888],{"class":881},[536,1549,950],{"class":881},[536,1551,882],{"class":881},[536,1553,1116],{"class":545},[536,1555,888],{"class":881},[536,1557,962],{"class":881},[536,1559,1560,1562,1564,1566,1568,1570,1572,1574],{"class":538,"line":943},[536,1561,1181],{"class":881},[536,1563,684],{"class":542},[536,1565,888],{"class":881},[536,1567,950],{"class":881},[536,1569,882],{"class":881},[536,1571,1119],{"class":545},[536,1573,888],{"class":881},[536,1575,962],{"class":881},[536,1577,1578,1580,1583,1585,1587,1589,1592,1594],{"class":538,"line":965},[536,1579,1181],{"class":881},[536,1581,1582],{"class":542},"check",[536,1584,888],{"class":881},[536,1586,950],{"class":881},[536,1588,882],{"class":881},[536,1590,1591],{"class":545},"vp check",[536,1593,888],{"class":881},[536,1595,962],{"class":881},[536,1597,1598,1600,1602,1604,1606,1608,1611],{"class":538,"line":987},[536,1599,1181],{"class":881},[536,1601,1399],{"class":542},[536,1603,888],{"class":881},[536,1605,950],{"class":881},[536,1607,882],{"class":881},[536,1609,1610],{"class":545},"vitest --run",[536,1612,1613],{"class":881},"\"\n",[536,1615,1616],{"class":538,"line":1266},[536,1617,1618],{"class":881},"  }\n",[536,1620,1621],{"class":538,"line":1280},[536,1622,1409],{"class":881},[615,1624,1625,1637,1647],{},[618,1626,1627,1629,1630,1632,1633,1636],{},[510,1628,1116],{}," — compile ",[510,1631,849],{}," and serve the generated ",[510,1634,1635],{},"fetch"," app, recompiling on every source change",[618,1638,1639,1641,1642,1644,1645,993],{},[510,1640,1591],{}," — formatting, lint, and a full TypeScript type-check in one pass (via ",[510,1643,639],{},", the TypeScript\nGo toolchain — never ",[510,1646,650],{},[618,1648,1649,1651,1652,1655,1656,1659,1660,1663],{},[510,1650,1119],{}," — emit a standalone production server into ",[510,1653,1654],{},"dist\u002Fserver.js"," (runs on Node, Bun, or Deno);\npublishing a ",[1142,1657,1658],{},"library"," package uses ",[510,1661,1662],{},"vp pack"," instead",[499,1665,1666,1667,1669],{},"That's the whole setup. ",[510,1668,520],{}," will compile and serve your app — the moment you add a module and a\ncontroller, an HTTP route answers on port 3000.",[503,1671,1673],{"id":1672},"already-running-nitro-or-nuxt","Already running Nitro or Nuxt?",[499,1675,1676],{},"Heximon bolts onto a host you already have instead of owning its own server.",[499,1678,1679,1680,1682,1683,1686,1687,1689],{},"For a ",[621,1681,332],{}," app, list the bare ",[510,1684,1685],{},"heximonNitroModule"," — no function call, no inline options; the same\n",[510,1688,516],{}," file carries the plugin list:",[526,1691,1694],{"className":860,"code":1692,"filename":1693,"language":863,"meta":532,"style":532},"import { defineNitroConfig } from \"nitro\u002Fconfig\";\nimport { heximonNitroModule } from \"@heximon\u002Fnitro\u002Fmodule\";\n\nexport default defineNitroConfig({\n  compatibilityDate: \"2025-07-04\",\n  serverDir: \"server\",\n  modules: [heximonNitroModule],\n});\n","nitro.config.ts",[510,1695,1696,1718,1740,1744,1756,1772,1788,1800],{"__ignoreMap":532},[536,1697,1698,1700,1702,1705,1707,1709,1711,1714,1716],{"class":538,"line":539},[536,1699,871],{"class":870},[536,1701,898],{"class":881},[536,1703,1704],{"class":874}," defineNitroConfig",[536,1706,904],{"class":881},[536,1708,907],{"class":870},[536,1710,882],{"class":881},[536,1712,1713],{"class":545},"nitro\u002Fconfig",[536,1715,888],{"class":881},[536,1717,891],{"class":881},[536,1719,1720,1722,1724,1727,1729,1731,1733,1736,1738],{"class":538,"line":708},[536,1721,871],{"class":870},[536,1723,898],{"class":881},[536,1725,1726],{"class":874}," heximonNitroModule",[536,1728,904],{"class":881},[536,1730,907],{"class":870},[536,1732,882],{"class":881},[536,1734,1735],{"class":545},"@heximon\u002Fnitro\u002Fmodule",[536,1737,888],{"class":881},[536,1739,891],{"class":881},[536,1741,1742],{"class":538,"line":918},[536,1743,922],{"emptyLinePlaceholder":921},[536,1745,1746,1748,1750,1752,1754],{"class":538,"line":925},[536,1747,928],{"class":870},[536,1749,931],{"class":870},[536,1751,1704],{"class":934},[536,1753,937],{"class":874},[536,1755,940],{"class":881},[536,1757,1758,1761,1763,1765,1768,1770],{"class":538,"line":943},[536,1759,1760],{"class":946},"  compatibilityDate",[536,1762,950],{"class":881},[536,1764,882],{"class":881},[536,1766,1767],{"class":545},"2025-07-04",[536,1769,888],{"class":881},[536,1771,962],{"class":881},[536,1773,1774,1777,1779,1781,1784,1786],{"class":538,"line":965},[536,1775,1776],{"class":946},"  serverDir",[536,1778,950],{"class":881},[536,1780,882],{"class":881},[536,1782,1783],{"class":545},"server",[536,1785,888],{"class":881},[536,1787,962],{"class":881},[536,1789,1790,1793,1795,1798],{"class":538,"line":987},[536,1791,1792],{"class":946},"  modules",[536,1794,950],{"class":881},[536,1796,1797],{"class":874}," [heximonNitroModule]",[536,1799,962],{"class":881},[536,1801,1802,1804,1806],{"class":538,"line":1266},[536,1803,990],{"class":881},[536,1805,993],{"class":874},[536,1807,891],{"class":881},[499,1809,1679,1810,1812],{},[621,1811,337],{}," app, add the module string — that's the whole Nuxt-side setup:",[526,1814,1817],{"className":860,"code":1815,"filename":1816,"language":863,"meta":532,"style":532},"export default defineNuxtConfig({\n  compatibilityDate: \"2025-07-04\",\n  srcDir: \"app\",\n  modules: [\"@heximon\u002Fnuxt\"],\n});\n","nuxt.config.ts",[510,1818,1819,1832,1846,1862,1882],{"__ignoreMap":532},[536,1820,1821,1823,1825,1828,1830],{"class":538,"line":539},[536,1822,928],{"class":870},[536,1824,931],{"class":870},[536,1826,1827],{"class":934}," defineNuxtConfig",[536,1829,937],{"class":874},[536,1831,940],{"class":881},[536,1833,1834,1836,1838,1840,1842,1844],{"class":538,"line":708},[536,1835,1760],{"class":946},[536,1837,950],{"class":881},[536,1839,882],{"class":881},[536,1841,1767],{"class":545},[536,1843,888],{"class":881},[536,1845,962],{"class":881},[536,1847,1848,1851,1853,1855,1858,1860],{"class":538,"line":918},[536,1849,1850],{"class":946},"  srcDir",[536,1852,950],{"class":881},[536,1854,882],{"class":881},[536,1856,1857],{"class":545},"app",[536,1859,888],{"class":881},[536,1861,962],{"class":881},[536,1863,1864,1866,1868,1870,1872,1875,1877,1880],{"class":538,"line":925},[536,1865,1792],{"class":946},[536,1867,950],{"class":881},[536,1869,953],{"class":874},[536,1871,888],{"class":881},[536,1873,1874],{"class":545},"@heximon\u002Fnuxt",[536,1876,888],{"class":881},[536,1878,1879],{"class":874},"]",[536,1881,962],{"class":881},[536,1883,1884,1886,1888],{"class":538,"line":943},[536,1885,990],{"class":881},[536,1887,993],{"class":874},[536,1889,891],{"class":881},[499,1891,1892,1893,1896,1897,1899,1900,662,1902,1904],{},"Either way your Heximon modules and controllers live under the host's ",[510,1894,1895],{},"server\u002F"," dir, and the same\n",[510,1898,516],{}," file drives the compile. See ",[606,1901,332],{"href":333},[606,1903,337],{"href":338}," for the full setup, including how each host derives your deploy platform from\nits own preset.",[503,1906,1908],{"id":1907},"next-steps","Next steps",[615,1910,1911,1916,1921,1926],{},[618,1912,1913,1915],{},[606,1914,21],{"href":22}," — write your first provider, controller, and module, then\ncurl a live route.",[618,1917,1918,1920],{},[606,1919,26],{"href":27}," — how modules, providers, and the compiled DI graph fit\ntogether.",[618,1922,1923,1925],{},[606,1924,131],{"href":132}," — the directory layout that scales to a real app.",[618,1927,1928,1935],{},[606,1929,1932],{"href":1930,"rel":1931},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fladder\u002FL01-minimal",[645],[621,1933,1934],{},"Example L01 — Minimal application"," —\nthe complete app this setup serves, with two GET routes and a module-level middleware.",[1937,1938,1939],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":532,"searchDepth":708,"depth":708,"links":1941},[1942,1943,1944,1945,1946,1947,1948,1949],{"id":505,"depth":708,"text":506},{"id":612,"depth":708,"text":613},{"id":669,"depth":708,"text":670},{"id":838,"depth":708,"text":839},{"id":1136,"depth":708,"text":1137},{"id":1480,"depth":708,"text":1481},{"id":1672,"depth":708,"text":1673},{"id":1907,"depth":708,"text":1908},"Install @heximon\u002Fruntime, @heximon\u002Fhttp, and @heximon\u002Fbuild; register the heximon() Vite plugin and the HttpPlugin in heximon.config.ts; set strict ESM tsconfig options; and add the vp dev, check, and pack scripts.","md",null,{},{"icon":19},{"title":16,"description":1950},"zuBDftQ8sOT-XvMFyUdU-nXpxQ292e_Ppmubg7ulR64",[1958,1960],{"title":11,"path":12,"stem":13,"description":1959,"icon":14,"children":-1},"A TypeScript backend framework for APIs, SaaS backends, and internal services — plain classes wired at build time, no decorators, no runtime container.",{"title":21,"path":22,"stem":23,"description":1961,"icon":24,"children":-1},"Build your first Heximon app in three files — a provider, a controller, and a module, wired by the compiler and served by Vite.",1783300761903]