{
  "generated_at": "2026-05-31T00:30:21Z",
  "releases": [
    {
      "version": "0.8.2",
      "released_at": "2026-05-31T00:30:20Z",
      "changes": {
        "features": [],
        "fixes": [
          {
            "scope": "server",
            "message": "pages no longer intermittently load blank on reused connections",
            "commit": "bb6c93e"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "pages no longer intermittently load blank on reused connections",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.8.1",
      "released_at": "2026-05-30T23:05:10Z",
      "changes": {
        "features": [],
        "fixes": [
          {
            "scope": "server",
            "message": "offline tunnels now show an error page instead of an endless loading screen",
            "commit": "e8dc056"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "offline tunnels now show an error page instead of an endless loading screen",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.8.0",
      "released_at": "2026-05-24T13:16:36Z",
      "changes": {
        "features": [
          {
            "scope": "protocol",
            "message": "server-initiated disconnect prevents CLI auto-reconnect after dashboard action",
            "commit": "f630d77"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "server-initiated disconnect prevents CLI auto-reconnect after dashboard action",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.7.0",
      "released_at": "2026-05-22T16:16:46Z",
      "changes": {
        "features": [
          {
            "scope": null,
            "message": "release intelligence pipeline + CLI/server version gate",
            "commit": "ae8b1ec"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "release intelligence pipeline + CLI/server version gate",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.6.2",
      "released_at": "2026-05-22T13:40:03Z",
      "changes": {
        "features": [],
        "fixes": [],
        "security": [
          {
            "scope": "server",
            "message": "prevent subdomain hijacking",
            "commit": "4860fbd",
            "severity": "high"
          }
        ],
        "performance": []
      },
      "summary": "Subdomain hijacking fix",
      "security": {
        "severity": "high",
        "advisory": "A second tenant could re-register an active subdomain held by another tenant, hijacking incoming traffic. Fixed via atomic DashMap::Entry registration with tenant ownership check and SAVEPOINT-based collision handling.",
        "advisory_url": "https://github.com/hasanyalmanbas/zgrok/commit/4860fbd"
      },
      "must_update": true
    },
    {
      "version": "0.6.1",
      "released_at": "2026-04-07T04:18:42Z",
      "changes": {
        "features": [],
        "fixes": [
          {
            "scope": "client",
            "message": "use Unicode half-block chars for square QR code display",
            "commit": "fd843ea"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "use Unicode half-block chars for square QR code display",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.6.0",
      "released_at": "2026-04-06T19:02:31Z",
      "changes": {
        "features": [
          {
            "scope": null,
            "message": "add developer toolkit features — request log, auto-reconnect, custom headers, IP whitelisting, request inspector, QR code",
            "commit": "694fe31"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "add developer toolkit features — request log, auto-reconnect, custom headers, IP whitelisting, request inspector, QR code",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.5.0",
      "released_at": "2026-04-06T07:11:28Z",
      "changes": {
        "features": [
          {
            "scope": "client",
            "message": "add `zgrok update` self-update command",
            "commit": "b9017f1"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "add `zgrok update` self-update command",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.4.0",
      "released_at": "2026-04-06T06:58:18Z",
      "changes": {
        "features": [
          {
            "scope": "ui",
            "message": "complete dark-first UI overhaul",
            "commit": "04731a2"
          },
          {
            "scope": "branding",
            "message": "replace ⚡ emoji with tunnel SVG icon across all surfaces",
            "commit": "bff2e45"
          },
          {
            "scope": "seo",
            "message": "add page metadata and structured data (JSON-LD)",
            "commit": "6afced3"
          },
          {
            "scope": "seo",
            "message": "add dynamic OG image generation",
            "commit": "1a6a123"
          },
          {
            "scope": "ui",
            "message": "restyle auth pages with dark theme + ZgrokLogo, fix download gradient",
            "commit": "ba7115d"
          },
          {
            "scope": "ui",
            "message": "replace flat blue accent text with brand gradient across app",
            "commit": "ef289a1"
          }
        ],
        "fixes": [
          {
            "scope": "dashboard",
            "message": "getBillingInfo counts only active tunnels",
            "commit": "5e25d99"
          },
          {
            "scope": "dashboard",
            "message": "use prisma with tenantId filter instead of db in getBillingInfo",
            "commit": "291cf66"
          },
          {
            "scope": "tunnel",
            "message": "fix tunnel staying active after graceful disconnect",
            "commit": "8918400"
          },
          {
            "scope": "seo",
            "message": "fix sitemap, remove GSC placeholder, update PWA manifest",
            "commit": "2183b5f"
          },
          {
            "scope": "ui",
            "message": "use real Apple, Linux, Windows logos on download page",
            "commit": "74580f1"
          },
          {
            "scope": "ui",
            "message": "use gradient on pricing Upgrade to Pro button",
            "commit": "b6562c8"
          },
          {
            "scope": "ui",
            "message": "correct text-gradient to blue-cyan (was blue-purple)",
            "commit": "4ddc507"
          },
          {
            "scope": "ui",
            "message": "redesign How it works section with card layout",
            "commit": "849ac57"
          },
          {
            "scope": "ui",
            "message": "remove connector line from How it works section",
            "commit": "b503b47"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "complete dark-first UI overhaul",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.3.0",
      "released_at": "2026-04-05T20:23:05Z",
      "changes": {
        "features": [
          {
            "scope": "common",
            "message": "add tunnel_limit_for_plan, remove unused MAX_TUNNELS_PER_CLIENT",
            "commit": "f14a4d2"
          }
        ],
        "fixes": [
          {
            "scope": "client",
            "message": "clean AuthError display with eprintln instead of tracing",
            "commit": "9bff4ba"
          },
          {
            "scope": "server",
            "message": "enforce tunnel limit in assign_tunnel with transactional check",
            "commit": "82b1dce"
          },
          {
            "scope": "dashboard",
            "message": "count only active tunnels for limit check",
            "commit": "ee4d12e"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "add tunnel_limit_for_plan, remove unused MAX_TUNNELS_PER_CLIENT",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.2.0",
      "released_at": "2026-04-05T10:38:01Z",
      "changes": {
        "features": [
          {
            "scope": "dashboard",
            "message": "reorganize billing and add usage page",
            "commit": "32dfc12"
          },
          {
            "scope": "server",
            "message": "add background cleanup task for stale tunnels",
            "commit": "ca9c832"
          },
          {
            "scope": "billing",
            "message": "finalize Paddle checkout with customData and settings",
            "commit": "7151a3a"
          },
          {
            "scope": "billing",
            "message": "migrate from Paddle to Polar.sh payment provider",
            "commit": "584470c"
          },
          {
            "scope": "auth",
            "message": "migrate from Clerk to Better Auth",
            "commit": "9ad3fe2"
          },
          {
            "scope": "auth",
            "message": "add nextCookies plugin for server action cookie support",
            "commit": "15e99d4"
          },
          {
            "scope": "auth",
            "message": "add prompt select_account for Google OAuth",
            "commit": "44a58fd"
          },
          {
            "scope": "auth",
            "message": "add password reset flow with zSender email integration",
            "commit": "91ade85"
          },
          {
            "scope": null,
            "message": "add admin panel, abuse detection, monitoring & security hardening",
            "commit": "b98ee3d"
          },
          {
            "scope": "admin",
            "message": "add VPS infrastructure monitoring",
            "commit": "dcf997e"
          },
          {
            "scope": null,
            "message": "add traffic optimization — API key cache, log batching, daily limits",
            "commit": "ff5e6a8"
          },
          {
            "scope": "security",
            "message": "comprehensive security hardening across API, Rust server, and VPS",
            "commit": "6b78090"
          },
          {
            "scope": "admin",
            "message": "modernize admin dashboard with pagination, search, filters, and actions",
            "commit": "3ca2169"
          }
        ],
        "fixes": [
          {
            "scope": "billing",
            "message": "wrap useSearchParams in Suspense boundary",
            "commit": "f109328"
          },
          {
            "scope": "server",
            "message": "reduce QUIC idle timeout from 30min to 5min",
            "commit": "1ad7da4"
          },
          {
            "scope": "billing",
            "message": "use NEXT_PUBLIC_PADDLE_ENV for environment config",
            "commit": "f9c661f"
          },
          {
            "scope": "billing",
            "message": "use client component for Paddle initialization",
            "commit": "16e43e9"
          },
          {
            "scope": "billing",
            "message": "use official @paddle/paddle-js package",
            "commit": "4d80a5d"
          },
          {
            "scope": "billing",
            "message": "move successUrl inside settings object",
            "commit": "f036d39"
          },
          {
            "scope": "billing",
            "message": "use Paddle types from @paddle/paddle-js package",
            "commit": "c542ee9"
          },
          {
            "scope": "billing",
            "message": "simplify Paddle checkout params and add debug logging",
            "commit": "954cf27"
          },
          {
            "scope": "billing",
            "message": "use minimal Paddle checkout to isolate 400 error",
            "commit": "330b3a6"
          },
          {
            "scope": "billing",
            "message": "add Paddle event callback for error debugging",
            "commit": "6a97b96"
          },
          {
            "scope": "billing",
            "message": "add seller ID parameter to Paddle initialization",
            "commit": "a20ebf7"
          },
          {
            "scope": "billing",
            "message": "remove seller param (token already includes it), add debug mode",
            "commit": "f016f1f"
          },
          {
            "scope": "billing",
            "message": "remove unsupported onSubscriptionPastDue handler",
            "commit": "5e3deb1"
          },
          {
            "scope": "billing",
            "message": "use correct Polar checkout query params (products + JSON metadata)",
            "commit": "2e16419"
          },
          {
            "scope": "auth",
            "message": "use window.location.origin for same-origin auth requests",
            "commit": "0fcd01e"
          },
          {
            "scope": "auth",
            "message": "add error logging to auth endpoint",
            "commit": "927284c"
          },
          {
            "scope": "auth",
            "message": "improve OAuth redirect and session detection",
            "commit": "4ad4d59"
          },
          {
            "scope": "auth",
            "message": "add router.refresh after signOut for immediate UI update",
            "commit": "9d300cf"
          },
          {
            "scope": "auth",
            "message": "use correct Better Auth password reset function names",
            "commit": "3b7f2f8"
          },
          {
            "scope": "email",
            "message": "send to field as array for zSender API",
            "commit": "3faef7d"
          },
          {
            "scope": "admin",
            "message": "change /system endpoint to /api/admin/system",
            "commit": "c8e8a79"
          },
          {
            "scope": "tunnel",
            "message": "add graceful degradation for Redis rate limiting",
            "commit": "8082a57"
          },
          {
            "scope": "types",
            "message": "revert tenantClientCache to fix circular type inference",
            "commit": "82301d8"
          }
        ],
        "security": [],
        "performance": [
          {
            "scope": "dashboard",
            "message": "optimize tRPC batch request latency (~2.26s → ~300ms)",
            "commit": "89ecf05"
          },
          {
            "scope": "auth",
            "message": "eliminate Vercel round-trip — direct PostgreSQL from Rust server (~15s → <500ms)",
            "commit": "490fa31"
          }
        ]
      },
      "summary": "reorganize billing and add usage page",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.8",
      "released_at": "2025-12-07T11:27:01Z",
      "changes": {
        "features": [
          {
            "scope": "client",
            "message": "add version check on startup with platform-aware update instructions",
            "commit": "c66b5df"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "add version check on startup with platform-aware update instructions",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.7",
      "released_at": "2025-12-07T11:14:05Z",
      "changes": {
        "features": [
          {
            "scope": "ui",
            "message": "add legal links to footer and improve copy",
            "commit": "51138df"
          },
          {
            "scope": "tunnel",
            "message": "add graceful shutdown with Ctrl+C handler",
            "commit": "b91f8ca"
          },
          {
            "scope": "dashboard",
            "message": "add billing page and improve tunnel management",
            "commit": "9387c43"
          }
        ],
        "fixes": [
          {
            "scope": "server",
            "message": "reduce QUIC idle timeout for faster disconnect detection",
            "commit": "bd1d437"
          },
          {
            "scope": "client",
            "message": "hide noisy QUIC library warnings from user output",
            "commit": "b50ef6e"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "add legal links to footer and improve copy",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.6",
      "released_at": "2025-12-06T22:57:09Z",
      "changes": {
        "features": [
          {
            "scope": "billing",
            "message": "implement Paddle billing and plan limits",
            "commit": "2345236"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "implement Paddle billing and plan limits",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.5",
      "released_at": "2025-12-05T08:52:34Z",
      "changes": {
        "features": [
          {
            "scope": "ui",
            "message": "add consistent navigation across landing and download pages",
            "commit": "5e29bae"
          },
          {
            "scope": "ui",
            "message": "dynamic navbar button based on authentication state",
            "commit": "8587a4d"
          },
          {
            "scope": "ui",
            "message": "add responsive mobile navigation and unify branding",
            "commit": "cf04301"
          },
          {
            "scope": "ui",
            "message": "make navigation bars sticky on scroll",
            "commit": "0f721d9"
          },
          {
            "scope": "branding",
            "message": "integrate logo and comprehensive SEO setup",
            "commit": "8b419fa"
          },
          {
            "scope": "assets",
            "message": "add zgrok logo",
            "commit": "7439c82"
          },
          {
            "scope": "favicon",
            "message": "add comprehensive favicon support",
            "commit": "48338d9"
          },
          {
            "scope": "dashboard",
            "message": "add responsive mobile sidebar with hamburger menu",
            "commit": "ea2d64b"
          },
          {
            "scope": "analytics",
            "message": "add Google Analytics 4 tracking",
            "commit": "aa40d39"
          },
          {
            "scope": "client",
            "message": "add user-friendly error pages for connection failures",
            "commit": "8661a67"
          }
        ],
        "fixes": [
          {
            "scope": "ui",
            "message": "unify footer across landing and download pages",
            "commit": "1f0cbbb"
          },
          {
            "scope": "ui",
            "message": "add overflow scroll to dialog modals",
            "commit": "fbd1a00"
          },
          {
            "scope": "ui",
            "message": "preserve logo aspect ratio across all pages",
            "commit": "8e36c3f"
          },
          {
            "scope": "download",
            "message": "remove unavailable Linux ARM64 download option",
            "commit": "ab4b062"
          },
          {
            "scope": "dashboard",
            "message": "move mobile hamburger button to top-right to avoid logo overlap",
            "commit": "8c0a9c5"
          },
          {
            "scope": "dashboard",
            "message": "make tunnel cards responsive for mobile devices",
            "commit": "c8cb3ec"
          },
          {
            "scope": "api",
            "message": "use target_port from client in tunnel verify endpoint",
            "commit": "56f02db"
          },
          {
            "scope": "auth",
            "message": "migrate all authentication links to accounts.zgrok.io subdomain",
            "commit": "89e81f9"
          },
          {
            "scope": "analytics",
            "message": "move GA scripts to body to preserve SEO metadata",
            "commit": "5af2739"
          },
          {
            "scope": "security",
            "message": "patch CVE-2025-55182 React Server Components vulnerability",
            "commit": "2f94be7"
          },
          {
            "scope": "landing",
            "message": "correct CLI command syntax in hero section",
            "commit": "7ed80be"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "add consistent navigation across landing and download pages",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.3",
      "released_at": "2025-11-15T09:28:19Z",
      "changes": {
        "features": [],
        "fixes": [
          {
            "scope": "tunnel",
            "message": "send target_port to API to fix dashboard display",
            "commit": "650e450"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "send target_port to API to fix dashboard display",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.2",
      "released_at": "2025-11-15T09:22:26Z",
      "changes": {
        "features": [],
        "fixes": [
          {
            "scope": "install",
            "message": "update URLs in installation scripts",
            "commit": "8a6e0ed"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "update URLs in installation scripts",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.1",
      "released_at": "2025-11-15T08:55:59Z",
      "changes": {
        "features": [
          {
            "scope": "config",
            "message": "implement persistent config file for API key storage",
            "commit": "04e4d42"
          }
        ],
        "fixes": [],
        "security": [],
        "performance": []
      },
      "summary": "implement persistent config file for API key storage",
      "security": null,
      "must_update": false
    },
    {
      "version": "0.1.0",
      "released_at": "2025-11-15T08:33:52Z",
      "changes": {
        "features": [
          {
            "scope": null,
            "message": "add Vercel + Hetzner deployment configuration",
            "commit": "a3c26be"
          },
          {
            "scope": "health",
            "message": "add /health endpoint to HTTP listener",
            "commit": "a62b80e"
          },
          {
            "scope": "landing",
            "message": "add navigation links to CTA buttons",
            "commit": "eb36f94"
          },
          {
            "scope": null,
            "message": "add HTTP request logging to Dashboard",
            "commit": "588612d"
          },
          {
            "scope": null,
            "message": "enable custom subdomains for all plans & add request logging",
            "commit": "ff4037c"
          },
          {
            "scope": null,
            "message": "add comprehensive health checks with database and Redis monitoring",
            "commit": "5e5343b"
          },
          {
            "scope": null,
            "message": "add Prometheus metrics export with tunnel, HTTP, and QUIC stats",
            "commit": "afa0bcf"
          },
          {
            "scope": null,
            "message": "add Prometheus metrics and analytics API with traffic insights",
            "commit": "746c0a9"
          },
          {
            "scope": null,
            "message": "add HTTP Basic Auth protection for tunnels",
            "commit": "5c0bb43"
          },
          {
            "scope": "dashboard",
            "message": "add analytics metrics to dashboard and tunnel logs",
            "commit": "66d62ef"
          },
          {
            "scope": null,
            "message": "add tunnel logs page with analytics (missing file)",
            "commit": "dc7769f"
          },
          {
            "scope": "auth",
            "message": "add complete Basic Auth UI and documentation",
            "commit": "8242651"
          },
          {
            "scope": "server",
            "message": "add admin disconnect endpoint for tunnel management",
            "commit": "77dcfc6"
          },
          {
            "scope": "dashboard",
            "message": "add remote tunnel disconnect functionality",
            "commit": "e26cd2a"
          },
          {
            "scope": "landing",
            "message": "redesign landing page with modern startup/SaaS style",
            "commit": "146de10"
          },
          {
            "scope": "website",
            "message": "add download page and integrate download links",
            "commit": "8d12f66"
          }
        ],
        "fixes": [
          {
            "scope": "server",
            "message": "resolve compilation errors in QUIC server",
            "commit": "546ff53"
          },
          {
            "scope": "common",
            "message": "force Docker cache invalidation with header comment",
            "commit": "26da35a"
          },
          {
            "scope": "server",
            "message": "resolve ownership error and clean up compiler warnings",
            "commit": "6c522cb"
          },
          {
            "scope": "ui",
            "message": "remove non-existent /dashboard/tunnels route from navigation",
            "commit": "7964444"
          },
          {
            "scope": "rustls",
            "message": "enable ring crypto provider and install default",
            "commit": "3a08712"
          },
          {
            "scope": "health",
            "message": "gracefully shutdown TCP connection after health check",
            "commit": "0981ba6"
          },
          {
            "scope": "cors",
            "message": "add CORS headers for cross-domain API requests",
            "commit": "88c6f09"
          },
          {
            "scope": "api",
            "message": "add CORS support to tRPC route handler",
            "commit": "3bc746a"
          },
          {
            "scope": "api",
            "message": "fix TypeScript error in CORS handler",
            "commit": "23a21e8"
          },
          {
            "scope": "trpc",
            "message": "use relative URLs to prevent CORS issues",
            "commit": "3054023"
          },
          {
            "scope": "tunnel",
            "message": "enable HTTP redirect following and ALPN protocol",
            "commit": "936eff8"
          },
          {
            "scope": null,
            "message": "increase QUIC idle timeout to 30min and enable keepalive",
            "commit": "30fe304"
          },
          {
            "scope": null,
            "message": "handle HTTP error codes in API key verification",
            "commit": "1bb416d"
          },
          {
            "scope": null,
            "message": "ensure error messages are sent to client before closing connection",
            "commit": "cd789bd"
          },
          {
            "scope": null,
            "message": "add delay before closing connection to ensure error message is received",
            "commit": "3aaeeaf"
          },
          {
            "scope": "analytics",
            "message": "import protectedProcedure from correct module",
            "commit": "89ec2ab"
          },
          {
            "scope": "config",
            "message": "remove standalone output for Vercel compatibility",
            "commit": "f9c16d9"
          },
          {
            "scope": "tunnel",
            "message": "reuse existing inactive tunnels instead of rejecting",
            "commit": "d7841c0"
          },
          {
            "scope": "http",
            "message": "properly close TCP connections for error responses",
            "commit": "5b4ef91"
          },
          {
            "scope": "http",
            "message": "correct Content-Length headers for error responses",
            "commit": "dc5b00e"
          },
          {
            "scope": "server",
            "message": "resolve array size mismatch in disconnect endpoint",
            "commit": "a417f2a"
          },
          {
            "scope": "http",
            "message": "read full request body for admin disconnect endpoint",
            "commit": "ac9885e"
          },
          {
            "scope": "auth",
            "message": "mark tunnel inactive immediately when auth settings change",
            "commit": "3f30d14"
          },
          {
            "scope": "domain",
            "message": "change zgrok.com to zgrok.io across all files",
            "commit": "854f17f"
          },
          {
            "scope": "landing",
            "message": "update tech stack versions to match package.json",
            "commit": "0e903c4"
          },
          {
            "scope": "auth",
            "message": "redirect to /dashboard after sign-up instead of missing /onboarding page",
            "commit": "f86e89e"
          },
          {
            "scope": "api-keys",
            "message": "add delay to show API key modal after create modal closes",
            "commit": "1f83db4"
          }
        ],
        "security": [],
        "performance": []
      },
      "summary": "add Vercel + Hetzner deployment configuration",
      "security": null,
      "must_update": false
    }
  ]
}
