Entri is open source and designed to be self-hostable. The same codebase that powers app.nt3.io can run on your own infrastructure with no managed service dependencies.Documentation Index
Fetch the complete documentation index at: https://docs.nt3.io/llms.txt
Use this file to discover all available pages before exploring further.
Quickstart (local Docker)
For evaluating Entri or running it on a laptop:docker compose up boots three containers — MongoDB, Redis, and TypeSense — bound to 127.0.0.1 only, with persistent named volumes. That covers everything Entri needs to run locally; no external accounts required.
The local Compose stack runs without authentication and binds to loopback. Do not expose those ports to the internet or to a shared LAN.
Architecture overview
Entri is an Nx monorepo with three deployable apps:| App | Stack | Default port |
|---|---|---|
apps/api | NestJS (REST + GraphQL) | 3333 |
apps/app | React + Vite | 4200 |
apps/cli | NestJS Commander | n/a |
- MongoDB — primary datastore (Mongoose 8)
- Redis — distributed cache and websocket pub/sub
- TypeSense (or Algolia) — full-text search (optional; falls back to MongoDB regex)
Configuration
All configuration is via environment variables. Copy.env.example to .env and fill in what you need. The minimum required for the app to boot:
.env.example in the repo for the complete list with inline documentation.
Search backend
SetSEARCH_PROVIDER to pick a search backend. Each option targets a different deployment shape:
After enabling a real search backend for the first time, backfill existing data:
Outbound email
Entri sends transactional email for invitations, welcome messages, and password resets. Two transports are supported. Pick whichever fits your stack — both produce identical output.EMAIL_FROM is required whenever a real transport is configured. Use an address on a domain you control. If neither transport is configured, emails are logged to the console (useful for local dev).
| Transport | Set | Best for |
|---|---|---|
| Resend | RESEND_API_KEY | Cloud deployments where you want a managed sender |
| SMTP | SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS | Self-hosters using their own MTA, AWS SES, Mailgun, Gmail, etc. |
EMAIL_PROVIDER=resend or EMAIL_PROVIDER=smtp.
Production deployment
Entri ships with a multi-stageDockerfile at the repo root that produces a single image containing both the API and the built web bundle. The reference deployment runs on Google Cloud Run, but the image is platform-agnostic — anywhere that runs OCI containers will work.
- A managed MongoDB — Atlas, DocumentDB, or self-hosted with replication.
- A managed Redis — Memorystore, ElastiCache, Upstash, or self-hosted.
- A managed TypeSense — TypeSense Cloud or self-hosted on the same network as the API.
- Static asset hosting — the API serves the built web bundle by default; no separate hosting needed unless you want a CDN.
- A reverse proxy with TLS termination (Cloud Run / ALB / nginx).
Running migrations
The API does not auto-migrate. Runmigrate-mongo up against your MongoDB before starting a new version:
Updating
Going further
- Contributing — develop against the codebase locally
- Authentication — configure OAuth providers
- API tokens — issue API credentials
- GitHub repository — source, issues, releases