Deploy EmDash

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

Deploy EmDash

Deploy and Host EmDash on Railway

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

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.


Template Content

More templates in this category

View Template
Libredesk - Complete Setup
Complete self-hosted omnichannel customer support desk.

codestorm
2
View Template
Paperless-ngx
Paperless-ngx — document management with OCR and full-text search

INAPP
1
View Template
Instatic CMS - Postgres
Design, build and manage powerful static sites from state-of-the-art CMS

Instatic
170