[{"data":1,"prerenderedAt":588},["ShallowReactive",2],{"navigation_docs":3,"-captcha-cloudflare-turnstile":218,"-captcha-cloudflare-turnstile-surround":583},[4,20,45,75,95,105,140,168,198],{"title":5,"path":6,"stem":7,"children":8,"page":19},"Introduction","\u002Fintroduction","1.introduction",[9,14],{"title":10,"path":11,"stem":12,"icon":13},"What is GO?","\u002Fintroduction\u002Fwhat-is-go","1.introduction\u002F1.what-is-go","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Features","\u002Fintroduction\u002Ffeatures","1.introduction\u002F2.features","i-lucide-sparkles",false,{"title":21,"path":22,"stem":23,"children":24,"page":19},"Getting Started","\u002Fgetting-started","2.getting-started",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Installation","\u002Fgetting-started\u002Finstallation","2.getting-started\u002F1.installation","i-lucide-download",{"title":31,"path":32,"stem":33,"icon":34},"Configuration","\u002Fgetting-started\u002Fconfiguration","2.getting-started\u002F2.configuration","i-lucide-settings",{"title":36,"path":37,"stem":38,"icon":39},"First Setup","\u002Fgetting-started\u002Ffirst-setup","2.getting-started\u002F3.first-setup","i-lucide-rocket",{"title":41,"path":42,"stem":43,"icon":44},"Updating","\u002Fgetting-started\u002Fupdating","2.getting-started\u002F4.updating","i-lucide-refresh-cw",{"title":46,"icon":19,"path":47,"stem":48,"children":49,"page":19},"User Guide","\u002Fuser-guide","3.user-guide",[50,55,60,65,70],{"title":51,"path":52,"stem":53,"icon":54},"Creating a Short Link","\u002Fuser-guide\u002Fcreating-a-short-link","3.user-guide\u002F1.creating-a-short-link","i-lucide-link",{"title":56,"path":57,"stem":58,"icon":59},"Expiration","\u002Fuser-guide\u002Fexpiration","3.user-guide\u002F2.expiration","i-lucide-clock",{"title":61,"path":62,"stem":63,"icon":64},"Renewing Links","\u002Fuser-guide\u002Frenewing-links","3.user-guide\u002F3.renewing-links","i-lucide-repeat",{"title":66,"path":67,"stem":68,"icon":69},"Dashboard","\u002Fuser-guide\u002Fdashboard","3.user-guide\u002F4.dashboard","i-lucide-layout-dashboard",{"title":71,"path":72,"stem":73,"icon":74},"Analytics","\u002Fuser-guide\u002Fanalytics","3.user-guide\u002F5.analytics","i-lucide-bar-chart-3",{"title":76,"path":77,"stem":78,"children":79,"page":19},"Authentication","\u002Fauthentication","4.authentication",[80,85,90],{"title":81,"path":82,"stem":83,"icon":84},"Email Login","\u002Fauthentication\u002Femail-login","4.authentication\u002F1.email-login","i-lucide-mail",{"title":86,"path":87,"stem":88,"icon":89},"Google Login","\u002Fauthentication\u002Fgoogle-login","4.authentication\u002F2.google-login","i-lucide-globe",{"title":91,"path":92,"stem":93,"icon":94},"Firebase Setup","\u002Fauthentication\u002Ffirebase-setup","4.authentication\u002F3.firebase-setup","i-simple-icons-firebase",{"title":96,"path":97,"stem":98,"children":99,"page":19},"Captcha","\u002Fcaptcha","5.captcha",[100],{"title":101,"path":102,"stem":103,"icon":104},"Cloudflare Turnstile","\u002Fcaptcha\u002Fcloudflare-turnstile","5.captcha\u002F1.cloudflare-turnstile","i-simple-icons-cloudflare",{"title":106,"path":107,"stem":108,"children":109,"page":19},"Administration","\u002Fadministration","6.administration",[110,115,120,125,130,135],{"title":111,"path":112,"stem":113,"icon":114},"Admin Panel","\u002Fadministration\u002Fadmin-panel","6.administration\u002F1.admin-panel","i-lucide-shield",{"title":116,"path":117,"stem":118,"icon":119},"Users","\u002Fadministration\u002Fusers","6.administration\u002F2.users","i-lucide-users",{"title":121,"path":122,"stem":123,"icon":124},"Links","\u002Fadministration\u002Flinks","6.administration\u002F3.links","i-lucide-link-2",{"title":126,"path":127,"stem":128,"icon":129},"Reports","\u002Fadministration\u002Freports","6.administration\u002F4.reports","i-lucide-flag",{"title":131,"path":132,"stem":133,"icon":134},"Bans & Timeouts","\u002Fadministration\u002Fbans-and-timeouts","6.administration\u002F5.bans-and-timeouts","i-lucide-user-x",{"title":136,"path":137,"stem":138,"icon":139},"Audit Logs","\u002Fadministration\u002Faudit-logs","6.administration\u002F6.audit-logs","i-lucide-scroll",{"title":141,"path":142,"stem":143,"children":144,"page":19},"Deployment","\u002Fdeployment","7.deployment",[145,150,155,160,165],{"title":146,"path":147,"stem":148,"icon":149},"VPS Installation","\u002Fdeployment\u002Fvps-installation","7.deployment\u002F1.vps-installation","i-lucide-server",{"title":151,"path":152,"stem":153,"icon":154},"Environment Variables","\u002Fdeployment\u002Fenvironment-variables","7.deployment\u002F2.environment-variables","i-lucide-sliders",{"title":156,"path":157,"stem":158,"icon":159},"Cloudflare Tunnel","\u002Fdeployment\u002Fcloudflare-tunnel","7.deployment\u002F3.cloudflare-tunnel","i-lucide-network",{"title":161,"path":162,"stem":163,"icon":164},"Systemd","\u002Fdeployment\u002Fsystemd","7.deployment\u002F4.systemd","i-lucide-cpu",{"title":41,"path":166,"stem":167,"icon":44},"\u002Fdeployment\u002Fupdating","7.deployment\u002F5.updating",{"title":169,"path":170,"stem":171,"children":172,"page":19},"Developer","\u002Fdeveloper","8.developer",[173,178,183,188,193],{"title":174,"path":175,"stem":176,"icon":177},"Architecture","\u002Fdeveloper\u002Farchitecture","8.developer\u002F1.architecture","i-lucide-box",{"title":179,"path":180,"stem":181,"icon":182},"API Architecture","\u002Fdeveloper\u002Fapi","8.developer\u002F2.api","i-lucide-code-xml",{"title":184,"path":185,"stem":186,"icon":187},"Database","\u002Fdeveloper\u002Fdatabase","8.developer\u002F3.database","i-lucide-database",{"title":189,"path":190,"stem":191,"icon":192},"Development","\u002Fdeveloper\u002Fdevelopment","8.developer\u002F4.development","i-lucide-terminal",{"title":194,"path":195,"stem":196,"icon":197},"Building Releases","\u002Fdeveloper\u002Fbuilding-releases","8.developer\u002F5.building-releases","i-lucide-package-check",{"title":199,"path":200,"stem":201,"children":202,"page":19},"Reference","\u002Freference","9.reference",[203,208,213],{"title":204,"path":205,"stem":206,"icon":207},"Configuration Reference","\u002Freference\u002Fconfiguration","9.reference\u002F1.configuration","i-lucide-file-cog",{"title":209,"path":210,"stem":211,"icon":212},"API Reference","\u002Freference\u002Fapi-reference","9.reference\u002F2.api-reference","i-lucide-webhook",{"title":214,"path":215,"stem":216,"icon":217},"Changelog","\u002Freference\u002Fchangelog","9.reference\u002F3.changelog","i-lucide-history",{"id":219,"title":101,"body":220,"description":574,"extension":575,"links":576,"meta":577,"navigation":578,"path":102,"seo":579,"stem":103,"__hash__":582},"docs\u002F5.captcha\u002F1.cloudflare-turnstile.md",{"type":221,"value":222,"toc":562},"minimark",[223,227,235,238,243,265,267,271,366,380,382,385,392,451,455,476,497,499,503,506,558],[224,225,101],"h1",{"id":226},"cloudflare-turnstile",[228,229,230,231,234],"p",{},"GO Shortener integrates with ",[232,233,101],"strong",{}," to provide smart, frictionless bot detection without frustrating users with distorted text or puzzle challenges.",[236,237],"hr",{},[239,240,242],"h2",{"id":241},"why-turnstile","Why Turnstile?",[244,245,246,253,259],"ul",{},[247,248,249,252],"li",{},[232,250,251],{},"Privacy-Preserving",": Turnstile does not harvest user browsing data or use tracking cookies across the web.",[247,254,255,258],{},[232,256,257],{},"Frictionless Experience",": Most legitimate users pass automatically without an interactive prompt.",[247,260,261,264],{},[232,262,263],{},"Server-Side Verification",": Form submissions include a Turnstile response token which the GO backend validates directly against Cloudflare's verification API.",[236,266],{},[239,268,270],{"id":269},"setting-up-cloudflare-turnstile","Setting Up Cloudflare Turnstile",[272,273,274,279,294,298,305,345,349,352],"steps",{},[275,276,278],"h3",{"id":277},"_1-access-cloudflare-turnstile-dashboard","1. Access Cloudflare Turnstile Dashboard",[228,280,281,282,289,290,293],{},"Log into the ",[283,284,288],"a",{"href":285,"rel":286},"https:\u002F\u002Fdash.cloudflare.com\u002F",[287],"nofollow","Cloudflare Dashboard"," and select ",[232,291,292],{},"Turnstile"," from the navigation sidebar.",[275,295,297],{"id":296},"_2-add-a-new-widget","2. Add a New Widget",[228,299,300,301,304],{},"Click ",[232,302,303],{},"Add Site"," and fill out the configuration:",[244,306,307,317,331],{},[247,308,309,312,313],{},[232,310,311],{},"Site name",": ",[314,315,316],"code",{},"GO Shortener Production",[247,318,319,322,323,326,327,330],{},[232,320,321],{},"Domain",": Add your hostname, e.g. ",[314,324,325],{},"go.arcn.online"," (you can also add ",[314,328,329],{},"localhost"," for testing).",[247,332,333,336,337,340,341,344],{},[232,334,335],{},"Widget Mode",": Choose ",[232,338,339],{},"Managed"," (recommended) or ",[232,342,343],{},"Non-interactive",".",[275,346,348],{"id":347},"_3-retrieve-keys","3. Retrieve Keys",[228,350,351],{},"Once created, Cloudflare displays your credentials:",[244,353,354,360],{},[247,355,356,359],{},[232,357,358],{},"Site Key",": A public key embedded in web forms.",[247,361,362,365],{},[232,363,364],{},"Secret Key",": A confidential key used by the backend to verify tokens.",[367,368,369,375,376,379],"caution",{},[232,370,371,372],{},"Never expose your ",[314,373,374],{},"TURNSTILE_SECRET_KEY",". Do not commit it to source control or embed it into client-side JavaScript. Keep it strictly inside your production ",[314,377,378],{},".env"," file.",[236,381],{},[239,383,151],{"id":384},"environment-variables",[228,386,387,388,391],{},"To enable Turnstile in GO Shortener, add the following variables to your ",[314,389,390],{},"\u002Froot\u002FGo-shortner\u002F.env",":",[393,394,399],"pre",{"className":395,"code":396,"filename":378,"language":397,"meta":398,"style":398},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Enable CAPTCHA Protection\nTURNSTILE_ENABLED=true\n\n# Public Widget Key\nTURNSTILE_SITE_KEY=0x4AAAAAA...your_site_key\n\n# Private Secret Key\nTURNSTILE_SECRET_KEY=0x4AAAAAA...your_secret_key\n","dotenv","",[314,400,401,409,415,422,428,434,439,445],{"__ignoreMap":398},[402,403,406],"span",{"class":404,"line":405},"line",1,[402,407,408],{},"# Enable CAPTCHA Protection\n",[402,410,412],{"class":404,"line":411},2,[402,413,414],{},"TURNSTILE_ENABLED=true\n",[402,416,418],{"class":404,"line":417},3,[402,419,421],{"emptyLinePlaceholder":420},true,"\n",[402,423,425],{"class":404,"line":424},4,[402,426,427],{},"# Public Widget Key\n",[402,429,431],{"class":404,"line":430},5,[402,432,433],{},"TURNSTILE_SITE_KEY=0x4AAAAAA...your_site_key\n",[402,435,437],{"class":404,"line":436},6,[402,438,421],{"emptyLinePlaceholder":420},[402,440,442],{"class":404,"line":441},7,[402,443,444],{},"# Private Secret Key\n",[402,446,448],{"class":404,"line":447},8,[402,449,450],{},"TURNSTILE_SECRET_KEY=0x4AAAAAA...your_secret_key\n",[275,452,454],{"id":453},"enabling-and-disabling-turnstile","Enabling and Disabling Turnstile",[244,456,457,467],{},[247,458,459,462,463,466],{},[232,460,461],{},"To Enable",": Set ",[314,464,465],{},"TURNSTILE_ENABLED=true"," and restart the service. The frontend will automatically load the Turnstile widget on registration and anonymous shortening forms, and the backend will enforce token verification.",[247,468,469,462,472,475],{},[232,470,471],{},"To Disable",[314,473,474],{},"TURNSTILE_ENABLED=false"," and restart the service. Forms will bypass CAPTCHA checks (ideal for local development or closed enterprise networks).",[393,477,482],{"className":478,"code":479,"filename":480,"language":481,"meta":398,"style":398},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","systemctl restart go-shortener\n","Terminal","bash",[314,483,484],{"__ignoreMap":398},[402,485,486,490,494],{"class":404,"line":405},[402,487,489],{"class":488},"sBMFI","systemctl",[402,491,493],{"class":492},"sfazB"," restart",[402,495,496],{"class":492}," go-shortener\n",[236,498],{},[239,500,502],{"id":501},"backend-verification-logic","Backend Verification Logic",[228,504,505],{},"When a user submits a form protected by Turnstile:",[507,508,509,512,519,548],"ol",{},[247,510,511],{},"The browser requests a verification token from Cloudflare's widget.",[247,513,514,515,518],{},"The client sends the token in the request payload (",[314,516,517],{},"cf-turnstile-response",").",[247,520,521,522,525,526],{},"The GO backend issues an HTTP POST to ",[314,523,524],{},"https:\u002F\u002Fchallenges.cloudflare.com\u002Fturnstile\u002Fv0\u002Fsiteverify"," containing:\n",[244,527,528,536,542],{},[247,529,530,533,534],{},[314,531,532],{},"secret",": Your ",[314,535,374],{},[247,537,538,541],{},[314,539,540],{},"response",": The user's submitted token",[247,543,544,547],{},[314,545,546],{},"remoteip",": The user's hashed IP",[247,549,550,551,554,555,344],{},"If Cloudflare returns ",[314,552,553],{},"{\"success\": true}",", the operation proceeds; otherwise, the request is rejected with ",[314,556,557],{},"403 Forbidden",[559,560,561],"style",{},"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}",{"title":398,"searchDepth":411,"depth":411,"links":563},[564,565,570,573],{"id":241,"depth":411,"text":242},{"id":269,"depth":411,"text":270,"children":566},[567,568,569],{"id":277,"depth":417,"text":278},{"id":296,"depth":417,"text":297},{"id":347,"depth":417,"text":348},{"id":384,"depth":411,"text":151,"children":571},[572],{"id":453,"depth":417,"text":454},{"id":501,"depth":411,"text":502},"Configure privacy-preserving bot detection and CAPTCHA protection with Cloudflare Turnstile.","md",null,{},{"icon":104},{"title":580,"description":581},"Cloudflare Turnstile Setup - GO Shortener","Step-by-step guide to configuring Cloudflare Turnstile CAPTCHA for bot protection in GO Shortener.","exAOX26sdWc-mer9NS5Hh_o4QMZQLPPtqoy-DHmBlno",[584,586],{"title":91,"path":92,"stem":93,"description":585,"icon":94,"children":-1},"Step-by-step instructions for configuring Firebase Authentication and Google OAuth.",{"title":111,"path":112,"stem":113,"description":587,"icon":114,"children":-1},"Overview of the administrative command center, role hierarchy, and permissions.",1788462427147]