[{"data":1,"prerenderedAt":2985},["ShallowReactive",2],{"navigation":3,"docs-path-index":200,"blog-page":261,"blogs":272},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,161,182],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,101,116,127,142],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"icon":52,"defaultOpen":52,"path":103,"stem":104,"children":105,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[106,109,113],{"title":66,"path":107,"stem":108},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":110,"path":111,"stem":112},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":114,"stem":115},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":117,"icon":52,"defaultOpen":52,"path":118,"stem":119,"children":120,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[121,124],{"title":66,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":125,"stem":126},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":128,"icon":52,"defaultOpen":52,"path":129,"stem":130,"children":131,"page":52},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[132,135,138],{"title":66,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":70,"path":136,"stem":137},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":139,"path":140,"stem":141},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":143,"icon":52,"defaultOpen":52,"path":144,"stem":145,"children":146,"page":52},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[147,150,153,157],{"title":66,"path":148,"stem":149},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":102,"path":151,"stem":152},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":154,"path":155,"stem":156},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":158,"path":159,"stem":160},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":162,"icon":163,"path":164,"stem":165,"children":166,"page":52},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[167,170,174,178],{"title":66,"path":168,"stem":169},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":171,"path":172,"stem":173},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":175,"path":176,"stem":177},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":179,"path":180,"stem":181},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":183,"icon":184,"path":185,"stem":186,"children":187,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[188,192,196],{"title":189,"path":190,"stem":191},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":193,"path":194,"stem":195},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":197,"path":198,"stem":199},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",[201,203,205,206,207,208,210,211,212,213,214,215,217,219,220,221,222,224,225,226,227,229,230,232,233,234,235,237,238,239,241,242,243,244,246,247,248,249,250,252,253,254,255,256,258,259,260],{"path":202},"\u002Fdocs\u002F.navigation",{"path":204},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":209},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":216},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":218},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":223},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":228},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":231},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":107},{"path":111},{"path":114},{"path":236},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":122},{"path":125},{"path":240},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":133},{"path":136},{"path":140},{"path":245},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":148},{"path":151},{"path":155},{"path":159},{"path":251},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":168},{"path":172},{"path":176},{"path":180},{"path":257},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":190},{"path":194},{"path":198},{"id":262,"title":263,"body":264,"description":265,"extension":266,"meta":267,"navigation":56,"path":268,"seo":269,"stem":270,"__hash__":271},"pages\u002Fblog.yml","Blog",null,"Updates, technical insights, and stories from building Vercube.","yml",{},"\u002Fblog",{"title":263,"description":265},"blog","yLM9HlWG7wYMMO6rdEOOOYTl4S_0xyDJFA2A5-y0JNs",[273],{"id":274,"title":275,"author":276,"body":282,"category":2976,"date":2977,"description":2978,"extension":2979,"image":264,"meta":2980,"minRead":1138,"navigation":56,"path":2981,"seo":2982,"shortImage":264,"stem":2983,"__hash__":2984},"blog\u002Fblog\u002F1.announcing-1.0.md","Announcing Vercube 1.0",{"name":277,"avatar":278,"to":281,"twitter":277},"OskarLebuda",{"src":279,"alt":280},"https:\u002F\u002Fgithub.com\u002FOskarLebuda.png","Oskar Lebuda","https:\u002F\u002Fx.com\u002FOskarLebuda",{"type":283,"value":284,"toc":2959},"minimark",[285,294,299,306,333,337,344,360,364,375,378,685,699,703,715,719,749,754,772,801,808,811,842,1177,1185,1189,1225,1588,1595,1598,1625,1808,1814,1821,1866,1869,1909,1920,2459,2492,2505,2509,2536,2566,2588,2853,2865,2869,2893,2900,2904,2920,2939,2942,2949,2955],[286,287,288,289,293],"p",{},"Today I can finally say it out loud: ",[290,291,292],"strong",{},"Vercube 1.0 is here",". For me, that is a huge weight off my shoulders - and the start of a new chapter for a project that has been with me almost every day for the past year and change.",[295,296,298],"h2",{"id":297},"more-than-a-year-in-open-source","More than a year in open source",[286,300,301,302,305],{},"Vercube has been open source for over a year. Throughout that time, I tried to hold it to a few clear principles: a coherent direction, sensible APIs, and code that is actually maintainable. The project has been kept up to date, but it has also steadily grown with ",[290,303,304],{},"new packages"," - on purpose, not by accident.",[286,307,308,309,312,313,320,321,326,327,332],{},"I will not pretend otherwise: in the beginning, ",[290,310,311],{},"I worked on it mostly alone",". I wanted to prove to myself that I could build it from scratch and that it had a place in the Node.js and TypeScript ecosystem - alongside names like ",[314,315,319],"a",{"href":316,"rel":317},"https:\u002F\u002Fnestjs.com",[318],"nofollow","NestJS",", ",[314,322,325],{"href":323,"rel":324},"https:\u002F\u002Fgithub.com\u002Ftypestack\u002Frouting-controllers",[318],"routing-controllers",", and ",[314,328,331],{"href":329,"rel":330},"https:\u002F\u002Ftsed.dev\u002F",[318],"Ts.ED",". Mature frameworks were always the natural benchmark: they set the bar for quality and expectations.",[295,334,336],{"id":335},"days-full-of-doubt","Days full of doubt",[286,338,339,340,343],{},"The hardest part was always the same: ",[290,341,342],{},"I had no idea whether anyone was actually using it",". The code lived on GitHub, the docs kept growing, and I was still left asking, “Does this even reach anyone?”",[286,345,346,347,351,352,355,356,359],{},"I started posting short updates on ",[314,348,350],{"href":281,"rel":349},[318],"X"," - reach was modest, as it often is at the start. Month after month, more ",[290,353,354],{},"GitHub stars"," showed up. These are not headline-grabbing numbers, and I know that - but ",[290,357,358],{},"each new star was real motivation to keep going"," and to keep polishing what I ship.",[295,361,363],{"id":362},"benchmarks-that-speak-for-themselves","Benchmarks that speak for themselves",[286,365,366,367,374],{},"Along the way, a separate, fully open project appeared: ",[290,368,369],{},[314,370,373],{"href":371,"rel":372},"https:\u002F\u002Fgithub.com\u002Fvercube\u002Fbenchmarks",[318],"vercube\u002Fbenchmarks",". The goal was comparisons that are repeatable, fair, and easy to verify - the same endpoints, comparable configuration, and metrics you can inspect.",[286,376,377],{},"Results from the latest published run (January 2026; see the repository README for the exact environment):",[379,380,381,515,601],"tabs",{},[382,383,386],"tabs-item",{"icon":384,"label":385},"i-lucide-activity","Load test",[387,388,389,411],"table",{},[390,391,392],"thead",{},[393,394,395,399,402,405,408],"tr",{},[396,397,398],"th",{},"Framework",[396,400,401],{},"Requests\u002Fs",[396,403,404],{},"p95 latency",[396,406,407],{},"vs best RPS",[396,409,410],{},"vs best p95",[412,413,414,437,455,476,496],"tbody",{},[393,415,416,426,429,432,435],{},[417,418,419],"td",{},[314,420,423],{"href":421,"rel":422},"https:\u002F\u002Fvercube.dev",[318],[290,424,425],{},"Vercube",[417,427,428],{},"95,588",[417,430,431],{},"19 ms",[417,433,434],{},"-",[417,436,434],{},[393,438,439,444,447,449,452],{},[417,440,441],{},[314,442,319],{"href":316,"rel":443},[318],[417,445,446],{},"82,705",[417,448,431],{},[417,450,451],{},"−16%",[417,453,454],{},"+0%",[393,456,457,464,467,470,473],{},[417,458,459],{},[314,460,463],{"href":461,"rel":462},"https:\u002F\u002Frikta.dev\u002F",[318],"Rikta",[417,465,466],{},"81,156",[417,468,469],{},"23 ms",[417,471,472],{},"−18%",[417,474,475],{},"+21%",[393,477,478,484,487,490,493],{},[417,479,480],{},[314,481,483],{"href":323,"rel":482},[318],"Routing Controllers",[417,485,486],{},"78,195",[417,488,489],{},"20 ms",[417,491,492],{},"−22%",[417,494,495],{},"+5%",[393,497,498,503,506,509,512],{},[417,499,500],{},[314,501,331],{"href":329,"rel":502},[318],[417,504,505],{},"32,156",[417,507,508],{},"56 ms",[417,510,511],{},"−197%",[417,513,514],{},"+195%",[382,516,519],{"icon":517,"label":518},"i-lucide-power","Cold start",[387,520,521,533],{},[390,522,523],{},[393,524,525,527,530],{},[396,526,398],{},[396,528,529],{},"Mean",[396,531,532],{},"vs best",[412,534,535,549,562,575,588],{},[393,536,537,544,547],{},[417,538,539],{},[314,540,542],{"href":421,"rel":541},[318],[290,543,425],{},[417,545,546],{},"280 ms",[417,548,434],{},[393,550,551,556,559],{},[417,552,553],{},[314,554,463],{"href":461,"rel":555},[318],[417,557,558],{},"326 ms",[417,560,561],{},"+16%",[393,563,564,569,572],{},[417,565,566],{},[314,567,483],{"href":323,"rel":568},[318],[417,570,571],{},"329 ms",[417,573,574],{},"+18%",[393,576,577,582,585],{},[417,578,579],{},[314,580,319],{"href":316,"rel":581},[318],[417,583,584],{},"377 ms",[417,586,587],{},"+35%",[393,589,590,595,598],{},[417,591,592],{},[314,593,331],{"href":329,"rel":594},[318],[417,596,597],{},"946 ms",[417,599,600],{},"+238%",[382,602,605],{"icon":603,"label":604},"i-lucide-package","Build time",[387,606,607,617],{},[390,608,609],{},[393,610,611,613,615],{},[396,612,398],{},[396,614,529],{},[396,616,532],{},[412,618,619,633,646,659,672],{},[393,620,621,628,631],{},[417,622,623],{},[314,624,626],{"href":421,"rel":625},[318],[290,627,425],{},[417,629,630],{},"0.28 s",[417,632,434],{},[393,634,635,640,643],{},[417,636,637],{},[314,638,483],{"href":323,"rel":639},[318],[417,641,642],{},"0.42 s",[417,644,645],{},"+49%",[393,647,648,653,656],{},[417,649,650],{},[314,651,331],{"href":329,"rel":652},[318],[417,654,655],{},"0.46 s",[417,657,658],{},"+62%",[393,660,661,666,669],{},[417,662,663],{},[314,664,463],{"href":461,"rel":665},[318],[417,667,668],{},"0.97 s",[417,670,671],{},"+244%",[393,673,674,679,682],{},[417,675,676],{},[314,677,319],{"href":316,"rel":678},[318],[417,680,681],{},"1.30 s",[417,683,684],{},"+358%",[286,686,687,688,691,692,695,696,698],{},"This is not a promise that your app will always be faster - real numbers depend on your code, your infrastructure, and what you measure. In ",[290,689,690],{},"this"," benchmark suite, though, ",[290,693,694],{},"the gaps are clear",", and they illustrate the cost of the framework layer. Clone the repo, run the scenarios on your machine, and read the methodology with a critical eye. In the load-test table, ",[290,697,407],{}," is relative to the fastest framework (a negative value means lower throughput than Vercube).",[295,700,702],{"id":701},"what-10-means","What 1.0 means",[286,704,705,708,709,714],{},[290,706,707],{},"1.0"," is the first stable release: the APIs and packages shipped here are what I intend to support going forward, and breaking changes will follow ",[314,710,713],{"href":711,"rel":712},"https:\u002F\u002Fsemver.org\u002F",[318],"semver",". Thank you to everyone who ran the betas and sent feedback - it shaped what shipped today. I still want to hear from you: in issues, in discussions, and about what you run in production.",[295,716,718],{"id":717},"what-is-new","What is new",[286,720,721,722,725,726,728,729,732,733,736,737,740,741,744,745,748],{},"There is a lot in this release. Below is a focused slice: ",[290,723,724],{},"performance first",", then ",[290,727,143],{},", the new ",[290,730,731],{},"CLI"," model, the new ",[290,734,735],{},"plugin"," system, ",[290,738,739],{},"OpenAPI docs with Scalar",", logging rebuilt on ",[290,742,743],{},"evlog",", and a ",[290,746,747],{},"leaner set of published packages",".",[750,751,753],"h3",{"id":752},"performance","Performance",[286,755,756,757,759,760,763,764,767,768,771],{},"Request handling in ",[290,758,707],{}," is ",[290,761,762],{},"about 15% faster"," end-to-end than the last pre-1.0 line, measured on ",[290,765,766],{},"24 internal fetch micro-benchmarks"," (ops\u002Fs, identical harness), with ",[290,769,770],{},"no regressions"," in that set.",[773,774,775,782],"ul",{},[776,777,778,781],"li",{},[290,779,780],{},"~15.5%"," higher throughput in aggregate (total 1.0 ops\u002Fs vs the previous line - hot paths weigh more).",[776,783,784,785,788,789,792,793,796,797,800],{},"Most scenarios land in the ",[290,786,787],{},"low teens","; a few ",[290,790,791],{},"query\u002Fparam-heavy"," cases peak near ",[290,794,795],{},"+25%","; a handful are ",[290,798,799],{},"flat"," (within noise).",[286,802,803,804,807],{},"Lab numbers are not your app - but the picture here is simple: ",[290,805,806],{},"faster across the board"," in this suite.",[750,809,143],{"id":810},"nitro",[286,812,813,821,822,826,827,830,831,830,834,837,838,841],{},[314,814,817],{"href":815,"rel":816},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@vercube\u002Fnitro",[318],[818,819,820],"code",{},"@vercube\u002Fnitro"," connects Vercube’s controllers, DI, and middleware to a ",[314,823,143],{"href":824,"rel":825},"https:\u002F\u002Fnitro.build\u002F",[318]," app with almost no glue. Register the module, keep writing ",[818,828,829],{},"@Controller"," \u002F ",[818,832,833],{},"@Get",[818,835,836],{},"@Post"," as usual, and the plugin discovers handlers at build time. (You can still pass a ",[818,839,840],{},"setupFile"," if you need explicit bootstrap - it is optional.) Deeper topics (file-based routes, middleware, storage) live in the docs.",[843,844,845,948],"code-group",{},[846,847,853],"pre",{"className":848,"code":849,"filename":850,"language":851,"meta":852,"style":852},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { vercubeNitro } from '@vercube\u002Fnitro';\n\nexport default defineNitroConfig({\n  modules: [vercubeNitro()],\n});\n","nitro.config.ts","ts","",[818,854,855,890,896,915,937],{"__ignoreMap":852},[856,857,860,864,868,872,875,878,881,884,887],"span",{"class":858,"line":859},"line",1,[856,861,863],{"class":862},"s7zQu","import",[856,865,867],{"class":866},"sMK4o"," {",[856,869,871],{"class":870},"sTEyZ"," vercubeNitro",[856,873,874],{"class":866}," }",[856,876,877],{"class":862}," from",[856,879,880],{"class":866}," '",[856,882,820],{"class":883},"sfazB",[856,885,886],{"class":866},"'",[856,888,889],{"class":866},";\n",[856,891,893],{"class":858,"line":892},2,[856,894,895],{"emptyLinePlaceholder":56},"\n",[856,897,899,902,905,909,912],{"class":858,"line":898},3,[856,900,901],{"class":862},"export",[856,903,904],{"class":862}," default",[856,906,908],{"class":907},"s2Zo4"," defineNitroConfig",[856,910,911],{"class":870},"(",[856,913,914],{"class":866},"{\n",[856,916,918,922,925,928,931,934],{"class":858,"line":917},4,[856,919,921],{"class":920},"swJcz","  modules",[856,923,924],{"class":866},":",[856,926,927],{"class":870}," [",[856,929,930],{"class":907},"vercubeNitro",[856,932,933],{"class":870},"()]",[856,935,936],{"class":866},",\n",[856,938,940,943,946],{"class":858,"line":939},5,[856,941,942],{"class":866},"}",[856,944,945],{"class":870},")",[856,947,889],{"class":866},[846,949,952],{"className":848,"code":950,"filename":951,"language":851,"meta":852,"style":852},"import { Controller, Get, Post } from '@vercube\u002Fcore';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  @Get('\u002F')\n  list() {\n    return [{ id: 1, name: 'Alice' }];\n  }\n\n  @Post('\u002F')\n  create() {\n    return { id: 2, name: 'Bob' };\n  }\n}\n","UserController.ts",[818,953,954,987,991,1011,1026,1045,1056,1097,1103,1108,1126,1136,1166,1171],{"__ignoreMap":852},[856,955,956,958,960,963,966,969,971,974,976,978,980,983,985],{"class":858,"line":859},[856,957,863],{"class":862},[856,959,867],{"class":866},[856,961,962],{"class":870}," Controller",[856,964,965],{"class":866},",",[856,967,968],{"class":870}," Get",[856,970,965],{"class":866},[856,972,973],{"class":870}," Post",[856,975,874],{"class":866},[856,977,877],{"class":862},[856,979,880],{"class":866},[856,981,982],{"class":883},"@vercube\u002Fcore",[856,984,886],{"class":866},[856,986,889],{"class":866},[856,988,989],{"class":858,"line":892},[856,990,895],{"emptyLinePlaceholder":56},[856,992,993,996,999,1001,1003,1006,1008],{"class":858,"line":898},[856,994,995],{"class":866},"@",[856,997,998],{"class":907},"Controller",[856,1000,911],{"class":870},[856,1002,886],{"class":866},[856,1004,1005],{"class":883},"\u002Fusers",[856,1007,886],{"class":866},[856,1009,1010],{"class":870},")\n",[856,1012,1013,1015,1019,1023],{"class":858,"line":917},[856,1014,901],{"class":862},[856,1016,1018],{"class":1017},"spNyl"," class",[856,1020,1022],{"class":1021},"sBMFI"," UserController",[856,1024,1025],{"class":866}," {\n",[856,1027,1028,1031,1034,1036,1038,1041,1043],{"class":858,"line":939},[856,1029,1030],{"class":866},"  @",[856,1032,1033],{"class":907},"Get",[856,1035,911],{"class":870},[856,1037,886],{"class":866},[856,1039,1040],{"class":883},"\u002F",[856,1042,886],{"class":866},[856,1044,1010],{"class":870},[856,1046,1048,1051,1054],{"class":858,"line":1047},6,[856,1049,1050],{"class":920},"  list",[856,1052,1053],{"class":866},"()",[856,1055,1025],{"class":866},[856,1057,1059,1062,1064,1067,1070,1072,1076,1078,1081,1083,1085,1088,1090,1092,1095],{"class":858,"line":1058},7,[856,1060,1061],{"class":862},"    return",[856,1063,927],{"class":920},[856,1065,1066],{"class":866},"{",[856,1068,1069],{"class":920}," id",[856,1071,924],{"class":866},[856,1073,1075],{"class":1074},"sbssI"," 1",[856,1077,965],{"class":866},[856,1079,1080],{"class":920}," name",[856,1082,924],{"class":866},[856,1084,880],{"class":866},[856,1086,1087],{"class":883},"Alice",[856,1089,886],{"class":866},[856,1091,874],{"class":866},[856,1093,1094],{"class":920},"]",[856,1096,889],{"class":866},[856,1098,1100],{"class":858,"line":1099},8,[856,1101,1102],{"class":866},"  }\n",[856,1104,1106],{"class":858,"line":1105},9,[856,1107,895],{"emptyLinePlaceholder":56},[856,1109,1111,1113,1116,1118,1120,1122,1124],{"class":858,"line":1110},10,[856,1112,1030],{"class":866},[856,1114,1115],{"class":907},"Post",[856,1117,911],{"class":870},[856,1119,886],{"class":866},[856,1121,1040],{"class":883},[856,1123,886],{"class":866},[856,1125,1010],{"class":870},[856,1127,1129,1132,1134],{"class":858,"line":1128},11,[856,1130,1131],{"class":920},"  create",[856,1133,1053],{"class":866},[856,1135,1025],{"class":866},[856,1137,1139,1141,1143,1145,1147,1150,1152,1154,1156,1158,1161,1163],{"class":858,"line":1138},12,[856,1140,1061],{"class":862},[856,1142,867],{"class":866},[856,1144,1069],{"class":920},[856,1146,924],{"class":866},[856,1148,1149],{"class":1074}," 2",[856,1151,965],{"class":866},[856,1153,1080],{"class":920},[856,1155,924],{"class":866},[856,1157,880],{"class":866},[856,1159,1160],{"class":883},"Bob",[856,1162,886],{"class":866},[856,1164,1165],{"class":866}," };\n",[856,1167,1169],{"class":858,"line":1168},13,[856,1170,1102],{"class":866},[856,1172,1174],{"class":858,"line":1173},14,[856,1175,1176],{"class":866},"}\n",[286,1178,1179,1180,748],{},"Read more: ",[290,1181,1182],{},[314,1183,1184],{"href":148},"Nitro module overview",[750,1186,1188],{"id":1187},"extensible-cli","Extensible CLI",[286,1190,1191,1192,1195,1196,320,1199,320,1202,830,1205,1208,1209,1212,1213,1216,1217,1220,1221,1224],{},"The CLI is now built to be ",[290,1193,1194],{},"extended",": you define commands as classes (",[818,1197,1198],{},"BaseCommand",[818,1200,1201],{},"@Command",[818,1203,1204],{},"@Arg",[818,1206,1207],{},"@Flag","), register them in ",[818,1210,1211],{},"vercube.config.ts"," under ",[818,1214,1215],{},"cli.commands",", and run ",[818,1218,1219],{},"vercube \u003Cname>"," - arguments are parsed for you, dependencies can be injected from the CLI container, and ",[290,1222,1223],{},"no extra build step"," is required for your command files.",[843,1226,1227,1469,1566],{},[846,1228,1231],{"className":848,"code":1229,"filename":1230,"language":851,"meta":852,"style":852},"import { BaseCommand, Command, Flag } from '@vercube\u002Fcli\u002Ftoolkit';\n\n@Command({ name: 'greet', description: 'Print a greeting' })\nexport class GreetCommand extends BaseCommand {\n  @Flag({ name: 'name', description: 'Who to greet', default: 'Vercube' })\n  public name: string;\n\n  public override async run(): Promise\u003Cvoid> {\n    console.log(`Hello, ${this.name}!`);\n  }\n}\n","src\u002FCommands\u002FGreetCommand.ts",[818,1232,1233,1265,1269,1309,1325,1376,1390,1394,1424,1461,1465],{"__ignoreMap":852},[856,1234,1235,1237,1239,1242,1244,1247,1249,1252,1254,1256,1258,1261,1263],{"class":858,"line":859},[856,1236,863],{"class":862},[856,1238,867],{"class":866},[856,1240,1241],{"class":870}," BaseCommand",[856,1243,965],{"class":866},[856,1245,1246],{"class":870}," Command",[856,1248,965],{"class":866},[856,1250,1251],{"class":870}," Flag",[856,1253,874],{"class":866},[856,1255,877],{"class":862},[856,1257,880],{"class":866},[856,1259,1260],{"class":883},"@vercube\u002Fcli\u002Ftoolkit",[856,1262,886],{"class":866},[856,1264,889],{"class":866},[856,1266,1267],{"class":858,"line":892},[856,1268,895],{"emptyLinePlaceholder":56},[856,1270,1271,1273,1276,1278,1280,1282,1284,1286,1289,1291,1293,1296,1298,1300,1303,1305,1307],{"class":858,"line":898},[856,1272,995],{"class":866},[856,1274,1275],{"class":907},"Command",[856,1277,911],{"class":870},[856,1279,1066],{"class":866},[856,1281,1080],{"class":920},[856,1283,924],{"class":866},[856,1285,880],{"class":866},[856,1287,1288],{"class":883},"greet",[856,1290,886],{"class":866},[856,1292,965],{"class":866},[856,1294,1295],{"class":920}," description",[856,1297,924],{"class":866},[856,1299,880],{"class":866},[856,1301,1302],{"class":883},"Print a greeting",[856,1304,886],{"class":866},[856,1306,874],{"class":866},[856,1308,1010],{"class":870},[856,1310,1311,1313,1315,1318,1321,1323],{"class":858,"line":917},[856,1312,901],{"class":862},[856,1314,1018],{"class":1017},[856,1316,1317],{"class":1021}," GreetCommand",[856,1319,1320],{"class":1017}," extends",[856,1322,1241],{"class":1021},[856,1324,1025],{"class":866},[856,1326,1327,1329,1332,1334,1336,1338,1340,1342,1345,1347,1349,1351,1353,1355,1358,1360,1362,1364,1366,1368,1370,1372,1374],{"class":858,"line":939},[856,1328,1030],{"class":866},[856,1330,1331],{"class":907},"Flag",[856,1333,911],{"class":870},[856,1335,1066],{"class":866},[856,1337,1080],{"class":920},[856,1339,924],{"class":866},[856,1341,880],{"class":866},[856,1343,1344],{"class":883},"name",[856,1346,886],{"class":866},[856,1348,965],{"class":866},[856,1350,1295],{"class":920},[856,1352,924],{"class":866},[856,1354,880],{"class":866},[856,1356,1357],{"class":883},"Who to greet",[856,1359,886],{"class":866},[856,1361,965],{"class":866},[856,1363,904],{"class":920},[856,1365,924],{"class":866},[856,1367,880],{"class":866},[856,1369,425],{"class":883},[856,1371,886],{"class":866},[856,1373,874],{"class":866},[856,1375,1010],{"class":870},[856,1377,1378,1381,1383,1385,1388],{"class":858,"line":1047},[856,1379,1380],{"class":1017},"  public",[856,1382,1080],{"class":920},[856,1384,924],{"class":866},[856,1386,1387],{"class":1021}," string",[856,1389,889],{"class":866},[856,1391,1392],{"class":858,"line":1058},[856,1393,895],{"emptyLinePlaceholder":56},[856,1395,1396,1398,1401,1404,1407,1410,1413,1416,1419,1422],{"class":858,"line":1099},[856,1397,1380],{"class":1017},[856,1399,1400],{"class":1017}," override",[856,1402,1403],{"class":1017}," async",[856,1405,1406],{"class":920}," run",[856,1408,1409],{"class":866},"():",[856,1411,1412],{"class":1021}," Promise",[856,1414,1415],{"class":866},"\u003C",[856,1417,1418],{"class":1021},"void",[856,1420,1421],{"class":866},">",[856,1423,1025],{"class":866},[856,1425,1426,1429,1431,1434,1436,1439,1442,1445,1448,1450,1452,1455,1457,1459],{"class":858,"line":1105},[856,1427,1428],{"class":870},"    console",[856,1430,748],{"class":866},[856,1432,1433],{"class":907},"log",[856,1435,911],{"class":920},[856,1437,1438],{"class":866},"`",[856,1440,1441],{"class":883},"Hello, ",[856,1443,1444],{"class":866},"${",[856,1446,1447],{"class":866},"this.",[856,1449,1344],{"class":870},[856,1451,942],{"class":866},[856,1453,1454],{"class":883},"!",[856,1456,1438],{"class":866},[856,1458,945],{"class":920},[856,1460,889],{"class":866},[856,1462,1463],{"class":858,"line":1110},[856,1464,1102],{"class":866},[856,1466,1467],{"class":858,"line":1128},[856,1468,1176],{"class":866},[846,1470,1472],{"className":848,"code":1471,"filename":1211,"language":851,"meta":852,"style":852},"import { defineConfig } from '@vercube\u002Fcore';\nimport { GreetCommand } from '.\u002Fsrc\u002FCommands\u002FGreetCommand';\n\nexport default defineConfig({\n  cli: {\n    commands: [GreetCommand],\n  },\n});\n",[818,1473,1474,1495,1516,1520,1532,1541,1553,1558],{"__ignoreMap":852},[856,1475,1476,1478,1480,1483,1485,1487,1489,1491,1493],{"class":858,"line":859},[856,1477,863],{"class":862},[856,1479,867],{"class":866},[856,1481,1482],{"class":870}," defineConfig",[856,1484,874],{"class":866},[856,1486,877],{"class":862},[856,1488,880],{"class":866},[856,1490,982],{"class":883},[856,1492,886],{"class":866},[856,1494,889],{"class":866},[856,1496,1497,1499,1501,1503,1505,1507,1509,1512,1514],{"class":858,"line":892},[856,1498,863],{"class":862},[856,1500,867],{"class":866},[856,1502,1317],{"class":870},[856,1504,874],{"class":866},[856,1506,877],{"class":862},[856,1508,880],{"class":866},[856,1510,1511],{"class":883},".\u002Fsrc\u002FCommands\u002FGreetCommand",[856,1513,886],{"class":866},[856,1515,889],{"class":866},[856,1517,1518],{"class":858,"line":898},[856,1519,895],{"emptyLinePlaceholder":56},[856,1521,1522,1524,1526,1528,1530],{"class":858,"line":917},[856,1523,901],{"class":862},[856,1525,904],{"class":862},[856,1527,1482],{"class":907},[856,1529,911],{"class":870},[856,1531,914],{"class":866},[856,1533,1534,1537,1539],{"class":858,"line":939},[856,1535,1536],{"class":920},"  cli",[856,1538,924],{"class":866},[856,1540,1025],{"class":866},[856,1542,1543,1546,1548,1551],{"class":858,"line":1047},[856,1544,1545],{"class":920},"    commands",[856,1547,924],{"class":866},[856,1549,1550],{"class":870}," [GreetCommand]",[856,1552,936],{"class":866},[856,1554,1555],{"class":858,"line":1058},[856,1556,1557],{"class":866},"  },\n",[856,1559,1560,1562,1564],{"class":858,"line":1099},[856,1561,942],{"class":866},[856,1563,945],{"class":870},[856,1565,889],{"class":866},[846,1567,1572],{"className":1568,"code":1569,"filename":1570,"language":1571,"meta":852,"style":852},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","vercube greet --name world\n","terminal","bash",[818,1573,1574],{"__ignoreMap":852},[856,1575,1576,1579,1582,1585],{"class":858,"line":859},[856,1577,1578],{"class":1021},"vercube",[856,1580,1581],{"class":883}," greet",[856,1583,1584],{"class":883}," --name",[856,1586,1587],{"class":883}," world\n",[286,1589,1179,1590,748],{},[290,1591,1592],{},[314,1593,1594],{"href":198},"Custom CLI command",[750,1596,193],{"id":1597},"plugins",[286,1599,1600,1601,1604,1605,1608,1609,1612,1613,1616,1617,1620,1621,1624],{},"Plugins are ",[290,1602,1603],{},"one pipeline"," for modifying the merged config, binding services when the worker starts, registering CLI commands, and hooking into ",[290,1606,1607],{},"dev-only"," behavior in the parent process during ",[818,1610,1611],{},"vercube dev",". Use a class extending ",[818,1614,1615],{},"BasePlugin",", or ",[818,1618,1619],{},"defineVercubePlugin"," for small inline snippets - same hooks, Vite-style ",[818,1622,1623],{},"enforce"," ordering when you need it.",[846,1626,1628],{"className":848,"code":1627,"filename":1211,"language":851,"meta":852,"style":852},"import { defineConfig, defineVercubePlugin } from '@vercube\u002Fcore';\n\nexport default defineConfig({\n  plugins: [\n    defineVercubePlugin({\n      name: 'example',\n      config: () => ({\n        server: { port: 3000 },\n      }),\n      setup: (app) => {\n        \u002F\u002F Worker runtime: bind services, start background work, etc.\n      },\n    }),\n  ],\n});\n",[818,1629,1630,1655,1659,1671,1681,1690,1706,1724,1744,1753,1772,1778,1783,1792,1799],{"__ignoreMap":852},[856,1631,1632,1634,1636,1638,1640,1643,1645,1647,1649,1651,1653],{"class":858,"line":859},[856,1633,863],{"class":862},[856,1635,867],{"class":866},[856,1637,1482],{"class":870},[856,1639,965],{"class":866},[856,1641,1642],{"class":870}," defineVercubePlugin",[856,1644,874],{"class":866},[856,1646,877],{"class":862},[856,1648,880],{"class":866},[856,1650,982],{"class":883},[856,1652,886],{"class":866},[856,1654,889],{"class":866},[856,1656,1657],{"class":858,"line":892},[856,1658,895],{"emptyLinePlaceholder":56},[856,1660,1661,1663,1665,1667,1669],{"class":858,"line":898},[856,1662,901],{"class":862},[856,1664,904],{"class":862},[856,1666,1482],{"class":907},[856,1668,911],{"class":870},[856,1670,914],{"class":866},[856,1672,1673,1676,1678],{"class":858,"line":917},[856,1674,1675],{"class":920},"  plugins",[856,1677,924],{"class":866},[856,1679,1680],{"class":870}," [\n",[856,1682,1683,1686,1688],{"class":858,"line":939},[856,1684,1685],{"class":907},"    defineVercubePlugin",[856,1687,911],{"class":870},[856,1689,914],{"class":866},[856,1691,1692,1695,1697,1699,1702,1704],{"class":858,"line":1047},[856,1693,1694],{"class":920},"      name",[856,1696,924],{"class":866},[856,1698,880],{"class":866},[856,1700,1701],{"class":883},"example",[856,1703,886],{"class":866},[856,1705,936],{"class":866},[856,1707,1708,1711,1713,1716,1719,1722],{"class":858,"line":1058},[856,1709,1710],{"class":907},"      config",[856,1712,924],{"class":866},[856,1714,1715],{"class":866}," ()",[856,1717,1718],{"class":1017}," =>",[856,1720,1721],{"class":870}," (",[856,1723,914],{"class":866},[856,1725,1726,1729,1731,1733,1736,1738,1741],{"class":858,"line":1099},[856,1727,1728],{"class":920},"        server",[856,1730,924],{"class":866},[856,1732,867],{"class":866},[856,1734,1735],{"class":920}," port",[856,1737,924],{"class":866},[856,1739,1740],{"class":1074}," 3000",[856,1742,1743],{"class":866}," },\n",[856,1745,1746,1749,1751],{"class":858,"line":1105},[856,1747,1748],{"class":866},"      }",[856,1750,945],{"class":870},[856,1752,936],{"class":866},[856,1754,1755,1758,1760,1762,1766,1768,1770],{"class":858,"line":1110},[856,1756,1757],{"class":907},"      setup",[856,1759,924],{"class":866},[856,1761,1721],{"class":866},[856,1763,1765],{"class":1764},"sHdIc","app",[856,1767,945],{"class":866},[856,1769,1718],{"class":1017},[856,1771,1025],{"class":866},[856,1773,1774],{"class":858,"line":1128},[856,1775,1777],{"class":1776},"sHwdD","        \u002F\u002F Worker runtime: bind services, start background work, etc.\n",[856,1779,1780],{"class":858,"line":1138},[856,1781,1782],{"class":866},"      },\n",[856,1784,1785,1788,1790],{"class":858,"line":1168},[856,1786,1787],{"class":866},"    }",[856,1789,945],{"class":870},[856,1791,936],{"class":866},[856,1793,1794,1797],{"class":858,"line":1173},[856,1795,1796],{"class":870},"  ]",[856,1798,936],{"class":866},[856,1800,1802,1804,1806],{"class":858,"line":1801},15,[856,1803,942],{"class":866},[856,1805,945],{"class":870},[856,1807,889],{"class":866},[286,1809,1179,1810,748],{},[290,1811,1812],{},[314,1813,193],{"href":194},[750,1815,1817,1818,945],{"id":1816},"openapi-and-scalar-vercubeschema","OpenAPI and Scalar (",[818,1819,1820],{},"@vercube\u002Fschema",[286,1822,1823,1824,1832,1833,1836,1837,1840,1841,1844,1845,1850,1851,1212,1855,1859,1860,1865],{},"API documentation should not be a second codebase. ",[290,1825,1826],{},[314,1827,1830],{"href":1828,"rel":1829},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@vercube\u002Fschema",[318],[818,1831,1820],{}," generates ",[290,1834,1835],{},"OpenAPI 3"," from the same Zod schemas you already use for validation on ",[818,1838,1839],{},"@Body"," and ",[818,1842,1843],{},"@QueryParams",". Register ",[290,1846,1847],{},[818,1848,1849],{},"SchemaPlugin"," in ",[290,1852,1853],{},[818,1854,1211],{},[290,1856,1857],{},[818,1858,1597],{},", annotate routes with ",[290,1861,1862],{},[818,1863,1864],{},"@Schema",", and you get a live spec plus an interactive UI - no Swagger setup, no duplicate DTO layers.",[286,1867,1868],{},"Out of the box:",[387,1870,1871,1881],{},[390,1872,1873],{},[393,1874,1875,1878],{},[396,1876,1877],{},"Endpoint",[396,1879,1880],{},"What you get",[412,1882,1883,1893],{},[393,1884,1885,1890],{},[417,1886,1887],{},[818,1888,1889],{},"GET \u002F_schema\u002F",[417,1891,1892],{},"OpenAPI JSON",[393,1894,1895,1900],{},[417,1896,1897],{},[818,1898,1899],{},"GET \u002F_schema\u002Fdocs",[417,1901,1902,1908],{},[290,1903,1904],{},[314,1905,139],{"href":1906,"rel":1907},"https:\u002F\u002Fgithub.com\u002Fscalar\u002Fscalar",[318]," API Reference (HTML)",[286,1910,1911,1912,1915,1916,1919],{},"Scalar is enabled by default once the plugin is registered. It loads your spec from ",[818,1913,1914],{},"\u002F_schema\u002F"," and gives you try-it-out requests, models, and themes - the same experience teams reach for via ",[818,1917,1918],{},"@scalar\u002Fexpress-api-reference",", but wired natively for Vercube’s router.",[843,1921,1922,2003,2440],{},[846,1923,1925],{"className":848,"code":1924,"filename":1211,"language":851,"meta":852,"style":852},"import { defineConfig } from '@vercube\u002Fcore';\nimport { SchemaPlugin } from '@vercube\u002Fschema';\n\nexport default defineConfig({\n  plugins: [SchemaPlugin],\n});\n",[818,1926,1927,1947,1968,1972,1984,1995],{"__ignoreMap":852},[856,1928,1929,1931,1933,1935,1937,1939,1941,1943,1945],{"class":858,"line":859},[856,1930,863],{"class":862},[856,1932,867],{"class":866},[856,1934,1482],{"class":870},[856,1936,874],{"class":866},[856,1938,877],{"class":862},[856,1940,880],{"class":866},[856,1942,982],{"class":883},[856,1944,886],{"class":866},[856,1946,889],{"class":866},[856,1948,1949,1951,1953,1956,1958,1960,1962,1964,1966],{"class":858,"line":892},[856,1950,863],{"class":862},[856,1952,867],{"class":866},[856,1954,1955],{"class":870}," SchemaPlugin",[856,1957,874],{"class":866},[856,1959,877],{"class":862},[856,1961,880],{"class":866},[856,1963,1820],{"class":883},[856,1965,886],{"class":866},[856,1967,889],{"class":866},[856,1969,1970],{"class":858,"line":898},[856,1971,895],{"emptyLinePlaceholder":56},[856,1973,1974,1976,1978,1980,1982],{"class":858,"line":917},[856,1975,901],{"class":862},[856,1977,904],{"class":862},[856,1979,1482],{"class":907},[856,1981,911],{"class":870},[856,1983,914],{"class":866},[856,1985,1986,1988,1990,1993],{"class":858,"line":939},[856,1987,1675],{"class":920},[856,1989,924],{"class":866},[856,1991,1992],{"class":870}," [SchemaPlugin]",[856,1994,936],{"class":866},[856,1996,1997,1999,2001],{"class":858,"line":1047},[856,1998,942],{"class":866},[856,2000,945],{"class":870},[856,2002,889],{"class":866},[846,2004,2006],{"className":848,"code":2005,"filename":951,"language":851,"meta":852,"style":852},"import { Body, Controller, Post } from '@vercube\u002Fcore';\nimport { Schema, z } from '@vercube\u002Fschema';\n\nconst CreateUserSchema = z.object({\n  name: z.string(),\n  email: z.string().email(),\n});\n\n@Controller('\u002Fusers')\nexport class UserController {\n  @Post('\u002F')\n  @Schema({\n    summary: 'Create user',\n    responses: {\n      201: {\n        description: 'Created',\n        content: {\n          'application\u002Fjson': {\n            schema: z.object({ id: z.string(), name: z.string() }),\n          },\n        },\n      },\n    },\n  })\n  create(@Body({ validationSchema: CreateUserSchema }) body: z.infer\u003Ctypeof CreateUserSchema>) {\n    return { id: '1', ...body };\n  }\n}\n",[818,2007,2008,2037,2063,2067,2089,2107,2131,2139,2143,2159,2169,2185,2195,2211,2220,2229,2246,2256,2271,2322,2328,2334,2339,2345,2353,2403,2430,2435],{"__ignoreMap":852},[856,2009,2010,2012,2014,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035],{"class":858,"line":859},[856,2011,863],{"class":862},[856,2013,867],{"class":866},[856,2015,2016],{"class":870}," Body",[856,2018,965],{"class":866},[856,2020,962],{"class":870},[856,2022,965],{"class":866},[856,2024,973],{"class":870},[856,2026,874],{"class":866},[856,2028,877],{"class":862},[856,2030,880],{"class":866},[856,2032,982],{"class":883},[856,2034,886],{"class":866},[856,2036,889],{"class":866},[856,2038,2039,2041,2043,2046,2048,2051,2053,2055,2057,2059,2061],{"class":858,"line":892},[856,2040,863],{"class":862},[856,2042,867],{"class":866},[856,2044,2045],{"class":870}," Schema",[856,2047,965],{"class":866},[856,2049,2050],{"class":870}," z",[856,2052,874],{"class":866},[856,2054,877],{"class":862},[856,2056,880],{"class":866},[856,2058,1820],{"class":883},[856,2060,886],{"class":866},[856,2062,889],{"class":866},[856,2064,2065],{"class":858,"line":898},[856,2066,895],{"emptyLinePlaceholder":56},[856,2068,2069,2072,2075,2078,2080,2082,2085,2087],{"class":858,"line":917},[856,2070,2071],{"class":1017},"const",[856,2073,2074],{"class":870}," CreateUserSchema ",[856,2076,2077],{"class":866},"=",[856,2079,2050],{"class":870},[856,2081,748],{"class":866},[856,2083,2084],{"class":907},"object",[856,2086,911],{"class":870},[856,2088,914],{"class":866},[856,2090,2091,2094,2096,2098,2100,2103,2105],{"class":858,"line":939},[856,2092,2093],{"class":920},"  name",[856,2095,924],{"class":866},[856,2097,2050],{"class":870},[856,2099,748],{"class":866},[856,2101,2102],{"class":907},"string",[856,2104,1053],{"class":870},[856,2106,936],{"class":866},[856,2108,2109,2112,2114,2116,2118,2120,2122,2124,2127,2129],{"class":858,"line":1047},[856,2110,2111],{"class":920},"  email",[856,2113,924],{"class":866},[856,2115,2050],{"class":870},[856,2117,748],{"class":866},[856,2119,2102],{"class":907},[856,2121,1053],{"class":870},[856,2123,748],{"class":866},[856,2125,2126],{"class":907},"email",[856,2128,1053],{"class":870},[856,2130,936],{"class":866},[856,2132,2133,2135,2137],{"class":858,"line":1058},[856,2134,942],{"class":866},[856,2136,945],{"class":870},[856,2138,889],{"class":866},[856,2140,2141],{"class":858,"line":1099},[856,2142,895],{"emptyLinePlaceholder":56},[856,2144,2145,2147,2149,2151,2153,2155,2157],{"class":858,"line":1105},[856,2146,995],{"class":866},[856,2148,998],{"class":907},[856,2150,911],{"class":870},[856,2152,886],{"class":866},[856,2154,1005],{"class":883},[856,2156,886],{"class":866},[856,2158,1010],{"class":870},[856,2160,2161,2163,2165,2167],{"class":858,"line":1110},[856,2162,901],{"class":862},[856,2164,1018],{"class":1017},[856,2166,1022],{"class":1021},[856,2168,1025],{"class":866},[856,2170,2171,2173,2175,2177,2179,2181,2183],{"class":858,"line":1128},[856,2172,1030],{"class":866},[856,2174,1115],{"class":907},[856,2176,911],{"class":870},[856,2178,886],{"class":866},[856,2180,1040],{"class":883},[856,2182,886],{"class":866},[856,2184,1010],{"class":870},[856,2186,2187,2189,2191,2193],{"class":858,"line":1138},[856,2188,1030],{"class":866},[856,2190,128],{"class":907},[856,2192,911],{"class":870},[856,2194,914],{"class":866},[856,2196,2197,2200,2202,2204,2207,2209],{"class":858,"line":1168},[856,2198,2199],{"class":920},"    summary",[856,2201,924],{"class":866},[856,2203,880],{"class":866},[856,2205,2206],{"class":883},"Create user",[856,2208,886],{"class":866},[856,2210,936],{"class":866},[856,2212,2213,2216,2218],{"class":858,"line":1173},[856,2214,2215],{"class":920},"    responses",[856,2217,924],{"class":866},[856,2219,1025],{"class":866},[856,2221,2222,2225,2227],{"class":858,"line":1801},[856,2223,2224],{"class":1074},"      201",[856,2226,924],{"class":866},[856,2228,1025],{"class":866},[856,2230,2232,2235,2237,2239,2242,2244],{"class":858,"line":2231},16,[856,2233,2234],{"class":920},"        description",[856,2236,924],{"class":866},[856,2238,880],{"class":866},[856,2240,2241],{"class":883},"Created",[856,2243,886],{"class":866},[856,2245,936],{"class":866},[856,2247,2249,2252,2254],{"class":858,"line":2248},17,[856,2250,2251],{"class":920},"        content",[856,2253,924],{"class":866},[856,2255,1025],{"class":866},[856,2257,2259,2262,2265,2267,2269],{"class":858,"line":2258},18,[856,2260,2261],{"class":866},"          '",[856,2263,2264],{"class":920},"application\u002Fjson",[856,2266,886],{"class":866},[856,2268,924],{"class":866},[856,2270,1025],{"class":866},[856,2272,2274,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2316,2318,2320],{"class":858,"line":2273},19,[856,2275,2276],{"class":920},"            schema",[856,2278,924],{"class":866},[856,2280,2050],{"class":870},[856,2282,748],{"class":866},[856,2284,2084],{"class":907},[856,2286,911],{"class":870},[856,2288,1066],{"class":866},[856,2290,1069],{"class":920},[856,2292,924],{"class":866},[856,2294,2050],{"class":870},[856,2296,748],{"class":866},[856,2298,2102],{"class":907},[856,2300,1053],{"class":870},[856,2302,965],{"class":866},[856,2304,1080],{"class":920},[856,2306,924],{"class":866},[856,2308,2050],{"class":870},[856,2310,748],{"class":866},[856,2312,2102],{"class":907},[856,2314,2315],{"class":870},"() ",[856,2317,942],{"class":866},[856,2319,945],{"class":870},[856,2321,936],{"class":866},[856,2323,2325],{"class":858,"line":2324},20,[856,2326,2327],{"class":866},"          },\n",[856,2329,2331],{"class":858,"line":2330},21,[856,2332,2333],{"class":866},"        },\n",[856,2335,2337],{"class":858,"line":2336},22,[856,2338,1782],{"class":866},[856,2340,2342],{"class":858,"line":2341},23,[856,2343,2344],{"class":866},"    },\n",[856,2346,2348,2351],{"class":858,"line":2347},24,[856,2349,2350],{"class":866},"  }",[856,2352,1010],{"class":870},[856,2354,2356,2358,2361,2364,2366,2368,2371,2373,2375,2377,2380,2383,2385,2387,2389,2392,2395,2398,2401],{"class":858,"line":2355},25,[856,2357,1131],{"class":920},[856,2359,2360],{"class":866},"(@",[856,2362,2363],{"class":907},"Body",[856,2365,911],{"class":870},[856,2367,1066],{"class":866},[856,2369,2370],{"class":920}," validationSchema",[856,2372,924],{"class":866},[856,2374,2074],{"class":870},[856,2376,942],{"class":866},[856,2378,2379],{"class":870},") ",[856,2381,2382],{"class":1764},"body",[856,2384,924],{"class":866},[856,2386,2050],{"class":1021},[856,2388,748],{"class":866},[856,2390,2391],{"class":1021},"infer",[856,2393,2394],{"class":866},"\u003Ctypeof",[856,2396,2397],{"class":870}," CreateUserSchema",[856,2399,2400],{"class":866},">)",[856,2402,1025],{"class":866},[856,2404,2406,2408,2410,2412,2414,2416,2419,2421,2423,2426,2428],{"class":858,"line":2405},26,[856,2407,1061],{"class":862},[856,2409,867],{"class":866},[856,2411,1069],{"class":920},[856,2413,924],{"class":866},[856,2415,880],{"class":866},[856,2417,2418],{"class":883},"1",[856,2420,886],{"class":866},[856,2422,965],{"class":866},[856,2424,2425],{"class":866}," ...",[856,2427,2382],{"class":870},[856,2429,1165],{"class":866},[856,2431,2433],{"class":858,"line":2432},27,[856,2434,1102],{"class":866},[856,2436,2438],{"class":858,"line":2437},28,[856,2439,1176],{"class":866},[846,2441,2444],{"className":1568,"code":2442,"filename":2443,"language":1571,"meta":852,"style":852},"# With the dev server running:\nopen http:\u002F\u002Flocalhost:3000\u002F_schema\u002Fdocs\n","browser",[818,2445,2446,2451],{"__ignoreMap":852},[856,2447,2448],{"class":858,"line":859},[856,2449,2450],{"class":1776},"# With the dev server running:\n",[856,2452,2453,2456],{"class":858,"line":892},[856,2454,2455],{"class":1021},"open",[856,2457,2458],{"class":883}," http:\u002F\u002Flocalhost:3000\u002F_schema\u002Fdocs\n",[286,2460,2461,2462,2467,2468,2475,2476,2479,2480,2483,2484,1850,2487,2491],{},"The package re-exports ",[290,2463,2464],{},[818,2465,2466],{},"z"," with ",[314,2469,2472],{"href":2470,"rel":2471},"https:\u002F\u002Fgithub.com\u002Fasteasolutions\u002Fzod-to-openapi",[318],[818,2473,2474],{},"zod-to-openapi"," helpers (",[818,2477,2478],{},".openapi()"," for examples and named components). Request body and query shapes from ",[818,2481,2482],{},"validationSchema"," are merged into the spec for you. Disable the UI with ",[818,2485,2486],{},"withPluginOptions(SchemaPlugin, { scalar: false })",[290,2488,2489],{},[818,2490,1597],{}," if you only want the JSON endpoint.",[286,2493,1179,2494,2499,2500,748],{},[290,2495,2496],{},[314,2497,2498],{"href":133},"Schema module overview"," · ",[290,2501,2502],{},[314,2503,2504],{"href":140},"Scalar integration",[750,2506,2508],{"id":2507},"logging-on-evlog","Logging on evlog",[286,2510,2511,2517,2518,2521,2522,2529,2530,2535],{},[290,2512,2513],{},[314,2514,743],{"href":2515,"rel":2516},"https:\u002F\u002Fwww.evlog.dev",[318]," is now Vercube’s ",[290,2519,2520],{},"built-in, default logger"," - not an optional add-on you wire up later. ",[314,2523,2526],{"href":2524,"rel":2525},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@vercube\u002Flogger",[318],[818,2527,2528],{},"@vercube\u002Flogger"," stays the package you import in app code; under the hood it delegates to evlog, and ",[290,2531,2532],{},[818,2533,2534],{},"@Inject(Logger)"," works the same way it did before.",[286,2537,2538,2539,2544,2545,2548,2549,2552,2553,2556,2557,2561,2562,2565],{},"For a long time the framework maintained its own logging layer: pluggable providers, custom drivers, formatting rules living entirely inside the monorepo. That was enough to ship, but every improvement - another observability backend, smarter request tracing, production-grade sampling - meant more surface area for Vercube to own while you waited on framework releases. ",[290,2540,2541],{},[314,2542,743],{"href":2515,"rel":2543},[318]," is a different bet: a focused TypeScript logger that has already grown deep roots. It gives you simple structured logs (a drop-in for ",[818,2546,2547],{},"console.log",", pino, or consola), ",[290,2550,2551],{},"wide events"," that accumulate context and emit once per operation, ",[290,2554,2555],{},"structured errors"," that explain ",[2558,2559,2560],"em",{},"why"," something failed and how to fix it, and a single ",[290,2563,2564],{},"drain pipeline"," (pretty output in dev, JSON in production, redaction, tail sampling, adapters for the backends people actually use). It ships integrations for Nitro, Hono, Nest, and the other stacks many of you run next to Vercube.",[286,2567,2568,2569,2572,2573,2576,2577,2579,2580,2583,2584,2587],{},"The switch to evlog keeps Vercube lean on observability while you get tooling that keeps maturing on its own schedule. Request logging is on by default: each HTTP call produces ",[290,2570,2571],{},"one wide event"," with method, path, status, and duration (disable with ",[818,2574,2575],{},"requestLogging: false"," in config). When you need more, evlog’s primitives are re-exported from ",[818,2578,2528],{}," - including ",[818,2581,2582],{},"createError"," for actionable errors and ",[818,2585,2586],{},"@vercube\u002Flogger\u002Ftoolkit"," for advanced request-scoped logging.",[843,2589,2590,2771],{},[846,2591,2594],{"className":848,"code":2592,"filename":2593,"language":851,"meta":852,"style":852},"import { Inject } from '@vercube\u002Fdi';\nimport { Logger } from '@vercube\u002Flogger';\n\nexport class UserService {\n  @Inject(Logger)\n  private logger!: Logger;\n\n  async createUser(data: CreateUserDto) {\n    this.logger.info('user.create', 'Creating user', { email: data.email });\n    \u002F\u002F ...\n  }\n}\n","UserService.ts",[818,2595,2596,2618,2639,2643,2654,2664,2679,2683,2705,2758,2763,2767],{"__ignoreMap":852},[856,2597,2598,2600,2602,2605,2607,2609,2611,2614,2616],{"class":858,"line":859},[856,2599,863],{"class":862},[856,2601,867],{"class":866},[856,2603,2604],{"class":870}," Inject",[856,2606,874],{"class":866},[856,2608,877],{"class":862},[856,2610,880],{"class":866},[856,2612,2613],{"class":883},"@vercube\u002Fdi",[856,2615,886],{"class":866},[856,2617,889],{"class":866},[856,2619,2620,2622,2624,2627,2629,2631,2633,2635,2637],{"class":858,"line":892},[856,2621,863],{"class":862},[856,2623,867],{"class":866},[856,2625,2626],{"class":870}," Logger",[856,2628,874],{"class":866},[856,2630,877],{"class":862},[856,2632,880],{"class":866},[856,2634,2528],{"class":883},[856,2636,886],{"class":866},[856,2638,889],{"class":866},[856,2640,2641],{"class":858,"line":898},[856,2642,895],{"emptyLinePlaceholder":56},[856,2644,2645,2647,2649,2652],{"class":858,"line":917},[856,2646,901],{"class":862},[856,2648,1018],{"class":1017},[856,2650,2651],{"class":1021}," UserService",[856,2653,1025],{"class":866},[856,2655,2656,2658,2661],{"class":858,"line":939},[856,2657,1030],{"class":866},[856,2659,2660],{"class":907},"Inject",[856,2662,2663],{"class":870},"(Logger)\n",[856,2665,2666,2669,2672,2675,2677],{"class":858,"line":1047},[856,2667,2668],{"class":1017},"  private",[856,2670,2671],{"class":920}," logger",[856,2673,2674],{"class":866},"!:",[856,2676,2626],{"class":1021},[856,2678,889],{"class":866},[856,2680,2681],{"class":858,"line":1058},[856,2682,895],{"emptyLinePlaceholder":56},[856,2684,2685,2688,2691,2693,2696,2698,2701,2703],{"class":858,"line":1099},[856,2686,2687],{"class":1017},"  async",[856,2689,2690],{"class":920}," createUser",[856,2692,911],{"class":866},[856,2694,2695],{"class":1764},"data",[856,2697,924],{"class":866},[856,2699,2700],{"class":1021}," CreateUserDto",[856,2702,945],{"class":866},[856,2704,1025],{"class":866},[856,2706,2707,2710,2713,2715,2718,2720,2722,2725,2727,2729,2731,2734,2736,2738,2740,2743,2745,2748,2750,2752,2754,2756],{"class":858,"line":1105},[856,2708,2709],{"class":866},"    this.",[856,2711,2712],{"class":870},"logger",[856,2714,748],{"class":866},[856,2716,2717],{"class":907},"info",[856,2719,911],{"class":920},[856,2721,886],{"class":866},[856,2723,2724],{"class":883},"user.create",[856,2726,886],{"class":866},[856,2728,965],{"class":866},[856,2730,880],{"class":866},[856,2732,2733],{"class":883},"Creating user",[856,2735,886],{"class":866},[856,2737,965],{"class":866},[856,2739,867],{"class":866},[856,2741,2742],{"class":920}," email",[856,2744,924],{"class":866},[856,2746,2747],{"class":870}," data",[856,2749,748],{"class":866},[856,2751,2126],{"class":870},[856,2753,874],{"class":866},[856,2755,945],{"class":920},[856,2757,889],{"class":866},[856,2759,2760],{"class":858,"line":1110},[856,2761,2762],{"class":1776},"    \u002F\u002F ...\n",[856,2764,2765],{"class":858,"line":1128},[856,2766,1102],{"class":866},[856,2768,2769],{"class":858,"line":1138},[856,2770,1176],{"class":866},[846,2772,2774],{"className":848,"code":2773,"filename":1211,"language":851,"meta":852,"style":852},"import { defineConfig } from '@vercube\u002Fcore';\n\nexport default defineConfig({\n  logLevel: 'info',\n  \u002F\u002F one structured wide event per request (EvlogMiddleware); default: true\n  requestLogging: true,\n});\n",[818,2775,2776,2796,2800,2812,2827,2832,2845],{"__ignoreMap":852},[856,2777,2778,2780,2782,2784,2786,2788,2790,2792,2794],{"class":858,"line":859},[856,2779,863],{"class":862},[856,2781,867],{"class":866},[856,2783,1482],{"class":870},[856,2785,874],{"class":866},[856,2787,877],{"class":862},[856,2789,880],{"class":866},[856,2791,982],{"class":883},[856,2793,886],{"class":866},[856,2795,889],{"class":866},[856,2797,2798],{"class":858,"line":892},[856,2799,895],{"emptyLinePlaceholder":56},[856,2801,2802,2804,2806,2808,2810],{"class":858,"line":898},[856,2803,901],{"class":862},[856,2805,904],{"class":862},[856,2807,1482],{"class":907},[856,2809,911],{"class":870},[856,2811,914],{"class":866},[856,2813,2814,2817,2819,2821,2823,2825],{"class":858,"line":917},[856,2815,2816],{"class":920},"  logLevel",[856,2818,924],{"class":866},[856,2820,880],{"class":866},[856,2822,2717],{"class":883},[856,2824,886],{"class":866},[856,2826,936],{"class":866},[856,2828,2829],{"class":858,"line":939},[856,2830,2831],{"class":1776},"  \u002F\u002F one structured wide event per request (EvlogMiddleware); default: true\n",[856,2833,2834,2837,2839,2843],{"class":858,"line":1047},[856,2835,2836],{"class":920},"  requestLogging",[856,2838,924],{"class":866},[856,2840,2842],{"class":2841},"sfNiH"," true",[856,2844,936],{"class":866},[856,2846,2847,2849,2851],{"class":858,"line":1058},[856,2848,942],{"class":866},[856,2850,945],{"class":870},[856,2852,889],{"class":866},[286,2854,1179,2855,2499,2860,748],{},[290,2856,2857],{},[314,2858,2859],{"href":83},"Logger module overview",[290,2861,2862],{},[314,2863,743],{"href":2515,"rel":2864},[318],[750,2866,2868],{"id":2867},"fewer-packages-to-maintain","Fewer packages to maintain",[286,2870,2871,2873,2874,2877,2878,1840,2885,2892],{},[290,2872,707],{}," also ",[290,2875,2876],{},"drops packages that were not part of the real stack",". ",[314,2879,2882],{"href":2880,"rel":2881},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@vercube\u002Fh3",[318],[818,2883,2884],{},"@vercube\u002Fh3",[314,2886,2889],{"href":2887,"rel":2888},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@vercube\u002Fmcp",[318],[818,2890,2891],{},"@vercube\u002Fmcp"," were published early on, but nothing in the framework or the examples depended on them anymore - only docs and release plumbing kept them alive. Keeping unused packages around means version bumps, changelogs, and confusion for anyone browsing npm.",[286,2894,2895,2896,2899],{},"They are ",[290,2897,2898],{},"removed from the monorepo"," in this release. If you never imported them, nothing changes. If you did, migrate to the core HTTP layer (Vercube’s own router and middleware) or wire MCP through a solution you already run in production - the framework no longer ships a dedicated wrapper for either.",[295,2901,2903],{"id":2902},"try-it","Try it",[846,2905,2907],{"className":1568,"code":2906,"language":1571,"meta":852,"style":852},"pnpm create vercube@beta\n",[818,2908,2909],{"__ignoreMap":852},[856,2910,2911,2914,2917],{"class":858,"line":859},[856,2912,2913],{"class":1021},"pnpm",[856,2915,2916],{"class":883}," create",[856,2918,2919],{"class":883}," vercube@beta\n",[286,2921,2922,2923,1840,2927,2932,2933,2938],{},"For a fuller picture of changes, migrations, and docs, see the ",[314,2924,2926],{"href":421,"rel":2925},[318],"project site",[314,2928,2931],{"href":2929,"rel":2930},"https:\u002F\u002Fgithub.com\u002Fvercube\u002Fvercube",[318],"repository"," - and the ",[314,2934,2937],{"href":2935,"rel":2936},"https:\u002F\u002Fvercube.dev\u002Fchangelog",[318],"changelog"," for what ships after 1.0.",[2940,2941],"hr",{},[286,2943,2944,2945,2948],{},"Thank you to everyone who starred the repo, left a comment, filed a bug, or simply ",[290,2946,2947],{},"tried Vercube in their own code",". You are why this moment matters at all.",[286,2950,2951,2952],{},"Questions or ideas? Open an issue on GitHub, join the Discord, or reach out on X. ",[290,2953,2954],{},"I am glad I get to announce this today.",[2956,2957,2958],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":852,"searchDepth":859,"depth":892,"links":2960},[2961,2962,2963,2964,2965,2975],{"id":297,"depth":892,"text":298},{"id":335,"depth":892,"text":336},{"id":362,"depth":892,"text":363},{"id":701,"depth":892,"text":702},{"id":717,"depth":892,"text":718,"children":2966},[2967,2968,2969,2970,2971,2973,2974],{"id":752,"depth":898,"text":753},{"id":810,"depth":898,"text":143},{"id":1187,"depth":898,"text":1188},{"id":1597,"depth":898,"text":193},{"id":1816,"depth":898,"text":2972},"OpenAPI and Scalar (@vercube\u002Fschema)",{"id":2507,"depth":898,"text":2508},{"id":2867,"depth":898,"text":2868},{"id":2902,"depth":892,"text":2903},"Release","2026-06-12","Over a year in open source, a growing community, and public benchmarks - Vercube 1.0 is here.","md",{},"\u002Fblog\u002Fannouncing-1.0",{"title":275,"description":2978},"blog\u002F1.announcing-1.0","gvUaAEUnGJJLJOUz5F8FlZ8XSToy_hhuDl_jXlVCz4I",1781248036340]