DevArchitecture

Why Astro, Firebase, and DatoCMS for teams with a growth mindset

Not the stack for a five-page brochure site. The stack for a marketing team running campaigns, a founder shipping product features, and an ops lead who needs an internal tool by Friday — without hiring a platform team to support any of it.

Who this stack is actually for

This isn’t a recommendation for a single-location shop that needs five pages and a phone number. It’s for a business or startup with enough moving parts that the stack itself changes what the team can execute: a marketing function that runs real campaigns and needs to publish and iterate without opening a pull request, a product or engineering team shipping actual functionality rather than a static page, and real (if not massive) traffic and budget — without the appetite to hire a dedicated platform or DevOps function to support it.

That’s the filter each of these three gets picked through: not “can this scale,” but “does this let a small, resourced team move at the speed their budget implies, without adding headcount just to keep the lights on.”

The question that actually matters

Not “what’s the trendiest framework” — it’s “who on the team touches this next, and does the stack get out of their way or become a second job.”

Astro: performance as the default, not a project — and not just for marketing pages

Every serious growth motion runs on paid traffic, organic SEO, or both, and both are directly sensitive to Core Web Vitals. Most frameworks make you earn back performance after the fact — ship the app, then spend a sprint on code-splitting and hydration budgets. Astro inverts that: zero JavaScript ships to the browser by default, and only the pieces that genuinely need interactivity — a form, a filter, a checkout step — get individually hydrated. Performance isn’t a later optimization pass; it’s the starting position.

That matters differently against each of the two obvious alternatives:

  • Against a heavier React/Next.js-style app for a marketing site: you’re paying a JS-shipping tax for pages that are 95% static content, and clawing performance back requires active engineering discipline most marketing sites never get budget for.
  • Against a no-code builder (Webflow, Framer, Squarespace): those are genuinely fast to launch, but the team hits a wall the moment the brief needs real logic, a data model that isn’t a stack of visual blocks, or an integration the builder doesn’t support natively — and the content lives in a proprietary export format the team doesn’t own.

And Astro isn’t confined to the marketing site. Riqa is a fully authenticated SaaS product built on Astro — server-rendered, Firebase Auth-gated dashboard, Stripe checkout, real file-processing workflows — not a brochure site with a contact form. The same framework that renders this blog post as static HTML also renders an authenticated billing flow, because Astro’s output mode (static, server, or hybrid) is a per-project choice, not a ceiling on what the framework is “for.”

Astro output modes · Mermaid
One framework, two output modes — the choice is per-project, not a ceiling on the framework

DatoCMS: built for the content team you actually have

The old objection to a headless CMS — “it’s overkill if it’s just me” — doesn’t apply here, because it isn’t just one person. A marketing or content function that publishes on a cadence needs to ship copy changes, landing pages, and campaign content without waiting on an engineer to review an MDX pull request. That’s precisely the constraint DatoCMS is built to remove: a real editorial UI, a structured content model, and a publish button that doesn’t require touching git.

Against the alternatives most teams compare it to:

  • Against self-hosted WordPress: no plugin sprawl, no PHP server to patch and secure, and a structured content API (GraphQL) instead of a decade of accumulated custom-field workarounds. The editorial experience is purpose-built for structured content, not retrofitted onto a blogging platform.
  • Against Contentful/Sanity: all three are credible headless CMS choices — the real differentiator is how fast a content model goes from whiteboard to a working editor UI, which is where DatoCMS’s modeling tools earn their keep for a team that wants to move without a CMS specialist on staff.
src/content.config.ts
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";

// A DatoCMS-backed collection: structured content a marketing team
// publishes independently, fetched at build time — no engineer in
// the publish path for a routine content change.
const campaigns = defineCollection({
loader: datocmsLoader("campaign"),
schema: z.object({
  title: z.string(),
  landingPageSlug: z.string(),
  publishedAt: z.string(),
  tags: z.array(z.string()),
}),
});

DatoCMS’s reach goes beyond the public marketing site, too. A structured, role-permissioned, versioned content model is exactly the shape a policies and procedures hub needs — an employee handbook, SOPs, compliance documentation — where HR or legal needs to own and revise the content directly, changes need an audit trail, and “who approved this version” is a real question, not a nice-to-have. That’s a fundamentally different brief from a portfolio page, and the same CMS handles both because the actual requirement — structured content, a real editor, a controlled publish workflow — is identical.

That governance need doesn’t stop at “who can edit,” either. Roles and permissions in DatoCMS scope per model and per environment — HR can be restricted to the policy models, marketing to the campaign ones, without either team touching content that isn’t theirs. Workflows can require a second set of eyes before anything reaches a published state, and scheduled publishing means a policy update or a campaign page goes live at a specific date and time, not whenever someone remembers to click the button. For content where “this went out before the right person signed off” is a real compliance risk — not just an editorial preference — that approval gate is the actual requirement, not a nice-to-have layered on top.

Firebase: the backend for the product and the internal tools

A team with real product ambitions and a real internal-ops surface (dashboards, approval workflows, admin panels) usually ends up either standing up a backend for each, or hand-rolling infrastructure — a VM, a Postgres instance, a process manager — that someone now owns forever. Firebase collapses that: Auth, Firestore, Cloud Functions, and Storage under one IAM boundary and one bill, provisioned in code rather than racked and patched.

  • Against a hand-rolled backend (Express + Postgres on a VM): no server to provision, patch, or scale manually — Cloud Functions run on demand and bill per invocation, which means a bursty or low-traffic workload doesn’t carry a fixed monthly cost regardless of whether anyone used it that month.
  • Against Supabase, the fairest modern comparison: Supabase’s Postgres-first model is the natural fit for genuinely relational, query-heavy data — mature tooling, real SQL, no translation layer. Firebase’s answer to that gap is now Firebase SQL Connect (formerly Data Connect): a managed Cloud SQL for PostgreSQL layer, queryable in native SQL or GraphQL, sitting inside the same platform as Auth, Functions, and Storage. The choice isn’t strictly relational-vs-document anymore — it’s whether that relational layer lives in the same IAM and billing boundary as everything else, or runs as its own product.

Riqa is the full-product proof: Cloud Functions triggered by Pub/Sub events, Firestore holding job and billing state, Storage holding generated files, Stripe wired through Functions for payments — a complete SaaS backend with nobody on the team running a server. This site’s own contact form is the same primitives at the smallest possible scale: one HTTP-triggered function, sendContactMessage, validating a payload and sending an email.

0
Servers provisioned across either product
4
Firebase products doing the work — Auth, Firestore, Functions, Storage
1
IAM/billing boundary instead of five separate vendors

Those same four primitives are exactly what an internal tool needs: Auth-gated access (including Google Workspace SSO), a database, and serverless compute for whatever business logic the tool requires. Standing up an internal ops dashboard or an approval workflow doesn’t need new infrastructure or a dedicated backend hire — it needs the same platform the customer-facing product already runs on.

Why the combination beats one platform doing everything

Each layer owns exactly one job: Astro owns the public-facing performance and the option to grow into real app functionality: DatoCMS owns the content a non-engineering team needs to control directly, with a proper editorial and approval workflow behind it: Firebase owns everything stateful — the product, the contact form, the internal tool — under one operational boundary. That’s a deliberate contrast with the alternative most teams default to: one platform (WordPress-plus-plugins, or a no-code builder) straining to be the CMS, the app server, and the internal-tools platform all at once, badly, versus three disconnected vendors with no shared deploy model or operational owner.

How the three layers fit together · Mermaid
Each team touches exactly the layer that's theirs — no one waits on engineering for a routine content change, and no one stands up new infrastructure for an internal tool

A small, resourced team can run all three without adding a platform role, because each piece is a managed service doing the one thing it’s actually good at — not a monolith doing all three adequately.

Fast and resilient because of how the pieces fit, not despite it

Performance and scale here aren’t properties of any one piece — they come from where each piece sits relative to the request path. Content comes out of DatoCMS at build time, not runtime: by the time a visitor requests a page, there’s no CMS API call anywhere in the critical path, just pre-rendered HTML served from Firebase Hosting’s CDN. A traffic spike — a campaign landing well, a link getting shared — hits a cached edge response, not an origin server doing fresh work for every request.

The only parts of the system doing real work per request are the narrow, genuinely dynamic slices: the contact form, an authenticated dashboard, a checkout step — and those run on Cloud Functions, which scale up and down automatically and entirely independently of the static site. Ten times the usual traffic to the marketing pages costs nothing extra to serve and needs no capacity planning done in advance; if that traffic also converts into ten times the sign-ups, Firebase scales the Functions and Firestore load to match, without anyone provisioning anything by hand.

0
Origin requests for a cached static page under a traffic spike
0
Capacity planning required ahead of a campaign launch
100%
Of dynamic work isolated to the slice of the app that actually needs it

That’s the practical version of “highly performant and scalable” — not a single benchmark number, but an architecture where the part that sees the most traffic (static pages) does the least work per request, and the parts that do real work (Functions, Firestore) are the parts actually built to scale on demand.

What this actually costs

The real question with a free tier isn’t “is it free” — it’s “can we actually validate the business case on it, with more than one person, before we pay anything.” That’s where the comparison gets interesting.

WordPress is free in the sense that the software costs nothing, but that’s not really a free tier — the cost just moves to hosting, security patching, and plugin maintenance, none of which show up until something breaks. It’s not a fair comparison to a managed platform’s free plan; it’s a different cost model entirely, one that bills in time rather than dollars.

Contentful’s free tier looks generous on paper, but the ceiling most teams hit first isn’t API calls or bandwidth — it’s the number of content types allowed. A blog, an author model, a couple of landing-page block types, and a policy-document model can burn through that budget faster than expected, which means the free tier validates a toy version of the content model, not the real one. Sanity’s free tier is the opposite trade: generous on raw document and API volume, but tight on non-admin editor seats and free datasets are public by default — exactly the two dimensions that matter most for a marketing team (plural) working on content that isn’t meant to be public before launch.

DatoCMS’s free tier sits closer to what this audience actually needs to validate: enough editors, and enough structural headroom, to build a real multi-model site — not a single-content-type demo — and have more than one person on the team actually touch it before a credit card is involved. That’s the bar a free tier needs to clear to be useful here: not “can I try it,” but “can my team build the real thing on it first.”

The pattern worth judging a free tier by

Not how much it costs at zero — every vendor’s free tier is zero. It’s which dimension it rations: content types, team seats, or private datasets. Whichever one it rations is the one that determines whether the free tier can actually validate your business case, or just a demo of it.

The same logic carries into paid usage on both DatoCMS and Firebase: pricing on both tracks actual usage — content volume and editor seats on one side, reads/writes/invocations on the other — rather than a fixed line item billed the same in a quiet month as a busy one. A quiet month costs close to nothing on either; a big month costs proportionally more, funded by the traffic or content volume actually driving it.

Where this doesn’t fit

None of this is a universal recommendation. Astro’s island architecture starts fighting back once most of a page is genuinely, continuously interactive — a real web app built around heavy client state is better served by a framework designed around that from the start. DatoCMS is unnecessary weight if there’s truly no one who needs to publish independently of engineering.

Firebase, honestly, gets less credit than it deserves for this audience. The common line is that it can’t do relational data, real analytics, or long-running work — but a Firebase project is a GCP project, and Cloud Run, SQL Connect, and BigQuery are one integration away, not a platform migration. The one genuinely honest caveat is narrower than that: Firestore specifically is a transactional system, not an analytical one — built for fast, per-document reads and writes and real-time listeners, not ad-hoc cross-collection reporting. Google’s own recommended path once the need turns genuinely analytical is to export into BigQuery. That’s still your GCP project doing more, not a reason to leave it.

The stack follows the team, not the other way around

I’ve had this conversation with prospective clients who read a “why we use X” post and assumed X was the answer to their brief too. The actual first question is always who’s going to touch this in six months and what they need to be productive — the stack falls out of that, not the reverse.

Takeaways

  • Pick for the team you have — who publishes content, who ships product, who runs ops — not for a hypothetical future scale.
  • Astro’s zero-JS-by-default model is a direct, ongoing advantage for SEO- and paid-traffic-sensitive marketing sites, and it scales into real authenticated product surfaces — it isn’t confined to brochure pages.
  • A headless CMS earns its cost the moment more than one non-engineering person needs to publish — and its structured, permissioned content model is just as useful for internal policy/compliance hubs as it is for a marketing site.
  • Firebase’s serverless primitives (Auth, Firestore, Functions, Storage) serve the customer-facing product and internal tooling from the same platform, without a dedicated backend or DevOps hire.
  • Firebase is more capable than its reputation suggests: a Firebase project is a GCP project, so Cloud Run, SQL Connect (relational Postgres), and BigQuery (real analytics) are one integration away, not a reason to migrate off the platform.
  • The static pages carry the most traffic and do the least work (CDN-cached, built at deploy time); the dynamic pieces are isolated to Functions that scale independently — that split is what makes the combination resilient under a spike, not any one piece alone.
  • Judge a free tier by what it rations, not what it costs at zero — content types, team seats, and private datasets are the dimensions that actually decide whether it can validate the real business case, and DatoCMS’s free tier is built around the two that matter for a content team: multiple editors and real structural headroom.
  • Both DatoCMS and Firebase bill on actual usage rather than a fixed line item — a quiet month costs close to nothing, a big month costs proportionally more, funded by the volume actually driving it.

If that’s the shape of your team — a marketing function ready to run with a fast, well-indexed site, a product roadmap that needs real engineering behind it, and no interest in hiring a platform team just to keep it all running — this is the stack I reach for, and the kind of build I take on. Scoped, code-owned, and handed over in a state your own team can actually run with.

Need something built? Let's talk.

I take on a small number of consulting projects alongside the day job. If timing works, let's find out.