Notifications

DeviceYard sends branded HTML email with a plain-text alternative through an operator-configured SMTP relay. Use any compatible hosted provider, company relay, or your own server. No provider account is built into the application.

Personal settings

Open Notifications in the account menu. Verify your email address, then choose Off, Failures only, or All completed runs separately for each organisation. Changes take effect when you click Save preferences. Existing accounts start with optional notifications off. Invitations, verification, and password resets are transactional messages and do not depend on these choices.

Email is the available channel. Push, Slack, and Webhooks are visible as Coming later; they cannot be configured yet.

Admins may enable device-health emails. A device must remain observably offline for two minutes before an alert is queued. Brief disconnects are silent. Recovery goes only to recipients whose outage email was accepted by SMTP. Missing observations restart an unconfirmed debounce. Monitoring happens in the background, independently of dashboard visits. A stopped service cannot report its own outage; use external uptime monitoring for that case.

SMTP setup

Configure these environment variables through your deployment's secret/config management. SMTP is disabled when configuration is absent. Partial or invalid configuration disables email and shows a safe diagnostic in Admin; existing login and run execution keep working.

Variable Meaning
SMTP_HOST SMTP relay hostname
SMTP_PORT Explicit port, usually 465 for TLS or 587 for STARTTLS
SMTP_TLS tls for implicit TLS, starttls for mandatory upgrade, none for local development only
SMTP_FROM Sender email address authorised by the relay
SMTP_FROM_NAME Display name; defaults to DeviceYard
PUBLIC_APP_URL Trusted public application URL; HTTPS required except loopback development
SMTP_USER Optional authentication username; required with password
SMTP_PASSWORD SMTP credential supplied from secret storage
SMTP_CONNECTION_TIMEOUT_MS Connection timeout; defaults to 10000
SMTP_SEND_TIMEOUT_MS Send deadline; defaults to 15000, maximum 60000
SMTP_ALLOW_LOCAL_PLAINTEXT Explicit true only for a loopback development mail catcher

Use NODE_ENV=development for local plaintext. Never disable TLS verification for production. STARTTLS never silently falls back to plaintext. Keep PUBLIC_APP_URL at the application origin, without credentials, query, or fragment. This service is hosted at the origin root, not a URL subdirectory.

Configure sender-domain authentication (SPF/DKIM and an appropriate DMARC policy) with your mail operator. SMTP configuration and domain setup do not guarantee inbox placement. Check your relay's sending limits before enabling high-volume run notifications; providers may charge for usage.

Open Admin → Notifications to inspect configuration readiness and rendered template samples. Send me a test email queues one message to the signed-in admin's verified address; it is limited to once per minute. Preview uses only synthetic data and disables links. Templates are reusable React components in src/notifications/templates.tsx, rendered by the server; layout/copy changes are code changes. There is no visual template editor.

Account actions

Forgot password? on sign-in requests a reset link valid for 30 minutes. The request response does not disclose whether an account exists. Completion revokes all of that user's sessions and personal access tokens. Organisation tokens are unchanged. Verification links last 24 hours.

Organisation members who can manage membership can issue invitations in the organisation's Members card. Invitations last seven days. Resend supersedes the previous link; Revoke closes it. New users create an ordinary account; existing users must sign in to the invited account. Invitations never grant platform-admin privileges.

Links keep action tokens in the URL fragment and remove it from visible history when the form loads. Reloading after that requires reopening the original email. Inspecting a link does not consume it; only explicit form submission does.

Reliability and privacy

Messages are persisted in an encrypted SQLite outbox. The application records only token hashes in account-action records and erases recoverable queued payloads after acceptance, cancellation, expiry, or final failure. Keep TOKEN_ENCRYPTION_KEY available across restarts; changing it makes existing encrypted queued messages unreadable. Never inspect production action payloads through logs or delivery-history endpoints.

Transient failures retry with exponential backoff starting at 30 seconds, up to five attempts. Account-action mail takes priority. Optional messages expire after 24 hours. Delivery history is retained for 30 days independently of job artifacts. Membership, account activity, email verification, and preferences are checked again before optional delivery.

Accepted by mail server means SMTP accepted the message, not that it reached the inbox. Generic SMTP does not provide provider delivery/bounce webhooks. A crash after SMTP acceptance but before recording it can produce a duplicate; stable message identifiers help correlation but cannot promise exactly once.

Run emails include result counts and a bounded list of failed flow names, without logs, attachments, or flow environment values. Run links require login and organisation membership. A run removed by retention is unavailable.

Release verification record

Automated tests exercise rendering, template escaping, MIME inputs, SMTP security, persistence, replay/expiry, authorisation, and health transitions. These do not substitute for real-client rendering checks.

Gmail, Outlook, and Apple Mail visual checks are not yet performed. Browser discovery in this development session returned no available browser. No live external test email was sent. Complete these visual checks before claiming email-client compatibility or accepting the visual release criteria.

View this page on GitHub ↗ · nmehlei/DeviceYard