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.
| URL | What 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 |
/search | Full-text search |
/rss.xml | RSS feed |
/_emdash/admin | EmDash 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.
| File | What it controls |
|---|---|
src/styles/theme.css | Color tokens, brand utility classes (start here) |
src/layouts/Base.astro | Header, footer, theme switcher, ambient backgrounds |
src/components/SilverHero.astro | Hero with install command + mirror tabs |
src/components/FeatureGrid.astro | "Why SilverBlog" three-card row |
src/components/PostCard.astro | Glass-card post tile |
seed/seed.json | Demo 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:
- Admin panel at
/_emdash/admin. Visual editor with block components, structured fields, drafts, revisions. Best for non-technical authors. - 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.