{
  "updated": "2026-10-28",
  "report_url": "https://freetier.tech/api/v1/reports",
  "category": {
    "id": "static-hosting",
    "name": "Static & frontend hosting",
    "description": "Host static sites and frontend apps from a git repo or a CLI deploy, served from a CDN.",
    "keywords": [
      "hosting",
      "deploy",
      "website",
      "static site",
      "frontend",
      "jamstack",
      "cdn"
    ],
    "count": 4,
    "url": "https://freetier.tech/api/v1/categories/static-hosting.json",
    "markdown": "https://freetier.tech/c/static-hosting.md",
    "page": "https://freetier.tech/c/static-hosting/"
  },
  "services": [
    {
      "id": "cloudflare-workers",
      "name": "Cloudflare Workers",
      "category": "static-hosting",
      "tagline": "Serverless platform that serves static assets and Worker code from Cloudflare's global network.",
      "website": "https://www.cloudflare.com/products/workers/",
      "pricing_url": "https://developers.cloudflare.com/workers/platform/pricing/",
      "free_tier": {
        "kind": "always-free",
        "summary": "Static asset requests are free and unlimited; Worker script requests are capped at 100,000 per day.",
        "limits": [
          "Requests that serve static assets are free and unlimited",
          "100,000 Worker requests per day (resets at 00:00 UTC)",
          "10 ms CPU time per Worker request",
          "20,000 static asset files per Worker version",
          "25 MiB max per static asset file",
          "100 Workers per account",
          "3,000 Workers Builds minutes per month, 1 concurrent build, 20-minute build timeout"
        ],
        "credit_usd": null,
        "commercial_use": null,
        "card_required": false
      },
      "gotchas": [
        "Cloudflare's Pages docs now tell new projects to start on Workers (static assets) instead of Pages.",
        "Past 100,000 Worker requests in a day the Worker returns Error 1027; paths matched by `run_worker_first` get a 429 instead of falling back to static assets.",
        "Cloudflare's Self-Serve Subscription Agreement bars collecting or processing credit card information on any web property receiving Free Services.",
        "workers.dev subdomains are intended for personal or hobby projects that aren't business-critical; Cloudflare recommends a custom domain or route for production.",
        "Accounts created with Google, Apple or GitHub login have no password until one is set, and creating API tokens requires a password.",
        "`wrangler deploy <dir>` only works interactively; agents and CI should set `assets.directory` in the Wrangler config file."
      ],
      "setup": {
        "signup_url": "https://dash.cloudflare.com/sign-up",
        "signup_methods": [
          "email",
          "google",
          "apple",
          "github"
        ],
        "human_steps": [
          "Sign up at https://dash.cloudflare.com/sign-up and verify your email address.",
          "Approve the Wrangler OAuth prompt in the browser when the agent runs `npx wrangler login`, or create an API token."
        ],
        "agent_access": [
          {
            "method": "cli-login",
            "install": "npm i -D wrangler@latest",
            "command": "npx wrangler login",
            "token_url": null,
            "env_var": null,
            "notes": "Opens a browser OAuth flow with a localhost:8976 callback; use `npx wrangler login --device` on remote or containerized machines."
          },
          {
            "method": "api-key",
            "install": "npm i -D wrangler@latest",
            "command": null,
            "token_url": "https://dash.cloudflare.com/profile/api-tokens",
            "env_var": "CLOUDFLARE_API_TOKEN",
            "notes": "Create it from the \"Edit Cloudflare Workers\" template; non-interactive Wrangler also needs CLOUDFLARE_ACCOUNT_ID."
          }
        ],
        "verify": "npx wrangler whoami",
        "try_without_account": {
          "command": "npx wrangler deploy --temporary",
          "expires": "The human has 60 minutes to claim the deployment.",
          "claim": "Open the claim URL Wrangler prints.",
          "notes": "Needs Wrangler 4.102.0 or later, and fails if Wrangler can already authenticate with OAuth, CLOUDFLARE_API_TOKEN or a global API key."
        }
      },
      "docs": {
        "quickstart": "https://developers.cloudflare.com/workers/static-assets/get-started/",
        "llms_txt": "https://developers.cloudflare.com/workers/llms.txt"
      },
      "sources": [
        "https://developers.cloudflare.com/pages/",
        "https://developers.cloudflare.com/workers/static-assets/",
        "https://developers.cloudflare.com/workers/static-assets/billing-and-limitations/",
        "https://developers.cloudflare.com/workers/static-assets/get-started/",
        "https://developers.cloudflare.com/workers/platform/pricing/",
        "https://developers.cloudflare.com/workers/platform/limits/",
        "https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/",
        "https://developers.cloudflare.com/workers/configuration/routing/workers-dev/",
        "https://www.cloudflare.com/terms/",
        "https://www.cloudflare.com/plans/",
        "https://developers.cloudflare.com/fundamentals/account/create-account/",
        "https://developers.cloudflare.com/fundamentals/user-profiles/login/",
        "https://developers.cloudflare.com/fundamentals/api/get-started/create-token/",
        "https://developers.cloudflare.com/workers/wrangler/install-and-update/",
        "https://developers.cloudflare.com/workers/wrangler/commands/general/",
        "https://developers.cloudflare.com/workers/wrangler/commands/workers/",
        "https://developers.cloudflare.com/workers/ci-cd/external-cicd/github-actions/",
        "https://developers.cloudflare.com/workers/llms.txt"
      ],
      "last_verified": "2026-10-28",
      "sponsored": false,
      "links": {
        "page": "https://freetier.tech/s/cloudflare-workers/",
        "markdown": "https://freetier.tech/s/cloudflare-workers.md",
        "json": "https://freetier.tech/api/v1/services/cloudflare-workers.json"
      }
    },
    {
      "id": "github-pages",
      "name": "GitHub Pages",
      "category": "static-hosting",
      "tagline": "Static site hosting that publishes HTML, CSS and JavaScript straight from a GitHub repository.",
      "website": "https://pages.github.com",
      "pricing_url": "https://github.com/pricing",
      "free_tier": {
        "kind": "always-free",
        "summary": "Free for public repositories on GitHub Free; sites up to 1 GB with a 100 GB/month soft bandwidth limit.",
        "limits": [
          "Public repositories only on GitHub Free (private repos need a paid plan)",
          "1 GB max published site size",
          "1 GB recommended source repository size",
          "100 GB per month soft bandwidth limit",
          "10 builds per hour soft limit (not applied to custom GitHub Actions workflows)",
          "Deployments time out after 10 minutes",
          "1 user or organization site per account; 1 project site per repository",
          "GitHub Actions is free for public repositories on standard GitHub-hosted runners"
        ],
        "credit_usd": null,
        "commercial_use": false,
        "card_required": false
      },
      "gotchas": [
        "GitHub says Pages may not be used as free hosting for an online business, e-commerce site or commercial SaaS, nor for sensitive transactions such as passwords or credit card numbers.",
        "The published site is public even when its repository is private (on plans that allow private Pages repos).",
        "Changes can take up to 10 minutes to go live after a push.",
        "Pushing `.github/workflows` files needs the `workflow` OAuth scope; gh's default scopes are repo, read:org and gist (add it with `gh auth refresh -s workflow`).",
        "A CNAME file does not set a custom domain; configure it in the repository's Pages settings or via the REST API.",
        "Commits pushed by a workflow using GITHUB_TOKEN do not trigger a branch-based Pages build."
      ],
      "setup": {
        "signup_url": "https://github.com/signup",
        "signup_methods": [
          "email",
          "google",
          "apple"
        ],
        "human_steps": [
          "Sign up at https://github.com/signup and verify your email address.",
          "Approve the GitHub CLI login in the browser when the agent runs `gh auth login`, or create a fine-grained personal access token."
        ],
        "agent_access": [
          {
            "method": "cli-login",
            "install": "brew install gh",
            "command": "gh auth login --web --scopes workflow",
            "token_url": null,
            "env_var": null,
            "notes": "Browser login with a one-time code; installers for other OSes are at https://cli.github.com. The workflow scope lets the agent push Pages workflow files."
          },
          {
            "method": "api-key",
            "install": "brew install gh",
            "command": null,
            "token_url": "https://github.com/settings/personal-access-tokens/new",
            "env_var": "GH_TOKEN",
            "notes": "Fine-grained token for the site repo with Contents, Pages, Administration and Workflows write; gh uses GH_TOKEN instead of stored credentials."
          }
        ],
        "verify": "gh auth status",
        "try_without_account": null
      },
      "docs": {
        "quickstart": "https://docs.github.com/en/pages/quickstart",
        "llms_txt": "https://docs.github.com/llms.txt"
      },
      "sources": [
        "https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits",
        "https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages",
        "https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site",
        "https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site",
        "https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages",
        "https://docs.github.com/en/pages/quickstart",
        "https://docs.github.com/en/get-started/learning-about-github/githubs-plans",
        "https://github.com/pricing",
        "https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github",
        "https://docs.github.com/en/github-cli/github-cli/quickstart",
        "https://docs.github.com/en/github-cli/github-cli/authenticating-with-github-cli",
        "https://cli.github.com/",
        "https://cli.github.com/manual/gh_auth_login",
        "https://cli.github.com/manual/gh_auth_refresh",
        "https://cli.github.com/manual/gh_auth_status",
        "https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps",
        "https://docs.github.com/en/rest/pages/pages",
        "https://docs.github.com/en/rest/authentication/permissions-required-for-fine-grained-personal-access-tokens",
        "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens",
        "https://docs.github.com/llms.txt"
      ],
      "last_verified": "2026-10-28",
      "sponsored": false,
      "links": {
        "page": "https://freetier.tech/s/github-pages/",
        "markdown": "https://freetier.tech/s/github-pages.md",
        "json": "https://freetier.tech/api/v1/services/github-pages.json"
      }
    },
    {
      "id": "netlify",
      "name": "Netlify",
      "category": "static-hosting",
      "tagline": "Web platform for deploying static sites and web apps with a global CDN, deploy previews and serverless functions.",
      "website": "https://www.netlify.com",
      "pricing_url": "https://www.netlify.com/pricing/",
      "free_tier": {
        "kind": "always-free",
        "summary": "300 credits per month (hard cap); a production deploy costs 15 credits and 1 GB of bandwidth costs 20.",
        "limits": [
          "300 credits per month, hard limit (no rollover, no extra credits on Free)",
          "15 credits per production deploy",
          "20 credits per GB of bandwidth",
          "2 credits per 10,000 web requests",
          "10 credits per GB-hour of compute (functions)",
          "0 credits to create Deploy Previews and branch deploys (their traffic still counts)",
          "Form submissions are free",
          "1 concurrent build",
          "500 projects per team",
          "1 team member (the Team Owner)"
        ],
        "credit_usd": null,
        "commercial_use": true,
        "card_required": false
      },
      "gotchas": [
        "When the monthly credits run out, every project on the team is paused (\"Site not available\") until the next billing cycle; Free can't buy more credits.",
        "20 production deploys use the whole 300-credit month; creating Deploy Previews and branch deploys costs 0 credits.",
        "Teams created on or after 2026-07-28 default to private projects, which only the Team Owner can view until made public.",
        "Free-plan projects created on or after 2026-08-19 show a \"Powered by Netlify\" badge to visitors; turn it off per project under Project configuration > General.",
        "Accounts created before 2025-09-04 stay on legacy (non-credit) plans with different limits."
      ],
      "setup": {
        "signup_url": "https://app.netlify.com/signup",
        "signup_methods": [
          "github",
          "gitlab",
          "bitbucket",
          "email"
        ],
        "human_steps": [
          "Sign up at https://app.netlify.com/signup (GitHub, GitLab, Bitbucket or email).",
          "Approve the Netlify CLI in the browser when the agent runs `netlify login`, or create a personal access token.",
          "To make new sites public by default, set Team settings > General > Visitor access > Default project visibility to \"Public for new projects\"."
        ],
        "agent_access": [
          {
            "method": "cli-login",
            "install": "npm install -g netlify-cli",
            "command": "netlify login",
            "token_url": null,
            "env_var": null,
            "notes": "Opens a browser for the human to approve; `netlify login --request` creates a login ticket for agent/human-in-the-loop auth and `--check` polls it."
          },
          {
            "method": "api-key",
            "install": "npm install -g netlify-cli",
            "command": null,
            "token_url": "https://app.netlify.com/user/applications#personal-access-tokens",
            "env_var": "NETLIFY_AUTH_TOKEN",
            "notes": "Personal access token for CI or headless use; the CLI reads NETLIFY_AUTH_TOKEN."
          }
        ],
        "verify": "netlify status",
        "try_without_account": null
      },
      "docs": {
        "quickstart": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli/",
        "llms_txt": "https://docs.netlify.com/llms.txt"
      },
      "sources": [
        "https://www.netlify.com/pricing/",
        "https://docs.netlify.com/manage/accounts-and-billing/billing/billing-for-credit-based-plans/credit-based-pricing-plans/",
        "https://docs.netlify.com/manage/accounts-and-billing/billing/billing-for-credit-based-plans/how-credits-work/",
        "https://docs.netlify.com/manage/accounts-and-billing/billing/billing-for-credit-based-plans/billing-faq-for-credit-based-plans/",
        "https://www.netlify.com/changelog/2026-04-14-pricing-updates-april-2026/",
        "https://www.netlify.com/changelog/2026-08-19-pre-launch-toolbar-and-powered-by-netlify-badge/",
        "https://docs.netlify.com/manage/projects/powered-by-netlify-badge/",
        "https://docs.netlify.com/manage/security/secure-access-to-sites/project-visibility/",
        "https://www.netlify.com/guides/netlify-vs-vercel/",
        "https://www.netlify.com/blog/introducing-netlify-free-plan/",
        "https://www.netlify.com/legal/self-serve-subscription-agreement/",
        "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli/",
        "https://docs.netlify.com/manage/accounts-and-billing/user-settings/",
        "https://cli.netlify.com/commands/login/",
        "https://cli.netlify.com/commands/status/",
        "https://docs.netlify.com/llms.txt"
      ],
      "last_verified": "2026-10-28",
      "sponsored": false,
      "links": {
        "page": "https://freetier.tech/s/netlify/",
        "markdown": "https://freetier.tech/s/netlify.md",
        "json": "https://freetier.tech/api/v1/services/netlify.json"
      }
    },
    {
      "id": "vercel",
      "name": "Vercel",
      "category": "static-hosting",
      "tagline": "Cloud platform for deploying static sites and web apps with Git integration, preview deployments and serverless functions.",
      "website": "https://vercel.com",
      "pricing_url": "https://vercel.com/pricing",
      "free_tier": {
        "kind": "always-free",
        "summary": "Hobby plan with 100 GB Fast Data Transfer and 1M CDN requests per month, for personal non-commercial use only.",
        "limits": [
          "100 GB Fast Data Transfer per month",
          "10 GB Fast Origin Transfer per month",
          "1,000,000 CDN requests per month",
          "1,000,000 function invocations per month",
          "4 CPU-hours Active CPU and 360 GB-hours provisioned memory per month",
          "5,000 image transformations per month",
          "100 deployments per day",
          "200 projects",
          "1 concurrent build, 45 minutes max per build",
          "100 MB max source upload per CLI deployment"
        ],
        "credit_usd": null,
        "commercial_use": false,
        "card_required": false
      },
      "gotchas": [
        "Hobby is restricted to non-commercial personal use; Vercel counts ads, taking payments, affiliate-focused sites and being paid to build or host the site as commercial.",
        "Going over a Hobby limit pauses that usage, generally until 30 days have passed; Hobby can't buy extra usage.",
        "Hobby projects can't connect to Git repositories owned by a Git organization.",
        "CLI deployments are limited to 100 MB of source files on Hobby and 15,000 source files.",
        "Use plain `vercel login` (OAuth device flow); the email and `--github`/`--gitlab`/`--bitbucket` login variants were retired on 2026-02-26."
      ],
      "setup": {
        "signup_url": "https://vercel.com/signup",
        "signup_methods": [
          "github",
          "gitlab",
          "bitbucket",
          "google",
          "apple",
          "email"
        ],
        "human_steps": [
          "Sign up at https://vercel.com/signup and use the free Hobby plan.",
          "Approve the device login in the browser when the agent runs `vercel login`, or create an access token."
        ],
        "agent_access": [
          {
            "method": "cli-login",
            "install": "npm i -g vercel",
            "command": "vercel login",
            "token_url": null,
            "env_var": null,
            "notes": "OAuth device flow; the human approves in any browser."
          },
          {
            "method": "api-key",
            "install": "npm i -g vercel",
            "command": null,
            "token_url": "https://vercel.com/account/settings/tokens",
            "env_var": "VERCEL_TOKEN",
            "notes": "The CLI reads VERCEL_TOKEN (or `--token`); set VERCEL_ORG_ID and VERCEL_PROJECT_ID to skip `vercel link` in CI."
          }
        ],
        "verify": "vercel whoami",
        "try_without_account": {
          "command": "vercel deploy --temporary",
          "expires": "Set by Vercel and printed by the CLI; the launch announcement said one hour.",
          "claim": "Open the claim URL the CLI prints, then run `vercel login` to keep deploying.",
          "notes": "Only works with no stored Vercel credentials, and not in CI or in a directory already linked to a Vercel project. Anyone with the claim link can take the project."
        }
      },
      "docs": {
        "quickstart": "https://vercel.com/docs/getting-started-with-vercel",
        "llms_txt": "https://vercel.com/llms.txt"
      },
      "sources": [
        "https://vercel.com/pricing",
        "https://vercel.com/docs/plans/hobby",
        "https://vercel.com/docs/plans",
        "https://vercel.com/docs/limits",
        "https://vercel.com/docs/limits/fair-use-guidelines",
        "https://vercel.com/docs/plans/pro-plan/trials",
        "https://vercel.com/legal/terms",
        "https://vercel.com/docs/accounts",
        "https://vercel.com/signup",
        "https://vercel.com/docs/cli",
        "https://vercel.com/docs/cli/global-options",
        "https://vercel.com/docs/cli/login",
        "https://vercel.com/docs/cli/whoami",
        "https://vercel.com/changelog/new-vercel-cli-login-flow",
        "https://vercel.com/changelog/deploy-without-an-account-using-vercel-cli",
        "https://vercel.com/llms.txt",
        "https://vercel.com/docs/deployments/deploy-without-logging-in"
      ],
      "last_verified": "2026-10-28",
      "sponsored": false,
      "links": {
        "page": "https://freetier.tech/s/vercel/",
        "markdown": "https://freetier.tech/s/vercel.md",
        "json": "https://freetier.tech/api/v1/services/vercel.json"
      }
    }
  ]
}
