Skip to content
Browse documentation
On this page

Introduction

What Emberstack is, what it ships with and the principles behind it.

Emberstack is a starter template for building a SaaS application with Astro on Cloudflare Workers. It gives you authentication and teams, Stripe billing, a CMS-driven marketing site and blog, and a dashboard for signed-in users, all running on Cloudflare's platform.

The demo runs at emberstack.dev and the code is on GitHub.

What's included

  • A marketing site and blog managed in EmDash at /_emdash/admin, built from editable blocks such as hero, features, pricing, FAQ and contact.
  • A pricing page wired to Stripe Checkout, with subscription management in the Stripe Customer Portal.
  • Email and password sign-in with Better Auth.
  • Teams with Owner, Admin and Member roles, invitations and a team switcher. Every signup gets its own team.
  • A dashboard under /app with an example Notes app you can copy for your own features.
  • Server-rendered pages enhanced with Datastar. Forms still work without JavaScript.
  • Activity logging for user events.
  • Transactional email through Cloudflare Email Sending.
  • A Workers AI binding, ready to call.

The stack

Concern

Tool

Framework

Astro 7 with server output

Runtime

Cloudflare Workers

App database

Cloudflare D1 with Drizzle ORM

CMS

EmDash, on its own D1 database with media in R2

Auth

Better Auth with the organization plugin

Payments

Stripe

Email

Cloudflare Email Sending

Frontend

Datastar

Styling

Tailwind CSS 4 and daisyUI 5

Tooling

Bun, Wrangler, Biome

Guiding principles

One platform. Everything runs on Cloudflare: the app, both databases, media, sessions, email and AI. There's no separate database host or email service to sign up for before you can ship.

Common cases only. A starter is meant to be edited, so it covers what nearly every SaaS needs and leaves the rest to you. Examples live in the docs, not in the app.

Low setup friction. Getting from clone to production should take minutes. Most of what the starter uses fits in Cloudflare's and Stripe's free tiers while you explore.

One way to do things. Each concern has one approach in the code and the docs: Drizzle for app data, EmDash for content, Datastar for interactivity.

Yours to change. The code is plain Astro and TypeScript. When your requirements move, swap pieces out.

Next steps