[{"data":1,"prerenderedAt":1124},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-installation":172,"-getting-started-installation-surround":1119},[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":16,"body":174,"description":1112,"extension":1113,"links":1114,"meta":1115,"navigation":1116,"path":17,"seo":1117,"stem":18,"__hash__":1118},"docs\u002F1.getting-started\u002F2.installation.md",{"type":175,"value":176,"toc":1099},"minimark",[177,182,195,218,222,240,437,445,449,464,467,537,540,554,558,565,579,607,611,621,699,708,716,720,723,1015,1030,1046,1061,1076,1080,1095],[178,179,181],"h2",{"id":180},"check-your-go-version","Check your Go version",[183,184,185,186,190,191,194],"p",{},"ezz uses method-aware routing patterns (",[187,188,189],"code",{},"GET \u002Fusers\u002F{id}",") and ",[187,192,193],{},"Request.PathValue",", both of which arrived in Go 1.22.",[196,197,203],"pre",{"className":198,"code":199,"filename":200,"language":201,"meta":202,"style":202},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go version\n","Terminal","bash","",[187,204,205],{"__ignoreMap":202},[206,207,210,214],"span",{"class":208,"line":209},"line",1,[206,211,213],{"class":212},"sBMFI","go",[206,215,217],{"class":216},"sfazB"," version\n",[178,219,221],{"id":220},"configure-private-module-access","Configure private module access",[183,223,224,227,228,231,232,235,236,239],{},[187,225,226],{},"sulv-io\u002Fezz"," is a private repository. The public module proxy and checksum database cannot read it, so ",[187,229,230],{},"go get"," fails with a ",[187,233,234],{},"410 Gone"," or ",[187,237,238],{},"404 Not Found"," until you tell Go to bypass both and tell Git how to authenticate. This is a one-time setup per machine.",[241,242,244,249,277,299,303,306,345,352,395,399,427],"steps",{"level":243},"3",[245,246,248],"h3",{"id":247},"mark-the-module-as-private","Mark the module as private",[196,250,252],{"className":198,"code":251,"filename":200,"language":201,"meta":202,"style":202},"go env -w GOPRIVATE='github.com\u002Fsulv-io\u002F*'\n",[187,253,254],{"__ignoreMap":202},[206,255,256,258,261,264,267,271,274],{"class":208,"line":209},[206,257,213],{"class":212},[206,259,260],{"class":216}," env",[206,262,263],{"class":216}," -w",[206,265,266],{"class":216}," GOPRIVATE=",[206,268,270],{"class":269},"sMK4o","'",[206,272,273],{"class":216},"github.com\u002Fsulv-io\u002F*",[206,275,276],{"class":269},"'\n",[183,278,279,282,283,286,287,290,291,294,295,298],{},[187,280,281],{},"GOPRIVATE"," is a convenience switch that sets ",[187,284,285],{},"GONOPROXY"," and ",[187,288,289],{},"GONOSUMDB"," to the same pattern. Go then fetches anything under ",[187,292,293],{},"github.com\u002Fsulv-io\u002F"," straight from the source and skips the ",[187,296,297],{},"sum.golang.org"," lookup that would otherwise fail on a repository it cannot see.",[245,300,302],{"id":301},"let-git-authenticate","Let Git authenticate",[183,304,305],{},"Go always requests modules over HTTPS. Rewrite that to SSH so your existing key does the work:",[196,307,309],{"className":198,"code":308,"filename":200,"language":201,"meta":202,"style":202},"git config --global url.\"git@github.com:sulv-io\u002F\".insteadOf \"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F\"\n",[187,310,311],{"__ignoreMap":202},[206,312,313,316,319,322,325,328,331,333,336,339,342],{"class":208,"line":209},[206,314,315],{"class":212},"git",[206,317,318],{"class":216}," config",[206,320,321],{"class":216}," --global",[206,323,324],{"class":216}," url.",[206,326,327],{"class":269},"\"",[206,329,330],{"class":216},"git@github.com:sulv-io\u002F",[206,332,327],{"class":269},[206,334,335],{"class":216},".insteadOf",[206,337,338],{"class":269}," \"",[206,340,341],{"class":216},"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F",[206,343,344],{"class":269},"\"\n",[183,346,347,348,351],{},"If you use a personal access token instead of a key, rewrite to an authenticated HTTPS URL. The token needs ",[187,349,350],{},"repo"," scope:",[196,353,355],{"className":198,"code":354,"filename":200,"language":201,"meta":202,"style":202},"git config --global url.\"https:\u002F\u002Fx-access-token:${GITHUB_TOKEN}@github.com\u002Fsulv-io\u002F\".insteadOf \"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F\"\n",[187,356,357],{"__ignoreMap":202},[206,358,359,361,363,365,367,369,372,375,379,382,385,387,389,391,393],{"class":208,"line":209},[206,360,315],{"class":212},[206,362,318],{"class":216},[206,364,321],{"class":216},[206,366,324],{"class":216},[206,368,327],{"class":269},[206,370,371],{"class":216},"https:\u002F\u002Fx-access-token:",[206,373,374],{"class":269},"${",[206,376,378],{"class":377},"sTEyZ","GITHUB_TOKEN",[206,380,381],{"class":269},"}",[206,383,384],{"class":216},"@github.com\u002Fsulv-io\u002F",[206,386,327],{"class":269},[206,388,335],{"class":216},[206,390,338],{"class":269},[206,392,341],{"class":216},[206,394,344],{"class":269},[245,396,398],{"id":397},"verify","Verify",[196,400,402],{"className":198,"code":401,"filename":200,"language":201,"meta":202,"style":202},"go env GOPRIVATE\ngit ls-remote git@github.com:sulv-io\u002Fezz.git HEAD\n",[187,403,404,413],{"__ignoreMap":202},[206,405,406,408,410],{"class":208,"line":209},[206,407,213],{"class":212},[206,409,260],{"class":216},[206,411,412],{"class":216}," GOPRIVATE\n",[206,414,416,418,421,424],{"class":208,"line":415},2,[206,417,315],{"class":212},[206,419,420],{"class":216}," ls-remote",[206,422,423],{"class":216}," git@github.com:sulv-io\u002Fezz.git",[206,425,426],{"class":216}," HEAD\n",[183,428,429,430,432,433,436],{},"The first prints ",[187,431,273],{},". The second prints a commit hash. If it asks for a password or reports ",[187,434,435],{},"Repository not found",", the credential is the problem, not Go.",[438,439,440,441,444],"warning",{},"The token form writes a credential in cleartext to ",[187,442,443],{},"~\u002F.gitconfig",". Prefer SSH on workstations, and prefer a short-lived token injected as an environment variable in CI.",[178,446,448],{"id":447},"add-the-module","Add the module",[196,450,452],{"className":198,"code":451,"filename":200,"language":201,"meta":202,"style":202},"go get github.com\u002Fsulv-io\u002Fezz\n",[187,453,454],{"__ignoreMap":202},[206,455,456,458,461],{"class":208,"line":209},[206,457,213],{"class":212},[206,459,460],{"class":216}," get",[206,462,463],{"class":216}," github.com\u002Fsulv-io\u002Fezz\n",[183,465,466],{},"The core packages import only the standard library:",[468,469,470,483],"table",{},[471,472,473],"thead",{},[474,475,476,480],"tr",{},[477,478,479],"th",{},"Import path",[477,481,482],{},"What it holds",[484,485,486,497,507,517,527],"tbody",{},[474,487,488,494],{},[489,490,491],"td",{},[187,492,493],{},"github.com\u002Fsulv-io\u002Fezz",[489,495,496],{},"App, routing, handlers, context, errors, middleware",[474,498,499,504],{},[489,500,501],{},[187,502,503],{},"github.com\u002Fsulv-io\u002Fezz\u002Fbinding",[489,505,506],{},"Request binding and validation",[474,508,509,514],{},[489,510,511],{},[187,512,513],{},"github.com\u002Fsulv-io\u002Fezz\u002Fmiddleware",[489,515,516],{},"Gzip, rate limiting",[474,518,519,524],{},[489,520,521],{},[187,522,523],{},"github.com\u002Fsulv-io\u002Fezz\u002Fopenapi",[489,525,526],{},"Spec generation and the Scalar UI",[474,528,529,534],{},[489,530,531],{},[187,532,533],{},"github.com\u002Fsulv-io\u002Fezz\u002Fauth",[489,535,536],{},"JWT providers, auth rules, resolvers, GoTrue",[183,538,539],{},"One optional package pulls in a dependency. Add it only if you want Redis-backed rate limiting on the GoTrue proxy:",[196,541,543],{"className":198,"code":542,"filename":200,"language":201,"meta":202,"style":202},"go get github.com\u002Fsulv-io\u002Fezz\u002Fauth\u002Fratelimit\n",[187,544,545],{"__ignoreMap":202},[206,546,547,549,551],{"class":208,"line":209},[206,548,213],{"class":212},[206,550,460],{"class":216},[206,552,553],{"class":216}," github.com\u002Fsulv-io\u002Fezz\u002Fauth\u002Fratelimit\n",[178,555,557],{"id":556},"pick-a-version","Pick a version",[183,559,560,561,564],{},"Use ",[187,562,563],{},"v1.1.0"," or later.",[196,566,568],{"className":198,"code":567,"filename":200,"language":201,"meta":202,"style":202},"go get github.com\u002Fsulv-io\u002Fezz@v1.1.0\n",[187,569,570],{"__ignoreMap":202},[206,571,572,574,576],{"class":208,"line":209},[206,573,213],{"class":212},[206,575,460],{"class":216},[206,577,578],{"class":216}," github.com\u002Fsulv-io\u002Fezz@v1.1.0\n",[580,581,582,585,586,588,589,591,592,595,596,598,599,602,603,606],"caution",{},[187,583,584],{},"v1.0.0"," does not work with the import paths on this page. That tag predates the rewrite that moved the framework to the module root, so at ",[187,587,584],{}," there is no package at ",[187,590,493],{}," and the core packages live under ",[187,593,594],{},"core\u002F"," instead. ",[187,597,230],{}," appears to succeed and the import then fails with ",[187,600,601],{},"no required module provides package",". If you see that error, check which version you resolved with ",[187,604,605],{},"go list -m github.com\u002Fsulv-io\u002Fezz",".",[178,608,610],{"id":609},"set-up-ci","Set up CI",[183,612,613,614,617,618,620],{},"CI runners have neither your ",[187,615,616],{},"go env"," settings nor your ",[187,619,443],{},", so the same two pieces of configuration have to be applied in the workflow. With GitHub Actions:",[196,622,627],{"className":623,"code":624,"filename":625,"language":626,"meta":202,"style":202},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- name: Configure private module access\n  env:\n    GITHUB_TOKEN: ${{ secrets.EZZ_READ_TOKEN }}\n  run: |\n    go env -w GOPRIVATE='github.com\u002Fsulv-io\u002F*'\n    git config --global \\\n      url.\"https:\u002F\u002Fx-access-token:${GITHUB_TOKEN}@github.com\u002Fsulv-io\u002F\".insteadOf \\\n      \"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F\"\n",".github\u002Fworkflows\u002Ftest.yml","yaml",[187,628,629,644,652,663,675,681,687,693],{"__ignoreMap":202},[206,630,631,634,638,641],{"class":208,"line":209},[206,632,633],{"class":269},"-",[206,635,637],{"class":636},"swJcz"," name",[206,639,640],{"class":269},":",[206,642,643],{"class":216}," Configure private module access\n",[206,645,646,649],{"class":208,"line":415},[206,647,648],{"class":636},"  env",[206,650,651],{"class":269},":\n",[206,653,655,658,660],{"class":208,"line":654},3,[206,656,657],{"class":636},"    GITHUB_TOKEN",[206,659,640],{"class":269},[206,661,662],{"class":216}," ${{ secrets.EZZ_READ_TOKEN }}\n",[206,664,666,669,671],{"class":208,"line":665},4,[206,667,668],{"class":636},"  run",[206,670,640],{"class":269},[206,672,674],{"class":673},"s7zQu"," |\n",[206,676,678],{"class":208,"line":677},5,[206,679,680],{"class":216},"    go env -w GOPRIVATE='github.com\u002Fsulv-io\u002F*'\n",[206,682,684],{"class":208,"line":683},6,[206,685,686],{"class":216},"    git config --global \\\n",[206,688,690],{"class":208,"line":689},7,[206,691,692],{"class":216},"      url.\"https:\u002F\u002Fx-access-token:${GITHUB_TOKEN}@github.com\u002Fsulv-io\u002F\".insteadOf \\\n",[206,694,696],{"class":208,"line":695},8,[206,697,698],{"class":216},"      \"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002F\"\n",[183,700,701,702,704,705,707],{},"The default ",[187,703,378],{}," is scoped to the repository running the workflow and cannot read a different private repository. Use a fine-grained PAT or a GitHub App token with read access to ",[187,706,226],{},", stored as a secret.",[709,710,711,712,715],"note",{},"If your runner already has an SSH deploy key loaded, use the ",[187,713,714],{},"git@github.com:"," rewrite from the previous section instead and skip the token entirely.",[178,717,719],{"id":718},"serve-a-request","Serve a request",[183,721,722],{},"Create a file and run it:",[196,724,728],{"className":725,"code":726,"filename":727,"language":213,"meta":202,"style":202},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"log\"\n\n    \"github.com\u002Fsulv-io\u002Fezz\"\n)\n\ntype PingResponse struct {\n    Message string `json:\"message\"`\n}\n\nfunc main() {\n    app := ezz.New()\n\n    app.GET(\"\u002Fping\", ezz.HFunc(func(ctx *ezz.Context) (*PingResponse, error) {\n        return &PingResponse{Message: \"pong\"}, nil\n    }))\n\n    log.Fatal(app.Listen(\":8080\"))\n}\n","main.go",[187,729,730,738,744,752,762,766,774,779,783,798,817,823,828,843,863,868,934,966,972,977,1010],{"__ignoreMap":202},[206,731,732,735],{"class":208,"line":209},[206,733,734],{"class":269},"package",[206,736,737],{"class":212}," main\n",[206,739,740],{"class":208,"line":415},[206,741,743],{"emptyLinePlaceholder":742},true,"\n",[206,745,746,749],{"class":208,"line":654},[206,747,748],{"class":673},"import",[206,750,751],{"class":269}," (\n",[206,753,754,757,760],{"class":208,"line":665},[206,755,756],{"class":269},"    \"",[206,758,759],{"class":212},"log",[206,761,344],{"class":269},[206,763,764],{"class":208,"line":677},[206,765,743],{"emptyLinePlaceholder":742},[206,767,768,770,772],{"class":208,"line":683},[206,769,756],{"class":269},[206,771,493],{"class":212},[206,773,344],{"class":269},[206,775,776],{"class":208,"line":689},[206,777,778],{"class":269},")\n",[206,780,781],{"class":208,"line":695},[206,782,743],{"emptyLinePlaceholder":742},[206,784,786,789,792,795],{"class":208,"line":785},9,[206,787,788],{"class":269},"type",[206,790,791],{"class":212}," PingResponse",[206,793,794],{"class":269}," struct",[206,796,797],{"class":269}," {\n",[206,799,801,804,808,811,814],{"class":208,"line":800},10,[206,802,803],{"class":377},"    Message ",[206,805,807],{"class":806},"spNyl","string",[206,809,810],{"class":269}," `",[206,812,813],{"class":216},"json:\"message\"",[206,815,816],{"class":269},"`\n",[206,818,820],{"class":208,"line":819},11,[206,821,822],{"class":269},"}\n",[206,824,826],{"class":208,"line":825},12,[206,827,743],{"emptyLinePlaceholder":742},[206,829,831,834,838,841],{"class":208,"line":830},13,[206,832,833],{"class":269},"func",[206,835,837],{"class":836},"s2Zo4"," main",[206,839,840],{"class":269},"()",[206,842,797],{"class":269},[206,844,846,849,852,855,857,860],{"class":208,"line":845},14,[206,847,848],{"class":377},"    app ",[206,850,851],{"class":269},":=",[206,853,854],{"class":377}," ezz",[206,856,606],{"class":269},[206,858,859],{"class":836},"New",[206,861,862],{"class":269},"()\n",[206,864,866],{"class":208,"line":865},15,[206,867,743],{"emptyLinePlaceholder":742},[206,869,871,874,876,879,882,884,887,889,892,894,896,899,902,906,909,912,914,916,919,922,925,927,930,932],{"class":208,"line":870},16,[206,872,873],{"class":377},"    app",[206,875,606],{"class":269},[206,877,878],{"class":836},"GET",[206,880,881],{"class":269},"(",[206,883,327],{"class":269},[206,885,886],{"class":216},"\u002Fping",[206,888,327],{"class":269},[206,890,891],{"class":269},",",[206,893,854],{"class":377},[206,895,606],{"class":269},[206,897,898],{"class":836},"HFunc",[206,900,901],{"class":269},"(func(",[206,903,905],{"class":904},"sHdIc","ctx",[206,907,908],{"class":269}," *",[206,910,911],{"class":212},"ezz",[206,913,606],{"class":269},[206,915,53],{"class":212},[206,917,918],{"class":269},")",[206,920,921],{"class":269}," (*",[206,923,924],{"class":212},"PingResponse",[206,926,891],{"class":269},[206,928,929],{"class":806}," error",[206,931,918],{"class":269},[206,933,797],{"class":269},[206,935,937,940,943,945,948,951,953,955,958,960,963],{"class":208,"line":936},17,[206,938,939],{"class":673},"        return",[206,941,942],{"class":269}," &",[206,944,924],{"class":212},[206,946,947],{"class":269},"{",[206,949,950],{"class":377},"Message",[206,952,640],{"class":269},[206,954,338],{"class":269},[206,956,957],{"class":216},"pong",[206,959,327],{"class":269},[206,961,962],{"class":269},"},",[206,964,965],{"class":269}," nil\n",[206,967,969],{"class":208,"line":968},18,[206,970,971],{"class":269},"    }))\n",[206,973,975],{"class":208,"line":974},19,[206,976,743],{"emptyLinePlaceholder":742},[206,978,980,983,985,988,990,993,995,998,1000,1002,1005,1007],{"class":208,"line":979},20,[206,981,982],{"class":377},"    log",[206,984,606],{"class":269},[206,986,987],{"class":836},"Fatal",[206,989,881],{"class":269},[206,991,992],{"class":377},"app",[206,994,606],{"class":269},[206,996,997],{"class":836},"Listen",[206,999,881],{"class":269},[206,1001,327],{"class":269},[206,1003,1004],{"class":216},":8080",[206,1006,327],{"class":269},[206,1008,1009],{"class":269},"))\n",[206,1011,1013],{"class":208,"line":1012},21,[206,1014,822],{"class":269},[196,1016,1018],{"className":198,"code":1017,"filename":200,"language":201,"meta":202,"style":202},"go run main.go\n",[187,1019,1020],{"__ignoreMap":202},[206,1021,1022,1024,1027],{"class":208,"line":209},[206,1023,213],{"class":212},[206,1025,1026],{"class":216}," run",[206,1028,1029],{"class":216}," main.go\n",[196,1031,1033],{"className":198,"code":1032,"filename":200,"language":201,"meta":202,"style":202},"curl -i localhost:8080\u002Fping\n",[187,1034,1035],{"__ignoreMap":202},[206,1036,1037,1040,1043],{"class":208,"line":209},[206,1038,1039],{"class":212},"curl",[206,1041,1042],{"class":216}," -i",[206,1044,1045],{"class":216}," localhost:8080\u002Fping\n",[183,1047,1048,1049,1052,1053,1056,1057,1060],{},"You should see a ",[187,1050,1051],{},"200"," with ",[187,1054,1055],{},"{\"message\":\"pong\"}",", an ",[187,1058,1059],{},"X-Request-ID"," header added by the default middleware, and a request line in the server log.",[709,1062,1063,1064,1067,1068,1071,1072,606],{},"No auth provider is registered in this example, so nothing is enforced. As soon as you call ",[187,1065,1066],{},"app.Auth(...)",", routes require a valid token unless you mark them ",[187,1069,1070],{},".Public()",". See ",[1073,1074,1075],"a",{"href":75},"Auth overview",[178,1077,1079],{"id":1078},"next-steps","Next steps",[1081,1082,1083,1090],"ul",{},[1084,1085,1086,1089],"li",{},[1073,1087,1088],{"href":22},"Quick start"," builds a real API with auth, groups, and generated docs.",[1084,1091,1092,1094],{},[1073,1093,33],{"href":34}," covers patterns, groups, and route metadata.",[1096,1097,1098],"style",{},"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":202,"searchDepth":415,"depth":415,"links":1100},[1101,1102,1107,1108,1109,1110,1111],{"id":180,"depth":415,"text":181},{"id":220,"depth":415,"text":221,"children":1103},[1104,1105,1106],{"id":247,"depth":654,"text":248},{"id":301,"depth":654,"text":302},{"id":397,"depth":654,"text":398},{"id":447,"depth":415,"text":448},{"id":556,"depth":415,"text":557},{"id":609,"depth":415,"text":610},{"id":718,"depth":415,"text":719},{"id":1078,"depth":415,"text":1079},"Add ezz to a Go module and verify it serves a request.","md",null,{},{"icon":19},{"title":16,"description":1112},"bnn4wh7OAyYAVeOQXXfLOcVEzYwcRY1t9xy7HMvWLfw",[1120,1122],{"title":11,"path":12,"stem":13,"description":1121,"icon":14,"children":-1},"What ezz is, what it does for you, and when it is the right choice.",{"title":21,"path":22,"stem":23,"description":1123,"icon":24,"children":-1},"Build an authenticated JSON API with generated OpenAPI docs in one file.",1784970047281]