EmDash is a pnpm monorepo. The main package is packages/core (published as emdash) — it contains the Astro integration, REST API, database layer, schema management, and plugin system. The admin UI lives in packages/admin.
For the full contributor reference — repo layout, architecture, code conventions, changeset policy — see CONTRIBUTING.md.
Local Setup
-
Clone and install
git clone https://github.com/emdash-cms/emdash.git cd emdash pnpm install pnpm build # required before first run -
Start the demo
cd demos/simple pnpm devThe setup wizard runs automatically on first launch — it creates the database, runs migrations, and prompts you to create an admin account.
To populate with sample content:
pnpm seed -
Open the admin
Visit http://localhost:4321/_emdash/admin
In dev mode, you can skip passkey auth with the bypass endpoint:
http://localhost:4321/_emdash/api/setup/dev-bypass?redirect=/_emdash/admin
Development Workflow
Watch Mode
For iterating on core packages alongside the demo, run two terminals:
# Terminal 1 — rebuild packages/core on change
cd packages/core && pnpm dev
# Terminal 2 — run the demo
cd demos/simple && pnpm dev
Checks
Run these before committing (from the repo root):
pnpm typecheck # TypeScript
pnpm lint # full type-aware lint
pnpm format # auto-format (oxfmt, tabs)
Tests
All tests
pnpm test Core only
cd packages/core && pnpm test Watch mode
cd packages/core && pnpm test --watch E2E
pnpm test:e2e # starts its own server Tests use real in-memory SQLite — no mocking. Each test gets a fresh database.
What We Accept
| Type | Process |
|---|---|
| Bug fixes | Open a PR directly. Include a failing test. |
| Docs / typos | Open a PR directly. |
| Translations | Open a PR directly. See Translating EmDash. |
| Features | Open a Discussion and wait for a maintainer to approve it. |
| Refactors | Open a Discussion first. |
Feature PRs without prior maintainer approval will be closed.
For the full contribution policy, changeset guide, repo layout, and architecture overview, see CONTRIBUTING.md.