[{"data":1,"prerenderedAt":1202},["ShallowReactive",2],{"navigation_docs":3,"-api-docs-scalar":172,"-api-docs-scalar-surround":1197},[4,26,67,98,124,140,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Core","i-lucide-box","\u002Fcore","2.core",[32,37,42,47,52,57,62],{"title":33,"path":34,"stem":35,"icon":36},"Routing","\u002Fcore\u002Frouting","2.core\u002F1.routing","i-lucide-route",{"title":38,"path":39,"stem":40,"icon":41},"Handlers","\u002Fcore\u002Fhandlers","2.core\u002F2.handlers","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Request Binding","\u002Fcore\u002Frequest-binding","2.core\u002F3.request-binding","i-lucide-tags",{"title":48,"path":49,"stem":50,"icon":51},"Validation","\u002Fcore\u002Fvalidation","2.core\u002F4.validation","i-lucide-check-check",{"title":53,"path":54,"stem":55,"icon":56},"Context","\u002Fcore\u002Fcontext","2.core\u002F5.context","i-lucide-file-input",{"title":58,"path":59,"stem":60,"icon":61},"Errors","\u002Fcore\u002Ferrors","2.core\u002F6.errors","i-lucide-triangle-alert",{"title":63,"path":64,"stem":65,"icon":66},"Middleware","\u002Fcore\u002Fmiddleware","2.core\u002F7.middleware","i-lucide-layers",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":25},"Auth","i-lucide-shield-check","\u002Fauth","3.auth",[73,78,83,88,93],{"title":74,"path":75,"stem":76,"icon":77},"Overview","\u002Fauth\u002Foverview","3.auth\u002F1.overview","i-lucide-shield",{"title":79,"path":80,"stem":81,"icon":82},"Auth Rules","\u002Fauth\u002Fauth-rules","3.auth\u002F2.auth-rules","i-lucide-lock",{"title":84,"path":85,"stem":86,"icon":87},"JWT Providers","\u002Fauth\u002Fjwt-providers","3.auth\u002F3.jwt-providers","i-lucide-key",{"title":89,"path":90,"stem":91,"icon":92},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F4.roles-and-permissions","i-lucide-users",{"title":94,"path":95,"stem":96,"icon":97},"Audit Logging","\u002Fauth\u002Faudit-logging","3.auth\u002F5.audit-logging","i-lucide-scroll-text",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":25},"GoTrue","i-lucide-key-round","\u002Fgotrue","4.gotrue",[104,109,114,119],{"title":105,"path":106,"stem":107,"icon":108},"Proxy","\u002Fgotrue\u002Fproxy","4.gotrue\u002F1.proxy","i-lucide-shuffle",{"title":110,"path":111,"stem":112,"icon":113},"Endpoints","\u002Fgotrue\u002Fendpoints","4.gotrue\u002F2.endpoints","i-lucide-list",{"title":115,"path":116,"stem":117,"icon":118},"Client IP & Rate Limits","\u002Fgotrue\u002Fclient-ip-and-rate-limits","4.gotrue\u002F3.client-ip-and-rate-limits","i-lucide-network",{"title":120,"path":121,"stem":122,"icon":123},"Deployment","\u002Fgotrue\u002Fdeployment","4.gotrue\u002F4.deployment","i-lucide-server",{"title":125,"icon":126,"path":127,"stem":128,"children":129,"page":25},"API Docs","i-lucide-file-text","\u002Fapi-docs","5.api-docs",[130,135],{"title":131,"path":132,"stem":133,"icon":134},"OpenAPI","\u002Fapi-docs\u002Fopenapi","5.api-docs\u002F1.openapi","i-lucide-file-json",{"title":136,"path":137,"stem":138,"icon":139},"Scalar UI","\u002Fapi-docs\u002Fscalar","5.api-docs\u002F2.scalar","i-lucide-book-open-text",{"title":141,"icon":142,"path":143,"stem":144,"children":145,"page":25},"Guides","i-lucide-compass","\u002Fguides","6.guides",[146,151,156],{"title":147,"path":148,"stem":149,"icon":150},"Testing","\u002Fguides\u002Ftesting","6.guides\u002F1.testing","i-lucide-flask-conical",{"title":152,"path":153,"stem":154,"icon":155},"Performance","\u002Fguides\u002Fperformance","6.guides\u002F2.performance","i-lucide-gauge",{"title":157,"path":158,"stem":159,"icon":160},"Releasing","\u002Fguides\u002Freleasing","6.guides\u002F3.releasing","i-lucide-tag",{"title":162,"icon":163,"path":164,"stem":165,"children":166,"page":25},"Reference","i-lucide-code","\u002Freference","7.reference",[167],{"title":168,"path":169,"stem":170,"icon":171},"API Reference","\u002Freference\u002Fapi-reference","7.reference\u002F1.api-reference","i-lucide-list-tree",{"id":173,"title":136,"body":174,"description":1190,"extension":1191,"links":1192,"meta":1193,"navigation":1194,"path":137,"seo":1195,"stem":138,"__hash__":1196},"docs\u002F5.api-docs\u002F2.scalar.md",{"type":175,"value":176,"toc":1181},"minimark",[177,193,198,233,285,292,296,449,611,617,621,684,687,691,694,697,766,769,907,916,920,929,1023,1026,1140,1144,1156,1159,1163,1177],[178,179,180,184,185,192],"p",{},[181,182,183],"code",{},"openapi.SetupDocsEndpoints"," serves a ",[186,187,191],"a",{"href":188,"rel":189},"https:\u002F\u002Fscalar.com",[190],"nofollow","Scalar"," reference page that reads your generated spec. Readers get a searchable endpoint list, request and response schemas, and a client for trying calls.",[194,195,197],"h2",{"id":196},"serve-it","Serve it",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","openapi.SetupDocsEndpoints(app)\n","go","",[181,206,207],{"__ignoreMap":204},[208,209,212,216,220,224,227,230],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"sTEyZ","openapi",[208,217,219],{"class":218},"sMK4o",".",[208,221,223],{"class":222},"s2Zo4","SetupDocsEndpoints",[208,225,226],{"class":218},"(",[208,228,229],{"class":214},"app",[208,231,232],{"class":218},")\n",[234,235,236,249],"table",{},[237,238,239],"thead",{},[240,241,242,246],"tr",{},[243,244,245],"th",{},"Path",[243,247,248],{},"Contents",[250,251,252,263,273],"tbody",{},[240,253,254,260],{},[255,256,257],"td",{},[181,258,259],{},"\u002Fdocs",[255,261,262],{},"The Scalar reference page",[240,264,265,270],{},[255,266,267],{},[181,268,269],{},"\u002Fopenapi.json",[255,271,272],{},"The generated document",[240,274,275,280],{},[255,276,277],{},[181,278,279],{},"\u002Fdocs\u002F",[255,281,282,283],{},"A permanent redirect to ",[181,284,259],{},[178,286,287,288,291],{},"All three are registered ",[181,289,290],{},"Public()",", so they work without a token even when the rest of the app requires one.",[194,293,295],{"id":294},"configure-it","Configure it",[199,297,299],{"className":201,"code":298,"language":203,"meta":204,"style":204},"openapi.SetupDocsEndpoints(app, openapi.ScalarConfig{\n    Title:       \"Orders API\",\n    Theme:       \"deepSpace\",\n    Layout:      \"modern\",\n    DarkMode:    true,\n    ShowSidebar: true,\n    HideModels:  false,\n    FavIcon:     \"\u002Ffavicon.ico\",\n})\n",[181,300,301,328,350,367,385,399,412,425,443],{"__ignoreMap":204},[208,302,303,305,307,309,311,313,316,320,322,325],{"class":210,"line":211},[208,304,215],{"class":214},[208,306,219],{"class":218},[208,308,223],{"class":222},[208,310,226],{"class":218},[208,312,229],{"class":214},[208,314,315],{"class":218},",",[208,317,319],{"class":318},"sBMFI"," openapi",[208,321,219],{"class":218},[208,323,324],{"class":318},"ScalarConfig",[208,326,327],{"class":218},"{\n",[208,329,331,334,337,340,344,347],{"class":210,"line":330},2,[208,332,333],{"class":214},"    Title",[208,335,336],{"class":218},":",[208,338,339],{"class":218},"       \"",[208,341,343],{"class":342},"sfazB","Orders API",[208,345,346],{"class":218},"\"",[208,348,349],{"class":218},",\n",[208,351,353,356,358,360,363,365],{"class":210,"line":352},3,[208,354,355],{"class":214},"    Theme",[208,357,336],{"class":218},[208,359,339],{"class":218},[208,361,362],{"class":342},"deepSpace",[208,364,346],{"class":218},[208,366,349],{"class":218},[208,368,370,373,375,378,381,383],{"class":210,"line":369},4,[208,371,372],{"class":214},"    Layout",[208,374,336],{"class":218},[208,376,377],{"class":218},"      \"",[208,379,380],{"class":342},"modern",[208,382,346],{"class":218},[208,384,349],{"class":218},[208,386,388,391,393,397],{"class":210,"line":387},5,[208,389,390],{"class":214},"    DarkMode",[208,392,336],{"class":218},[208,394,396],{"class":395},"sfNiH","    true",[208,398,349],{"class":218},[208,400,402,405,407,410],{"class":210,"line":401},6,[208,403,404],{"class":214},"    ShowSidebar",[208,406,336],{"class":218},[208,408,409],{"class":395}," true",[208,411,349],{"class":218},[208,413,415,418,420,423],{"class":210,"line":414},7,[208,416,417],{"class":214},"    HideModels",[208,419,336],{"class":218},[208,421,422],{"class":395},"  false",[208,424,349],{"class":218},[208,426,428,431,433,436,439,441],{"class":210,"line":427},8,[208,429,430],{"class":214},"    FavIcon",[208,432,336],{"class":218},[208,434,435],{"class":218},"     \"",[208,437,438],{"class":342},"\u002Ffavicon.ico",[208,440,346],{"class":218},[208,442,349],{"class":218},[208,444,446],{"class":210,"line":445},9,[208,447,448],{"class":218},"})\n",[234,450,451,464],{},[237,452,453],{},[240,454,455,458,461],{},[243,456,457],{},"Field",[243,459,460],{},"Values",[243,462,463],{},"Default",[250,465,466,481,524,542,557,572,586,599],{},[240,467,468,473,476],{},[255,469,470],{},[181,471,472],{},"Title",[255,474,475],{},"Any string, used as the page title",[255,477,478],{},[181,479,480],{},"API Documentation",[240,482,483,488,520],{},[255,484,485],{},[181,486,487],{},"Theme",[255,489,490,493,494,493,497,493,500,493,503,493,506,493,509,493,512,493,515,493,518],{},[181,491,492],{},"default",", ",[181,495,496],{},"alternate",[181,498,499],{},"moon",[181,501,502],{},"purple",[181,504,505],{},"solarized",[181,507,508],{},"bluePlanet",[181,510,511],{},"saturn",[181,513,514],{},"kepler",[181,516,517],{},"mars",[181,519,362],{},[255,521,522],{},[181,523,492],{},[240,525,526,531,538],{},[255,527,528],{},[181,529,530],{},"Layout",[255,532,533,493,535],{},[181,534,380],{},[181,536,537],{},"classic",[255,539,540],{},[181,541,380],{},[240,543,544,549,552],{},[255,545,546],{},[181,547,548],{},"DarkMode",[255,550,551],{},"bool",[255,553,554],{},[181,555,556],{},"false",[240,558,559,564,566],{},[255,560,561],{},[181,562,563],{},"ShowSidebar",[255,565,551],{},[255,567,568,571],{},[181,569,570],{},"true"," in the default config",[240,573,574,579,582],{},[255,575,576],{},[181,577,578],{},"HideModels",[255,580,581],{},"bool, hides the schema list",[255,583,584],{},[181,585,556],{},[240,587,588,593,596],{},[255,589,590],{},[181,591,592],{},"CustomCSS",[255,594,595],{},"CSS injected into the page",[255,597,598],{},"empty",[240,600,601,606,609],{},[255,602,603],{},[181,604,605],{},"FavIcon",[255,607,608],{},"URL of a favicon",[255,610,598],{},[178,612,613,616],{},[181,614,615],{},"openapi.DefaultScalarConfig()"," returns the defaults if you want to start from them and change one field.",[194,618,620],{"id":619},"use-custom-paths","Use custom paths",[199,622,624],{"className":201,"code":623,"language":203,"meta":204,"style":204},"openapi.ServeScalar(app, \"\u002Fopenapi.json\", \"\u002Freference\", openapi.ScalarConfig{\n    Title: \"Orders API\",\n})\n",[181,625,626,666,680],{"__ignoreMap":204},[208,627,628,630,632,635,637,639,641,644,646,648,650,652,654,656,658,660,662,664],{"class":210,"line":211},[208,629,215],{"class":214},[208,631,219],{"class":218},[208,633,634],{"class":222},"ServeScalar",[208,636,226],{"class":218},[208,638,229],{"class":214},[208,640,315],{"class":218},[208,642,643],{"class":218}," \"",[208,645,269],{"class":342},[208,647,346],{"class":218},[208,649,315],{"class":218},[208,651,643],{"class":218},[208,653,164],{"class":342},[208,655,346],{"class":218},[208,657,315],{"class":218},[208,659,319],{"class":318},[208,661,219],{"class":218},[208,663,324],{"class":318},[208,665,327],{"class":218},[208,667,668,670,672,674,676,678],{"class":210,"line":330},[208,669,333],{"class":214},[208,671,336],{"class":218},[208,673,643],{"class":218},[208,675,343],{"class":342},[208,677,346],{"class":218},[208,679,349],{"class":218},[208,681,682],{"class":210,"line":352},[208,683,448],{"class":218},[178,685,686],{},"The first path serves the spec, the second serves the UI. The UI fetches the spec path from the browser, so it has to be reachable by whoever opens the page.",[194,688,690],{"id":689},"restrict-who-can-read-the-docs","Restrict who can read the docs",[178,692,693],{},"Public docs are convenient internally and often unwanted in production. Two straightforward options.",[178,695,696],{},"Serve them only outside production:",[199,698,700],{"className":201,"code":699,"language":203,"meta":204,"style":204},"if os.Getenv(\"APP_ENV\") != \"production\" {\n    openapi.SetupDocsEndpoints(app, cfg)\n}\n",[181,701,702,741,761],{"__ignoreMap":204},[208,703,704,708,711,713,716,718,720,723,725,728,731,733,736,738],{"class":210,"line":211},[208,705,707],{"class":706},"s7zQu","if",[208,709,710],{"class":214}," os",[208,712,219],{"class":218},[208,714,715],{"class":222},"Getenv",[208,717,226],{"class":218},[208,719,346],{"class":218},[208,721,722],{"class":342},"APP_ENV",[208,724,346],{"class":218},[208,726,727],{"class":218},")",[208,729,730],{"class":218}," !=",[208,732,643],{"class":218},[208,734,735],{"class":342},"production",[208,737,346],{"class":218},[208,739,740],{"class":218}," {\n",[208,742,743,746,748,750,752,754,756,759],{"class":210,"line":330},[208,744,745],{"class":214},"    openapi",[208,747,219],{"class":218},[208,749,223],{"class":222},[208,751,226],{"class":218},[208,753,229],{"class":214},[208,755,315],{"class":218},[208,757,758],{"class":214}," cfg",[208,760,232],{"class":218},[208,762,763],{"class":210,"line":352},[208,764,765],{"class":218},"}\n",[178,767,768],{},"Or gate them with middleware on a group, keeping the paths but requiring a credential:",[199,770,772],{"className":201,"code":771,"language":203,"meta":204,"style":204},"docs := app.Group(\"\u002Finternal\").Use(basicAuth(os.Getenv(\"DOCS_USER\"), os.Getenv(\"DOCS_PASS\")))\ndocs.GET(\"\u002Fopenapi.json\", specHandler).Public()\ndocs.GET(\"\u002Fdocs\", uiHandler).Public()\n",[181,773,774,849,880],{"__ignoreMap":204},[208,775,776,779,782,785,787,790,792,794,797,799,802,805,807,810,812,815,817,819,821,823,826,828,831,833,835,837,839,841,844,846],{"class":210,"line":211},[208,777,778],{"class":214},"docs ",[208,780,781],{"class":218},":=",[208,783,784],{"class":214}," app",[208,786,219],{"class":218},[208,788,789],{"class":222},"Group",[208,791,226],{"class":218},[208,793,346],{"class":218},[208,795,796],{"class":342},"\u002Finternal",[208,798,346],{"class":218},[208,800,801],{"class":218},").",[208,803,804],{"class":222},"Use",[208,806,226],{"class":218},[208,808,809],{"class":222},"basicAuth",[208,811,226],{"class":218},[208,813,814],{"class":214},"os",[208,816,219],{"class":218},[208,818,715],{"class":222},[208,820,226],{"class":218},[208,822,346],{"class":218},[208,824,825],{"class":342},"DOCS_USER",[208,827,346],{"class":218},[208,829,830],{"class":218},"),",[208,832,710],{"class":214},[208,834,219],{"class":218},[208,836,715],{"class":222},[208,838,226],{"class":218},[208,840,346],{"class":218},[208,842,843],{"class":342},"DOCS_PASS",[208,845,346],{"class":218},[208,847,848],{"class":218},")))\n",[208,850,851,854,856,859,861,863,865,867,869,872,874,877],{"class":210,"line":330},[208,852,853],{"class":214},"docs",[208,855,219],{"class":218},[208,857,858],{"class":222},"GET",[208,860,226],{"class":218},[208,862,346],{"class":218},[208,864,269],{"class":342},[208,866,346],{"class":218},[208,868,315],{"class":218},[208,870,871],{"class":214}," specHandler",[208,873,801],{"class":218},[208,875,876],{"class":222},"Public",[208,878,879],{"class":218},"()\n",[208,881,882,884,886,888,890,892,894,896,898,901,903,905],{"class":210,"line":352},[208,883,853],{"class":214},[208,885,219],{"class":218},[208,887,858],{"class":222},[208,889,226],{"class":218},[208,891,346],{"class":218},[208,893,259],{"class":342},[208,895,346],{"class":218},[208,897,315],{"class":218},[208,899,900],{"class":214}," uiHandler",[208,902,801],{"class":218},[208,904,876],{"class":222},[208,906,879],{"class":218},[178,908,909,910,912,913,219],{},"Because ",[181,911,634],{}," registers on the app rather than a group, this variant means writing the two small handlers yourself, as shown in ",[186,914,131],{"href":915},"\u002Fapi-docs\u002Fopenapi#set-the-document-title-and-servers",[194,917,919],{"id":918},"style-it","Style it",[178,921,922,924,925,928],{},[181,923,592],{}," is injected into a ",[181,926,927],{},"\u003Cstyle>"," tag, which is enough to match a brand:",[199,930,932],{"className":201,"code":931,"language":203,"meta":204,"style":204},"openapi.SetupDocsEndpoints(app, openapi.ScalarConfig{\n    Title:    \"Orders API\",\n    DarkMode: true,\n    CustomCSS: `\n        :root {\n            --scalar-color-accent: #00add8;\n            --scalar-font: \"Inter\", system-ui, sans-serif;\n        }\n    `,\n})\n",[181,933,934,956,971,981,991,996,1001,1006,1011,1018],{"__ignoreMap":204},[208,935,936,938,940,942,944,946,948,950,952,954],{"class":210,"line":211},[208,937,215],{"class":214},[208,939,219],{"class":218},[208,941,223],{"class":222},[208,943,226],{"class":218},[208,945,229],{"class":214},[208,947,315],{"class":218},[208,949,319],{"class":318},[208,951,219],{"class":218},[208,953,324],{"class":318},[208,955,327],{"class":218},[208,957,958,960,962,965,967,969],{"class":210,"line":330},[208,959,333],{"class":214},[208,961,336],{"class":218},[208,963,964],{"class":218},"    \"",[208,966,343],{"class":342},[208,968,346],{"class":218},[208,970,349],{"class":218},[208,972,973,975,977,979],{"class":210,"line":352},[208,974,390],{"class":214},[208,976,336],{"class":218},[208,978,409],{"class":395},[208,980,349],{"class":218},[208,982,983,986,988],{"class":210,"line":369},[208,984,985],{"class":214},"    CustomCSS",[208,987,336],{"class":218},[208,989,990],{"class":218}," `\n",[208,992,993],{"class":210,"line":387},[208,994,995],{"class":342},"        :root {\n",[208,997,998],{"class":210,"line":401},[208,999,1000],{"class":342},"            --scalar-color-accent: #00add8;\n",[208,1002,1003],{"class":210,"line":414},[208,1004,1005],{"class":342},"            --scalar-font: \"Inter\", system-ui, sans-serif;\n",[208,1007,1008],{"class":210,"line":427},[208,1009,1010],{"class":342},"        }\n",[208,1012,1013,1016],{"class":210,"line":445},[208,1014,1015],{"class":218},"    `",[208,1017,349],{"class":218},[208,1019,1021],{"class":210,"line":1020},10,[208,1022,448],{"class":218},[178,1024,1025],{},"Helper functions exist for building a config in steps:",[199,1027,1029],{"className":201,"code":1028,"language":203,"meta":204,"style":204},"cfg := openapi.DefaultScalarConfig()\nopenapi.ApplyScalarOptions(&cfg,\n    openapi.WithCustomTheme(\"moon\"),\n    openapi.WithDarkMode(true),\n    openapi.WithLayout(\"classic\"),\n)\nopenapi.SetupDocsEndpoints(app, cfg)\n",[181,1030,1031,1047,1064,1084,1099,1118,1122],{"__ignoreMap":204},[208,1032,1033,1036,1038,1040,1042,1045],{"class":210,"line":211},[208,1034,1035],{"class":214},"cfg ",[208,1037,781],{"class":218},[208,1039,319],{"class":214},[208,1041,219],{"class":218},[208,1043,1044],{"class":222},"DefaultScalarConfig",[208,1046,879],{"class":218},[208,1048,1049,1051,1053,1056,1059,1062],{"class":210,"line":330},[208,1050,215],{"class":214},[208,1052,219],{"class":218},[208,1054,1055],{"class":222},"ApplyScalarOptions",[208,1057,1058],{"class":218},"(&",[208,1060,1061],{"class":214},"cfg",[208,1063,349],{"class":218},[208,1065,1066,1068,1070,1073,1075,1077,1079,1081],{"class":210,"line":352},[208,1067,745],{"class":214},[208,1069,219],{"class":218},[208,1071,1072],{"class":222},"WithCustomTheme",[208,1074,226],{"class":218},[208,1076,346],{"class":218},[208,1078,499],{"class":342},[208,1080,346],{"class":218},[208,1082,1083],{"class":218},"),\n",[208,1085,1086,1088,1090,1093,1095,1097],{"class":210,"line":369},[208,1087,745],{"class":214},[208,1089,219],{"class":218},[208,1091,1092],{"class":222},"WithDarkMode",[208,1094,226],{"class":218},[208,1096,570],{"class":395},[208,1098,1083],{"class":218},[208,1100,1101,1103,1105,1108,1110,1112,1114,1116],{"class":210,"line":387},[208,1102,745],{"class":214},[208,1104,219],{"class":218},[208,1106,1107],{"class":222},"WithLayout",[208,1109,226],{"class":218},[208,1111,346],{"class":218},[208,1113,537],{"class":342},[208,1115,346],{"class":218},[208,1117,1083],{"class":218},[208,1119,1120],{"class":210,"line":401},[208,1121,232],{"class":218},[208,1123,1124,1126,1128,1130,1132,1134,1136,1138],{"class":210,"line":414},[208,1125,215],{"class":214},[208,1127,219],{"class":218},[208,1129,223],{"class":222},[208,1131,226],{"class":218},[208,1133,229],{"class":214},[208,1135,315],{"class":218},[208,1137,758],{"class":214},[208,1139,232],{"class":218},[194,1141,1143],{"id":1142},"know-the-constraints","Know the constraints",[1145,1146,1147,1148,1151,1152,1155],"warning",{},"The page loads the Scalar bundle from ",[181,1149,1150],{},"cdn.jsdelivr.net",". A machine with no internet access, or a strict ",[181,1153,1154],{},"Content-Security-Policy",", will render an empty page. If either applies, serve the spec with ezz and host the viewer yourself, or vendor the bundle and serve it from your own static assets.",[178,1157,1158],{},"The spec is regenerated on every request to the spec path. That is fine for a documentation endpoint, but do not put it on a hot path or a health check.",[194,1160,1162],{"id":1161},"next-steps","Next steps",[1164,1165,1166,1172],"ul",{},[1167,1168,1169,1171],"li",{},[186,1170,131],{"href":132}," for what goes into the document.",[1167,1173,1174,1176],{},[186,1175,147],{"href":148}," for asserting the spec in CI.",[1178,1179,1180],"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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":204,"searchDepth":330,"depth":330,"links":1182},[1183,1184,1185,1186,1187,1188,1189],{"id":196,"depth":330,"text":197},{"id":294,"depth":330,"text":295},{"id":619,"depth":330,"text":620},{"id":689,"depth":330,"text":690},{"id":918,"depth":330,"text":919},{"id":1142,"depth":330,"text":1143},{"id":1161,"depth":330,"text":1162},"Serve an interactive API reference next to your spec, and style it.","md",null,{},{"icon":139},{"title":136,"description":1190},"QWDi8zAabipWQCE2GYCwoptre_hPfegYZUdRsw4skvs",[1198,1200],{"title":131,"path":132,"stem":133,"description":1199,"icon":134,"children":-1},"Generate an OpenAPI 3 document from your handler types and struct tags.",{"title":147,"path":148,"stem":149,"description":1201,"icon":150,"children":-1},"Test handlers, routes, and auth with httptest or the built-in test helpers.",1784970048696]