[{"data":1,"prerenderedAt":821},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Froadmap\u002Fmid-term":176,"\u002Fdocs\u002Froadmap\u002Fmid-term-surround":816},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":169,"body":178,"description":811,"extension":812,"meta":813,"navigation":673,"path":170,"seo":814,"status":11,"stem":171,"__hash__":815},"docs\u002F1.docs\u002F4.roadmap\u002F3.mid-term.md",{"type":179,"value":180,"toc":802},"minimark",[181,192,197,201,204,224,247,254,262,264,271,276,417,426,440,442,460,497,610,623,730,748,753,757,777,781,798],[182,183,184,185,188,189,191],"p",{},"By this point the ",[186,187,96],"code",{}," packages have been promoted to ",[186,190,103],{}," and the obvious gaps from short-term are filled. Mid-term is a focused list - three pillars - chosen because each unblocks a class of production apps that today need workarounds: realtime, observability, and read-heavy caching.",[193,194,196],"h2",{"id":195},"websocket-support","WebSocket support",[198,199],"badge",{"label":200},"planned",[182,202,203],{},"First-class WebSocket support that composes with existing decorators and DI. Two integration paths reflect the existing HTTP adapter split:",[205,206,207,218],"ul",{},[208,209,210,213,214,217],"li",{},[186,211,212],{},"@miiajs\u002Fnode-server"," exposes WebSocket via ",[186,215,216],{},"ws"," package",[208,219,220,223],{},[186,221,222],{},"@miiajs\u002Fuws-server"," uses uWebSockets.js' native WebSocket upgrade (significantly faster)",[182,225,226,227,230,231,234,235,238,239,242,243,246],{},"API in ",[186,228,229],{},"@miiajs\u002Fcore"," stays adapter-agnostic - decorators like ",[186,232,233],{},"@WebSocket('\u002Fchat')"," and ",[186,236,237],{},"@OnMessage('event-name')",", with the same ",[186,240,241],{},"@UseGuard","\u002F",[186,244,245],{},"@Use"," middleware composition as HTTP routes.",[182,248,249,253],{},[250,251,252],"strong",{},"Why mid-term:"," WebSocket is a Web Standard, fits the framework's architecture, but needs careful design around connection lifecycle, broadcasting, and how the two adapters expose roughly the same primitives without leaking adapter-specific APIs.",[193,255,257,258,261],{"id":256},"opentelemetry-integration-miiajsotel","OpenTelemetry integration (",[186,259,260],{},"@miiajs\u002Fotel",")",[198,263],{"label":200},[182,265,266,267,270],{},"Auto-instrument HTTP requests, DI providers, transport publish\u002Fdispatch, and database calls. Picks up the W3C trace context already plumbed through ",[186,268,269],{},"MessageEnvelope.meta.traceparent",".",[182,272,273],{},[250,274,275],{},"Module shape:",[277,278,283],"pre",{"className":279,"code":280,"language":281,"meta":282,"style":282},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","OtelModule.configure({\n  serviceName: 'orders-svc',\n  exporter: 'otlp',  \u002F\u002F or 'console' for dev\n  \u002F\u002F automatically instrument:\n  instrumentations: ['http', 'messaging', 'drizzle', 'mongoose'],\n})\n","ts","",[186,284,285,307,330,352,358,408],{"__ignoreMap":282},[286,287,290,294,297,301,304],"span",{"class":288,"line":289},"line",1,[286,291,293],{"class":292},"sTEyZ","OtelModule",[286,295,270],{"class":296},"sMK4o",[286,298,300],{"class":299},"s2Zo4","configure",[286,302,303],{"class":292},"(",[286,305,306],{"class":296},"{\n",[286,308,310,314,317,320,324,327],{"class":288,"line":309},2,[286,311,313],{"class":312},"swJcz","  serviceName",[286,315,316],{"class":296},":",[286,318,319],{"class":296}," '",[286,321,323],{"class":322},"sfazB","orders-svc",[286,325,326],{"class":296},"'",[286,328,329],{"class":296},",\n",[286,331,333,336,338,340,343,345,348],{"class":288,"line":332},3,[286,334,335],{"class":312},"  exporter",[286,337,316],{"class":296},[286,339,319],{"class":296},[286,341,342],{"class":322},"otlp",[286,344,326],{"class":296},[286,346,347],{"class":296},",",[286,349,351],{"class":350},"sHwdD","  \u002F\u002F or 'console' for dev\n",[286,353,355],{"class":288,"line":354},4,[286,356,357],{"class":350},"  \u002F\u002F automatically instrument:\n",[286,359,361,364,366,369,371,374,376,378,380,383,385,387,389,392,394,396,398,401,403,406],{"class":288,"line":360},5,[286,362,363],{"class":312},"  instrumentations",[286,365,316],{"class":296},[286,367,368],{"class":292}," [",[286,370,326],{"class":296},[286,372,373],{"class":322},"http",[286,375,326],{"class":296},[286,377,347],{"class":296},[286,379,319],{"class":296},[286,381,382],{"class":322},"messaging",[286,384,326],{"class":296},[286,386,347],{"class":296},[286,388,319],{"class":296},[286,390,391],{"class":322},"drizzle",[286,393,326],{"class":296},[286,395,347],{"class":296},[286,397,319],{"class":296},[286,399,400],{"class":322},"mongoose",[286,402,326],{"class":296},[286,404,405],{"class":292},"]",[286,407,329],{"class":296},[286,409,411,414],{"class":288,"line":410},6,[286,412,413],{"class":296},"}",[286,415,416],{"class":292},")\n",[182,418,419,421,422,425],{},[250,420,252],{}," distributed tracing is a non-negotiable for multi-service production. The ",[186,423,424],{},"traceparent"," field is already there - this package wires it to spans on both ends.",[193,427,429,430,433,434,433,437,261],{"id":428},"cache-abstraction-miiajscache-miiajscache-redis-miiajscache-unstorage","Cache abstraction (",[186,431,432],{},"@miiajs\u002Fcache"," + ",[186,435,436],{},"@miiajs\u002Fcache-redis",[186,438,439],{},"@miiajs\u002Fcache-unstorage",[198,441],{"label":200},[182,443,444,447,448,451,452,455,456,459],{},[186,445,446],{},"CacheStore"," interface mirroring ",[186,449,450],{},"IdempotencyStore"," shape: ",[186,453,454],{},"get\u002Fset\u002Fdelete\u002Fhas"," with optional TTL. Decorator ",[186,457,458],{},"@Cache({ ttl, key? })"," for memoizing handler results. Three packages ship together:",[205,461,462,469,479],{},[208,463,464,468],{},[250,465,466],{},[186,467,432],{}," - core: interface, decorator, middleware, in-memory store (the dev default).",[208,470,471,475,476,478],{},[250,472,473],{},[186,474,436],{}," - ioredis-backed ",[186,477,446],{}," for typical Node\u002FBun\u002FDeno deployments.",[208,480,481,485,486,493,494,496],{},[250,482,483],{},[186,484,439],{}," - thin adapter (~30 lines) that wraps any ",[487,488,492],"a",{"href":489,"rel":490},"https:\u002F\u002Funstorage.unjs.io\u002F",[491],"nofollow","unstorage"," driver as a ",[186,495,446],{},". The escape hatch for serverless\u002Fedge: Cloudflare KV, Vercel KV, Netlify Blob, S3, and ~30 more drivers come for free.",[277,498,500],{"className":279,"code":499,"language":281,"meta":282,"style":282},"@Get('\u002Fuser\u002F:id')\n@Cache({ ttl: 60, key: (ctx) => `user:${ctx.params.id}` })\nasync getUser(ctx) { ... }\n",[186,501,502,521,591],{"__ignoreMap":282},[286,503,504,507,510,512,514,517,519],{"class":288,"line":289},[286,505,506],{"class":296},"@",[286,508,509],{"class":299},"Get",[286,511,303],{"class":292},[286,513,326],{"class":296},[286,515,516],{"class":322},"\u002Fuser\u002F:id",[286,518,326],{"class":296},[286,520,416],{"class":292},[286,522,523,525,528,530,533,536,538,542,544,547,549,552,556,558,562,565,568,571,573,575,578,580,583,586,589],{"class":288,"line":309},[286,524,506],{"class":296},[286,526,527],{"class":299},"Cache",[286,529,303],{"class":292},[286,531,532],{"class":296},"{",[286,534,535],{"class":312}," ttl",[286,537,316],{"class":296},[286,539,541],{"class":540},"sbssI"," 60",[286,543,347],{"class":296},[286,545,546],{"class":299}," key",[286,548,316],{"class":296},[286,550,551],{"class":296}," (",[286,553,555],{"class":554},"sHdIc","ctx",[286,557,261],{"class":296},[286,559,561],{"class":560},"spNyl"," =>",[286,563,564],{"class":296}," `",[286,566,567],{"class":322},"user:",[286,569,570],{"class":296},"${",[286,572,555],{"class":292},[286,574,270],{"class":296},[286,576,577],{"class":292},"params",[286,579,270],{"class":296},[286,581,582],{"class":292},"id",[286,584,585],{"class":296},"}`",[286,587,588],{"class":296}," }",[286,590,416],{"class":292},[286,592,593,596,599,602,604,607],{"class":288,"line":332},[286,594,595],{"class":292},"async ",[286,597,598],{"class":299},"getUser",[286,600,601],{"class":292},"(ctx) ",[286,603,532],{"class":296},[286,605,606],{"class":296}," ...",[286,608,609],{"class":296}," }\n",[182,611,612,615,616,619,620,622],{},[250,613,614],{},"Serverless story."," ",[186,617,618],{},"app.fetch"," already runs MiiaJS on Cloudflare Workers, Vercel Edge, Netlify, and AWS Lambda. Forcing Redis on an edge runtime burns money on outbound network and adds latency. The unstorage adapter plugs the runtime's native KV directly into our ",[186,621,446],{}," interface:",[277,624,626],{"className":279,"code":625,"language":281,"meta":282,"style":282},"import cloudflareKV from 'unstorage\u002Fdrivers\u002Fcloudflare-kv-binding'\nimport { unstorageStore } from '@miiajs\u002Fcache-unstorage'\n\nCacheModule.configure({\n  store: unstorageStore(cloudflareKV({ binding: env.MY_KV }))\n})\n",[186,627,628,648,669,675,688,724],{"__ignoreMap":282},[286,629,630,634,637,640,642,645],{"class":288,"line":289},[286,631,633],{"class":632},"s7zQu","import",[286,635,636],{"class":292}," cloudflareKV ",[286,638,639],{"class":632},"from",[286,641,319],{"class":296},[286,643,644],{"class":322},"unstorage\u002Fdrivers\u002Fcloudflare-kv-binding",[286,646,647],{"class":296},"'\n",[286,649,650,652,655,658,660,663,665,667],{"class":288,"line":309},[286,651,633],{"class":632},[286,653,654],{"class":296}," {",[286,656,657],{"class":292}," unstorageStore",[286,659,588],{"class":296},[286,661,662],{"class":632}," from",[286,664,319],{"class":296},[286,666,439],{"class":322},[286,668,647],{"class":296},[286,670,671],{"class":288,"line":332},[286,672,674],{"emptyLinePlaceholder":673},true,"\n",[286,676,677,680,682,684,686],{"class":288,"line":354},[286,678,679],{"class":292},"CacheModule",[286,681,270],{"class":296},[286,683,300],{"class":299},[286,685,303],{"class":292},[286,687,306],{"class":296},[286,689,690,693,695,697,699,702,704,706,709,711,714,716,719,721],{"class":288,"line":360},[286,691,692],{"class":312},"  store",[286,694,316],{"class":296},[286,696,657],{"class":299},[286,698,303],{"class":292},[286,700,701],{"class":299},"cloudflareKV",[286,703,303],{"class":292},[286,705,532],{"class":296},[286,707,708],{"class":312}," binding",[286,710,316],{"class":296},[286,712,713],{"class":292}," env",[286,715,270],{"class":296},[286,717,718],{"class":292},"MY_KV ",[286,720,413],{"class":296},[286,722,723],{"class":292},"))\n",[286,725,726,728],{"class":288,"line":410},[286,727,413],{"class":296},[286,729,416],{"class":292},[182,731,732,733,735,736,739,740,743,744,747],{},"Because ",[186,734,446],{}," is our interface, not unstorage's, native first-party drivers can land later (",[186,737,738],{},"@miiajs\u002Fcache-cloudflare",", ",[186,741,742],{},"@miiajs\u002Fcache-vercel-kv",") without breaking users. They swap the ",[186,745,746],{},"store"," instance, nothing else changes.",[182,749,750,752],{},[250,751,252],{}," caching is the second most-requested cross-cutting concern after auth. Reusing the transport-store separation pattern from messaging keeps it consistent across the framework.",[193,754,756],{"id":755},"examples-expansion","Examples expansion",[205,758,759,765,771],{},[208,760,761,764],{},[186,762,763],{},"examples\u002Frealtime-chat"," - WebSocket end-to-end with rooms, presence.",[208,766,767,770],{},[186,768,769],{},"examples\u002Fobservability"," - OpenTelemetry + structured logging + metrics endpoint.",[208,772,773,776],{},[186,774,775],{},"examples\u002Fcached-api"," - cache decorator + Redis adapter + invalidation patterns.",[193,778,780],{"id":779},"out-of-scope-deferred-to-long-term","Out of scope (deferred to long-term)",[205,782,783,786,789,792,795],{},[208,784,785],{},"NATS transport",[208,787,788],{},"GraphQL",[208,790,791],{},"Request-Reply for messaging",[208,793,794],{},"Type-safe RPC client generation",[208,796,797],{},"Job scheduling",[799,800,801],"style",{},"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":282,"searchDepth":309,"depth":309,"links":803},[804,805,807,809,810],{"id":195,"depth":309,"text":196},{"id":256,"depth":309,"text":806},"OpenTelemetry integration (@miiajs\u002Fotel)",{"id":428,"depth":309,"text":808},"Cache abstraction (@miiajs\u002Fcache + @miiajs\u002Fcache-redis + @miiajs\u002Fcache-unstorage)",{"id":755,"depth":309,"text":756},{"id":779,"depth":309,"text":780},"Production essentials - features that unblock real-world deployments at scale.","md",{},{"title":169,"description":811},"wB3ngpto4-VQ59LNc_VsjfT9iN1aQv3foLzZUeqFsE4",[817,819],{"title":165,"path":166,"stem":167,"description":818,"children":-1},"Hardening and gap-fills - what gets attention next.",{"title":173,"path":174,"stem":175,"description":820,"children":-1},"Ecosystem expansion - new transports, integrations, and patterns that broaden where MiiaJS fits.",1778575275505]