Back to Articles
2026-08-148 min read
hostingfree-tiercloud-runfirebasenextjs

How We Host For Free: Decoupled Next.js on Firebase App Hosting

How We Host For Free: Decoupled Next.js on Firebase App Hosting

Most modern web development agencies push clients into paying monthly platform subscription fees on Vercel, Shopify, or Heroku. However, digital sovereignty means owning your infrastructure. Here is our exact technical blueprint to host dynamic, server-side rendered (SSR) Next.js web applications for $0.00/month in production while delivering sub-second page loads globally.


1. The Industry Anti-Pattern: Monthly Infrastructure Rent

Traditional PaaS providers charge steep monthly seat taxes ($20/user/month) and ballooning bandwidth markups once your web traffic grows. A small local business hosting a standard Next.js site can easily burn $240 to $1,200 every year just for static file hosting and basic serverless functions.

WARNING
Renting server space on closed SaaS platforms creates dangerous vendor lock-in. If you fail to pay the monthly billing subscription or if a platform changes its pricing policy, your site, client data, and operational workflows disappear overnight.

When developers build applications tightly coupled to proprietary platform SDKs, migrating to another provider becomes cost-prohibitive. This artificially locks small businesses into perpetual subscription payments for basic web infrastructure that costs pennies to compute.


2. The Strategy: Serverless Containers Scaling to Zero

Instead of keeping an expensive dedicated server running 24 hours a day, 7 days a week, we leverage Google Cloud Platform (GCP) via Firebase App Hosting. Firebase App Hosting compiles Next.js server components into lightweight Open Container Initiative (OCI) images and deploys them to Cloud Run, GCP's serverless container execution environment.

========================================================================================================
                          FIREBASE APP HOSTING & CLOUD RUN ARCHITECTURE
========================================================================================================

 [ USER BROWSER ]
       │
       ▼ (Edge CDN Asset Caching)
 [ CLOUDFLARE / FIREBASE CDN ] ──► (95% Static Assets Served Instantly - $0.00)
       │
       ▼ (Dynamic SSR Requests Only)
 [ GOOGLE CLOUD RUN CONTAINERS ]
       ├── Autoscale to 0 when idle (Zero CPU cost when no users are visiting)
       ├── Instant spin-up on incoming request (< 200ms cold start)
       └── Generous Free Tier Cushion (2M requests/mo, 180,000 vCPU-sec/mo)
========================================================================================================
  • Autoscale to Zero: When no traffic is visiting the website, Cloud Run containers scale down to zero active instances. You pay exactly $0.00 for idle server capacity.
  • Generous Free Tier Cushion: GCP provides a permanent free tier of 2 million requests per month, 180,000 vCPU-seconds, and 360,000 GB-seconds of memory—far exceeding the traffic demands of typical B2B and local business sites.
  • Global Edge CDN: Cloudflare or Firebase Hosting handles static asset routing at the edge, meaning 95% of asset requests (CSS, images, JS bundles) never hit our backend container.

3. Production Configuration Blueprint

To deploy dynamic Next.js builds seamlessly using Firebase CLI source deploys, we configure apphosting.yaml at the project root:

# apphosting.yaml - Production Deployment Config
runConfig:
  minInstances: 0
  maxInstances: 10
  concurrency: 80
  cpu: 1
  memoryMiB: 512

env:
  - variable: GOOGLE_CALENDAR_ID
    availability:
      - RUNTIME
  - variable: RESEND_API_KEY
    availability:
      - RUNTIME
  - variable: TURSO_DATABASE_URL
    availability:
      - RUNTIME
  - variable: TURSO_AUTH_TOKEN
    availability:
      - RUNTIME

And in Node.js, we cache SQLite / Turso database connections to prevent connection pool exhaustion across ephemeral container spawns:

import { createClient, Client } from '@libsql/client';
import path from 'path';

let globalClient: Client | null = null;

export async function openDb() {
  if (!globalClient) {
    globalClient = createClient({
      url: process.env.TURSO_DATABASE_URL || `file:${path.join(process.cwd(), 'src/lib/protoss.db')}`,
      authToken: process.env.TURSO_AUTH_TOKEN
    });
  }
  return globalClient;
}

4. Cold Start Optimization Techniques

Serverless containers can occasionally suffer from cold start latency when waking up from zero instances. To eliminate cold starts completely:

  1. Keep Bundle Sizes Lightweight: Strip heavy external UI dependencies. Use native Vanilla CSS and modern Next.js 16 App Router components.
  2. Pre-warm Connections: Use edge-cached static placeholders for instant initial HTML rendering while server components stream in parallel.
  3. Optimize Asset Headers: Set aggressive cache control headers (Cache-Control: public, max-age=31536000, immutable) for static images and media.
# Verify container build size locally before deploy
docker build -t protoss-web-test .
docker image ls protoss-web-test

By keeping our container footprint under 150MB, cold start execution takes less than 180 milliseconds, rendering pages faster than traditional WordPress or Webflow servers.


5. ROI & Platform Comparison Matrix

Metric / Feature Vercel Pro Plan Sovereign Firebase App Hosting
Monthly Base Cost $20.00 / user / month $0.00 / month (GCP Free Tier)
Idle CPU Costs Charged Continuously $0.00 (Autoscale to Zero)
Bandwidth Markup $40 / 100GB beyond limit Included in GCP Free Tier
Infrastructure Control Proprietary Vercel Lock-In Open OCI Docker Container
Deploy Target Closed Ecosystem Relocatable to Any Cloud (AWS/GCP/Hetzner)

6. Actionable Developer Checklist

  1. Configure minInstances: 0: Ensure your Cloud Run container scales down to zero when idle to prevent background charges.
  2. Cache Database Connections: Use a global singleton pattern in TypeScript to reuse database connections across requests.
  3. Offload Static Assets to Edge CDN: Route heavy media files through Cloudflare or Firebase Storage to shield backend containers.
  4. Deploy via Local CLI: Use firebase deploy --only apphosting to upload zipped source code directly from your terminal.
  5. Enforce Security Headers: Include HSTS, X-Content-Type-Options, and Content-Security-Policy headers in next.config.js.

Transparency Note: The architectures, scripts, and configurations described in this article represent real-world technical implementations currently deployed on Protoss.ca. We publish these implementation notes to share our open-source blueprints for sovereign, local-first infrastructure.