[Indie Dev] A Free Stack for Web Apps (Onamae.com + Firebase)

Published: June 30, 2026 (Updated September 26, 2026)
For: Solo developers who want to ship a web app on their own domain

The Setup at a Glance

  • Domain from Onamae.com, hosting on Firebase Hosting. Data and sign-in are Firebase too; analytics are GA4 and Search Console
  • A regular web app with no payments fits inside Firebase's free tier. The only bill is the domain renewal (¥1,778 a year)
  • Almost all of kabe-tech.com's bill is transfer of the Unity WebGL build: about ¥150 a month
  • Adding payments (Stripe) means switching to the Blaze plan. The extra cost came to about ¥10 a month

Architecture of kabe-tech.com. Domain and DNS on Onamae.com, delivery on Firebase Hosting, data in Firestore, sign-in with Authentication, analytics with GA4 and Search Console. Serving HTML, CSS, JS and images stays inside the free tier; almost all of the bill is the transfer of the Unity WebGL build (14.7MB per first visit, about ¥150 a month). Adding payments brings in Cloud Functions, Stripe and Secret Manager and requires the Blaze plan

Introduction

Once a web app is finished, the next question is where to put it so it doesn't cost money every month. Rental servers and VPSs bill monthly, and there are too many free hosts to choose from.

kabe-tech.com serves PoseMirror (turns a photo into a 3D pose), SkeletonCheck (a body-frame check) and this blog from one domain. This article shows that setup and what it actually costs. The numbers come from the Google Cloud billing screen and the Onamae.com dashboard (as of September 2026). Onamae.com is a large Japanese domain registrar; any registrar works the same way.

Services and What Each One Does

Role Service
Domain and DNS Onamae.com
Hosting Firebase Hosting
Data Cloud Firestore
Sign-in Firebase Authentication
Analytics GA4, Search Console
Source code GitHub

DNS stays at Onamae.com. When you add a custom domain in the Firebase console, it shows the records to set. Enter them in Onamae.com's DNS settings and Firebase issues the SSL certificate automatically. kabe-tech.com uses just these two lines:

kabe-tech.com.  A    199.36.158.100
kabe-tech.com.  TXT  "hosting-site=pose-mirror-app"

The values differ per project, so use the ones Firebase shows you. Hosting settings live in firebase.json. The main parts are dropping .html from URLs and the header that lets the Unity build be served.

{
  "hosting": {
    "public": "public",
    "cleanUrls": true,
    "trailingSlash": false,
    "headers": [
      {
        "source": "**/Build/*.unityweb",
        "headers": [{ "key": "Content-Encoding", "value": "br" }]
      }
    ]
  }
}

Why These Choices

Why Onamae.com (and Not GitHub Pages)

The biggest reason: to apply for Google AdSense you need a domain of your own. AdSense manages sites per domain and folds subdomains into their parent. GitHub Pages' username.github.io and Firebase's default project.web.app are parts of domains someone else owns. People in the AdSense community do report being unable to add a github.io subdomain. If you plan to run ads, you need your own domain from day one.

I bought it from Onamae.com because it is a Japanese service with a Japanese dashboard and support. kabe-tech.com cost ¥0 for the first year and renews at ¥1,778 a year.

GitHub Pages does support custom domains. I still skipped it for two reasons. First, you can't set your own response headers. Serving a Brotli-compressed Unity WebGL build needs Content-Encoding: br, as in the firebase.json above. Second, my repository is private, and GitHub Pages on a private repository needs a paid plan (GitHub Pro). Firebase Hosting covers both for free.

A Regular Web App Fits in the Free Tier

Firebase's free Spark plan allows 10GB of storage and 10GB/month of transfer (360MB a day) on Hosting, 1GiB of storage and 50K reads a day on Firestore, and 50K monthly active users on Authentication. Estimating kabe-tech.com's non-Unity pages as "page views × bytes per page" gives about 40MB a day, roughly a tenth of the limit.

Adding Unity Is What Costs Money

94% of kabe-tech.com's Firebase bill is transfer of the Unity WebGL build behind PoseMirror (¥453 of ¥482 over the last 90 days). Measured on a first visit, a blog post transfers 0.08MB and SkeletonCheck 0.76MB, while PoseMirror transfers 14.7MB. Nearly all of that is the Unity build (.wasm 6.8MB + .data 7.7MB).

Dividing the free transfer by that size gives a rough count of free loads:

10GB ÷ 14.7MB ≈ 680 loads/month (about 23 a day)

Past 680 first-time loads of the Unity page in a month, you are over the free tier. In the week of September 18–24, 2026, PoseMirror had 187 users and Hosting as a whole transferred 4.49GB (about 640MB a day). Transfer beyond the free tier costs $0.15 per GB, and Hosting billed ¥453 over the last 90 days, or about ¥150 a month.

To keep serving past the free tier, you switch to the pay-as-you-go Blaze plan and register a credit card. If a Spark project goes over 10GB of transfer in a month, the site is disabled until the next month after a short grace period (Firebase Hosting usage, quotas, and pricing). A smaller build also means more free loads. How I shrank mine is in [Unity] How to Shrink a WebGL Build for the Web.

When You Add Payments

PoseMirror has a paid plan, with payments through Stripe. Processing payments and storing the Stripe secret key require Cloud Functions and Secret Manager, and both are only available on the Blaze plan. Actual usage stays almost entirely within the free tier: over the last 90 days Secret Manager billed ¥26 and Functions ¥3.

What It Actually Costs

Item Cost
Domain
(Onamae.com)
¥1,778/year
(¥0 the first year)
Hosting transfer
(Unity's share)
About ¥150/month
Functions +
Secret Manager
(payments)
About ¥10/month
Everything else
on Firebase
¥0

The Firebase monthly figures are the last 90 days of actual charges on the Google Cloud billing screen (before credits), divided by three: ¥453 for Hosting and ¥29 for Secret Manager and Functions combined. Prices change, so check the current terms on the Firebase pricing page.

Wrapping Up

If all you need is to publish a web app built with HTML and JavaScript, a domain from a registrar plus Firebase Hosting leaves the domain renewal as your only monthly cost. Apps that need data storage or sign-in still fit in the Firestore and Authentication free tiers.

Money comes in when you serve something heavy per visit (Unity, in my case) or use Cloud Functions for things like payments. Both came to a few hundred yen a month or less. If you are about to launch, start on the free Spark plan and switch to Blaze when you get close to the limit.

Here's a web app running on this setup.

A Unity WebGL app served from Firebase Hosting. Turn one photo into a 3D pose.

▶ Try PoseMirror

Related (English):

Related (Japanese):

References

← Back to portfolio TOP