Newsletter
Join the Community
Subscribe to our newsletter for the latest news and updates
Self-hostable Astro marketing + blog + docs starter using EmDash CMS, SQLite, and Cloudflare R2. Typed pages, full-text search, SEO.
Astro EmDash Starter is a self-hostable Astro 7 boilerplate that bundles a marketing site, a blog, and a Starlight-powered documentation section into a single project, with the EmDash CMS managing content as the single source of truth.
The starter is a production-ready template for server-rendered Astro sites that need a CMS-backed blog and pages plus static documentation. It takes content authored in the EmDash admin panel and renders it through the Astro Node adapter, serving everything from a Docker container on any Node host. The project is built by milzamsz and released under the MIT license, with the repository description claiming 100/100 Lighthouse scores.
/_emdash/admin; portable text rich content is rendered with a PortableText component.llms.txt are generated from a single site config.RESEND_API_KEY, which lets Resend deliver magic links.src/content as Markdown or JSON, with full-text search from Starlight, then host everything from the same deployable container.Running pnpm dev starts EmDash's dev server, which boots Astro, runs database migrations, and seeds seed/seed.json on the first run. You then open the site at localhost port 4321 and the admin at /_emdash/admin, where the first visit walks you through creating an owner account. Content is stored locally in ./data/emdash.db and uploads in ./data/uploads, with no database configuration required.
The template is free and open source under the MIT license. Infrastructure costs are your own: a Docker host or Dokploy deployment, Cloudflare R2 for media storage, and an optional Resend account for magic-link email.
Clone the repository, run pnpm install, then pnpm dev. The dev server starts EmDash, runs migrations, and seeds the database with starter content automatically. After that, open http://localhost:4321 for the site and /_emdash/admin for the admin panel.
Blog posts and pages are stored in a SQLite database file (./data/emdash.db) on first run, with media uploads in ./data/uploads locally. In production, you mount a persistent volume at /app/data and set Cloudflare R2 credentials so uploads go to a private bucket.
Build with pnpm build to produce a Node server output, then run the included Dockerfile on a Node host such as Dokploy. Mount a persistent volume at /app/data and provide R2 credentials as environment variables. For the best Lighthouse scores, compress responses at your reverse proxy.
Public pages are built with plain Astro components and small inline scripts rather than React. The optional magic-link sign-in through Resend is the only external dynamic service tied to the admin, not the rendered site.
Yes, the project includes a pnpm export-seed script that exports the current CMS content back to a seed file, which is useful for versioning content or resetting an environment.
