[{"data":1,"prerenderedAt":1598},["ShallowReactive",2],{"navigation_docs":3,"-reference-releases":93,"-reference-releases-surround":1593},[4,71],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":70},"Guide","i-lucide-book-open","\u002Fguide","1.guide",[10,14,18,22,26,30,34,38,42,46,50,54,58,62,66],{"title":11,"path":12,"stem":13},"Getting started","\u002Fguide\u002Fgetting-started","1.guide\u002F01.getting-started",{"title":15,"path":16,"stem":17},"Adoption paths","\u002Fguide\u002Fadoption","1.guide\u002F02.adoption",{"title":19,"path":20,"stem":21},"Routes and typed $fetch","\u002Fguide\u002Froutes","1.guide\u002F02.routes",{"title":23,"path":24,"stem":25},"Kyo handlers","\u002Fguide\u002Fkyo","1.guide\u002F03.kyo",{"title":27,"path":28,"stem":29},"ZIO handlers","\u002Fguide\u002Fzio","1.guide\u002F04.zio",{"title":31,"path":32,"stem":33},"Configuration and secrets","\u002Fguide\u002Fconfiguration","1.guide\u002F05.configuration",{"title":35,"path":36,"stem":37},"Application and request lifetimes","\u002Fguide\u002Flifetimes","1.guide\u002F06.lifetimes",{"title":39,"path":40,"stem":41},"Schemas","\u002Fguide\u002Fschema","1.guide\u002F07.schema",{"title":43,"path":44,"stem":45},"PostgreSQL","\u002Fguide\u002Fdatabase","1.guide\u002F08.database",{"title":47,"path":48,"stem":49},"Streaming and cancellation","\u002Fguide\u002Fstreaming","1.guide\u002F09.streaming",{"title":51,"path":52,"stem":53},"Testing","\u002Fguide\u002Ftesting","1.guide\u002F10.testing",{"title":55,"path":56,"stem":57},"Nitro storage and NuxtHub KV","\u002Fguide\u002Fstorage","1.guide\u002F11.storage",{"title":59,"path":60,"stem":61},"Debug Scala handlers","\u002Fguide\u002Fdebugging","1.guide\u002F12.debugging",{"title":63,"path":64,"stem":65},"npm build tooling","\u002Fguide\u002Fnpm-tooling","1.guide\u002F13.npm-tooling",{"title":67,"path":68,"stem":69},"Set up h34s with a coding assistant","\u002Fguide\u002Fagent-setup","1.guide\u002F14.agent-setup",false,{"title":72,"icon":73,"path":74,"stem":75,"children":76,"page":70},"Reference","i-lucide-library","\u002Freference","2.reference",[77,81,85,89],{"title":78,"path":79,"stem":80},"Architecture","\u002Freference\u002Farchitecture","2.reference\u002F1.architecture",{"title":82,"path":83,"stem":84},"Releases","\u002Freference\u002Freleases","2.reference\u002F2.releases",{"title":86,"path":87,"stem":88},"Compatibility","\u002Freference\u002Fcompatibility","2.reference\u002F3.compatibility",{"title":90,"path":91,"stem":92},"Migration guide","\u002Freference\u002Fmigration","2.reference\u002F4.migration",{"id":94,"title":82,"body":95,"description":1587,"extension":1588,"links":1589,"meta":1590,"navigation":605,"path":83,"seo":1591,"stem":84,"__hash__":1592},"docs\u002F2.reference\u002F2.releases.md",{"type":96,"value":97,"toc":1574},"minimark",[98,132,150,174,223,228,439,493,497,500,506,517,521,540,558,711,724,746,783,789,792,796,799,816,848,851,993,1015,1027,1050,1053,1064,1080,1084,1095,1261,1269,1309,1316,1348,1363,1378,1382,1406,1421,1434,1438,1461,1465,1530,1534,1543,1546,1550,1558,1562,1570],[99,100,101,113,114,117,118,125,126,131],"p",{},[102,103,104,108,109,112],"strong",{},[105,106,107],"code",{},"dev.yuri4n"," version ",[105,110,111],{},"0.2.0-alpha.1"," is published"," in the GitHub Packages Maven registry for ",[105,115,116],{},"yuri4n\u002Fh34s",". The ",[119,120,124],"a",{"href":121,"rel":122},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fv0.2.0-alpha.1",[123],"nofollow","prerelease"," and ",[119,127,130],{"href":128,"rel":129},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39145732257",[123],"successful release workflow"," record publication of all nine artifacts. The same workflow then resolved the Kyo, ZIO, Kyo Schema and ZIO Schema consumers from the authenticated registry, and each one served real h3 requests.",[99,133,134,136,137,142,143,145,146,149],{},[105,135,111],{}," changes the module set and the handler API: Kyo is the core runtime, the ZIO modules adapt it, and every module builds with Scala 3.9.0. Its ",[119,138,141],{"href":139,"rel":140},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002F.github\u002Frelease-notes\u002F0.2.0-alpha.1.md",[123],"release notes"," summarize the changes. The tables and commands below describe ",[105,144,111],{},". Where ",[105,147,148],{},"0.1.0-alpha.1"," differs, this page says so.",[99,151,152,153,158,159,125,163,168,169,173],{},"The older ",[102,154,155,157],{},[105,156,148],{}," stays published",", with eleven artifacts and the older API. Its ",[119,160,124],{"href":161,"rel":162},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fv0.1.0-alpha.1",[123],[119,164,167],{"href":165,"rel":166},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F38779659501",[123],"release workflow"," record that publication, and its ",[119,170,141],{"href":171,"rel":172},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002F.github\u002Frelease-notes\u002F0.1.0-alpha.1.md",[123]," list what that version contains.",[99,175,176,177,180,181,186,187,189,190,192,193,195,196,199,200,202,203,117,210,215,216,219,220,222],{},"The reusable JavaScript tooling is published separately as ",[105,178,179],{},"@yuri4n\u002Fh34s-nuxt@0.2.0-alpha.1"," in its own ",[119,182,185],{"href":183,"rel":184},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fnpm-v0.2.0-alpha.1",[123],"npm release",". See ",[119,188,63],{"href":64}," for package installation, shared configuration, and local tarball review. This package version registers a new Nitro plugin that the ",[105,191,111],{}," Scala libraries need for runtime config, storage mounts, and application-scoped resources. The ",[105,194,148],{}," package does not have it. Use ",[105,197,198],{},"@yuri4n\u002Fh34s-nuxt"," at the Scala libraries' version or later. With the ",[105,201,148],{}," libraries, use the matching ",[119,204,207],{"href":205,"rel":206},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fnpm-v0.1.0-alpha.1",[123],[105,208,209],{},"@yuri4n\u002Fh34s-nuxt@0.1.0-alpha.1",[119,211,214],{"href":212,"rel":213},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144809255",[123],"npm release workflow"," checked that the registry download matches the tested archive. The ",[119,217,218],{"href":91},"migration guide"," maps the ",[105,221,148],{}," API to the new one.",[224,225,227],"h2",{"id":226},"what-020-alpha1-provides","What 0.2.0-alpha.1 provides",[229,230,231,247],"table",{},[232,233,234],"thead",{},[235,236,237,241,244],"tr",{},[238,239,240],"th",{},"Capability",[238,242,243],{},"Kyo",[238,245,246],{},"ZIO",[248,249,250,270,285,307,324,338,356,371,386,401,418],"tbody",{},[235,251,252,260,265],{},[253,254,255,256,259],"td",{},"Handlers as ",[105,257,258],{},"Request => body"," functions",[253,261,262],{},[105,263,264],{},"KHandler.define",[253,266,267],{},[105,268,269],{},"ZHandler.define",[235,271,272,275,280],{},[253,273,274],{},"Response head as local state, written once",[253,276,277],{},[105,278,279],{},"Var[ResponseHead]",[253,281,282],{},[105,283,284],{},"ZState[ResponseHead]",[235,286,287,298,303],{},[253,288,289,290,293,294,297],{},"Wire format ",[105,291,292],{},"{data}"," \u002F ",[105,295,296],{},"{errors:[{message,path}]}"," \u002F 204, configurable",[253,299,300],{},[105,301,302],{},"HandlerOptions",[253,304,305],{},[105,306,302],{},[235,308,309,312,321],{},[253,310,311],{},"Bounded body reads with 400\u002F413\u002F415\u002F422",[253,313,314,317,318],{},[105,315,316],{},"request.body.json",", ",[105,319,320],{},"text",[253,322,323],{},"same",[235,325,326,329,332],{},[253,327,328],{},"Safe errors, opaque 500s, development and debug diagnostics",[253,330,331],{},"yes",[253,333,334,335],{},"yes, with ",[105,336,337],{},"Cause.prettyPrint",[235,339,340,346,351],{},[253,341,342,343],{},"Runtime config from Scala, ",[105,344,345],{},"Secret",[253,347,348],{},[105,349,350],{},"RuntimeConfig",[253,352,353],{},[105,354,355],{},"ZRuntimeConfig",[235,357,358,361,366],{},[253,359,360],{},"Application-scoped resources released on Nitro close",[253,362,363],{},[105,364,365],{},"Shared",[253,367,368],{},[105,369,370],{},"ZShared",[235,372,373,376,381],{},[253,374,375],{},"Streams with cancellation that waits for cleanup",[253,377,378],{},[105,379,380],{},"kyo.Stream",[253,382,383],{},[105,384,385],{},"ZStream",[235,387,388,391,396],{},[253,389,390],{},"Nitro storage",[253,392,393],{},[105,394,395],{},"KHubKv.mount",[253,397,398],{},[105,399,400],{},"ZHubKv.mount",[235,402,403,406,412],{},[253,404,405],{},"One schema for native values, JSON, YAML and validation",[253,407,408,409],{},"Kyo ",[105,410,411],{},"NativeSchema",[253,413,414,415,417],{},"ZIO ",[105,416,411],{}," (no YAML on Scala.js)",[235,419,420,423,432],{},[253,421,422],{},"Testing without h3",[253,424,425,428,429],{},[105,426,427],{},"Request.fake"," + ",[105,430,431],{},"Var.runTuple",[253,433,434,428,436],{},[105,435,427],{},[105,437,438],{},"ZIO.stateful",[99,440,441,442,445,446,449,450,453,454,459,460,462,463,465,466,469,470,473,474,477,478,125,481,484,485,477,488,492],{},"On ",[105,443,444],{},"main",", for the next release: handlers declare their routes in Scala with ",[105,447,448],{},".at(Route...)",", and Nuxt types ",[105,451,452],{},"$fetch"," from generated declarations. See ",[119,455,456,457],{"href":20},"routes and typed ",[105,458,452],{},". In ",[105,461,111],{},", mount each handler with a one-line route file. Also on ",[105,464,444],{},": handlers send streams with ",[105,467,468],{},"Response.sendStream"," instead of returning them, and tests call ",[105,471,472],{},"KHandler.test"," or ",[105,475,476],{},"ZHandler.test","; see ",[119,479,480],{"href":48},"streaming",[119,482,483],{"href":52},"testing",". The models that your routes return also get TypeScript names, which your app imports from ",[105,486,487],{},"#h34s\u002Fmodels",[119,489,491],{"href":490},"\u002Fguide\u002Froutes#use-the-models-in-your-app","use the models in your app",". ",[224,494,496],{"id":495},"toolchain","Toolchain",[99,498,499],{},"Use Node 24, pnpm 10.34.4, sbt 1.11.7, Scala.js 1.22.0, and Java 25. Every module compiles with Scala 3.9.0. The Kyo modules use Kyo 1.0.0-RC7; the ZIO modules use ZIO 2.1.26, the version that kyo-zio pins. Kyo's macros require Java 25 at build time, so build your application with Java 25 too. Java and sbt are build tools; the application runs inside Nitro\u002FNode.",[99,501,502,503,505],{},"In ",[105,504,148],{},", the native and ZIO modules used Scala 3.5.2 and only the Kyo modules used Scala 3.9.0.",[99,507,508,509,512,513,516],{},"Scala 3 dependency names have the ",[105,510,511],{},"_sjs1_3"," suffix. Use sbt's ",[105,514,515],{},"%%%"," syntax to select it. A Kyo-only application never resolves ZIO. A ZIO application resolves Kyo too, because the ZIO adapter runs on the Kyo core.",[224,518,520],{"id":519},"authenticate-package-reads","Authenticate package reads",[99,522,523,524,529,530,535,536,539],{},"The repository is public, and so are its Maven packages: GitHub's Maven registry gives a package the visibility of its repository. Every download from GitHub Packages still needs a token with package-read permission, also for a public package. Installing without a token waits for the public registries planned after the coordinate decision in ",[119,525,528],{"href":526,"rel":527},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fissues\u002F21",[123],"issue #21"," (",[119,531,534],{"href":532,"rel":533},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002Fdocs\u002Fdesign\u002Fadr\u002F0013-public-repository-and-registries.md",[123],"ADR-0013","). On a developer machine, use a GitHub personal access token (classic) with ",[105,537,538],{},"read:packages"," from any GitHub account. If organization SSO applies, authorize the token for that organization.",[99,541,542,543,125,546,549,550,553,554,557],{},"Provide ",[105,544,545],{},"GITHUB_PACKAGES_USER",[105,547,548],{},"GITHUB_PACKAGES_TOKEN"," through your shell or secret manager. Keep the token out of committed sbt files, ",[105,551,552],{},".env"," files included in builds, and command output. In a consumer's ",[105,555,556],{},"build.sbt",", add:",[559,560,565],"pre",{"className":561,"code":562,"language":563,"meta":564,"style":564},"language-scala shiki shiki-themes github-light github-light github-dark","ThisBuild \u002F resolvers += \"h34s GitHub Packages\" at\n  \"https:\u002F\u002Fmaven.pkg.github.com\u002Fyuri4n\u002Fh34s\"\n\nThisBuild \u002F credentials ++= (for {\n  user \u003C- sys.env.get(\"GITHUB_PACKAGES_USER\")\n  token \u003C- sys.env.get(\"GITHUB_PACKAGES_TOKEN\")\n} yield Credentials(\n  \"GitHub Package Registry\",\n  \"maven.pkg.github.com\",\n  user,\n  token,\n)).toSeq\n","scala","",[105,566,567,594,600,607,628,646,661,676,685,693,699,705],{"__ignoreMap":564},[568,569,572,576,580,584,587,591],"span",{"class":570,"line":571},"line",1,[568,573,575],{"class":574},"snPdu","ThisBuild",[568,577,579],{"class":578},"s8jYJ"," \u002F",[568,581,583],{"class":582},"sxrX7"," resolvers ",[568,585,586],{"class":578},"+=",[568,588,590],{"class":589},"sIIMD"," \"h34s GitHub Packages\"",[568,592,593],{"class":582}," at\n",[568,595,597],{"class":570,"line":596},2,[568,598,599],{"class":589},"  \"https:\u002F\u002Fmaven.pkg.github.com\u002Fyuri4n\u002Fh34s\"\n",[568,601,603],{"class":570,"line":602},3,[568,604,606],{"emptyLinePlaceholder":605},true,"\n",[568,608,610,612,614,617,620,622,625],{"class":570,"line":609},4,[568,611,575],{"class":574},[568,613,579],{"class":578},[568,615,616],{"class":582}," credentials ",[568,618,619],{"class":578},"++=",[568,621,529],{"class":582},[568,623,624],{"class":578},"for",[568,626,627],{"class":582}," {\n",[568,629,631,634,637,640,643],{"class":570,"line":630},5,[568,632,633],{"class":582},"  user ",[568,635,636],{"class":578},"\u003C-",[568,638,639],{"class":582}," sys.env.get(",[568,641,642],{"class":589},"\"GITHUB_PACKAGES_USER\"",[568,644,645],{"class":582},")\n",[568,647,649,652,654,656,659],{"class":570,"line":648},6,[568,650,651],{"class":582},"  token ",[568,653,636],{"class":578},[568,655,639],{"class":582},[568,657,658],{"class":589},"\"GITHUB_PACKAGES_TOKEN\"",[568,660,645],{"class":582},[568,662,664,667,670,673],{"class":570,"line":663},7,[568,665,666],{"class":582},"} ",[568,668,669],{"class":578},"yield",[568,671,672],{"class":574}," Credentials",[568,674,675],{"class":582},"(\n",[568,677,679,682],{"class":570,"line":678},8,[568,680,681],{"class":589},"  \"GitHub Package Registry\"",[568,683,684],{"class":582},",\n",[568,686,688,691],{"class":570,"line":687},9,[568,689,690],{"class":589},"  \"maven.pkg.github.com\"",[568,692,684],{"class":582},[568,694,696],{"class":570,"line":695},10,[568,697,698],{"class":582},"  user,\n",[568,700,702],{"class":570,"line":701},11,[568,703,704],{"class":582},"  token,\n",[568,706,708],{"class":570,"line":707},12,[568,709,710],{"class":582},")).toSeq\n",[99,712,713,714,719,720,723],{},"GitHub's Maven registry uses ",[119,715,718],{"href":716,"rel":717},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Flearn-github-packages\u002Fabout-permissions-for-github-packages#permissions-for-repository-scoped-packages",[123],"repository-scoped permissions",". The h34s repository's own workflows can publish and verify these packages with their ",[105,721,722],{},"GITHUB_TOKEN",".",[99,725,726,727,730,731,733,734,737,738,741,742,745],{},"A different repository, including ",[105,728,729],{},"yurian.land",", needs a classic PAT with ",[105,732,538],{},". A token from any GitHub account works, because the Maven packages are public. Store it as that consumer repository's ",[105,735,736],{},"PACKAGES_READ_TOKEN"," Actions secret and provide the token owner's username as the ",[105,739,740],{},"PACKAGES_USER"," Actions variable. GitHub reserves the ",[105,743,744],{},"GITHUB_"," prefix for saved secret and variable names. Map the saved values into the environment names read by sbt:",[559,747,751],{"className":748,"code":749,"language":750,"meta":564,"style":564},"language-yaml shiki shiki-themes github-light github-light github-dark","env:\n  GITHUB_PACKAGES_TOKEN: ${{ secrets.PACKAGES_READ_TOKEN }}\n  GITHUB_PACKAGES_USER: ${{ vars.PACKAGES_USER }}\n","yaml",[105,752,753,762,773],{"__ignoreMap":564},[568,754,755,759],{"class":570,"line":571},[568,756,758],{"class":757},"sovSZ","env",[568,760,761],{"class":582},":\n",[568,763,764,767,770],{"class":570,"line":596},[568,765,766],{"class":757},"  GITHUB_PACKAGES_TOKEN",[568,768,769],{"class":582},": ",[568,771,772],{"class":589},"${{ secrets.PACKAGES_READ_TOKEN }}\n",[568,774,775,778,780],{"class":570,"line":602},[568,776,777],{"class":757},"  GITHUB_PACKAGES_USER",[568,779,769],{"class":582},[568,781,782],{"class":589},"${{ vars.PACKAGES_USER }}\n",[99,784,785,786,788],{},"The consumer's own ",[105,787,722],{}," and the granular package “Manage Actions access” settings do not establish cross-repository Maven access.",[99,790,791],{},"HTTP 401 usually means missing or invalid credentials. HTTP 403, or a package appearing absent despite a successful release, can mean that the account or workflow repository lacks access. Check the registry URL, package version, token scope, and package access before changing dependency versions.",[224,793,795],{"id":794},"add-the-api-to-a-scalajs-application","Add the API to a Scala.js application",[99,797,798],{},"Pin the build tools:",[559,800,804],{"className":801,"code":802,"language":803,"meta":564,"style":564},"language-properties shiki shiki-themes github-light github-light github-dark","# project\u002Fbuild.properties\nsbt.version=1.11.7\n","properties",[105,805,806,811],{"__ignoreMap":564},[568,807,808],{"class":570,"line":571},[568,809,810],{},"# project\u002Fbuild.properties\n",[568,812,813],{"class":570,"line":596},[568,814,815],{},"sbt.version=1.11.7\n",[559,817,819],{"className":561,"code":818,"language":563,"meta":564,"style":564},"\u002F\u002F project\u002Fplugins.sbt\naddSbtPlugin(\"org.scala-js\" % \"sbt-scalajs\" % \"1.22.0\")\n",[105,820,821,827],{"__ignoreMap":564},[568,822,823],{"class":570,"line":571},[568,824,826],{"class":825},"sCsY4","\u002F\u002F project\u002Fplugins.sbt\n",[568,828,829,832,835,838,841,843,846],{"class":570,"line":596},[568,830,831],{"class":582},"addSbtPlugin(",[568,833,834],{"class":589},"\"org.scala-js\"",[568,836,837],{"class":578}," %",[568,839,840],{"class":589}," \"sbt-scalajs\"",[568,842,837],{"class":578},[568,844,845],{"class":589}," \"1.22.0\"",[568,847,645],{"class":582},[99,849,850],{},"For ZIO, add the registry and credentials above, then configure your application module:",[559,852,854],{"className":561,"code":853,"language":563,"meta":564,"style":564},"import org.scalajs.linker.interface.ModuleKind\n\nlazy val server = project.in(file(\"scala-server\"))\n  .enablePlugins(ScalaJSPlugin)\n  .settings(\n    scalaVersion := \"3.9.0\",\n    libraryDependencies +=\n      \"dev.yuri4n\" %%% \"zio-h3-ext\" % \"0.2.0-alpha.1\",\n    scalaJSLinkerConfig ~= (_.withModuleKind(ModuleKind.ESModule)),\n  )\n",[105,855,856,884,888,912,922,927,940,948,966,988],{"__ignoreMap":564},[568,857,858,861,864,866,869,871,874,876,879,881],{"class":570,"line":571},[568,859,860],{"class":578},"import",[568,862,863],{"class":574}," org",[568,865,723],{"class":582},[568,867,868],{"class":574},"scalajs",[568,870,723],{"class":582},[568,872,873],{"class":574},"linker",[568,875,723],{"class":582},[568,877,878],{"class":574},"interface",[568,880,723],{"class":582},[568,882,883],{"class":574},"ModuleKind\n",[568,885,886],{"class":570,"line":596},[568,887,606],{"emptyLinePlaceholder":605},[568,889,890,893,896,900,903,906,909],{"class":570,"line":602},[568,891,892],{"class":578},"lazy",[568,894,895],{"class":578}," val",[568,897,899],{"class":898},"sP4rz"," server",[568,901,902],{"class":578}," =",[568,904,905],{"class":582}," project.in(file(",[568,907,908],{"class":589},"\"scala-server\"",[568,910,911],{"class":582},"))\n",[568,913,914,917,920],{"class":570,"line":609},[568,915,916],{"class":582},"  .enablePlugins(",[568,918,919],{"class":574},"ScalaJSPlugin",[568,921,645],{"class":582},[568,923,924],{"class":570,"line":630},[568,925,926],{"class":582},"  .settings(\n",[568,928,929,932,935,938],{"class":570,"line":648},[568,930,931],{"class":582},"    scalaVersion ",[568,933,934],{"class":578},":=",[568,936,937],{"class":589}," \"3.9.0\"",[568,939,684],{"class":582},[568,941,942,945],{"class":570,"line":663},[568,943,944],{"class":582},"    libraryDependencies ",[568,946,947],{"class":578},"+=\n",[568,949,950,953,956,959,961,964],{"class":570,"line":678},[568,951,952],{"class":589},"      \"dev.yuri4n\"",[568,954,955],{"class":578}," %%%",[568,957,958],{"class":589}," \"zio-h3-ext\"",[568,960,837],{"class":578},[568,962,963],{"class":589}," \"0.2.0-alpha.1\"",[568,965,684],{"class":582},[568,967,968,971,974,977,980,982,985],{"class":570,"line":687},[568,969,970],{"class":582},"    scalaJSLinkerConfig ",[568,972,973],{"class":578},"~=",[568,975,976],{"class":582}," (_.withModuleKind(",[568,978,979],{"class":574},"ModuleKind",[568,981,723],{"class":582},[568,983,984],{"class":574},"ESModule",[568,986,987],{"class":582},")),\n",[568,989,990],{"class":570,"line":695},[568,991,992],{"class":582},"  )\n",[99,994,995,996,999,1000,1003,1004,1007,1008,1010,1011,1014],{},"For Kyo, replace ",[105,997,998],{},"zio-h3-ext"," with ",[105,1001,1002],{},"kyo-h3-ext",". Both APIs use Scala ",[105,1005,1006],{},"3.9.0","; in ",[105,1009,148],{}," the ZIO API used Scala ",[105,1012,1013],{},"3.5.2",". Keep Java 25 selected when compiling. These dependencies bring their runtime and the shared native layer transitively.",[99,1016,1017,1018,1021,1022,1026],{},"Also create the ",[105,1019,1020],{},".jvmopts"," file from the ",[119,1023,1025],{"href":1024},"\u002Fguide\u002Fadoption#configure-the-scalajs-module","adoption guide",". The verified consumer builds use it; a build without it has not been tested.",[99,1028,1029,1030,1033,1034,1037,1038,1040,1041,125,1044,492,1047,1049],{},"The current ",[105,1031,1032],{},"h3-ext"," has hand-written, internal h3 and Nitro facades. Your handlers receive a ",[105,1035,1036],{},"Request"," value and return a body; they do not call facades. ",[105,1039,148],{}," instead packaged ScalablyTyped-generated facades under ",[105,1042,1043],{},"dev.yuri4n.h34s.facades.h3",[105,1045,1046],{},"dev.yuri4n.h34s.facades.std",[105,1048,111],{}," removes those packages.",[99,1051,1052],{},"Install h3 in the Nuxt application as a runtime dependency:",[559,1054,1058],{"className":1055,"code":1056,"language":1057,"meta":564,"style":564},"language-sh shiki shiki-themes github-light github-light github-dark","pnpm add h3@1.15.4\n","sh",[105,1059,1060],{"__ignoreMap":564},[568,1061,1062],{"class":570,"line":571},[568,1063,1056],{},[99,1065,1066,1067,1070,1071,1076,1077,1079],{},"Maven dependencies supply Scala.js code, while pnpm supplies the JavaScript module imported by that code. See ",[119,1068,1069],{"href":16},"adoption"," for linking output, mounting exports alongside TypeScript routes, and composing application services outside handlers. See ",[119,1072,1075],{"href":1073,"rel":1074},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002Fdocs\u002Fdevelopment.md",[123],"development"," for the complete repository example and ",[119,1078,243],{"href":24}," for its independent application entry point.",[224,1081,1083],{"id":1082},"independently-consumable-modules","Independently consumable modules",[99,1085,1086,1087,1089,1090,492,1092,1094],{},"Every row uses organization ",[105,1088,107],{}," and Scala.js coordinates selected by ",[105,1091,515],{},[105,1093,111],{}," publishes these nine library modules:",[229,1096,1097,1110],{},[232,1098,1099],{},[235,1100,1101,1104,1107],{},[238,1102,1103],{},"Artifact",[238,1105,1106],{},"Purpose",[238,1108,1109],{},"Brings",[248,1111,1112,1127,1147,1162,1182,1204,1218,1231,1244],{},[235,1113,1114,1118,1124],{},[253,1115,1116],{},[105,1117,1032],{},[253,1119,1120,1121,1123],{},"Native layer: request snapshot, response head, safe errors, ",[105,1122,345],{},", internal h3\u002FNitro facades",[253,1125,1126],{},"No effect runtime",[235,1128,1129,1133,1145],{},[253,1130,1131],{},[105,1132,1002],{},[253,1134,1135,1136,1139,1140,317,1142,1144],{},"The core: ",[105,1137,1138],{},"KHandler",", body reading, ",[105,1141,350],{},[105,1143,365],{},", streaming",[253,1146,243],{},[235,1148,1149,1154,1160],{},[253,1150,1151],{},[105,1152,1153],{},"kyo-nuxthub-ext",[253,1155,1156,1157,1159],{},"Optional Kyo storage over Nitro mounts (",[105,1158,395],{},")",[253,1161,243],{},[235,1163,1164,1169,1179],{},[253,1165,1166],{},[105,1167,1168],{},"native-converter-kyo-schema-ext",[253,1170,1171,1172,1175,1176],{},"Optional ",[105,1173,1174],{},"derives NativeSchema"," from a Kyo ",[105,1177,1178],{},"Schema",[253,1180,1181],{},"Kyo Schema",[235,1183,1184,1188,1201],{},[253,1185,1186],{},[105,1187,998],{},[253,1189,1190,1191,317,1194,317,1196,317,1198,1200],{},"The ZIO adapter: ",[105,1192,1193],{},"ZHandler",[105,1195,355],{},[105,1197,370],{},[105,1199,385],{}," bodies",[253,1202,1203],{},"ZIO and Kyo",[235,1205,1206,1211,1216],{},[253,1207,1208],{},[105,1209,1210],{},"zio-nuxthub-ext",[253,1212,1213,1214,1159],{},"Optional ZIO storage over Nitro mounts (",[105,1215,400],{},[253,1217,1203],{},[235,1219,1220,1225,1228],{},[253,1221,1222],{},[105,1223,1224],{},"native-converter-zio-ext",[253,1226,1227],{},"NativeConverter support for ZIO data types",[253,1229,1230],{},"ZIO, no Kyo",[235,1232,1233,1238,1241],{},[253,1234,1235],{},[105,1236,1237],{},"native-converter-zio-json-ext",[253,1239,1240],{},"NativeConverter support for ZIO JSON values",[253,1242,1243],{},"ZIO JSON, no Kyo",[235,1245,1246,1251,1258],{},[253,1247,1248],{},[105,1249,1250],{},"native-converter-zio-schema-ext",[253,1252,1171,1253,1255,1256],{},[105,1254,1174],{}," from a ZIO ",[105,1257,1178],{},[253,1259,1260],{},"ZIO Schema, no Kyo",[99,1262,1263,1265,1266,1268],{},[105,1264,148],{}," published eleven artifacts. ",[105,1267,111],{}," removes three of them and adds one:",[1270,1271,1272,1279,1289,1304],"ul",{},[1273,1274,1275,1278],"li",{},[105,1276,1277],{},"zio-js-ext"," is removed. It no longer contained code.",[1273,1280,1281,1284,1285,1288],{},[105,1282,1283],{},"nuxthub-ext"," is removed. The storage adapters open a Nitro mount by name (",[105,1286,1287],{},"KHubKv.mount(\"kv\")",") through the h34s Nitro plugin, so your application does not supply a native KV object.",[1273,1290,1291,1294,1295,999,1297,1300,1301,723],{},[105,1292,1293],{},"zio-h3-schema-ext"," is removed. Use ",[105,1296,1250],{},[105,1298,1299],{},"derives Schema, NativeSchema"," and read the body with ",[105,1302,1303],{},"request.body.json[A]",[1273,1305,1306,1308],{},[105,1307,1168],{}," is new.",[99,1310,1311,1312,1315],{},"See ",[119,1313,1314],{"href":56},"NuxtHub KV"," for storage configuration and driver limitations.",[99,1317,1318,1319,1321,1322,1325,1326,1328,1329,1332,1333,317,1336,1339,1340,1343,1344,1347],{},"Schema support stays optional. Add ",[105,1320,1250],{}," (with ",[105,1323,1324],{},"\"dev.zio\" %%% \"zio-schema-derivation\" % \"1.7.5\"",") or ",[105,1327,1168],{}," next to your handler module when your models need one schema for validation and conversion. Plain ",[105,1330,1331],{},"derives NativeConverter"," models need neither. The schema bridges do not choose a JSON or YAML library for you: add ",[105,1334,1335],{},"kyo-schema-json",[105,1337,1338],{},"kyo-schema-yaml",", or ",[105,1341,1342],{},"zio-schema-json"," yourself when you need those formats. See ",[119,1345,1346],{"href":40},"schema"," for supported forms and validation behavior.",[99,1349,1350,1351,1354,1355,1358,1359,1362],{},"The root project, aggregates, applications, and examples, including ",[105,1352,1353],{},"zioMigrationsExt"," in ",[105,1356,1357],{},"examples\u002Fzio-migrations",", are excluded from publication. Database services, configuration, models, and ",[105,1360,1361],{},"AppHandler"," composition stay in application modules. The reusable libraries do not require the example's Skunk database.",[99,1364,1365,1366,1368,1369,1371,1372,1377],{},"Releases include binary and source jars. ",[105,1367,556],{}," still omits Scaladoc jars. In ",[105,1370,148],{}," the reason was that Scala 3.5's documentation generator failed on the generated inline h3 facades. Those facades are gone, but publishing Scaladoc again has not been tested. The ",[119,1373,1376],{"href":1374,"rel":1375},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Ftree\u002Fv0.2.0-alpha.1\u002Fwebsite\u002Fcontent",[123],"documentation website"," and source jars remain the API guides.",[224,1379,1381],{"id":1380},"verified-and-how","Verified, and how",[99,1383,1384,1385,1388,1389,1392,1393,1396,1397,1399,1400,1402,1403,1405],{},"On macOS x86_64 with JDK 25 and Node 24.19.0: 276 Scala tests across the native layer, the Kyo core, the ZIO adapter, both schema bridges, storage and the ZIO demo; the npm package's Node tests; fresh Maven consumers for Kyo, ZIO and both schema bridges (Kyo consumers resolve no ZIO); a production build of the demo serving the Kyo and ZIO routes, debug mode with ",[105,1386,1387],{},"NUXT_H34S_DEBUG=true",", and releasing the shared pool on ",[105,1390,1391],{},"SIGTERM","; and ",[105,1394,1395],{},"nuxt dev"," with development diagnostics and Kyo stacks mapped to Scala sources. For the generated routes on ",[105,1398,444],{},", the demo has no route files: a production build served the Kyo and ZIO routes from the manifests, a type check proved typed ",[105,1401,452],{}," from the declarations, and the packed module mounted a route added while ",[105,1404,1395],{}," ran.",[99,1407,1408,1409,1412,1413,1415,1416,1420],{},"In a Claude Code cloud session on Ubuntu 24.04.5, x86_64 (2026-10-19): a production build of the demo; the ZIO Notes routes against PostgreSQL 16 with ",[105,1410,1411],{},"scram-sha-256",", and the release of the pooled sessions on ",[105,1414,1391],{},"; and the kyo-sql code of the ",[119,1417,1419],{"href":1418},"\u002Fguide\u002Fdatabase#run-the-kyo-sql-tests","database guide",", which passed its 5 tests against PostgreSQL 16 in Node through sbt.",[99,1422,1423,1424,1427,1428,1430,1431,723],{},"In CI, on GitHub's Linux x86_64 runners: every Scala test suite, production linking and the four fresh Maven consumers, on the merge commit and again in the release workflow; the packed npm module in Nuxt 4.3.1 with development and production HTTP checks; and, after publication, the four consumers resolved from GitHub Packages and a byte-for-byte check of the downloaded npm archive. The ",[105,1425,1426],{},"postgres"," job runs the kyo-sql suite, the demo's production build and the Notes routes against PostgreSQL 16 on pull requests and on pushes to ",[105,1429,444],{}," that touch the libraries or the example. It skips release tags, so it does not gate a release. Details and run links are in ",[119,1432,1433],{"href":87},"compatibility",[224,1435,1437],{"id":1436},"not-verified-yet","Not verified yet",[1270,1439,1440,1449,1455,1458],{},[1273,1441,1442,1443,1445,1446,1448],{},"Relinking the real demo under ",[105,1444,1395],{},", and breakpoint stepping (diagnostics and source maps under ",[105,1447,1395],{}," were checked).",[1273,1450,1451,1452,1454],{},"kyo-sql inside Nitro: the ",[119,1453,1419],{"href":44}," code ran in Node through sbt, not in a Nitro bundle.",[1273,1456,1457],{},"NuxtHub KV as a Nitro storage mount.",[1273,1459,1460],{},"Linux beyond the CI checks, Windows, Nix, and non-Node Nitro presets.",[224,1462,1464],{"id":1463},"limits-to-plan-around","Limits to plan around",[1270,1466,1467,1476,1490,1496,1502,1508],{},[1273,1468,1469,1472,1473,723],{},[102,1470,1471],{},"Generated types:"," response bodies only. Request bodies and query strings have no generated type, and a converter that does not describe itself gives ",[105,1474,1475],{},"unknown",[1273,1477,1478,1354,1481,1483,1484,1486,1487,492],{},[102,1479,1480],{},"Streaming:",[105,1482,111],{},", direct Node HTTP only; on ",[105,1485,444],{},", also Nitro's in-process local fetch. No end-to-end memory bound, because h3 does not wait for ",[105,1488,1489],{},"drain",[1273,1491,1492,1495],{},[102,1493,1494],{},"ZIO Schema:"," no enums, sealed traits or maps yet; no YAML on Scala.js.",[1273,1497,1498,1501],{},[102,1499,1500],{},"Finalizers:"," failures are logged and do not change the response, in Kyo and in ZIO.",[1273,1503,1504,1507],{},[102,1505,1506],{},"Locale data:"," Kyo brings a large currency database; exclude it in applications that do not need it.",[1273,1509,1510,1513,1514,1517,1518,1521,1522,1525,1526,723],{},[102,1511,1512],{},"Build memory:"," Nitro bundles the linked Scala.js twice. With ",[105,1515,1516],{},"scalaPrerender: 'stub'",", which the demo sets, the demo's ",[105,1519,1520],{},"nuxt build"," passed with a 4096 MiB heap limit. The demo's scripts keep ",[105,1523,1524],{},"--max-old-space-size=8192"," as a margin; see ",[119,1527,1529],{"href":1528},"\u002Freference\u002Fcompatibility#known-gaps","build memory",[224,1531,1533],{"id":1532},"planned","Planned",[1535,1536,1537,1540],"ol",{},[1273,1538,1539],{},"Nix and sbt-native-packager paths over the same build pipeline.",[1273,1541,1542],{},"Interactive documentation: compiler-derived types, symbol links and runnable examples.",[99,1544,1545],{},"The documentation shows static source examples. It has no semantic hovers, no editable compiler and no hosted playground yet.",[224,1547,1549],{"id":1548},"about-this-documentation","About this documentation",[99,1551,1552,1553,723],{},"This documentation is written with AI assistance under the maintainer's direction, and errors are tracked as ",[119,1554,1557],{"href":1555,"rel":1556},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fissues",[123],"issues",[224,1559,1561],{"id":1560},"publish-a-release","Publish a release",[99,1563,1564,1565,723],{},"Maintainers validate, tag and publish releases with the procedure in ",[119,1566,1569],{"href":1567,"rel":1568},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002Fdocs\u002Fmaintainers\u002Freleases.md",[123],"the maintainer release guide",[1571,1572,1573],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sovSZ, html code.shiki .sovSZ{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":564,"searchDepth":596,"depth":596,"links":1575},[1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586],{"id":226,"depth":596,"text":227},{"id":495,"depth":596,"text":496},{"id":519,"depth":596,"text":520},{"id":794,"depth":596,"text":795},{"id":1082,"depth":596,"text":1083},{"id":1380,"depth":596,"text":1381},{"id":1436,"depth":596,"text":1437},{"id":1463,"depth":596,"text":1464},{"id":1532,"depth":596,"text":1533},{"id":1548,"depth":596,"text":1549},{"id":1560,"depth":596,"text":1561},"Published versions, registry access and installation, what 0.2.0-alpha.1 provides, and what was verified.","md",null,{},{"title":82,"description":1587},"gkB6CorjyfsuHC1zl9K4p0x6leF1-IUch_QXLBWhxW8",[1594,1596],{"title":78,"path":79,"stem":80,"description":1595,"children":-1},"An effect-free native layer, a Kyo core, a hand-written ZIO adapter, optional schema and storage bridges, and your application.",{"title":86,"path":87,"stem":88,"description":1597,"children":-1},"Tested profiles with their evidence, kept apart into locally verified, CI-validated and untested combinations.",1792533381916]