Self-hosting
Dialecto self-hosts on a deliberately boring stack: an Elixir/Phoenix release, PostgreSQL, and — if you want machine-translation features — a local Ollama instance. Everything lives in Postgres: scans, catalogs, voice sources, all of it. There is no object-storage dependency, no Redis, no message broker.
The stack
- Elixir 1.20 / Erlang OTP 28 (what we build and test against)
- PostgreSQL — any current version
- Ollama (optional) — for machine-translation suggestions, voice
distillation, and local quality evaluation; default model
gemma3:27b pdftotext(poppler, optional) — only needed if users upload PDFs as brand-voice sources
Environment variables
Required:
| Variable | Purpose |
|---|---|
DATABASE_URL | Postgres connection (ecto://user:pass@host/db) |
SECRET_KEY_BASE | Phoenix secret — generate with mix phx.gen.secret |
Strongly recommended:
| Variable | Purpose |
|---|---|
ENCRYPTION_KEY | at-rest encryption for GitHub tokens & scan credentials. Optional — it falls back to SECRET_KEY_BASE — but set it: a separate key means rotating one doesn’t burn the other |
PHX_HOST | your public hostname |
PHX_SERVER | set to start the web server in a release |
PORT | HTTP port |
Operational:
| Variable | Purpose |
|---|---|
POOL_SIZE | DB pool (default 10) |
ECTO_IPV6 | set if your DB resolves over IPv6 |
MAILER_SENDER_EMAIL / MAILER_SENDER_NAME | the From: on notification email |
GitHub App (all optional — without them the App integration is simply inert and repos connect via personal access tokens):
GITHUB_APP_ID, GITHUB_APP_SLUG, GITHUB_APP_PRIVATE_KEY (the PEM
contents), GITHUB_APP_CLIENT_ID, GITHUB_APP_CLIENT_SECRET,
GITHUB_APP_WEBHOOK_SECRET. You register your own (private) GitHub
App for your deployment — the permission set is in
GitHub App.
Quality evaluation, bring-your-own endpoint (optional, deployment-wide):
| Variable | Purpose |
|---|---|
QUALITY_EVAL_OPENAI_KEY | presence switches the quality evaluator to an OpenAI-compatible API |
QUALITY_EVAL_OPENAI_BASE_URL | any OpenAI-compatible endpoint (default api.openai.com/v1) |
QUALITY_EVAL_MODEL | model name |
The local-model posture
By default every AI feature points at a local Ollama on the app
host (localhost:11434): suggestions, voice distillation, and quality
evaluation. Nothing leaves the machine unless you explicitly configure
the OpenAI-compatible evaluator above — that switch is yours, made
once, at deployment level. The Ollama host and model currently live in
application config rather than env vars; changing them means adjusting
the release config (an env-var override is on the list).
The release ships with Swoosh’s local adapter (a dev mailbox — fine for trying things, silent in production). To actually deliver notification email, configure a Swoosh production adapter (SMTP or an API-based provider) in your release config.
Sovereignty notes
Self-hosting is the strongest form of the sovereignty story: your slice of data, your jurisdiction, your keys, and a model that runs on your own hardware. The EU-hosted product is built on the same stack, with the same local-model default, and it runs on EU infrastructure under EU jurisdiction. The hosted deployment is still being set up, so its exact model configuration is not documented here; self-hosting moves that choice, and the trust boundary, all the way to you.