[{"data":1,"prerenderedAt":387},["ShallowReactive",2],{"navigation_docs":3,"-developer-architecture":218,"-developer-architecture-surround":382},[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":174,"body":220,"description":373,"extension":374,"links":375,"meta":376,"navigation":377,"path":175,"seo":378,"stem":176,"__hash__":381},"docs\u002F8.developer\u002F1.architecture.md",{"type":221,"value":222,"toc":362},"minimark",[223,227,231,234,239,250,252,256,259,265,267,271,280,291,312,316,327],[224,225,174],"h1",{"id":226},"architecture",[228,229,230],"p",{},"GO Shortener is engineered in modern Go (1.22+) using a modular, decoupled architecture tailored specifically for high throughput and negligible resource consumption.",[232,233],"hr",{},[235,236,238],"h2",{"id":237},"high-level-architectural-diagram","High-Level Architectural Diagram",[240,241,246],"pre",{"className":242,"code":244,"language":245},[243],"language-text","+-------------------------------------------------------------+\n|               HTTP Requests (Port 3000)                     |\n+-------------------------------------------------------------+\n                              |\n                              v\n+-------------------------------------------------------------+\n|                 HTTP Middleware Pipeline                    |\n|   - Security Headers (HSTS, CSP, X-Frame-Options)           |\n|   - Session Authenticator (go_session Cookie \u002F JWT)         |\n|   - Rate Limiter & Identity Hash Provider                   |\n|   - Intrusion Detection & Audit Logger                      |\n+-------------------------------------------------------------+\n                              |\n              +---------------+---------------+\n              |                               |\n              v                               v\n+-----------------------------+ +-----------------------------+\n|      API Handlers Layer     | |   Embedded Frontend Static  |\n|  (\u002Fapi\u002Flinks, \u002Fapi\u002Fauth,    | |     Handler (embed.FS)      |\n|   \u002Fapi\u002Fuser, \u002Fapi\u002Fadmin)    | |  (HTML, CSS, JS, Favicon)   |\n+-----------------------------+ +-----------------------------+\n              |\n              v\n+-------------------------------------------------------------+\n|                    Business Service Layer                   |\n|   - SSRF & Protocol Validator                               |\n|   - Quota Engine (15\u002F24h anon, 100\u002Fmo registered)           |\n|   - Expiration & Code Renewal Calculator                    |\n|   - Telemetry Anonymizer (SHA-256 IP Hashing)               |\n+-------------------------------------------------------------+\n                              |\n              +---------------+---------------+\n              |                               |\n              v                               v\n+-----------------------------+ +-----------------------------+\n|     Repository Layer        | |      External Clients       |\n|    (SQLite CRUD Ops)        | |  - Cloudflare Turnstile API |\n+-----------------------------+ |  - Firebase Auth Verifier   |\n              |                 +-----------------------------+\n              v\n+-------------------------------------------------------------+\n|                 Pure Go SQLite Engine                       |\n|   - modernc.org\u002Fsqlite (CGO-Free)                           |\n|   - Single-Writer Concurrency (MaxOpenConns = 1)            |\n|   - Write-Ahead Logging (WAL Mode)                          |\n+-------------------------------------------------------------+\n","text",[247,248,244],"code",{"__ignoreMap":249},"",[232,251],{},[235,253,255],{"id":254},"directory-organization","Directory Organization",[228,257,258],{},"The codebase follows idiomatic Go standards:",[240,260,263],{"className":261,"code":262,"language":245,"meta":249},[243],"backend\u002F\n├── cmd\u002F\n│   └── server\u002F\n│       └── main.go          # Application entrypoint & HTTP router wiring\n├── internal\u002F\n│   ├── config\u002F              # Environment variable loading & defaults\n│   ├── database\u002F            # SQLite connection pool, pragmas, & auto-migration\n│   ├── embedded\u002F            # embed.FS packaging of the static frontend\n│   ├── handlers\u002F            # REST API endpoints & HTTP request parsing\n│   ├── middleware\u002F          # Security headers, auth cookies, & rate limiters\n│   ├── models\u002F              # Struct definitions for links, users, & analytics\n│   ├── repository\u002F          # SQL queries, parameter binding, & transactions\n│   ├── service\u002F             # Domain logic (SSRF checks, quota calculations)\n│   └── validator\u002F           # Input validation, URL format, & scheme checks\n├── pkg\u002F                     # Reusable utilities (hashing, random code generation)\n├── go.mod                   # Go module definition\n└── go.sum                   # Dependency checksum verification\n",[247,264,262],{"__ignoreMap":249},[232,266],{},[235,268,270],{"id":269},"key-design-patterns","Key Design Patterns",[272,273,275,276,279],"h3",{"id":274},"_1-100-standalone-executable-embedfs","1. 100% Standalone Executable (",[247,277,278],{},"embed.FS",")",[228,281,282,283,286,287,290],{},"All HTML templates, vanilla JavaScript controllers, stylesheets, and icons residing in ",[247,284,285],{},"frontend\u002Fpublic"," are baked into the Go binary at compile time via Go's native ",[247,288,289],{},"\u002F\u002Fgo:embed all:public",".",[292,293,294,298,309],"ul",{},[295,296,297],"li",{},"Eliminates filesystem read errors on deployment.",[295,299,300,301,304,305,308],{},"Assets are served directly from RAM with proper ",[247,302,303],{},"ETag"," and ",[247,306,307],{},"Cache-Control"," headers.",[295,310,311],{},"Total binary size is ~13 MB.",[272,313,315],{"id":314},"_2-cgo-free-sqlite-wal-concurrency","2. CGO-Free SQLite WAL Concurrency",[228,317,318,319,322,323,326],{},"Traditional Go SQLite wrappers require a C compiler (",[247,320,321],{},"gcc","), preventing cross-compilation. GO Shortener utilizes ",[247,324,325],{},"modernc.org\u002Fsqlite",", a 100% pure Go SQLite transpilation:",[292,328,329,344,353],{},[295,330,331,335,336,339,340,343],{},[332,333,334],"strong",{},"Single-Writer Lock",": Set via ",[247,337,338],{},"db.SetMaxOpenConns(1)"," to eliminate database lock contention (",[247,341,342],{},"database is locked",").",[295,345,346,352],{},[332,347,348,349,279],{},"WAL Mode (",[247,350,351],{},"PRAGMA journal_mode=WAL;",": Allows simultaneous non-blocking concurrent readers while a write transaction is in progress.",[295,354,355,361],{},[332,356,357,358,279],{},"Busy Timeout (",[247,359,360],{},"PRAGMA busy_timeout=5000;",": Automatically retries pending writes for up to 5 seconds if a transaction is waiting.",{"title":249,"searchDepth":363,"depth":363,"links":364},2,[365,366,367],{"id":237,"depth":363,"text":238},{"id":254,"depth":363,"text":255},{"id":269,"depth":363,"text":270,"children":368},[369,372],{"id":274,"depth":370,"text":371},3,"1. 100% Standalone Executable (embed.FS)",{"id":314,"depth":370,"text":315},"Internal engineering, directory organization, and high-performance design patterns.","md",null,{},{"icon":177},{"title":379,"description":380},"System Architecture - GO Shortener Developer Guide","In-depth technical architecture of GO Shortener, including embed.FS, SQLite WAL, and Clean Architecture layers.","Xh2-YZvoK6vI7FhDkFIuBAD2c72JoOjCwXO2p7tGv34",[383,385],{"title":41,"path":166,"stem":167,"description":384,"icon":44,"children":-1},"Production release upgrade procedures, database backup safeguards, and rollbacks.",{"title":179,"path":180,"stem":181,"description":386,"icon":182,"children":-1},"REST conventions, standard response formats, and error handling policies.",1788462428501]