[{"content":"Install Linux \u0026amp; macOS curl -fsSL gomodvanityurls.com/install.sh | bash Or download a binary from the latest release.\nWindows Choose based on your shell environment:\nOption A — Git Bash / MSYS2 / Cygwin (recommended):\nOpen your shell terminal, then run:\ncurl -fsSL gomodvanityurls.com/install.sh | bash The script auto-detects Windows and downloads the correct .exe binary.\nOption B — WSL/WSL2:\nOpen a WSL terminal, then run:\ncurl -fsSL gomodvanityurls.com/install.sh | bash Option C — Scoop (PowerShell / CMD):\nscoop bucket add gomodvanityurls https://github.com/gomodvanityurls/scoop-bucket scoop install gvu Scoop handles PATH setup automatically. Run gvu --version to verify.\nOption D — PowerShell / CMD (manual download):\nDownload gvu-windows-amd64.exe (or gvu-windows-arm64.exe for ARM devices) from the latest release, rename to gvu.exe, and add its folder to your PATH.\nAdd a vanity URL Using gomod.io (default domain, no setup) $ gvu add gomod.io/private-module https://github.com/yourorg/private-module.git ✔ Route created successfully! ═══════════════════════════════════════════════════════════ ┃ Route ID: m_abc123 ┃ Vanity Path: gomod.io/private-module ┃ Target Repo: https://github.com/yourorg/private-module.git ┃ Quota: 1 / 5 used ═══════════════════════════════════════════════════════════ An anonymous account is created automatically — no signup required.\nMonorepo with subdirectory (Go 1.25+) If your repo contains multiple Go modules in subdirectories (e.g., go/module-a/go.mod), use --subdir to point to the module\u0026rsquo;s location within the repo:\ngvu add gomod.io/module-a https://github.com/yourorg/monorepo.git --subdir go/module-a ┃ Route ID: m_def456 ┃ Vanity Path: gomod.io/module-a ┃ Target Repo: https://github.com/yourorg/monorepo.git ┃ Subdir: go/module-a Then use it in your code:\nimport \u0026#34;gomod.io/module-a\u0026#34; The Go 1.25+ toolchain will clone https://github.com/yourorg/monorepo and read go/module-a/go.mod. On Go \u0026lt; 1.25 the subdir field is silently ignored (backward compatible).\nMajor version support (v2, v3, \u0026hellip;) Routes automatically support Go module major version suffixes. You only need to add the base route — no separate entries for /v2, /v3, etc.\n# This single route also serves /v2, /v3, and any future major version gvu add gomod.io/mylib https://github.com/yourorg/mylib.git Then both of these work without any additional setup:\nimport \u0026#34;gomod.io/mylib\u0026#34; // v0 or v1 import \u0026#34;gomod.io/mylib/v2\u0026#34; // v2 import \u0026#34;gomod.io/mylib/v3\u0026#34; // v3 Wildcard routing (Pro only) If you have many repos under the same organization or prefix, wildcard routing lets you cover them all with a single rule:\n# Cover all repos under go.mycorp.com/dept1/ gvu add \u0026#39;go.mycorp.com/dept1/*\u0026#39; \u0026#39;https://github.com/dept1/*.git\u0026#39; Requires a Pro account and a custom domain. See Wildcard Routing.\nUsing a custom domain (requires Verified account) # Step 1: Create an anonymous account (fast, no email required) gvu auth signup # Step 2: Bind your email to upgrade to Verified gvu auth bind user@example.com # Enter the 6-digit code sent to your email # Step 3: Point your DNS (must be done before adding the route) # go.yourcompany.com CNAME gomodvanityurls.com # Step 4: Add the custom domain route gvu add go.yourcompany.com/private-module https://github.com/yourorg/private-module.git Configure Go Tell the Go toolchain to resolve your vanity paths directly:\nexport GOPRIVATE=gomod.io # Add custom domains too: export GOPRIVATE=gomod.io,go.yourcompany.com Add to ~/.bashrc or ~/.zshrc for persistence.\nUse it import \u0026#34;gomod.io/private-module\u0026#34; import \u0026#34;go.yourcompany.com/private-module\u0026#34; The Go toolchain resolves vanity paths to your Git repo automatically. If you ever move your code, your users\u0026rsquo; import paths stay the same.\nModule path must match the vanity URL.\nYour module\u0026rsquo;s go.mod must use the vanity URL as its module path — not the original Git hosting URL. For example:\n// go.mod — correct module gomod.io/private-module // go.mod — WRONG (will cause import resolution failure) module github.com/yourorg/private-module If your existing module uses github.com/... or gitlab.com/... as the module path, update it to the vanity URL before publishing.\nManage routes # List your routes gvu list # Remove a route gvu remove m_abc123 # Bulk delete gvu remove m_abc123 m_def456 -y # Check your account gvu auth whoami ","permalink":"https://gomodvanityurls.com/docs/quickstart/","summary":"\u003ch2 id=\"install\"\u003eInstall\u003c/h2\u003e\n\u003ch3 id=\"linux--macos\"\u003eLinux \u0026amp; macOS\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -fsSL gomodvanityurls.com/install.sh | bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOr download a binary from the \u003ca href=\"https://github.com/gomodvanityurls/gvu/releases/latest\"\u003elatest release\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"windows\"\u003eWindows\u003c/h3\u003e\n\u003cp\u003eChoose based on your shell environment:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOption A — Git Bash / MSYS2 / Cygwin (recommended):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOpen your shell terminal, then run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -fsSL gomodvanityurls.com/install.sh | bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe script auto-detects Windows and downloads the correct \u003ccode\u003e.exe\u003c/code\u003e binary.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOption B — WSL/WSL2:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOpen a WSL terminal, then run:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -fsSL gomodvanityurls.com/install.sh | bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eOption C — Scoop (PowerShell / CMD):\u003c/strong\u003e\u003c/p\u003e","title":"Quick Start"},{"content":"Verified and Pro users can use their own domain as the vanity URL prefix.\nPrerequisites A Verified or Pro account (run gvu auth bind \u0026lt;email\u0026gt; to upgrade) A domain you control with DNS management access gvu CLI installed — see Quick Start (Windows: use WSL/WSL2 or download .exe) Setup Important: DNS must be configured before running gvu add. The server verifies your domain\u0026rsquo;s CNAME record during route creation.\n1. Configure DNS Point your domain to the service via CNAME:\ngo.yourcompany.com CNAME gomodvanityurls.com 2. Wait for DNS propagation DNS changes typically propagate within seconds to a few minutes. You can verify with:\ndig go.yourcompany.com CNAME +short # Expected output: gomodvanityurls.com. 3. Add a custom domain route gvu add go.yourcompany.com/private-module https://github.com/yourorg/private-module.git The server verifies the CNAME record. If DNS is not yet configured, you will receive a DNS_NOT_CONFIGURED error — wait for propagation and try again.\n4. TLS auto-provisions TLS certificates are provisioned automatically via Caddy On-Demand TLS. The CLI probes the route after creation and warns you if TLS is still provisioning.\n5. Use it import \u0026#34;go.yourcompany.com/private-module\u0026#34; Quota Plan Custom domains Total quota (shared) Anonymous ✗ 5 Verified ✓ 10 Pro ✓ 50 Custom domain routes share the same quota pool as gomod.io routes. For example, a Verified user with 3 custom domain routes has 7 remaining slots for gomod.io routes.\nDomain Binding (Pro only) For Pro users, when you add your first route under a custom domain, that domain is automatically bound to your account. Only you can add routes under that domain afterwards. This prevents other users from using your DNS configuration.\nPlan DNS verification Domain binding Verified ✓ ✗ Pro ✓ ✓ (up to 50 domains) Note: Deleting all routes under a domain does not release the binding. Contact support if you need to release a domain binding.\nTips Use a subdomain like go.yourcompany.com or pkg.yourcompany.com Custom domain routes are exempt from the short path restriction You can mix gomod.io and custom domain routes in the same account Different subdomains are independent — go.example.com and pkg.example.com can belong to different users Domain binding persists even after Pro subscription expires or all routes are removed --subdir works with custom domains too: gvu add go.mycompany.com/module-a https://github.com/myorg/monorepo.git --subdir go/module-a Wildcard Routing (Pro only) Pro users can create wildcard routes that cover all repos under a custom domain prefix, eliminating the need to add routes one by one.\nType Syntax Example Repo wildcard gvu add 'domain/prefix/*' 'repo/*.git' go.mycorp.com/dept/* → github.com/dept/*.git Subdir wildcard gvu add domain/prefix/repo repo.git '--subdir=*' Auto-resolve monorepo subdirs See Wildcard Routing for details, priority rules, and examples.\n","permalink":"https://gomodvanityurls.com/docs/custom-domains/","summary":"\u003cp\u003eVerified and Pro users can use their own domain as the vanity URL prefix.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003ePrerequisites\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003cstrong\u003eVerified\u003c/strong\u003e or \u003cstrong\u003ePro\u003c/strong\u003e account (run \u003ccode\u003egvu auth bind \u0026lt;email\u0026gt;\u003c/code\u003e to upgrade)\u003c/li\u003e\n\u003cli\u003eA domain you control with DNS management access\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egvu\u003c/code\u003e CLI installed — see \u003ca href=\"/docs/quickstart/#install\"\u003eQuick Start\u003c/a\u003e (Windows: use WSL/WSL2 or \u003ca href=\"https://github.com/gomodvanityurls/gvu/releases/latest\"\u003edownload .exe\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"setup\"\u003eSetup\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eImportant\u003c/strong\u003e: DNS must be configured \u003cstrong\u003ebefore\u003c/strong\u003e running \u003ccode\u003egvu add\u003c/code\u003e. The server verifies your domain\u0026rsquo;s CNAME record during route creation.\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch3 id=\"1-configure-dns\"\u003e1. Configure DNS\u003c/h3\u003e\n\u003cp\u003ePoint your domain to the service via CNAME:\u003c/p\u003e","title":"Custom Domains"},{"content":"Route management Command Description gvu add \u0026lt;vanity-path\u0026gt; \u0026lt;repo-url\u0026gt; Add a new vanity URL route gvu list List all your registered routes gvu remove \u0026lt;route-id\u0026gt; [...] Remove one or more routes gvu add The hosting platform is auto-detected from the repo URL.\nFlags Flag Description --subdir \u0026lt;path\u0026gt; Subdirectory within the repo where go.mod lives (Go 1.25+). Use * for subdir wildcard (Pro only). Omit for single-module repos. Examples # ── gomod.io routes (default domain, all users) ── # GitHub gvu add gomod.io/mylib https://github.com/myorg/mylib.git gvu add gomod.io/mylib ssh://git@github.com:myorg/mylib.git # GitLab gvu add gomod.io/mylib https://gitlab.com/myorg/mylib.git gvu add gomod.io/mylib ssh://git@gitlab.com:myorg/mylib.git # Bitbucket gvu add gomod.io/mylib https://user@bitbucket.org/myorg/mylib.git gvu add gomod.io/mylib ssh://git@bitbucket.org:myorg/mylib.git # Codeberg gvu add gomod.io/mylib https://codeberg.org/myorg/mylib.git gvu add gomod.io/mylib ssh://git@codeberg.org:myorg/mylib.git # Self-hosted GitLab (custom port) gvu add gomod.io/mylib http://gitlab.example.com/group/mylib.git gvu add gomod.io/mylib ssh://git@gitlab.example.com:2222/group/mylib.git # ── Monorepo (Go 1.25+, --subdir) ── # go.mod at go/module-a/go.mod inside the repo gvu add gomod.io/module-a https://github.com/myorg/monorepo.git --subdir go/module-a gvu add gomod.io/module-b https://github.com/myorg/monorepo.git --subdir go/module-b # ── Custom domain routes (Verified/Pro only) ── gvu add go.mycompany.com/mylib https://github.com/myorg/mylib.git gvu add go.mycompany.com/mylib ssh://git@gitlab.com:myorg/mylib.git # ── Wildcard routes (Pro + custom domain only) ── # Repo wildcard — cover all repos under a GitHub org gvu add \u0026#39;go.mycorp.com/dept1/*\u0026#39; \u0026#39;https://github.com/dept1/*.git\u0026#39; # Subdir wildcard — cover all subdirs in a monorepo gvu add go.mycorp.com/dept1/mono https://github.com/dept1/mono.git \u0026#39;--subdir=*\u0026#39; Note: Wildcard routes require a Pro account and a custom domain. Repo wildcard and subdir wildcard are mutually exclusive per route. See Wildcard Routing for full details.\nCustom domain prerequisite: Configure the DNS CNAME record before running gvu add. The server verifies the CNAME during route creation. See Custom Domains for setup steps.\nPro domain binding: Pro users get exclusive domain binding — once you add a route under a custom domain, only you can add routes under that domain.\nRemember: After adding a vanity URL, your module\u0026rsquo;s go.mod must use the vanity path as the module path (e.g., module gomod.io/mylib), not the original hosting URL (e.g., github.com/myorg/mylib).\ngvu list Lists all your registered routes. Wildcard routes are marked with [W1] or [W2]:\n$ gvu list [1] m_abc123 gomod.io/mylib [exact] [2] m_def456 go.mycorp.com/dept1/* [W1] [3] m_ghi789 go.mycorp.com/dept1/mono [W2] gvu remove Supports bulk deletion:\ngvu remove m_abc123 # single gvu remove m_abc123 m_def456 # multiple gvu remove m_abc123 m_def456 -y # skip confirmation # Remove a wildcard route gvu remove m_def456 # removes the W1 wildcard rule Authentication Command Description gvu auth signup Create an anonymous account gvu auth bind \u0026lt;email\u0026gt; Bind email, upgrade to Verified gvu auth login \u0026lt;email\u0026gt; Login on a new device via email OTP gvu auth logout Clear local credentials gvu auth whoami Show current account info and quota gvu auth whoami Displays your account details including plan, quota, and access token.\nExample — Pro user:\n$ gvu auth whoami User ID: usr_abc123 Plan: PRO Pro Expires: 2027-06-24T00:00:00Z (365 days remaining) Email Status: Verified (user@example.com) Access Token: gvu_a1b2...c3d4 (expires 2026-07-25) Route Quota: 12 / 50 used (38 slots remaining) When your Pro subscription has 7 days or fewer remaining, a warning is displayed next to the expiry date.\nSubscription Command Description gvu subscribe Subscribe to Pro Plan (interactive flow) gvu subscribe Upgrades your account to Pro with an interactive payment flow:\nChoose billing period (monthly or yearly) QR codes are displayed for all supported payment methods Select your payment channel (WeChat Pay, Alipay, or PayPal) Enter the last 4 characters of your transaction ID After submission, an admin verifies your payment and activates your Pro subscription.\nSee Pricing for details on plans and payment methods.\nOther commands Command Description gvu donate Show donation QR codes (WeChat Pay, Alipay, PayPal) gvu issue Open a GitHub issue gvu --version Show version Global flags Flag Short Description --json -j Structured JSON output --yes -y Skip confirmation prompts --version -v Show version JSON output All commands support --json:\n$ gvu list --json { \u0026#34;status\u0026#34;: \u0026#34;success\u0026#34;, \u0026#34;data\u0026#34;: { \u0026#34;routes\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;m_abc123\u0026#34;, \u0026#34;vanity_path\u0026#34;: \u0026#34;gomod.io/private-module\u0026#34;, \u0026#34;target_repo\u0026#34;: \u0026#34;https://github.com/myorg/private-module.git\u0026#34;, \u0026#34;repo_type\u0026#34;: \u0026#34;github\u0026#34;, \u0026#34;route_type\u0026#34;: \u0026#34;exact\u0026#34; }, { \u0026#34;id\u0026#34;: \u0026#34;m_def456\u0026#34;, \u0026#34;vanity_path\u0026#34;: \u0026#34;gomod.io/module-a\u0026#34;, \u0026#34;target_repo\u0026#34;: \u0026#34;https://github.com/myorg/monorepo.git\u0026#34;, \u0026#34;repo_type\u0026#34;: \u0026#34;github\u0026#34;, \u0026#34;subdir\u0026#34;: \u0026#34;go/module-a\u0026#34;, \u0026#34;route_type\u0026#34;: \u0026#34;exact\u0026#34; }, { \u0026#34;id\u0026#34;: \u0026#34;m_ghi789\u0026#34;, \u0026#34;vanity_path\u0026#34;: \u0026#34;go.mycorp.com/dept1/*\u0026#34;, \u0026#34;target_repo\u0026#34;: \u0026#34;https://github.com/dept1/*.git\u0026#34;, \u0026#34;repo_type\u0026#34;: \u0026#34;github\u0026#34;, \u0026#34;route_type\u0026#34;: \u0026#34;wildcard_repo\u0026#34; } ] } } Supported Git platforms Platform HTTPS SSH Self-hosted GitHub Yes Yes — GitLab Yes Yes Yes Bitbucket Yes Yes — Codeberg Yes Yes — Custom Yes Yes Yes Configuration Credentials (access token, email, plan info) are stored in ~/.config/gvu/config.yaml, created automatically on first use.\nPrivacy note: The server never stores your Git credentials, SSH keys, or repo passwords. gvu only sends your email and an OTP to the service — your access token stays on your machine.\n","permalink":"https://gomodvanityurls.com/docs/cli/","summary":"\u003ch2 id=\"route-management\"\u003eRoute management\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eCommand\u003c/th\u003e\n          \u003cth\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003egvu add \u0026lt;vanity-path\u0026gt; \u0026lt;repo-url\u0026gt;\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eAdd a new vanity URL route\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003egvu list\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eList all your registered routes\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003egvu remove \u0026lt;route-id\u0026gt; [...]\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eRemove one or more routes\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"gvu-add\"\u003e\u003ccode\u003egvu add\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eThe hosting platform is \u003cstrong\u003eauto-detected\u003c/strong\u003e from the repo URL.\u003c/p\u003e\n\u003ch4 id=\"flags\"\u003eFlags\u003c/h4\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eFlag\u003c/th\u003e\n          \u003cth\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e--subdir \u0026lt;path\u0026gt;\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eSubdirectory within the repo where \u003ccode\u003ego.mod\u003c/code\u003e lives (Go 1.25+). Use \u003ccode\u003e*\u003c/code\u003e for subdir wildcard (Pro only). Omit for single-module repos.\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"examples\"\u003eExamples\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# ── gomod.io routes (default domain, all users) ──\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# GitHub\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib https://github.com/myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib ssh://git@github.com:myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# GitLab\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib https://gitlab.com/myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib ssh://git@gitlab.com:myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Bitbucket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib https://user@bitbucket.org/myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib ssh://git@bitbucket.org:myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Codeberg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib https://codeberg.org/myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib ssh://git@codeberg.org:myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Self-hosted GitLab (custom port)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib http://gitlab.example.com/group/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/mylib ssh://git@gitlab.example.com:2222/group/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# ── Monorepo (Go 1.25+, --subdir) ──\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# go.mod at go/module-a/go.mod inside the repo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/module-a https://github.com/myorg/monorepo.git --subdir go/module-a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add gomod.io/module-b https://github.com/myorg/monorepo.git --subdir go/module-b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# ── Custom domain routes (Verified/Pro only) ──\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add go.mycompany.com/mylib https://github.com/myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add go.mycompany.com/mylib ssh://git@gitlab.com:myorg/mylib.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# ── Wildcard routes (Pro + custom domain only) ──\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Repo wildcard — cover all repos under a GitHub org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#39;go.mycorp.com/dept1/*\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#39;https://github.com/dept1/*.git\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Subdir wildcard — cover all subdirs in a monorepo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu add go.mycorp.com/dept1/mono https://github.com/dept1/mono.git \u003cspan style=\"color:#f1fa8c\"\u003e\u0026#39;--subdir=*\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e Wildcard routes require a \u003cstrong\u003ePro\u003c/strong\u003e account and a \u003cstrong\u003ecustom domain\u003c/strong\u003e. Repo wildcard and subdir wildcard are mutually exclusive per route. See \u003ca href=\"/docs/wildcard-routing/\"\u003eWildcard Routing\u003c/a\u003e for full details.\u003c/p\u003e","title":"CLI Reference"},{"content":"Module Path Why must go.mod use the vanity URL instead of github.com/...? When you set up a vanity URL like gomod.io/mylib, the Go toolchain uses the import path (the vanity URL) to locate the module. The module directive in go.mod must match exactly:\n// go.mod — correct module gomod.io/mylib // go.mod — WRONG module github.com/yourorg/mylib If they don\u0026rsquo;t match, go get and go build will fail with an error like:\ngo: gomod.io/mylib@v0.1.0: parsing go.mod: module declares its path as: github.com/yourorg/mylib but was required as: gomod.io/mylib How do I migrate an existing module to use a vanity URL? Add a vanity URL route: gvu add gomod.io/mylib https://github.com/yourorg/mylib.git Update go.mod: change module github.com/yourorg/mylib to module gomod.io/mylib Update all internal imports within the module to use the new vanity path Tag a new release: git tag v0.2.0 \u0026amp;\u0026amp; git push --tags Update any downstream consumers to use the new import path Can I keep both github.com/... and the vanity URL working? No. Go modules require the module directive in go.mod to be a single, canonical path. You cannot have two different module paths for the same code. Choose one and stick with it.\nDo I need a separate route for major versions like /v2 or /v3? No. Routes automatically support Go module major version suffixes (/v2, /v3, etc.). You only need to add the base route:\ngvu add gomod.io/mylib https://github.com/yourorg/mylib.git This single route serves gomod.io/mylib, gomod.io/mylib/v2, gomod.io/mylib/v3, and so on. The server detects the version suffix, strips it for route lookup, and includes it in the go-import meta tag prefix — fully compliant with the Go module specification.\nGetting Started Do I need an account to use gomod.io routes? No. An anonymous account is created automatically when you run your first gvu add command. No email or signup is required. However, anonymous accounts are limited to 5 routes on the gomod.io domain.\nHow do I upgrade from Anonymous to Verified? Run gvu auth bind your@email.com and enter the verification code sent to your email. This upgrades your account to Verified with up to 10 routes and access to custom domains.\nWhat is GOPRIVATE and why do I need it? GOPRIVATE tells the Go toolchain to fetch certain module paths directly from their source (via Git) rather than from the public Go proxy (proxy.golang.org). Without it, the proxy won\u0026rsquo;t be able to resolve your private vanity URLs.\nexport GOPRIVATE=gomod.io # Add custom domains: export GOPRIVATE=gomod.io,go.yourcompany.com Quotas \u0026amp; Plans Anonymous Verified Pro Total routes 5 10 50 Custom domains ✗ ✓ ✓ Domain binding ✗ ✗ ✓ (50) Short paths (\u0026lt; 4 chars) ✗ ✗ ✓ How do I subscribe to Pro? Run gvu subscribe and follow the interactive payment flow. After payment, an admin will verify your transaction (usually within 24 hours) and upgrade your account.\nWhich payment methods are supported? Method Best for WeChat Pay China mainland users Alipay China mainland users PayPal International users You can choose monthly or yearly billing. See Pricing for details.\nWhat happens to my routes if my Pro subscription expires? If your Pro subscription expires, your account is downgraded to Verified (10 routes). Excess routes will be frozen. They are not deleted immediately — renew your subscription to reactivate them.\nRun gvu auth whoami to check your expiry date and remaining days A warning appears when 7 days or fewer remain After renewal, all frozen routes are automatically reactivated Note: Frozen routes are retained for 90 days. If you do not renew within 90 days, frozen routes will be permanently deleted.\nCustom Domains How do I set up a custom domain? Upgrade to Verified: gvu auth bind your@email.com Create a CNAME DNS record: go.yourcompany.com → gomodvanityurls.com Wait for DNS propagation (usually seconds to a few minutes) Add a route: gvu add go.yourcompany.com/mylib https://github.com/yourorg/mylib.git TLS certificates are provisioned automatically via Caddy On-Demand TLS See Custom Domains for full details.\nDoes my custom domain need HTTPS? No — TLS certificates are managed automatically. Once your CNAME is in place, HTTPS is provisioned on first request.\nWhy does gvu add require DNS to be configured first? To prevent domain hijacking, the server verifies your domain\u0026rsquo;s CNAME record before creating the route. Configure the CNAME record first, wait for DNS propagation, then run gvu add. If DNS is not yet configured, you will receive a DNS_NOT_CONFIGURED error.\nCan other users add routes under my custom domain? Pro users: No. When you add the first route under a custom domain, the domain is automatically bound to your account. Other users receive a DOMAIN_ALREADY_BOUND error. Verified users: Yes — Verified accounts can use custom domains but do not have exclusive domain binding. Upgrade to Pro to lock your domain. What if someone bound my domain before me? Contact support with proof of domain ownership (e.g., a DNS TXT record or domain registrar screenshot). We can transfer the binding after verification.\nDoes deleting all routes release the domain binding? No. Domain bindings persist even after all routes under the domain are removed. This prevents accidental loss of your domain claim. Contact support to release a binding.\nWildcard Routing What is wildcard routing? Wildcard routing lets you cover all repos under a custom domain prefix with a single rule, instead of adding routes one by one. It requires a Pro account and a custom domain. See Wildcard Routing for details.\nCan I use wildcard routes on gomod.io? No. Wildcard routes are only available on custom domains. gomod.io routes use exact matching only.\nDo wildcard routes count against my quota? Yes. Each wildcard route counts as 1 route against your Pro quota (50 total), same as exact routes.\nWhat happens if both a wildcard and exact route match? Exact routes always take priority. Wildcard routes only apply when no exact match exists. See Priority rules.\nCan I combine repo wildcard and subdir wildcard? No. Repo wildcard (W1) and subdir wildcard (W2) are mutually exclusive per route. A single route can use one or the other, not both.\nWhat if a repo matched by a wildcard doesn\u0026rsquo;t exist? go get will fail with a \u0026ldquo;repository not found\u0026rdquo; error, same as with exact routes. The wildcard resolves the URL but the Git host must have the repo.\nDo wildcard routes work after Pro expiry? No special treatment — wildcard routes are frozen and deleted along with regular routes when your Pro subscription expires. See Pro expiry and renewal.\nTroubleshooting go get fails with \u0026ldquo;module declares its path as\u0026hellip;\u0026rdquo; This means your go.mod module path doesn\u0026rsquo;t match the vanity URL. Update go.mod to use the vanity URL. See Why must go.mod use the vanity URL?.\ngo get fails with \u0026ldquo;no Go modules found\u0026rdquo; Check that GOPRIVATE includes your vanity domain:\ngo env GOPRIVATE If it\u0026rsquo;s empty or missing your domain, set it:\ngo env -w GOPRIVATE=gomod.io My route shows as \u0026ldquo;Frozen\u0026rdquo; in gvu list A frozen route means your Pro subscription has expired and your account was downgraded to Verified (10 routes). Routes beyond the first 10 are frozen. Renew your subscription with gvu subscribe — all frozen routes are automatically reactivated once your Pro is active again. You can also remove excess routes with gvu remove. You have 90 days to renew before frozen routes are permanently removed.\nThe server returned RATE_LIMITED when I ran gvu add Anonymous users are rate-limited to prevent abuse. Wait a few minutes and try again, or bind an email (gvu auth bind) to get higher limits.\nWindows Windows shows \u0026ldquo;Windows protected your PC\u0026rdquo; when running gvu.exe This is Microsoft SmartScreen — it flags newly-published executables that haven\u0026rsquo;t accumulated enough download reputation yet. To bypass:\nClick More info Click Run anyway Better alternatives that avoid SmartScreen entirely:\n# Use Scoop (installs with proper PATH setup, no SmartScreen warning) scoop bucket add gomodvanityurls https://github.com/gomodvanityurls/scoop-bucket scoop install gvu # Or use install.sh if you have a shell environment (WSL, Git Bash, etc.) curl -fsSL gomodvanityurls.com/install.sh | bash The SmartScreen warning will gradually disappear as more users install gvu.\nHow do I update gvu on Windows? If installed via Scoop:\nscoop update gvu If installed via install.sh (WSL/Git Bash):\ncurl -fsSL gomodvanityurls.com/install.sh | bash If installed manually: Download the latest .exe from GitHub Releases and replace the old file.\n","permalink":"https://gomodvanityurls.com/docs/faq/","summary":"\u003ch2 id=\"module-path\"\u003eModule Path\u003c/h2\u003e\n\u003ch3 id=\"why-must-gomod-use-the-vanity-url-instead-of-githubcom\"\u003eWhy must \u003ccode\u003ego.mod\u003c/code\u003e use the vanity URL instead of \u003ccode\u003egithub.com/...\u003c/code\u003e?\u003c/h3\u003e\n\u003cp\u003eWhen you set up a vanity URL like \u003ccode\u003egomod.io/mylib\u003c/code\u003e, the Go toolchain uses the \u003cstrong\u003eimport path\u003c/strong\u003e (the vanity URL) to locate the module. The \u003ccode\u003emodule\u003c/code\u003e directive in \u003ccode\u003ego.mod\u003c/code\u003e must match exactly:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e// go.mod — correct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emodule gomod.io\u003cspan style=\"color:#ff79c6\"\u003e/\u003c/span\u003emylib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e// go.mod — WRONG\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emodule github.com\u003cspan style=\"color:#ff79c6\"\u003e/\u003c/span\u003eyourorg\u003cspan style=\"color:#ff79c6\"\u003e/\u003c/span\u003emylib\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf they don\u0026rsquo;t match, \u003ccode\u003ego get\u003c/code\u003e and \u003ccode\u003ego build\u003c/code\u003e will fail with an error like:\u003c/p\u003e","title":"FAQ"},{"content":"Wildcard routing lets you cover all repositories under a custom domain prefix with a single rule, eliminating the need to register each repo individually.\nPrerequisites A Pro account (run gvu subscribe to upgrade) A custom domain with DNS CNAME already configured gvu CLI installed — see Quick Start Note: Wildcard routes are not available on the default gomod.io domain. They require a custom domain.\nRepo wildcard (W1) Use repo wildcard when you have many repos under the same GitHub organization or path prefix.\nSyntax gvu add \u0026#39;\u0026lt;domain\u0026gt;/\u0026lt;prefix\u0026gt;/*\u0026#39; \u0026#39;https://\u0026lt;host\u0026gt;/\u0026lt;org\u0026gt;/*.git\u0026#39; Shell quoting: The * character must be quoted in the shell to prevent glob expansion. Use single quotes ('...') around arguments containing *.\nThe * in the vanity path matches any single path segment. The * in the repo URL is replaced with the matched segment.\nExample # Cover all repos under go.mycorp.com/dept1/ gvu add \u0026#39;go.mycorp.com/dept1/*\u0026#39; \u0026#39;https://github.com/dept1/*.git\u0026#39; After creating this rule, any go get request under go.mycorp.com/dept1/ is automatically resolved:\nimport \u0026#34;go.mycorp.com/dept1/auth\u0026#34; // → github.com/dept1/auth import \u0026#34;go.mycorp.com/dept1/config\u0026#34; // → github.com/dept1/config import \u0026#34;go.mycorp.com/dept1/utils\u0026#34; // → github.com/dept1/utils No need to add routes individually — new repos work immediately.\nSubdir wildcard (W2) Use subdir wildcard when your monorepo contains multiple Go modules in subdirectories. Combined with Go 1.25+ subdir support, this auto-resolves all sub-packages.\nSyntax gvu add \u0026lt;domain\u0026gt;/\u0026lt;prefix\u0026gt;/\u0026lt;repo\u0026gt; https://\u0026lt;host\u0026gt;/\u0026lt;org\u0026gt;/\u0026lt;repo\u0026gt;.git \u0026#39;--subdir=*\u0026#39; The * in --subdir is replaced with the sub-package path segment from the request.\nExample # Cover all sub-packages in a monorepo gvu add go.mycorp.com/dept1/mono https://github.com/dept1/mono.git \u0026#39;--subdir=*\u0026#39; After creating this rule:\nimport \u0026#34;go.mycorp.com/dept1/mono/api\u0026#34; // → github.com/dept1/mono (subdir: api) import \u0026#34;go.mycorp.com/dept1/mono/config\u0026#34; // → github.com/dept1/mono (subdir: config) import \u0026#34;go.mycorp.com/dept1/mono/worker\u0026#34; // → github.com/dept1/mono (subdir: worker) The Go 1.25+ toolchain clones the repo and reads the go.mod from the matched subdirectory.\nPriority rules When multiple rules could match a request, the resolver uses this priority order:\nPriority Rule type Example 1 (highest) Exact match go.mycorp.com/dept1/auth (exact route) 2 Subdir wildcard (W2) go.mycorp.com/dept1/mono with --subdir=* 3 Repo wildcard (W1) go.mycorp.com/dept1/* Example: priority in action Suppose you have these rules:\n# Exact route (priority 1) gvu add go.mycorp.com/dept1/auth https://github.com/dept1/auth-v2.git # Repo wildcard (priority 3) gvu add \u0026#39;go.mycorp.com/dept1/*\u0026#39; \u0026#39;https://github.com/dept1/*.git\u0026#39; go get go.mycorp.com/dept1/auth → resolves to auth-v2 (exact match wins) go get go.mycorp.com/dept1/config → resolves to github.com/dept1/config (wildcard match) Quota and limits Each wildcard route counts as 1 route against your Pro quota (50 total) Wildcard routes require a custom domain — gomod.io is not supported Repo wildcard (W1) and subdir wildcard (W2) are mutually exclusive per route Only one * is allowed in the repo URL Common scenarios Scenario A: 20+ repos under an organization Instead of adding each repo individually:\n# One rule covers all current and future repos gvu add \u0026#39;go.mycorp.com/platform/*\u0026#39; \u0026#39;https://github.com/mycorp-platform/*.git\u0026#39; Scenario B: Monorepo with many Go modules # One rule covers all sub-packages gvu add go.mycorp.com/infra/core https://github.com/mycorp/core.git \u0026#39;--subdir=*\u0026#39; Scenario C: Mix exact and wildcard routes # Wildcard for most repos gvu add \u0026#39;go.mycorp.com/team/*\u0026#39; \u0026#39;https://github.com/myteam/*.git\u0026#39; # Override specific repos with exact routes (higher priority) gvu add go.mycorp.com/team/legacy https://gitlab.com/myteam/legacy.git gvu add go.mycorp.com/team/fork https://github.com/upstream/fork.git Troubleshooting go get fails with \u0026ldquo;repository not found\u0026rdquo; The repo matched by the wildcard doesn\u0026rsquo;t exist on the Git host. Verify the repo URL by replacing * with the actual package name:\n# If go get go.mycorp.com/dept1/foo fails, check: git ls-remote https://github.com/dept1/foo.git gvu add rejects wildcard route Common reasons:\nError Cause Fix WILDCARD_PRO_ONLY Not a Pro account Run gvu subscribe INVALID_WILDCARD Invalid * combination Ensure * is at the end of the path (/*) and in the repo URL CUSTOM_DOMAIN_REQUIRED Using gomod.io Use a custom domain instead Wildcard route works but sub-package doesn\u0026rsquo;t resolve Make sure GOPRIVATE includes your custom domain:\ngo env -w GOPRIVATE=go.mycorp.com See Wildcard Routing for full details.\n","permalink":"https://gomodvanityurls.com/docs/wildcard-routing/","summary":"\u003cp\u003eWildcard routing lets you cover all repositories under a custom domain prefix with a single rule, eliminating the need to register each repo individually.\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003ePrerequisites\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003cstrong\u003ePro\u003c/strong\u003e account (run \u003ccode\u003egvu subscribe\u003c/code\u003e to upgrade)\u003c/li\u003e\n\u003cli\u003eA \u003cstrong\u003ecustom domain\u003c/strong\u003e with DNS CNAME already configured\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egvu\u003c/code\u003e CLI installed — see \u003ca href=\"/docs/quickstart/#install\"\u003eQuick Start\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNote:\u003c/strong\u003e Wildcard routes are \u003cstrong\u003enot\u003c/strong\u003e available on the default \u003ccode\u003egomod.io\u003c/code\u003e domain. They require a custom domain.\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"repo-wildcard-w1\"\u003eRepo wildcard (W1)\u003c/h2\u003e\n\u003cp\u003eUse repo wildcard when you have many repos under the same GitHub organization or path prefix.\u003c/p\u003e","title":"Wildcard Routing"},{"content":" GitHub Issues Report bugs, request features, or browse existing discussions.\nOpen Source More channels (Discord, X/Twitter) coming soon.\n","permalink":"https://gomodvanityurls.com/community/","summary":"\u003cdiv class=\"community-grid\"\u003e\n\u003ca href=\"https://github.com/gomodvanityurls/gvu/issues\" class=\"community-card\" target=\"_blank\" rel=\"noopener\"\u003e\n  \u003ch3\u003eGitHub Issues\u003c/h3\u003e\n  \u003cp\u003eReport bugs, request features, or browse existing discussions.\u003c/p\u003e\n  \u003cspan class=\"community-badge\"\u003eOpen Source\u003c/span\u003e\n\u003c/a\u003e\n\u003c/div\u003e\n\u003cp style=\"margin-top: 24px; color: #666;\"\u003eMore channels (Discord, X/Twitter) coming soon.\u003c/p\u003e","title":"Community"},{"content":"Free forever for personal use Anonymous Verified Pro Price Free Free See below Total routes 5 10 50 Custom domains ✗ ✓ ✓ Domain binding ✗ ✗ ✓ (50) Short paths (\u0026lt; 4 chars) ✗ ✗ ✓ Wildcard routing ✗ ✗ ✓ (custom domain only) Multi-device ✗ ✓ ✓ How to upgrade Anonymous → Verified (free) gvu auth bind user@example.com # Enter the 6-digit code sent to your email That\u0026rsquo;s it. You now have 10 routes (shared pool for gomod.io and custom domains).\nVerified → Pro Subscription-based. 50 routes (shared pool).\nPricing Billing period CNY (WeChat Pay / Alipay) USD (PayPal) Monthly ¥9.9 / month $3.99 / month Yearly ¥79 / year $29.99 / year Yearly billing saves 37% compared to monthly.\nHow to subscribe gvu subscribe The interactive flow walks you through:\nChoose a billing period (monthly or yearly) Scan the QR code for your preferred payment method Enter your User ID in the payment remark field Enter the last 4 characters of your transaction ID An admin will verify your payment, usually within 24 hours. Once verified, your account is upgraded automatically.\nSupported payment methods Method Best for WeChat Pay China mainland users Alipay China mainland users PayPal International users Pro expiry and renewal Your Pro subscription is valid for 30 days (monthly) or 365 days (yearly) from activation.\nRun gvu auth whoami to check your expiry date and remaining days When your subscription expires, your account is downgraded to Verified (10 routes). Excess routes are frozen (not deleted immediately) Renew with gvu subscribe — all frozen routes are automatically reactivated Routes that remain frozen for more than 90 days without renewal will be permanently removed Notes All route types share a single quota pool For example, a Verified user with 3 custom domain routes has 7 remaining slots for gomod.io routes gomod.io is the platform\u0026rsquo;s default domain — works immediately without DNS configuration Custom domains require a DNS CNAME record pointing to the service ","permalink":"https://gomodvanityurls.com/pricing/","summary":"\u003ch2 id=\"free-forever-for-personal-use\"\u003eFree forever for personal use\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eAnonymous\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eVerified\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003ePro\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003ePrice\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003eFree\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003eFree\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003eSee below\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eTotal routes\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e5\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e10\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e50\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eCustom domains\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eDomain binding\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓ (50)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eShort paths (\u0026lt; 4 chars)\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eWildcard routing\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓ (custom domain only)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eMulti-device\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✗\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e✓\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"how-to-upgrade\"\u003eHow to upgrade\u003c/h2\u003e\n\u003ch3 id=\"anonymous--verified-free\"\u003eAnonymous → Verified (free)\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egvu auth \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003ebind\u003c/span\u003e user@example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#6272a4\"\u003e# Enter the 6-digit code sent to your email\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThat\u0026rsquo;s it. You now have \u003cstrong\u003e10 routes\u003c/strong\u003e (shared pool for \u003ccode\u003egomod.io\u003c/code\u003e and custom domains).\u003c/p\u003e","title":"Pricing"}]