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.

senlo logo

Self-host senlo

Open-source email infrastructure with visual MJML editor

BetaOpen SourceAGPL-3.0
Updated4 months ago
LanguageTypescript
Setup difficultyModerate
Stars
178
Port
3000 (HTTP web interface)
Requires
PostgreSQL, Redis

What is senlo?

Senlo is an open-source email platform you host yourself for sending transactional and lifecycle messages. It gives developers a visual MJML-based drag-and-drop editor to build responsive templates, a REST API to trigger emails and manage contacts, and automation flows that can branch based on calls to your own APIs. Features include template versioning, multi-project isolation, real-time analytics with open/click tracking, and support for multiple delivery providers — Resend, Postmark, AWS SES, Mailgun, or any SMTP server. The stack runs via Docker Compose with bundled PostgreSQL and Redis, configured entirely through environment variables. The project is in MVP stage with a public roadmap that lists dark mode, a visual automation builder, and expanded provider webhooks as upcoming work.

Should you self-host senlo?

senlo scores 38/100 on selfhost.directory (how scoring works) and ranks #88 of 106 in Email. It has 178 GitHub stars.

There was no stable release in the past 12 months, so check the repository's recent activity before you rely on it.

Setup is moderate: expect some configuration beyond a single command. It is AGPL-3.0-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is Postal (72/100, 16 899 stars). It scores higher overall, so compare the two before you pick. See senlo vs Postal side by side.

Features

  • Advanced Analytics
  • Conditional Content
  • Dynamic personalization
  • Dynamic Subjects
  • Email Analytics & Tracking
  • Email automations
  • Embedded Editor
  • GitHub OAuth
  • Multi-Project Isolation
  • Provider-Agnostic Delivery
  • REST API
  • S3-compatible Storage
  • Template versioning
  • Visual Drag-and-Drop Email Editor

senlo README

How to configure senlo

  • ALLOW_REGISTRATIONtrueSet to "false" to close public registration. Existing users still sign in.

    Set to "false" to close public registration. Existing users still sign in.

    values: true, false

  • APP_URLhttp://localhost:3000The address Senlo is reached at, including the port if not 80/443. Links in outgoing mail point here.

    The address Senlo is reached at, including the port if not 80/443. Links in outgoing mail point here.

  • AUTH_SECRETSigns sessions, and unsubscribe and tracking links in outgoing mail. Generate with: openssl rand -base64 32

    Signs sessions, and unsubscribe and tracking links in outgoing mail. Generate with: openssl rand -base64 32

  • AUTH_TRUST_HOSTtrueTrust the host header (required behind most VPS setups)

    Trust the host header (required behind most VPS setups)

  • DATABASE_URLpostgresql://senlo_user:senlo_password@db:5432/senlo_dbPostgreSQL connection string

    PostgreSQL connection string

  • DEFAULT_FROM_EMAILSender for triggers and campaigns that do not set one

    Sender for triggers and campaigns that do not set one

  • GITHUB_IDGitHub OAuth client ID for GitHub sign-in

    GitHub OAuth client ID for GitHub sign-in

  • GITHUB_SECRETGitHub OAuth client secret for GitHub sign-in

    GitHub OAuth client secret for GitHub sign-in

  • IS_DEMO_MODEfalseOnly for the public demo instance: shows the demo banner and loads Umami analytics

    Only for the public demo instance: shows the demo banner and loads Umami analytics

    values: true, false

  • LINK_SIGNING_SECRETSigns unsubscribe and tracking links instead of AUTH_SECRET. Set to rotate AUTH_SECRET without breaking links in mail already sent.

    Signs unsubscribe and tracking links instead of AUTH_SECRET. Set to rotate AUTH_SECRET without breaking links in mail already sent.

  • REDIS_QUEUE_PREFIXsenloPrefix for queue and rate-limit keys if several instances share one Redis

    Prefix for queue and rate-limit keys if several instances share one Redis

  • REDIS_URLredis://redis:6379Redis connection string for queues and rate limiting

    Redis connection string for queues and rate limiting

  • S3_ACCESS_KEY_IDS3 access key ID

    S3 access key ID

  • S3_BUCKETS3 bucket name

    S3 bucket name

  • S3_ENDPOINTS3 endpoint URL (required for S3-compatible services like Cloudflare R2, MinIO)

    S3 endpoint URL (required for S3-compatible services like Cloudflare R2, MinIO)

  • S3_FORCE_PATH_STYLEtrueForce path-style S3 URLs

    Force path-style S3 URLs

    values: true, false

  • S3_KEY_PREFIXuploadsPrefix for S3 keys

    Prefix for S3 keys

  • S3_PUBLIC_URLPublic URL for S3 files (required when using S3_ENDPOINT)

    Public URL for S3 files (required when using S3_ENDPOINT)

  • S3_REGIONautoS3 region

    S3 region

  • S3_SECRET_ACCESS_KEYS3 secret access key

    S3 secret access key

  • SECRETS_KEYEncrypts provider credentials (API keys, SMTP passwords) in the database. Falls back to LINK_SIGNING_SECRET / AUTH_SECRET.

    Encrypts provider credentials (API keys, SMTP passwords) in the database. Falls back to LINK_SIGNING_SECRET / AUTH_SECRET.

  • STORAGE_DRIVERWhere uploaded images go. Default: the app's own disk. Set to "s3" for S3-compatible storage (Cloudflare R2, MinIO)

    Where uploaded images go. Default: the app's own disk. Set to "s3" for S3-compatible storage (Cloudflare R2, MinIO)

    values: s3

  • UMAMI_WEBSITE_IDUmami analytics website ID

    Umami analytics website ID

More in Marketing Automation

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…