[{"data":1,"prerenderedAt":1902},["ShallowReactive",2],{"navigation_docs":3,"-reference-compatibility":93,"-reference-compatibility-surround":1897},[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":86,"body":95,"description":1890,"extension":1891,"links":1892,"meta":1893,"navigation":1894,"path":87,"seo":1895,"stem":88,"__hash__":1896},"docs\u002F2.reference\u002F3.compatibility.md",{"type":96,"value":97,"toc":1873},"minimark",[98,102,125,128,142,177,311,315,318,686,689,693,722,920,925,949,1332,1349,1353,1372,1405,1431,1435,1441,1486,1490,1529,1533,1703,1707,1771,1778,1789,1846,1859,1863,1866,1870],[99,100,101],"p",{},"A compatibility profile is a set of versions that was tested together, on a stated platform, with stated evidence. This page keeps three kinds of evidence apart:",[103,104,105,113,119],"ul",{},[106,107,108,112],"li",{},[109,110,111],"strong",{},"Locally verified:"," run by hand or by an agent on one machine. Useful, but not repeatable by others yet.",[106,114,115,118],{},[109,116,117],{},"CI-validated:"," run by a GitHub Actions workflow, with a link to the run.",[106,120,121,124],{},[109,122,123],{},"Untested:"," configured or expected to work, with no evidence. Do not rely on it.",[99,126,127],{},"Listing a library here does not make it a dependency of your application. Add only the modules you use.",[129,130,132,133,137,138,141],"h2",{"id":131},"profile-alpha-020-020-alpha1-published","Profile ",[134,135,136],"code",{},"alpha-0.2.0"," (",[134,139,140],{},"0.2.0-alpha.1",", published)",[99,143,144,145,147,148,151,152,159,160,165,166,171,172,176],{},"Version ",[134,146,140],{},", with the Kyo core and the ZIO adapter. It was published on 2026-10-18 from commit ",[134,149,150],{},"433ac9d",", the merge of ",[153,154,158],"a",{"href":155,"rel":156},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fpull\u002F14",[157],"nofollow","#14",": the ",[153,161,164],{"href":162,"rel":163},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fv0.2.0-alpha.1",[157],"Maven prerelease"," and the ",[153,167,170],{"href":168,"rel":169},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fnpm-v0.2.0-alpha.1",[157],"npm release",". The ",[153,173,175],{"href":174},"#release-workflows","release evidence"," below links the workflows that published and verified the packages.",[178,179,180,193],"table",{},[181,182,183],"thead",{},[184,185,186,190],"tr",{},[187,188,189],"th",{},"Component",[187,191,192],{},"Version",[194,195,196,212,220,228,236,244,252,260,268,276,284,292,300],"tbody",{},[184,197,198,202],{},[199,200,201],"td",{},"Artifacts",[199,203,204,205,208,209,211],{},"nine ",[134,206,207],{},"dev.yuri4n"," modules, ",[134,210,140],{},", GitHub Packages (public)",[184,213,214,217],{},[199,215,216],{},"Scala (every module)",[199,218,219],{},"3.9.0",[184,221,222,225],{},[199,223,224],{},"Scala.js linker",[199,226,227],{},"1.22.0",[184,229,230,233],{},[199,231,232],{},"Build JDK",[199,234,235],{},"25 (checked with Temurin 25.0.4.1+1)",[184,237,238,241],{},[199,239,240],{},"sbt",[199,242,243],{},"1.11.7",[184,245,246,249],{},[199,247,248],{},"Kyo",[199,250,251],{},"1.0.0-RC7 (kyo-core, kyo-zio, kyo-schema; kyo-schema-json and kyo-schema-yaml in tests)",[184,253,254,257],{},[199,255,256],{},"ZIO",[199,258,259],{},"2.1.26; zio-prelude 1.0.0-RC41; zio-json 0.7.44; zio-schema 1.7.5",[184,261,262,265],{},[199,263,264],{},"NativeConverter",[199,266,267],{},"0.9.0",[184,269,270,273],{},[199,271,272],{},"h3",[199,274,275],{},"1.15.4 (tests and the demo's runtime dependency)",[184,277,278,281],{},[199,279,280],{},"Skunk (demo only)",[199,282,283],{},"1.0.0-M12",[184,285,286,289],{},[199,287,288],{},"Node \u002F pnpm",[199,290,291],{},"24 (checked with 24.19.0) \u002F 10.34.4",[184,293,294,297],{},[199,295,296],{},"Nuxt (demo lockfile)",[199,298,299],{},"4.3.1, with Nitro 2.13.1",[184,301,302,305],{},[199,303,304],{},"npm tooling",[199,306,307,310],{},[134,308,309],{},"@yuri4n\u002Fh34s-nuxt@0.2.0-alpha.1",", private GitHub Packages (the repository demo uses the workspace link)",[272,312,314],{"id":313},"locally-verified","Locally verified",[99,316,317],{},"On macOS 15.7.5, x86_64, during the refactor (2026-10-17):",[178,319,320,330],{},[181,321,322],{},[184,323,324,327],{},[187,325,326],{},"Check",[187,328,329],{},"Result",[194,331,332,342,352,362,372,382,392,402,413,427,440,451,465,480,496,516,539,585,624,672],{},[184,333,334,339],{},[199,335,336],{},[134,337,338],{},"h3Ext\u002Ftest",[199,340,341],{},"36 passed",[184,343,344,349],{},[199,345,346],{},[134,347,348],{},"kyoH3Ext\u002Ftest",[199,350,351],{},"79 passed",[184,353,354,359],{},[199,355,356],{},[134,357,358],{},"kyoNuxtHubExt\u002Ftest",[199,360,361],{},"15 passed",[184,363,364,369],{},[199,365,366],{},[134,367,368],{},"nativeConverterKyoSchemaExt\u002Ftest",[199,370,371],{},"25 passed",[184,373,374,379],{},[199,375,376],{},[134,377,378],{},"zioH3Ext\u002Ftest",[199,380,381],{},"81 passed",[184,383,384,389],{},[199,385,386],{},[134,387,388],{},"zioNuxtHubExt\u002Ftest",[199,390,391],{},"14 passed",[184,393,394,399],{},[199,395,396],{},[134,397,398],{},"nativeConverterZIOSchemaExt\u002Ftest",[199,400,401],{},"20 passed",[184,403,404,410],{},[199,405,406,409],{},[134,407,408],{},"nuxtsvr\u002Ftest"," (ZIO demo)",[199,411,412],{},"6 passed",[184,414,415,424],{},[199,416,417,420,421],{},[134,418,419],{},"nativeConverterZIOJsonExt",", ",[134,422,423],{},"zioMigrationsExt",[199,425,426],{},"compile",[184,428,429,437],{},[199,430,431,420,434],{},[134,432,433],{},"kyoExample\u002FfastLinkJS",[134,435,436],{},"nuxtsvr\u002FfastLinkJS",[199,438,439],{},"link",[184,441,442,448],{},[199,443,444,447],{},[134,445,446],{},"releaseCheck"," (POMs for the 9 release modules)",[199,449,450],{},"passed",[184,452,453,462],{},[199,454,455,456,420,459],{},"Node tests: ",[134,457,458],{},"scripts\u002F*.test.mjs",[134,460,461],{},"packages\u002Fnuxt\u002Ftest\u002F*.test.mjs",[199,463,464],{},"All 47 passed (after the Phase D review fixes)",[184,466,467,470],{},[199,468,469],{},"Documentation snippets that do not come from compiled sources (Kyo and ZIO guides, configuration, lifetimes, storage, streaming, testing, adoption, and the kyo-sql code with kyo-sql-postgres 1.0.0-RC7)",[199,471,472,473,420,476,479],{},"Compiled in a temporary test file against this branch (",[134,474,475],{},"kyoNuxtHubExt\u002FTest\u002Fcompile",[134,477,478],{},"zioNuxtHubExt\u002FTest\u002Fcompile","); not run",[184,481,482,489],{},[199,483,484,485,488],{},"Fresh Maven consumers (",[134,486,487],{},"scripts\u002Fcheck-consumers.mjs",") for Kyo, ZIO, Kyo Schema and ZIO Schema, from a temporary Maven repository",[199,490,491,492,495],{},"Compiled, linked and served real h3 requests with the new wire format; the Kyo consumers resolved no ",[134,493,494],{},"dev.zio"," artifact",[184,497,498,501],{},[199,499,500],{},"Kyo demo over a plain h3 server with a preemptive router (Nitro's router mode)",[199,502,503,504,507,508,511,512,515],{},"GET and POST 200 with ",[134,505,506],{},"{\"data\":...}","; 422 entries with ",[134,509,510],{},"path"," for a blank or 81-character name; generic 422 for a wrong shape; 400 for invalid JSON; ",[134,513,514],{},"Cache-Control: no-store"," on every response",[184,517,518,521],{},[199,519,520],{},"ZIO demo over the same h3 server",[199,522,523,526,527,530,531,534,535,538],{},[134,524,525],{},"\u002Fapi\u002Ftest"," answers ",[134,528,529],{},"abc","; ",[134,532,533],{},"\u002Fapi\u002Fnotes"," without the plugin is an opaque 500; with a fake plugin record and no database, a 500 with ",[134,536,537],{},"debug.cause"," and no password in it, and one close hook registered and released",[184,540,541,552],{},[199,542,543,544,547,548,551],{},"Production build of the demo (Scala full link, ",[134,545,546],{},"nuxt build",", then the Node server from ",[134,549,550],{},".output\u002F",")",[199,553,554,555,558,559,562,563,565,566,562,568,570,571,574,575,577,578,159,581,584],{},"Built with ",[134,556,557],{},"NODE_OPTIONS=--max-old-space-size=8192"," (the default heap ran out of memory). Kyo routes: the same 200, 422, 400 responses, and 415 for ",[134,560,561],{},"text\u002Fplain",". ",[134,564,525],{}," streamed ",[134,567,529],{},[134,569,533],{}," without a database: opaque 500. With ",[134,572,573],{},"NUXT_H34S_DEBUG=true",": ",[134,576,537],{}," present, password absent. ",[134,579,580],{},"SIGTERM",[134,582,583],{},"ZShared"," pool registered on the first Notes request was released, exit status 0",[184,586,587,590],{},[199,588,589],{},"Production build after the review fixes (same machine, same day)",[199,591,592,595,596,599,600,603,604,607,608,611,612,615,616,619,620,623],{},[134,593,594],{},"kyo-smoke.mjs"," passed with the default salutation and with ",[134,597,598],{},"NUXT_GREETING_SALUTATION=Hi"," (Kyo ",[134,601,602],{},"RuntimeConfig.load"," in a ",[134,605,606],{},"Shared","); ",[134,609,610],{},"smoke.mjs"," with ",[134,613,614],{},"H34S_SMOKE_SKIP_DATABASE=true"," passed without PostgreSQL (invalid Notes input is a 422 before any database work); streams carry ",[134,617,618],{},"text\u002Fplain; charset=utf-8"," and ",[134,621,622],{},"nosniff"," by default",[184,625,626,639],{},[199,627,628,631,632,635,636,551],{},[134,629,630],{},"nuxt dev"," on the demo (Nuxt 4.3.1, ",[134,633,634],{},"pnpm dev"," after ",[134,637,638],{},"pnpm run scala:fast",[199,640,641,642,619,644,647,648,530,651,653,654,530,656,658,659,661,662,665,666,619,669],{},"Kyo GET 200 with ",[134,643,506],{},[134,645,646],{},"no-store","; a blank name 422 with path ",[134,649,650],{},"name",[134,652,525],{}," answered ",[134,655,529],{},[134,657,533],{}," without a database answered a 500 with ",[134,660,537],{}," (Scala stack frames, no password). A Kyo handler that threw a JavaScript ",[134,663,664],{},"TypeError"," (a temporary probe route) had its stack mapped to ",[134,667,668],{},"RequestLifecycle.scala",[134,670,671],{},"KHandler.scala",[184,673,674,680],{},[199,675,676,679],{},[134,677,678],{},"scripts\u002Fcheck-npm-nuxt.mjs"," (the packed module in a synthetic Nuxt 4.3.1 project)",[199,681,682,683,685],{},"Development diagnostics, direct loading, Scala source maps, a relink reload, production bundling, and ",[134,684,573],{}," at runtime",[99,687,688],{},"The Scala tests use real h3 1.15.4 events with mocked Node responses. They do not start Nuxt or Nitro. The consumer and production-build checks come from Phase C1 of the refactor, on the same machine.",[272,690,692],{"id":691},"locally-verified-in-a-cloud-session-2026-10-19","Locally verified in a cloud session (2026-10-19)",[99,694,695,696,699,700,703,704,707,708,711,712,715,716,721],{},"In a Claude Code cloud session: Ubuntu 24.04.5, x86_64, 4 vCPUs, 15.7 GiB memory, Node 24.22.0, pnpm 10.34.4, OpenJDK 25.0.4.1, sbt 1.11.7, Nuxt 4.3.1, Nitro 2.13.1, Nuxt Content 3.11.2, and PostgreSQL 16.15 (",[134,697,698],{},"psql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)","), from commit ",[134,701,702],{},"f1fb8e1","; the kyo-sql row with ",[134,705,706],{},"KyoSqlPostgresSuite"," from commit ",[134,709,710],{},"314546f"," (the first four tests also from ",[134,713,714],{},"70688b2","). The ",[153,717,720],{"href":718,"rel":719},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002Fdocs\u002Fdevelopment.md#cloud-session-production-build-and-postgresql-2026-10-19",[157],"development guide"," has the full record.",[178,723,724,732],{},[181,725,726],{},[184,727,728,730],{},[187,729,326],{},[187,731,329],{},[194,733,734,754,787,798,811,854,888],{},[184,735,736,748],{},[199,737,738,739,742,743,611,745,551],{},"Production build of the demo (",[134,740,741],{},"pnpm run scala:full",", then ",[134,744,546],{},[134,746,747],{},"--max-old-space-size=8192",[199,749,750,751,753],{},"Passed; 2:14 for ",[134,752,741],{}," (cold sbt start, compile and link), 2:15 for the Nuxt build, 6.5 GiB peak RSS",[184,755,756,767],{},[199,757,758,759,762,763,766],{},"ZIO Notes against PostgreSQL 16 with ",[134,760,761],{},"scram-sha-256"," (production server, ",[134,764,765],{},".env.example"," variables)",[199,768,769,771,772,775,776,530,779,782,783,786],{},[134,770,610],{}," passed with the database. ",[134,773,774],{},"POST \u002Fapi\u002Fnotes"," 201; blank text 422 with path ",[134,777,778],{},"text",[134,780,781],{},"{\"text\":42}"," the generic 422; ",[134,784,785],{},"GET \u002Fapi\u002Fnotes"," 200 with the note",[184,788,789,792],{},[199,790,791],{},"Skunk 1.0.0-M12 SCRAM login in the production bundle",[199,793,794,795],{},"PostgreSQL logged ",[134,796,797],{},"connection authenticated: identity=\"h34s\" method=scram-sha-256",[184,799,800,805],{},[199,801,802,804],{},[134,803,580],{}," with 4 pooled sessions open",[199,806,807,808],{},"Exit status 0; 4 disconnections logged; 0 sessions of the user in ",[134,809,810],{},"pg_stat_activity",[184,812,813,827],{},[199,814,815,816,820,821,611,824],{},"kyo-sql code of the ",[153,817,819],{"href":818},"\u002Fguide\u002Fdatabase#run-the-kyo-sql-tests","database guide",", kyo-sql-postgres 1.0.0-RC7, in Node through ",[134,822,823],{},"sbt kyoExample\u002Ftest",[134,825,826],{},"H34S_POSTGRES_URL",[199,828,829,830,833,834,837,838,841,842,845,846,849,850,853],{},"5 passed, twice: insert and list, unique violation to ",[134,831,832],{},"DuplicateNote",", rollback on a non-SQL ",[134,835,836],{},"Abort",", rollback (with ",[134,839,840],{},"SqlRequestTransactionFailedStatementException",") when the body recovers from a failed statement, and a failed nested transaction that rolls back only its own part. The nested test also checks that the nested step failed with SQLSTATE 23505. After each run, no suite row was left in ",[134,843,844],{},"notes",". kyo-net selected its ",[134,847,848],{},"node"," backend by itself. Without the variable, the 5 tests are skipped; with ",[134,851,852],{},"H34S_POSTGRES_REQUIRED=true"," and no variable, they fail",[184,855,856,869],{},[199,857,858,861,862,865,866,551],{},[134,859,860],{},"pnpm run test:package"," with the ",[134,863,864],{},"scalaPrerender: 'stub'"," checks (commit ",[134,867,868],{},"ae4c502",[199,870,871,872,875,876,879,880,883,884,887],{},"Passed. ",[134,873,874],{},"check-npm-nuxt.mjs"," set the option in the packed consumer. A build that also prerendered a route calling a Scala.js route through ",[134,877,878],{},"event.$fetch",", and catching the 501, failed with the ",[134,881,882],{},"[h34s]"," warning and the list of requests. The build that prerendered only a route without Scala.js passed: its prerender bundle had the stub and no linked code, its server output had the linked code and no stub, and the production server ran a directly mounted linked handler. Without the ",[134,885,886],{},"prerender:done"," report or without the stub plugin, the check failed ",[184,889,890,898],{},[199,891,892,894,895,551],{},[134,893,860],{}," after the review fixes (commit ",[134,896,897],{},"68f6100",[199,899,900,901,903,904,907,908,911,912,915,916,919],{},"Passed in 44 s. The build that prerendered the route calling a Scala.js route failed with the ",[134,902,882],{}," warning and the list, and its log had no ",[134,905,906],{},"[request error]"," or ",[134,909,910],{},"[unhandled]"," line. A third build also prerendered the Scala.js route itself: it failed with Nitro's ",[134,913,914],{},"Errors prerendering:"," summary and ",[134,917,918],{},"Exiting due to prerender errors.",", h34s logged the list of both requests, and the log had no unhandled-error line ",[921,922,924],"h4",{"id":923},"heap-measurement-2026-10-19","Heap measurement (2026-10-19)",[99,926,927,928,930,931,933,934,937,938,940,941,944,945,948],{},"Each row is one ",[134,929,546],{}," of the demo, run alone, on the production link above. A variant is a temporary change that was reverted afterwards, except the last three rows: the module option ",[134,932,864],{},", which the demo now uses. The 4096 MiB limit stands for Node's default heap on a 16 GB Mac (about 4 GiB). On this VM, Node's own default limit is 2240 MiB (",[134,935,936],{},"env -u NODE_OPTIONS node -e 'console.log(require(\"v8\").getHeapStatistics().heap_size_limit\u002F1048576)'","). The session's environment set ",[134,939,557],{},"; a command-line ",[134,942,943],{},"--max-old-space-size"," overrides it for the build process. In a full 8192 MiB build sampled every 10 seconds (14 samples), the only child processes were two esbuild services, which have no Node heap, so the limits in the table apply to the build's only Node process. Peak RSS is the largest process, from GNU ",[134,946,947],{},"time -v"," (KiB), given in GiB. ",[178,950,951,969],{},[181,952,953],{},[184,954,955,958,961,963,966],{},[187,956,957],{},"Variant",[187,959,960],{},"Heap limit",[187,962,329],{},[187,964,965],{},"Peak RSS",[187,967,968],{},"Wall time",[194,970,971,988,1009,1024,1040,1070,1089,1105,1121,1149,1166,1222,1239,1266,1301],{},[184,972,973,976,979,982,985],{},[199,974,975],{},"Baseline (both applications, server source maps, prerendering)",[199,977,978],{},"8192 MiB (the scripts' option)",[199,980,981],{},"Passed",[199,983,984],{},"6.50 GiB",[199,986,987],{},"2:15",[184,989,990,993,1000,1003,1006],{},[199,991,992],{},"Baseline",[199,994,995,996,999],{},"Node's real default on this VM (2240 MiB; ",[134,997,998],{},"NODE_OPTIONS"," removed)",[199,1001,1002],{},"Out of memory while it built the prerender bundle (\"Initializing prerenderer\")",[199,1004,1005],{},"2.58 GiB",[199,1007,1008],{},"1:00",[184,1010,1011,1013,1016,1018,1021],{},[199,1012,992],{},[199,1014,1015],{},"6144 MiB",[199,1017,981],{},[199,1019,1020],{},"5.46 GiB",[199,1022,1023],{},"2:06",[184,1025,1026,1028,1031,1034,1037],{},[199,1027,992],{},[199,1029,1030],{},"4096 MiB",[199,1032,1033],{},"Out of memory in \"Building Nuxt Nitro server\", after prerendering",[199,1035,1036],{},"4.66 GiB",[199,1038,1039],{},"2:36",[184,1041,1042,1052,1054,1064,1067],{},[199,1043,1044,1045,1048,1049,551],{},"No server source maps (",[134,1046,1047],{},"sourcemap.server=false"," in ",[134,1050,1051],{},".nuxtrc",[199,1053,1030],{},[199,1055,1056,1057,1060,1061],{},"Passed; no ",[134,1058,1059],{},".map"," file in ",[134,1062,1063],{},".output\u002Fserver",[199,1065,1066],{},"4.34 GiB",[199,1068,1069],{},"1:56",[184,1071,1072,1079,1081,1083,1086],{},[199,1073,1074,1075,1078],{},"No prerendering (a temporary ",[134,1076,1077],{},"prerender:routes"," hook that clears the one route)",[199,1080,1030],{},[199,1082,981],{},[199,1084,1085],{},"4.02 GiB",[199,1087,1088],{},"1:16",[184,1090,1091,1094,1096,1099,1102],{},[199,1092,1093],{},"Kyo application only (the ZIO route files moved away)",[199,1095,1030],{},[199,1097,1098],{},"Passed; prerendering took 17 s",[199,1100,1101],{},"3.41 GiB",[199,1103,1104],{},"1:01",[184,1106,1107,1110,1112,1115,1118],{},[199,1108,1109],{},"ZIO application only (the Kyo route files moved away)",[199,1111,1030],{},[199,1113,1114],{},"Passed; prerendering took 33 s",[199,1116,1117],{},"4.46 GiB",[199,1119,1120],{},"1:46",[184,1122,1123,1134,1137,1144,1147],{},[199,1124,1125,1126,1129,1130,1133],{},"No full locale database (",[134,1127,1128],{},"locales-full-currencies-db"," excluded from ",[134,1131,1132],{},"nuxtsvr"," too)",[199,1135,1136],{},"Not built",[199,1138,1139,1140,1143],{},"The database jar is on the ZIO application's classpath (",[134,1141,1142],{},"show nuxtsvr\u002FCompile\u002FfullClasspath","), but excluding it did not change the linked output (same name, size and time stamp), so the build input does not change",[199,1145,1146],{},"Not measured",[199,1148,1146],{},[184,1150,1151,1154,1157,1160,1163],{},[199,1152,1153],{},"Baseline, a second run on the same day",[199,1155,1156],{},"8192 MiB",[199,1158,1159],{},"Passed; prerendering took 54 s",[199,1161,1162],{},"6.42 GiB",[199,1164,1165],{},"2:13 ",[184,1167,1168,1175,1177,1216,1219],{},[199,1169,1170,1171,1174],{},"Stub through a temporary ",[134,1172,1173],{},"nuxt.config"," hook that added the same Rollup plugin to the prerender build, before the option existed",[199,1176,1030],{},[199,1178,1179,1180,420,1183,420,1186,420,1189,420,1192,1195,1196,1199,1200,1203,1204,171,1206,1209,1210,1212,1213,1215],{},"Passed; prerendering took 5.7 s. The plugin replaced exactly the 5 Scala.js route entries (",[134,1181,1182],{},"kyo-greeting-get",[134,1184,1185],{},"kyo-greeting-post",[134,1187,1188],{},"notes-get",[134,1190,1191],{},"notes-post",[134,1193,1194],{},"test","). The prerendered ",[134,1197,1198],{},"sql_dump.txt"," had the baseline's SHA-256 (",[134,1201,1202],{},"15069d1d1d010d84d8b3f879a12c2efaf4335d6e5feb5c154127f0df1574573d","), and the stub's text was not in ",[134,1205,1063],{},[134,1207,1208],{},"postgres"," CI job's serve step, run on this VM (",[134,1211,610],{}," with PostgreSQL, 4 sessions before ",[134,1214,580],{},", exit status 0, 0 after), passed on this build",[199,1217,1218],{},"4.13 GiB",[199,1220,1221],{},"1:41 ",[184,1223,1224,1227,1231,1234,1236],{},[199,1225,1226],{},"The same hook",[199,1228,995,1229,999],{},[134,1230,998],{},[199,1232,1233],{},"Prerendering passed (3.5 s), then out of memory in \"Building Nuxt Nitro server\"",[199,1235,1005],{},[199,1237,1238],{},"0:43 ",[184,1240,1241,1249,1251,1260,1263],{},[199,1242,1243,1245,1246,551],{},[134,1244,864],{},", the module option (commit ",[134,1247,1248],{},"cca91f5",[199,1250,1030],{},[199,1252,1253,1254,1256,1257,1259],{},"Passed; prerendering took 3.8 s. ",[134,1255,1198],{}," had the same SHA-256. The same serve step passed on this build. The contents of the prerender bundle and of ",[134,1258,1063],{}," were not recorded for this build",[199,1261,1262],{},"4.05 GiB",[199,1264,1265],{},"1:23 ",[184,1267,1268,1275,1277,1295,1298],{},[199,1269,1270,1272,1273,551],{},[134,1271,864],{},", the module option with the request report (commit ",[134,1274,868],{},[199,1276,1030],{},[199,1278,1279,1280,1283,1284,1286,1287,1289,1290,1292,1293],{},"Passed; prerendering took 3.6 s, and no request reached the stub. The prerender bundle (90 files, 1,207,913 bytes, about 1.2 MB; ",[134,1281,1282],{},"du -sh"," reports 1.5M of disk use) mounts the stub for all 5 Scala.js routes; ",[134,1285,1063],{}," bundles the Scala.js and has no stub text. ",[134,1288,1198],{}," had the same SHA-256. The same serve step passed, and ",[134,1291,594],{}," passed against the same server build, which then exited with status 0 on ",[134,1294,580],{},[199,1296,1297],{},"4.07 GiB",[199,1299,1300],{},"1:18 ",[184,1302,1303,1310,1312,1327,1330],{},[199,1304,1305,1307,1308,551],{},[134,1306,864],{},", the stub's 501 as a handled h3 error (commit ",[134,1309,897],{},[199,1311,1030],{},[199,1313,1314,1315,420,1317,907,1319,1321,1322,1286,1324,1326],{},"Passed; prerendering took 3.9 s, and no request reached the stub (no ",[134,1316,882],{},[134,1318,906],{},[134,1320,910],{}," line). The prerender bundle (90 files, 1,208,871 bytes, about 1.2 MB) mounts the stub for all 5 Scala.js routes and has no Scala.js classes; ",[134,1323,1063],{},[134,1325,1198],{}," had the same SHA-256. This build was not served",[199,1328,1329],{},"4.06 GiB",[199,1331,1300],{},[99,1333,1334,1335,1338,1339,1342,1343,1345,1346,1348],{},"Cause: Nitro 2.13.1 bundles the linked Scala.js (16.5 MB of JavaScript and 13.2 MB of source maps) twice in one process. First it builds a complete ",[134,1336,1337],{},"nitro-prerender"," server for the one prerendered Nuxt Content route and imports it, which took 47 to 59 s across the baseline runs. Then it builds the ",[134,1340,1341],{},"node-server"," output. Removing the prerendered route, the server source maps, or one application each let the build pass with a 4096 MiB heap limit; peak RSS was then 3.4 to 4.5 GiB. The measurement does not separate how much memory each Rollup build keeps. A first attempt at the source-map row appended to ",[134,1344,1051],{}," without a newline, so Nuxt ignored the setting; those two runs are not in the table. The module option ",[134,1347,864],{}," keeps the Scala.js out of the first bundle. With it, the build passed with a 4096 MiB heap limit. With the equivalent temporary hook, it did not pass with 2240 MiB: the stub removes the duplicate bundle, not the need for more than about 2.2 GiB. ",[272,1350,1352],{"id":1351},"ci-validated","CI-validated",[99,1354,1355,1356,1359,1360,1363,1364,1367,1368,1371],{},"Pull request CI for ",[153,1357,158],{"href":155,"rel":1358},[157]," passed on GitHub's ",[134,1361,1362],{},"ubuntu-24.04"," runners (Linux x86_64) for commit ",[134,1365,1366],{},"8f9e222",", with version ",[134,1369,1370],{},"0.2.0-SNAPSHOT",":",[103,1373,1374,1389,1397],{},[106,1375,1376,1377,1382,1383,420,1385,1388],{},"The ",[153,1378,1381],{"href":1379,"rel":1380},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39075718558",[157],"Scala.js libraries workflow",": the Node tests, every Scala test suite, production linking of both demo applications, ",[134,1384,446],{},[134,1386,1387],{},"check-release.mjs --allow-snapshot",", and the four fresh Maven consumers.",[106,1390,1376,1391,1396],{},[153,1392,1395],{"href":1393,"rel":1394},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39075718554",[157],"Nuxt build tooling workflow",": package tests and the packed-archive check on Node 22.18.0 and 24, and the Nuxt 4.3.1 development and production HTTP checks.",[106,1398,1376,1399,1404],{},[153,1400,1403],{"href":1401,"rel":1402},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39075718873",[157],"documentation website workflow",".",[99,1406,1407,1408,1410,1411,1367,1414,574,1416,420,1421,165,1426,1404],{},"The same workflows passed again on the merge commit ",[134,1409,150],{}," on ",[134,1412,1413],{},"main",[134,1415,140],{},[153,1417,1420],{"href":1418,"rel":1419},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144782174",[157],"Scala.js libraries",[153,1422,1425],{"href":1423,"rel":1424},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144782180",[157],"Nuxt build tooling",[153,1427,1430],{"href":1428,"rel":1429},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144782493",[157],"documentation website",[921,1432,1434],{"id":1433},"release-workflows","Release workflows",[99,1436,1437,1438,1440],{},"Both tags point at ",[134,1439,150],{},". The workflows ran on GitHub's Linux x86_64 runners, and the npm release finished before the Maven release started.",[103,1442,1443,1466],{},[106,1444,1376,1445,1450,1451,1454,1455,1457,1458,1461,1462,1465],{},[153,1446,1449],{"href":1447,"rel":1448},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144809255",[157],"npm release workflow"," for ",[134,1452,1453],{},"npm-v0.2.0-alpha.1",": package tests and the packed-archive check on Node 22.18.0 and 24, then the packed module in a Nuxt 4.3.1 project with development and production HTTP checks. It published ",[134,1456,309],{},", downloaded it again with registry authentication, and required the download to be byte-identical to the tested archive before an offline install checked the CLI and the JavaScript entry points. The ",[153,1459,170],{"href":168,"rel":1460},[157]," attaches that archive and ",[134,1463,1464],{},"registry.json"," with its registry location and integrity.",[106,1467,1376,1468,1450,1473,1476,1477,1480,1481,1485],{},[153,1469,1472],{"href":1470,"rel":1471},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39145732257",[157],"Maven release workflow",[134,1474,1475],{},"v0.2.0-alpha.1",": the validation job (development integration, every Scala test suite, production linking, publication metadata, and the four fresh consumers from a staged repository), then publication of the nine artifacts to GitHub Packages. ",[134,1478,1479],{},"node scripts\u002Fcheck-consumers.mjs --published"," then resolved the Kyo, ZIO, Kyo Schema and ZIO Schema consumers from the authenticated registry, and each one served real h3 requests. The ",[153,1482,1484],{"href":162,"rel":1483},[157],"prerelease"," was created only after that check passed.",[921,1487,1489],{"id":1488},"downstream-consumer","Downstream consumer",[99,1491,1492,1493,1496,1497,1502,1503,420,1506,619,1509,1512,1513,1515,1516,1518,1519,1524,1525,1528],{},"The private ",[134,1494,1495],{},"yurian.land"," application consumes the published packages in its pull request ",[153,1498,1501],{"href":1499,"rel":1500},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fyurian.land\u002Fpull\u002F15",[157],"#15",". It resolves ",[134,1504,1505],{},"kyo-h3-ext",[134,1507,1508],{},"kyo-nuxthub-ext",[134,1510,1511],{},"native-converter-kyo-schema-ext"," ",[134,1514,140],{}," from GitHub Packages and installs ",[134,1517,309],{}," with Nuxt 4.4.2. Its ",[153,1520,1523],{"href":1521,"rel":1522},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fyurian.land\u002Factions\u002Fruns\u002F39147055600",[157],"CI run"," for commit ",[134,1526,1527],{},"0337ccb"," passed on GitHub's Ubuntu 24.04 runner: Node and Scala tests, a production Nuxt build, and API checks against PostgreSQL 16 and Redis. This is evidence for one Kyo application, not for the ZIO modules or other Nuxt setups.",[272,1530,1532],{"id":1531},"untested","Untested",[178,1534,1535,1545],{},[181,1536,1537],{},[184,1538,1539,1542],{},[187,1540,1541],{},"Area",[187,1543,1544],{},"Status",[194,1546,1547,1558,1572,1586,1599,1663,1671,1679,1687,1695],{},[184,1548,1549,1555],{},[199,1550,1551,1552,1554],{},"Relinking the real Scala.js demo under ",[134,1553,630],{},", and breakpoint stepping",[199,1556,1557],{},"Not checked (the relink reload was checked on a synthetic project)",[184,1559,1560,1566],{},[199,1561,1562,1563,1565],{},"The Nitro close hook when ",[134,1564,630],{}," replaces its worker",[199,1567,1568,1569,1571],{},"Not checked; ",[134,1570,580],{}," in production was",[184,1573,1574,1580],{},[199,1575,1576,1577],{},"kyo-sql \u002F kyo-sql-postgres inside Nitro, including ",[134,1578,1579],{},"KYO_NET_BACKEND=node",[199,1581,1582,1583,1585],{},"Not run. The ",[153,1584,819],{"href":44}," service code ran against PostgreSQL 16 in Node through sbt (see above), not in a Nitro bundle ",[184,1587,1588,1593],{},[199,1589,1590,1591],{},"kyo-sql guide code vs ",[134,1592,706],{},[199,1594,1595,1596,1598],{},"Copied by hand; no check keeps them identical (byte-identical on 2026-10-19). The ",[134,1597,1208],{}," CI job compiles and runs the suite, not the guide ",[184,1600,1601,1604],{},[199,1602,1603],{},"PostgreSQL in CI",[199,1605,1376,1606,1608,1609,1611,1612,165,1614,1616,1617,1619,1620,1623,1624,1629,1630,1632,1633,1636,1637,1642,1643,1646,1647,1649,1650,1653,1654,1656,1657,1659,1660,1662],{},[134,1607,1208],{}," job of the Scala.js libraries workflow runs PostgreSQL 16 with SCRAM, the kyo-sql suite (",[134,1610,852],{},", so it cannot skip), a check that the suite left no rows, the demo's production build, ",[134,1613,610],{},[134,1615,580],{}," session check. It runs on pull requests and pushes to ",[134,1618,1413],{}," that touch the libraries or the example. It skips release tags (",[134,1621,1622],{},"release.yml"," reuses this workflow), so it does not gate a release. Its first run on ",[153,1625,1628],{"href":1626,"rel":1627},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fpull\u002F45",[157],"#45"," failed: the ",[134,1631,580],{}," check counted PostgreSQL's logical replication launcher, which runs as the bootstrap superuser ",[134,1634,1635],{},"h34s"," in the job's container. The ",[153,1638,1641],{"href":1639,"rel":1640},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39277276171\u002Fjob\u002F118144813255",[157],"corrected job"," passed on ",[134,1644,1645],{},"042cef3"," on GitHub's ",[134,1648,1362],{}," runner: the suite 5 of 5 with 0 rows left, ",[134,1651,1652],{},"pnpm build"," in 1:43, ",[134,1655,610],{},", and 4 sessions before ",[134,1658,580],{},", exit status 0, 0 after. No run on ",[134,1661,1413],{}," or a release tag yet ",[184,1664,1665,1668],{},[199,1666,1667],{},"NuxtHub KV as a Nitro storage mount",[199,1669,1670],{},"Not verified; storage tests use Unstorage 1.17.3's memory driver",[184,1672,1673,1676],{},[199,1674,1675],{},"Nitro presets other than Node (serverless, edge, Workers)",[199,1677,1678],{},"Not tested; streaming needs a Node HTTP response",[184,1680,1681,1684],{},[199,1682,1683],{},"Linux beyond the CI checks above, Windows",[199,1685,1686],{},"Not run",[184,1688,1689,1692],{},[199,1690,1691],{},"Nix \u002F NixOS",[199,1693,1694],{},"No Nix profile exists yet",[184,1696,1697,1700],{},[199,1698,1699],{},"Other Scala, Kyo, ZIO or h3 versions",[199,1701,1702],{},"Not supported; Kyo 1.0.0-RC7 needs Scala 3.9.0 and JDK 25",[272,1704,1706],{"id":1705},"known-gaps","Known gaps",[103,1708,1709,1719,1735,1748],{},[106,1710,1711,1714,1715,1718],{},[109,1712,1713],{},"ZIO YAML on Scala.js."," zio-json-yaml is published for the JVM only (no ",[134,1716,1717],{},"_sjs1_3"," artifact on Maven Central), so a ZIO model has no YAML codec in Nitro. Kyo models get YAML from kyo-schema-yaml.",[106,1720,1721,1724,1725,420,1728,1731,1732,1404],{},[109,1722,1723],{},"ZIO Schema shapes."," The ZIO bridge supports strings, booleans, ",[134,1726,1727],{},"Int",[134,1729,1730],{},"Double",", records, options, sequences, lazy and transformed schemas. Enums, sealed traits and maps are not supported yet. See ",[153,1733,1734],{"href":40},"schemas",[106,1736,1737,1740,1741,1744,1745,1404],{},[109,1738,1739],{},"Finalizer failures"," are logged and do not change the response, in Kyo and in ZIO. Before the next release (provisionally ",[134,1742,1743],{},"0.3.0-alpha.1","), a dying ZIO finalizer turned a value response into a 500. See ",[153,1746,1747],{"href":36},"lifetimes",[106,1749,1750,1753,1754,1756,1757,1759,1760,1762,1763,1765,1766,1770],{},[109,1751,1752],{},"Build memory."," The demo's ",[134,1755,546],{}," keeps ",[134,1758,747],{},". Nitro bundles the linked Scala.js twice (once for the prerendered Nuxt Content route, once for the server) with its source maps. Without ",[134,1761,864],{},", a 4096 MiB heap limit runs out of memory, and a 6144 MiB limit passed in one run. The demo now sets ",[134,1764,864],{},": with it, a 4096 MiB limit passed. With an equivalent temporary hook, Node's 2240 MiB default on a 15.7 GiB cloud VM ran out of memory. Without the prerendered route, without server source maps, or with one application, the build also passed with a 4096 MiB heap limit; see the ",[153,1767,1769],{"href":1768},"#heap-measurement-2026-10-19","heap measurement",". The scripts keep 8 GiB as a margin. A single-runtime application links less code, but check your own build. ",[129,1772,132,1774,1777],{"id":1773},"profile-alpha-010-published",[134,1775,1776],{},"alpha-0.1.0"," (published)",[99,1779,1780,1781,1784,1785,1788],{},"The published ",[134,1782,1783],{},"0.1.0-alpha.1"," release, with the older API and two independent runtimes. See the ",[153,1786,1787],{"href":91},"migration guide"," to move off it.",[178,1790,1791,1799],{},[181,1792,1793],{},[184,1794,1795,1797],{},[187,1796,189],{},[187,1798,192],{},[194,1800,1801,1812,1820,1828,1836],{},[184,1802,1803,1805],{},[199,1804,201],{},[199,1806,1807,1808,208,1810,211],{},"eleven ",[134,1809,207],{},[134,1811,1783],{},[184,1813,1814,1817],{},[199,1815,1816],{},"Scala",[199,1818,1819],{},"3.5.2 for native and ZIO modules; 3.9.0 for Kyo modules",[184,1821,1822,1825],{},[199,1823,1824],{},"Scala.js \u002F Kyo \u002F ZIO",[199,1826,1827],{},"1.22.0 \u002F 1.0.0-RC7 \u002F 2.1.23",[184,1829,1830,1833],{},[199,1831,1832],{},"Build JDK \u002F sbt",[199,1834,1835],{},"25 \u002F 1.11.7",[184,1837,1838,1840],{},[199,1839,304],{},[199,1841,1842,1845],{},[134,1843,1844],{},"@yuri4n\u002Fh34s-nuxt@0.1.0-alpha.1",", Node 22.18 or later, Nuxt 4.3.1 or 4.4.2",[99,1847,1848,1849,1853,1854,1858],{},"CI-validated: the ",[153,1850,1472],{"href":1851,"rel":1852},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F38779659501",[157]," checked authenticated ZIO, Kyo and Schema consumers on Linux x86_64. The ",[153,1855,1449],{"href":1856,"rel":1857},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F38937318206",[157]," checked the registry archive in an offline consumer. Nuxt 4.3.1 passed the packed-package HTTP checks in CI; Nuxt 4.4.2 passed them locally on Linux x86_64 with Node 24.19.0.",[129,1860,1862],{"id":1861},"nix","Nix",[99,1864,1865],{},"No Nix profile exists. When one does, record its lock revision in the profile, run the same sbt\u002Fpnpm pipeline inside it, and validate the packaged Node application. A working development shell alone does not establish reproducible builds.",[129,1867,1869],{"id":1868},"add-a-profile","Add a profile",[99,1871,1872],{},"Add a row only with exact versions, a platform and evidence. Promote a profile to \"supported\" only after CI runs its compilation, handler tests, optional integrations and consumer setup, and link those runs here.",{"title":1874,"searchDepth":1875,"depth":1875,"links":1876},"",2,[1877,1886,1888,1889],{"id":131,"depth":1875,"text":1878,"children":1879},"Profile alpha-0.2.0 (0.2.0-alpha.1, published)",[1880,1882,1883,1884,1885],{"id":313,"depth":1881,"text":314},3,{"id":691,"depth":1881,"text":692},{"id":1351,"depth":1881,"text":1352},{"id":1531,"depth":1881,"text":1532},{"id":1705,"depth":1881,"text":1706},{"id":1773,"depth":1875,"text":1887},"Profile alpha-0.1.0 (published)",{"id":1861,"depth":1875,"text":1862},{"id":1868,"depth":1875,"text":1869},"Tested profiles with their evidence, kept apart into locally verified, CI-validated and untested combinations.","md",null,{},true,{"title":86,"description":1890},"cF-IMbTU3o-bXHhx7qpsDJG4y8gjQzqzyN53CPuETqI",[1898,1900],{"title":82,"path":83,"stem":84,"description":1899,"children":-1},"Published versions, registry access and installation, what 0.2.0-alpha.1 provides, and what was verified.",{"title":90,"path":91,"stem":92,"description":1901,"children":-1},"Every removed or renamed API with its replacement, the new wire format, and the new toolchain.",1792533383165]