Quick start

Open a terminal and run:

pnpm create silverblog@latest

You'll be asked for a project name and a deploy target. Pick Cloudflare Workers if you want to ship to the edge with D1 + R2, or Node.js if you'd rather run a single binary with a local SQLite file.

The scaffolder downloads the matching template from GitHub, installs dependencies with your detected package manager, initializes the database, loads demo content (Node only — Cloudflare needs D1 provisioned first), and prints the next steps.

npm or bun? npm create silverblog@latest and bun create silverblog work too — the CLI auto-detects which one called it.

Project structure

What you get after scaffolding:

my-site/
├── astro.config.mjs        EmDash integration + Astro adapter
├── package.json
├── seed/
│   └── seed.json           Demo posts, pages, bylines, menus
├── src/
│   ├── components/         SilverHero, FeatureGrid, PostCard, …
│   ├── layouts/Base.astro  Site header + footer
│   ├── pages/              /, /post/[slug], /index/[page], /[slug], /rss.xml
│   ├── styles/theme.css    Color + brand tokens (start here)
│   └── live.config.ts      EmDash content loader
└── tsconfig.json

URL routes

SilverBlog preserves the original v1 URL structure. EmDash defaults still resolve via 301 redirects.

URLWhat it serves
/Hero + features + recent posts
/post/{slug}Single post (canonical)
/index/{n}Paginated archive, 1-indexed
/{slug}Custom page from the pages collection
/tag/{slug} · /category/{slug}Taxonomy archives
/searchFull-text search
/rss.xmlRSS feed
/_emdash/adminEmDash admin panel
/posts/{slug}, /pages/{slug}, /posts, /rss/301 → canonical paths

Customize the theme

Visual tweaks live in two files; everything else is structure you rarely need to touch.

FileWhat it controls
src/styles/theme.cssColor tokens, brand utility classes (start here)
src/layouts/Base.astroHeader, footer, theme switcher, ambient backgrounds
src/components/SilverHero.astroHero with install command + mirror tabs
src/components/FeatureGrid.astro"Why SilverBlog" three-card row
src/components/PostCard.astroGlass-card post tile
seed/seed.jsonDemo content (posts, pages, menus, bylines)

The CSS is layered so anything you write in theme.css wins automatically — no specificity tricks needed.

Deploy

Cloudflare Workers (recommended)

npx wrangler d1 create silverblog
# Paste the printed database_id into wrangler.jsonc

npx wrangler r2 bucket create silverblog-media

node node_modules/.bin/emdash init --database d1
node node_modules/.bin/emdash seed seed/seed.json --database d1

pnpm deploy

Your site is live at {your-worker-name}.workers.dev. Add a custom domain via wrangler.jsonc or the Cloudflare dashboard.

Node.js

pnpm bootstrap   # init DB + load seed content
pnpm build
pnpm start

This produces dist/server/entry.mjs — point your process manager (systemd, PM2, etc.) at it.

Writing posts

Two ways to add content:

  1. Admin panel at /_emdash/admin. Visual editor with block components, structured fields, drafts, revisions. Best for non-technical authors.
  2. Markdown files in the seed, then re-run emdash seed. Best for version-controlling your content. The seed schema lives at emdashcms.com/seed.schema.json.

Next steps

  • Browse the live demo to see what the seed content looks like rendered.
  • Read Why EmDash for the reasoning behind the v1-to-v2 rewrite.
  • Open an issue or contribute on GitHub.