---
title: "Deploy ExcaliDash"
description: "Self-hosted Excalidraw dashboard with storage, sharing and collaboration"
category: "Other"
url: https://railway.com/deploy/excalidash
---

# Deploy ExcaliDash

Self-hosted Excalidraw dashboard with storage, sharing and collaboration

**[Deploy ExcaliDash on Railway](https://railway.com/template/excalidash)**

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

- **Creator:** Auromations
- **Category:** Other
- **Total deploys:** 1

## Template content

### backend https://raw.githubusercontent.com/ZimengXiong/ExcaliDash/1988ca51dc636b6bb54fefbd1c511d5867b3d6e4/readme-assets/logoExcaliDash.png

- **Image:** zimengxiong/excalidash-backend:0.6.0
- **Start command:** `/bin/sh -c "set -e; grep -q RAILWAY_BOOTSTRAP_SQL /app/docker-entrypoint.sh || sed -i '/^# 4. Start Application/i printenv RAILWAY_BOOTSTRAP_SQL | su-exec nodejs npx prisma db execute --stdin --schema=/app/prisma/schema.prisma' /app/docker-entrypoint.sh; exec /app/docker-entrypoint.sh"`
- **Health check:** /health

### frontend https://raw.githubusercontent.com/ZimengXiong/ExcaliDash/1988ca51dc636b6bb54fefbd1c511d5867b3d6e4/readme-assets/logoExcaliDash.png

- **Image:** zimengxiong/excalidash-frontend:0.6.0
- **Start command:** `/bin/sh -c "set -e; grep -q 'upstream excalidash_api' /etc/nginx/nginx.conf.template || sed -i 's/http {/http { resolver [fd12::10] valid=10s; upstream excalidash_api { zone excalidash_api 64k; server __BACKEND_URL__ resolve; }/; s@proxy_pass http://__BACKEND_URL__@proxy_pass http://excalidash_api@g' /etc/nginx/nginx.conf.template; exec /docker-entrypoint.sh nginx -g 'daemon off;'"`
- **Health check:** /api/health
- **Public domain:** Yes

## Documentation

# Deploy and Host ExcaliDash on Railway

ExcaliDash is a self-hosted dashboard for Excalidraw. Save drawings, organize collections, restore previous versions, and collaborate through scoped sharing links.

## About Hosting ExcaliDash

This template deploys the upstream 0.6.0 frontend and backend images. The frontend provides the public HTTPS address and proxies API and collaboration traffic to a private backend. A persistent volume stores SQLite, drawings, embedded image data, and authentication state. Authentication is enabled before the first public request.

ExcaliDash is beta software. Back up your data before upgrading.

## Common Use Cases

- Keep architecture sketches and diagrams in a private drawing library.
- Organize project drawings into searchable collections.
- Collaborate on drawings and share view or edit access.
- Retain and restore recent drawing versions.

## Dependencies for ExcaliDash Hosting

### Deployment Dependencies

- A Railway account with resources for two always-on services and one persistent volume.
- No external database, SMTP credentials, or S3 account required.

### Implementation Details

**First login:** Open the frontend URL after both services become healthy. Read the one-time admin setup code from the backend deployment logs, marked `[BOOTSTRAP SETUP]`, and use it to create your administrator account. There are no default credentials. Choose a password with at least 12 characters, including uppercase, lowercase, a number, and a symbol.

The setup code expires after 15 minutes. Restart the backend and use its newest code if yours expires. Logs are also available through `railway logs --project PROJECT_ID --service backend --environment production`.

**Storage:** The backend volume is mounted at `/app/prisma`. Keep one backend replica. Deleting that volume deletes your persistent data. Export drawings and configure Railway volume backups; retain independent backup copies. Scheduled application backups are not enabled by this template.

**Security:** JWT, CSRF, and API-key pepper secrets are generated for each deployment. Keep the backend private and authentication enabled. A guarded startup step enables auth only for an unconfigured database with no active users. It does not overwrite existing users or completed onboarding decisions. Outbound update checks are disabled.

**Networking:** The frontend handles both API and Socket.IO traffic. Its healthcheck verifies backend connectivity. Private DNS refreshes every 10 seconds, allowing backend IP changes without restarting the frontend. TLS terminates at Railway. If you add a custom domain, update the backend's `FRONTEND_URL` to its exact HTTPS origin.

**Troubleshooting:** First boot runs database migrations. A deploying frontend may be waiting for the backend. Private DNS refreshes every 10 seconds. In-flight requests can time out during backend redeploys; retry or reload once the backend is healthy. Zero-downtime redeploys are not guaranteed. For expired setup codes, restart the backend. For login or CSRF errors following a domain change, check `FRONTEND_URL` and reload. Upstream nginx limits request bodies to 50 MB.

**Upgrades:** Both images are pinned to 0.6.0. Back up first, then update both tags together after reviewing upstream migration notes. SQLite is single-instance storage, not a horizontally scalable database. OIDC, PostgreSQL, S3, custom domains, and scheduled backups are not verified template features.

## Why Deploy ExcaliDash on Railway?

Railway provides the public HTTPS endpoint, private service networking, persistent storage, deployment logs, and generated secrets without requiring a separate server setup.

Upstream source: https://github.com/ZimengXiong/ExcaliDash


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

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