For Users
Pick a theme, run the wizard, start editing. No database knowledge required.
An EmDash theme is a complete Astro site — pages, layouts, components, styles — distributed via create-astro. It also includes a seed file that bootstraps the database with collections, fields, menus, redirects, and sample content on first run.
A theme is a working Astro project with:
my-theme/├── package.json # Theme metadata + EmDash config├── astro.config.mjs # Astro integration setup├── src/│ ├── live.config.ts # Live Collections configuration│ ├── pages/ # Astro routes│ ├── layouts/ # Layout components│ └── components/ # UI components└── .emdash/ ├── seed.json # Schema + sample content └── uploads/ # Optional local media filesWhen you create a site from a theme, this happens:
create-astro scaffolds the project from the templatenpm install and npm run devFor Users
Pick a theme, run the wizard, start editing. No database knowledge required.
For Developers
Themes are standard Astro projects. Customize freely after scaffolding.
Use create-astro with a template:
npm create astro@latest -- --template @emdash-cms/template-blogCommunity themes work via GitHub:
npm create astro@latest -- --template github:user/emdash-portfolioAfter installation:
cd my-sitenpm installnpm run devVisit http://localhost:4321/_emdash/admin to complete the Setup Wizard.
The Setup Wizard runs automatically on first admin visit. It:
┌────────────────────────────────────────────────────────┐│ ││ ◆ EmDash ││ ││ Welcome to your new site ││ ││ Site Title: [My Awesome Blog ] ││ Tagline: [Thoughts and ideas ] ││ ││ Admin Email: [admin@example.com ] ││ Admin Password: [•••••••••••• ] ││ ││ ☑ Include sample content ││ ││ [Create Site →] ││ ││ Template: Blog Starter ││ Creates: 2 collections, 3 pages, 1 post │└────────────────────────────────────────────────────────┘EmDash provides official starter themes, each available in local (SQLite + filesystem) and Cloudflare (D1 + R2) variants:
| Theme | Description | Use Case |
|---|---|---|
@emdash-cms/template-blog | Minimal blog with posts, pages, categories, and dark mode | Personal blogs, simple sites |
@emdash-cms/template-portfolio | Editorial-style portfolio with projects, serif typography (Playfair Display), and image-focused layouts | Freelancers, agencies, creatives |
@emdash-cms/template-marketing | Bold marketing site with custom Portable Text blocks (hero, features, testimonials, pricing, FAQ) | Landing pages, SaaS sites, product marketing |
For deployment on Cloudflare Pages with D1 and R2, append -cloudflare to the template name:
npm create astro@latest -- --template @emdash-cms/template-blog-cloudflarenpm create astro@latest -- --template @emdash-cms/template-portfolio-cloudflarenpm create astro@latest -- --template @emdash-cms/template-marketing-cloudflareThese variants include wrangler.jsonc for deployment configuration.
After the Setup Wizard completes, your site is a standard Astro project. Customize it like any Astro site:
src/pages/src/layouts/The seed file is only used during initial setup. Once applied, your schema lives in the database.