selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

evc-team-relay logo

Self-host evc-team-relay

v1.13.7

Real-time collaboration server for Obsidian vaults

ReleaseOpen SourceApache-2.0
Updated13 hours ago
LanguagePython
Setup difficultyAdvanced
Stars
40
CPU
2+ cores recommended
RAM
4GB minimum, 8GB recommended
Storage
20GB+ for base install, more for document storage
Ports
8080 (Relay server WebSocket/API), 9090 (Relay server metrics), 8000 (Control plane API), 3000 (Web publish frontend)
Requires
MinIO (S3-compatible object storage), PostgreSQL
Install with Docker Compose

What is evc-team-relay?

EVC Team Relay is a self-hosted server that brings real-time collaborative editing and web publishing to Obsidian vaults. It uses CRDT-based sync via Yjs (y-sweet) for conflict-free concurrent editing with offline-first support. Teams can share folders with viewer or editor permissions, publish notes to custom domains with access control (public, token-protected, or private), and manage users through OAuth/OIDC, email/password, and 2FA. The stack includes a control plane API, a WebSocket relay server, and a web publishing frontend, all deployed via Docker Compose with PostgreSQL and MinIO for storage. Monitoring is provided via Prometheus and Grafana. The project is developed by Entire VC and licensed under Apache 2.0.

Should you self-host evc-team-relay?

evc-team-relay scores 41/100 on selfhost.directory (how scoring works) and ranks #26 of 30 in Collaboration. It has 40 GitHub stars.

It shipped 11 stable releases in the past year. The latest, v1.13.7, came out on 23 October 2026. New versions land roughly every 7 days.

Setup is advanced: plan for several services and some ongoing maintenance. It is Apache-2.0-licensed and written mostly in Python.

Its closest alternative on selfhost.directory is Memos (86/100, 64 149 stars). It scores higher overall, so compare the two before you pick. See evc-team-relay vs Memos side by side.

Features

  • Access control
  • Audit Logs
  • Automated Backups
  • Custom domains
  • Docker Compose Deployment
  • Folder sharing
  • Grafana Dashboards
  • OAuth/OIDC Authentication
  • Offline-first editing
  • Prometheus Metrics
  • Real-Time Collaboration
  • Two-factor authentication
  • Webhooks
  • Web Publishing

evc-team-relay README

How to install evc-team-relay

Install evc-team-relay with Docker Compose

Environment variables
DOMAIN_BASE, ACME_EMAIL, JWT_SECRET, POSTGRES_PASSWORD, MINIO_ROOT_PASSWORD, BOOTSTRAP_ADMIN_EMAIL, BOOTSTRAP_ADMIN_PASSWORD, CONTROL_PLANE_PUBLIC_URL, RELAY_PRIVATE_KEY, RELAY_KEY_ID, RELAY_AUDIENCE, WEB_PUBLISH_DOMAIN, etc.

git clone https://github.com/entire-vc/evc-team-relay.git cd evc-team-relay/infra cp env.example .env

Edit .env — at minimum DOMAIN_BASE, ACME_EMAIL, and RELAY_PRIVATE_KEY

(generate with: openssl genpkey -algorithm ed25519 -out relay_private.pem

&& openssl base64 -A -in relay_private.pem)

cp relay/relay.toml.example relay/relay.toml

Edit relay.toml: MinIO credentials from .env, and the [[auth]] public_key

derived from the same key (see docs/installation.md step 3)

Pull the published images instead of building from source — faster, and

byte-identical to what the release workflow shipped. Building from source

works too: every dependency is public. Point releases only; run from

evc-team-relay/ (one level up from infra/).

bash ../scripts/pull-published-images.sh

docker compose up -d

Requires Docker Engine 24.0+ and Docker Compose 2.20+

How to configure evc-team-relay

  • ACME_EMAILEmail for Let's Encrypt certificate notifications

    Email for Let's Encrypt certificate notifications

  • BACKUP_HOUR2Hour (UTC) to run daily backup

    Hour (UTC) to run daily backup

  • BACKUP_RETENTION7Days to keep local backups

    Days to keep local backups

  • BACKUP_RUN_ON_STARTUPtrueRun backup when container starts

    Run backup when container starts

  • BACKUP_S3_BUCKETS3 bucket name for backups

    S3 bucket name for backups

  • BACKUP_S3_ENABLEDfalseUpload backups to S3

    Upload backups to S3

  • BOOTSTRAP_ADMIN_EMAILEmail for initial admin account

    Email for initial admin account

  • BOOTSTRAP_ADMIN_PASSWORDPassword for initial admin (min 8 chars)

    Password for initial admin (min 8 chars)

  • CONTROL_PLANE_PUBLIC_URLhttp://localhost:8000Externally-reachable base URL of the control-plane API

    Externally-reachable base URL of the control-plane API

  • CORS_ALLOWED_ORIGINSComma-separated allowed origins for CORS

    Comma-separated allowed origins for CORS

  • DOMAIN_BASEBase domain (e.g., example.com). Used to construct cp.example.com, relay.example.com

    Base domain (e.g., example.com). Used to construct cp.example.com, relay.example.com

  • EMAIL_ENABLEDfalseEnable email sending

    Enable email sending

  • EMAIL_FROMFrom email address

    From email address

  • EMAIL_WORKER_BATCH_SIZE100Max emails per cycle

    Max emails per cycle

  • EMAIL_WORKER_INTERVAL60Email worker poll interval (seconds)

    Email worker poll interval (seconds)

  • GRAFANA_ADMIN_PASSWORDadminGrafana admin password

    Grafana admin password

  • GRAFANA_ADMIN_USERadminGrafana admin username

    Grafana admin username

  • JWT_SECRETSecret key for JWT signing. Generate with openssl rand -hex 32

    Secret key for JWT signing. Generate with openssl rand -hex 32

  • LOG_LEVELINFOLogging level

    Logging level

  • MINIO_ROOT_PASSWORDMinIO root password

    MinIO root password

  • MINIO_ROOT_USERrelayMinIO root username

    MinIO root username

  • POSTGRES_DBrelaycpPostgreSQL database name

    PostgreSQL database name

  • POSTGRES_PASSWORDPostgreSQL password

    PostgreSQL password

  • POSTGRES_USERrelaycpPostgreSQL username

    PostgreSQL username

  • RELAY_AUDIENCEderived from RELAY_PUBLIC_URL hostAudience claim for relay tokens

    Audience claim for relay tokens

  • RELAY_KEY_IDrelay_cp_devCOSE kid embedded in issued tokens; must match a [[auth]] key_id in relay.toml

    COSE kid embedded in issued tokens; must match a [[auth]] key_id in relay.toml

  • RELAY_PRIVATE_KEYBase64-encoded Ed25519 private key used to sign relay tokens

    Base64-encoded Ed25519 private key used to sign relay tokens

  • RELAY_PUBLIC_URLwss://${DOMAIN_BASE}Public WebSocket origin for relay server (client-facing)

    Public WebSocket origin for relay server (client-facing)

  • SERVER_NAMEEVC Team RelayDisplay name shown in plugin

    Display name shown in plugin

  • SMTP_HOSTSMTP server hostname

    SMTP server hostname

  • SMTP_PASSWORDSMTP password

    SMTP password

  • SMTP_PORT587SMTP port (587 for TLS, 465 for SSL)

    SMTP port (587 for TLS, 465 for SSL)

  • SMTP_USERSMTP username

    SMTP username

  • SMTP_USE_TLStrueUse STARTTLS

    Use STARTTLS

  • WEBHOOK_WORKER_BATCH_SIZE50Max webhooks per cycle

    Max webhooks per cycle

  • WEBHOOK_WORKER_INTERVAL30Webhook worker poll interval (seconds)

    Webhook worker poll interval (seconds)

  • WEB_PUBLISH_DOMAINDomain for web publishing (e.g., docs.example.com)

    Domain for web publishing (e.g., docs.example.com)

evc-team-relay releases & version history

More in Collaboration

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…