Build

Self-hosting

Run the whole stack on your own machine, or all of it in Docker.

You need Node 22.18+, pnpm (corepack enable), Docker, a Zetaris instance, an OpenAI API key, an NVIDIA API key (free at build.nvidia.com), an ElevenLabs API key and a Google OAuth client.

cp .env.example .env            # every variable is described there
pnpm install
pnpm services:up                # Postgres + pgvector, RustFS (S3), Gotenberg, in Docker
pnpm services:check
pnpm db:migrate
pnpm dev                        # the web app on :3210, the worker, and these docs on :3211

All in Docker

infra/compose.prod.yaml is the production stack: the web app, the worker (with OCRmyPDF and yt-dlp) and these docs, built from their Dockerfiles, beside Postgres, RustFS and Gotenberg. Migrations run first, in a one-shot container; web and worker share one /data volume for traces and each person's memory and World Model.

docker compose -f infra/compose.prod.yaml up -d --build

Browsers upload straight to S3 with presigned URLs, so S3_PUBLIC_ENDPOINT must be an address browsers can reach (a domain in front of the s3 service).

Zetaris

Set ZETARIS_REST_URL, then either ZETARIS_API_KEY (the hackathon's instance) or a local bundle's ZETARIS_LOGIN_URL, ZETARIS_USERNAME, ZETARIS_PASSWORD and ZETARIS_ORG_ID. EVIDENCE_DIR is where the worker writes evidence files, and ZETARIS_EVIDENCE_URI is the same folder as Zetaris sees it.

Other services

VariableForNeeded
OPENAI_API_KEYThe Writer, Verifier, Analyst, Tutor and Grader, and deep search's web searchYes
NVIDIA_API_KEYEmbeddings, planning, deep-search screening, safety checks and every fallback (Nemotron on NVIDIA's API)Yes
MODEL_BASE_URLA self-hosted NVIDIA NIM serving the same Nemotron ids, instead of NVIDIA's APINo
MODEL_REQUESTS_PER_MINUTEThis process's share of each model's rate limit (web and worker split about 40 a minute; half each by default)No
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETSign-in with Google (guests work without)Yes
ELEVENLABS_API_KEYTranscribing recordings, audio briefsYes
OPENALEX_API_KEYOpenAlex's own PDF copies for deep search (without it, other open links are tried)No
COMPOSIO_*Gmail, Drive and Notion connectorsNo
VAPID_*Web Push notificationsNo
DEMO_SHARE_SLUGThe landing page's live demo folderNo
ADMIN_USER_IDSWho receives reports of articles, in their InboxNo
RESEND_API_KEYEmail: sign-in codes, invites, the digest (a full-access key: receiving needs it)No
RESEND_WEBHOOK_SECRETMail to a space's address: the signing secret of Resend's email.received webhook, pointed at /api/inbound/emailNo
EMAIL_FROM, INBOUND_EMAIL_DOMAINYour own sending address and inbound host, when not konkyo.xyz'sNo

Email

Add your domain in Resend for sending and a subdomain for receiving (Konkyo uses in.), put the DNS records Resend gives you at your registrar (the receiving one is an MX on the subdomain, so the root domain's mail is untouched), and point an email.received webhook at https://<your domain>/api/inbound/email. Without the keys the email features switch off, the add tray's email this space tile with them.

These docs

pnpm --filter @konkyo/docs build writes a static site to apps/docs/out, which any static file server can serve.

On this page