This is an EmDash site -- a CMS built on Astro with a full admin UI. ## Commands ```bash npx emdash dev # Start dev server (runs migrations, seeds, generates types) npx emdash types # Regenerate TypeScript types from schema npx emdash seed seed/seed.json --validate # Validate seed file ``` The admin UI is at `http://localhost:4321/_emdash/admin`. ## Key Files | File | Purpose | | ------------------------ | ---------------------------------------------------------------------------------- | | `astro.config.mjs` | Astro config with `emdash()` integration, database, and storage | | `src/live.config.ts` | EmDash loader registration (boilerplate -- don't modify) | | `seed/seed.json` | Schema definition + demo content (collections, fields, taxonomies, menus, widgets) | | `emdash-env.d.ts` | Generated types for collections (auto-regenerated on dev server start) | | `src/layouts/Base.astro` | Base layout with EmDash wiring (menus, search, page contributions) | | `src/pages/` | Astro pages -- all server-rendered | ## Rules - All content pages must be server-rendered (`output: "server"`). No `getStaticPaths()` for CMS content. - `entry.id` is the slug (for URLs). `entry.data.id` is the database ULID (for API calls like `getEntryTerms`). - Always call `Astro.cache.set(cacheHint)` on pages that query content.