Files
moreminimore-redesign/packages/core
Matt Kane 3c319ed641 fix: redirect to setup wizard on fresh deployments when public page is first request
On a fresh CF deployment, if the first request hits a public page, the
middleware fast-path skips runtime init. Template helpers like
getSiteSettings() then query an empty database and crash with
'no such table: options'.

Add a one-time setup probe in the middleware fast-path: check if the
migrations table exists, and redirect to the setup wizard if not.
The check is cached for the worker lifetime after first success.

Also includes release workflow update to use GitHub App token and
admin branding changeset.
2026-04-01 14:14:05 +01:00
..
2026-04-01 11:51:57 +01:00
2026-04-01 12:07:38 +00:00
2026-04-01 10:58:32 +01:00
2026-04-01 12:07:38 +00: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
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.