Files
moreminimore-redesign/packages/core
Matt Kane 885df3b3a8 test(smoke): add astro build verification for all demos and templates (#361)
Smoke tests only ran astro dev, which uses Vite's on-demand compilation
and never invokes the adapter build pipeline. Build failures in
cloudflare/playground demos (or any adapter-dependent site) passed CI
undetected. Add a build verification suite that runs astro build for
every site in the matrix before the existing runtime tests.

Bumps smoke test CI timeout from 15 to 30 minutes to accommodate.
2026-04-07 19:07:07 +00:00
..
2026-04-01 15:02:06 +00:00
2026-04-01 10:58:32 +01:00
2026-04-01 10:46:10 +01:00
2026-04-01 10:44:22 +01:00
2026-04-01 10:44:22 +01:00
2026-04-01 10:44:22 +01:00

emdash

The core EmDash CMS package - an Astro-native, agent-portable reimplementation of WordPress.

Installation

npm install emdash

Features

  • Content Management - Collections, fields, Live Collections integration
  • Media Library - Upload via signed URLs, S3-compatible storage
  • Full-Text Search - FTS5 with Porter stemming, per-collection config
  • Navigation Menus - Hierarchical menus with URL resolution
  • Taxonomies - Categories, tags, custom taxonomies
  • Widget Areas - Content, menu, and component widgets
  • Sections - Reusable content blocks
  • Plugin System - Hooks, storage, settings, admin pages
  • WordPress Import - WXR, REST API, WordPress.com

Quick Start

// astro.config.mjs
import { defineConfig } from "astro/config";
import emdash, { local } from "emdash/astro";
import { sqlite } from "emdash/db";

export default defineConfig({
	integrations: [
		emdash({
			database: sqlite({ url: "file:./data.db" }),
			storage: local({
				directory: "./uploads",
				baseUrl: "/_emdash/api/media/file",
			}),
		}),
	],
});
// src/live.config.ts
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";

export const collections = {
	_emdash: defineLiveCollection({ loader: emdashLoader() }),
};

API

import {
	getEmDashCollection,
	getEmDashEntry,
	getSiteSettings,
	getMenu,
	getTaxonomyTerms,
	getWidgetArea,
	search,
} from "emdash";

// Content
const { entries } = await getEmDashCollection("posts");
const { entry } = await getEmDashEntry("posts", "hello-world");

// Site settings
const settings = await getSiteSettings();

// Navigation
const menu = await getMenu("primary");

// Taxonomies
const categories = await getTaxonomyTerms("categories");

// Widgets
const sidebar = await getWidgetArea("sidebar");

// Search
const results = await search("hello world", { collections: ["posts"] });

Documentation

See the documentation site for guides, API reference, and plugin development.