Self-hosting

What an operator of their own Exponential installation needs to know; nothing on this page applies to exponential.im

Exponential is open source and can run on your own infrastructure. Everything in the rest of these docs describes the product as a user sees it; this page is for the person operating an installation. If you use exponential.im, you can skip it.

Deploy on Railway

Deploy on Railway

The Railway template runs your own installation in one click: Postgres with pgvector, the app and the scheduler, with every secret generated for you. When the deploy finishes, open the app service's logs, find the block that starts This install has no admin yet, and redeem the setup token at the /setup link it gives. You become the instance admin and sign-up turns invite-only. Until you add email (SMTP or Postmark), your sign-in codes are written to the same logs, so keep them to yourself. If you add only an OAuth provider instead, also set AUTH_LOG_SIGN_IN_CODES=false: OAuth alone doesn't stop codes going to the logs.

Where to find it

The code is at github.com/positonic/exponential. The README's "Self-hosting" section covers Railway, Docker Compose and running from source; the deeper operator guides live under dev-docs/, starting with PRODUCTION_DEPLOYMENT_GUIDE.md.

What an installation consists of

PartWhat it is
The web appNext.js on any Node host or container platform, backed by PostgreSQL with pgvector. It applies database migrations when it starts.
The schedulerRuns the background jobs (notifications, syncs, agent runs) by calling the app's job routes on a timer. Included in the Railway template and Docker Compose.
The agent serviceOptional. Runs Zoe and the specialist agents; the web app talks to it over MASTRA_API_URL. Without it the Assistant is off.
The WhatsApp gatewayOptional; holds linked WhatsApp sessions and relays messages to the agent service

Environment variables that affect what users see

The complete list is validated in src/env.js in the repository. These are the ones that change which features appear:

VariableEffect
DATABASE_URL, AUTH_SECRET, DATABASE_ENCRYPTION_KEYRequired. Credentials and PII are encrypted with the key; rotate it with the documented procedure, never by replacing it.
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET, AUTH_DISCORD_ID / AUTH_DISCORD_SECRETEach configured provider adds a button to the sign-in page.
SMTP_HOST and EMAIL_FROM (plus SMTP_PORT, SMTP_USER, SMTP_PASSWORD), or AUTH_POSTMARK_KEYEmail sign-in codes and other email. Postmark wins when both are set.
AUTH_LOG_SIGN_IN_CODESWrites the instance admin's sign-in codes to the server log instead of emailing them; nobody else gets one. Ignored once email is set up, but not when only OAuth is: set it to false then. Anyone who can read the log can sign in as the admin.
OPENAI_API_KEYOptional. Meeting summaries and extraction, semantic search and the knowledge base, digests.
ANTHROPIC_API_KEYOptional. Claude meeting summaries and workspace updates.
MASTRA_API_URLOptional. The agent service's URL; turns on the Assistant (Zoe chat, Assign to Assistant).
WHATSAPP_GATEWAY_URLEnables Connect WhatsApp. The gateway must share the app's AUTH_SECRET, which signs the short-lived tokens the two exchange. Without it users see "Gateway not configured".
SLACK_BOT_TOKEN on the agent serviceGives Zoe Slack tools for installations that connect one shared Slack app; users on exponential.im connect their own app from Settings → Integrations instead.
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEYWeb push notifications.
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKENRate limiting for public endpoints.
NEXT_PUBLIC_SENTRY_DSNError reporting.
The GitHub App credentialsEnable the GitHub Repositories card in workspace settings.

With no AI variable set the app is a plain project and task tool: each AI feature is hidden or says how to turn it on, and the startup log lists what is on.

Sovereign installation

An installation that operates without any Exponential-controlled account or control plane, where the operator controls compute, data, keys, identity, backups and update timing. The docs use this term rather than "self-hosted" when the control boundary matters.

How it connects

Was this page helpful?
Last updated Edit this page on GitHub