---
title: "Deploy EmDash"
description: "EmDash CMS with its admin behind a password and the database on a volume"
category: "CMS"
url: https://railway.com/deploy/emdash
---

# Deploy EmDash

EmDash CMS with its admin behind a password and the database on a volume

**[Deploy EmDash on Railway](https://railway.com/template/emdash)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/emdash/manifest.json

- **Creator:** Dektion
- **Category:** CMS
- **Total deploys:** 4

## Template content

### EmDash https://raw.githubusercontent.com/emdash-cms/emdash/1f2a36a03b6ffff2d9804918296e11100b66cfff/docs/public/favicon.svg

- **Source:** dektionstudio/railway-template-images
- **Health check:** /
- **Public domain:** Yes

## Documentation

# Deploy and Host EmDash on Railway

[EmDash](https://github.com/emdash-cms/emdash) is a full-stack TypeScript CMS built on Astro, pitched as a modern successor to WordPress: posts and pages with a visual editor, media, taxonomies, scheduled publishing, plugins, and passkey logins instead of passwords. This template runs EmDash 1.3.0 with its blog starter on Node.js 24, with the database and uploads on a volume.

## About Hosting EmDash

EmDash's first-run setup wizard makes whoever opens the admin first the site's admin. On a public URL, that's a race with anyone scanning new domains. So the template puts Caddy in front of EmDash: the admin pages and the setup API ask for `ADMIN_GATE_USER` and the generated `ADMIN_GATE_PASSWORD` first, and EmDash's own passkey login comes after that. The public site, its media and the setup status stay open.

Two things in EmDash's own setup didn't fit Railway as-is. Its Dockerfile builds the whole monorepo with a 4 GB Node heap; this template builds just the blog starter at a pinned commit. And Astro bakes the path of its session store into the build, so the app is built in the same folder it runs from, or passkey sign-up fails. The SQLite database and uploaded media live on the volume at `/data`. `EMDASH_ENCRYPTION_KEY`, which encrypts plugin secrets, is generated at deploy in EmDash's canonical format.

Before publishing I tested it on Railway, in a real browser. The site loaded with the starter's sample posts, and the admin answered 401 without the gate login and opened with it. I ran EmDash's setup wizard (site title, account, then a passkey from Chrome's virtual authenticator, as you would with Touch ID or Windows Hello), and EmDash reported setup complete. With that session I created a post through EmDash's content API and published it, and it showed at `/posts/hello-from-railway` on the public site along with the new site title. After a restart, setup was still complete and the title and post were still there.

It used about 0.16 GB of RAM, under $2 a month on Railway's usage pricing.

## Common Use Cases

- A blog or company site you edit in the browser, with drafts, scheduling and an RSS feed
- A WordPress replacement for people who want TypeScript, Astro themes and no PHP
- A content backend for an Astro site you customize, starting from this template's starter

## Dependencies for EmDash Hosting

Nothing beyond the template. A device or password manager that supports passkeys (most phones, laptops and browsers do).

### Deployment Dependencies

- EmDash: https://github.com/emdash-cms/emdash
- Starter templates: https://github.com/emdash-cms/templates
- Docs: https://docs.emdashcms.com
- The wrapper this template builds: https://github.com/dektionstudio/railway-template-images/tree/main/emdash

### Implementation Details

```
EMDASH_URL                             # your site
EMDASH_ADMIN_URL                       # the admin: the gate login first, then EmDash's setup or passkey login
ADMIN_GATE_USER / ADMIN_GATE_PASSWORD  # the gate in front of the admin and the setup
/data                                  # the volume: emdash.db and uploads
```

The gate stays on after setup, so the admin always needs the gate login plus your passkey. Magic-link login and invitations need an email provider, and Railway blocks outbound SMTP below the Pro plan. If you add a custom domain, set `EMDASH_SITE_URL` to it and redeploy, since passkeys are tied to the domain. To change the theme or add plugins, copy the wrapper into your own repository and edit the starter.

## Why Deploy EmDash on Railway?

You get the CMS, its database and its media on HTTPS in one service, with the admin protected from the first minute. Railway bills the little RAM it uses, and there's no per-site license.


## Similar templates

- [Libredesk - Complete Setup](https://railway.com/deploy/libredesk-complete-setup) — Complete self-hosted omnichannel customer support desk.
- [Paperless-ngx](https://railway.com/deploy/paperless-ngx-3) — Paperless-ngx — document management with OCR and full-text search
- [Instatic CMS - Postgres](https://railway.com/deploy/instatic-cms-postgres) — Design, build and manage powerful static sites from state-of-the-art CMS

Open this page in a browser: https://railway.com/deploy/emdash
