Skip to content

Self-Hosting

VibeXP is designed to be self-hosted on your own infrastructure and domain. There is no committed secret or infrastructure-specific value in the repository — every deployment supplies its own configuration through environment variables.

  • Docker + Docker Compose (for the quick start), or Node 22+ / Go 1.25+ for local dev.
  • PostgreSQL 15/16 with the pgvector extension.
  • A WorkOS account for production login (see Authentication), or use the dev-login bypass for local evaluation.
  • (For semantic search) an OpenAI-compatible embeddings endpoint — e.g. shaharia-lab/ai-service.
Terminal window
git clone https://github.com/shaharia-lab/vibexp-oss.git
cd vibexp-oss
cp backend-api/.env.example backend-api/.env # then edit the required values
docker compose -f docker-compose.selfhost.yml up --build

Edit docker-compose.selfhost.yml (or supply an .env) with your own values before exposing it publicly. By default the frontend serves on http://localhost:5173 and the API on http://localhost:8080.

The application’s API, app, and MCP URLs are yours — they are not hardcoded. Throughout this documentation we use deployment-agnostic placeholders: <your-vibexp-host> for the app, <your-api-host> for the API, and <your-mcp-host> for the MCP endpoint. Set them per deployment:

ConcernEnv varNotes
Backend API originVITE_API_BASE_URL (frontend build arg)e.g. https://<your-api-host>/api/v1
Allowed CORS originsCORS_ALLOWED_ORIGINS (backend)your frontend origin(s)
Frontend base URLFRONTEND_BASE_URL (backend)used for auth redirects + email links
MCP resource URIMCP_RESOURCE_URI (backend)your MCP endpoint

The marketing website, blog, and docs-site are independent static sites; their public URLs and branding are configurable via their own VITE_* / PUBLIC_* env vars (see each service’s .env.example).

These are the only hard requirements to boot the backend. Everything else is optional and stays disabled until configured.

Env varRequiredPurpose
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAMEPostgreSQL connection (must have pgvector)
ENCRYPTION_KEYAES-256 at-rest key — exactly 32 bytes
EMBEDDING_MODEL / EMBEDDING_DIMENSIONSMust match your embeddings service and the vector(768) schema

Production login uses WorkOS AuthKit. Provide:

  • WORKOS_API_KEY
  • WORKOS_CLIENT_ID
  • WORKOS_REDIRECT_URI
  • WORKOS_COOKIE_PASSWORD (64 hex chars = 32 bytes)

For local evaluation without WorkOS, set DEV_LOGIN_ENABLED=true (only honored with a localhost FRONTEND_BASE_URL) plus WORKOS_COOKIE_PASSWORD.

Semantic search requires an embeddings service exposing an OpenAI-compatible POST /v1/embeddings. Run shaharia-lab/ai-service (sentence-transformers, CPU-friendly) or point AI_SERVICE_URL at any compatible provider.

The vector dimension must match EMBEDDING_DIMENSIONS and the database schema.

All disabled by default, enabled by setting their env vars (see backend-api/.env.example):

IntegrationEnable viaBehavior when off
Object storage (attachments)S3 / GCS / MinIO via STORAGE_EMULATOR_HOST + bucketUploads return 503
EmailEMAIL_PROVIDER=smtp + SMTP_* (or Mailgun)Email features disabled
Web pushFCM_ENABLED, VITE_FIREBASE_* (Firebase Cloud Messaging)Push disabled
Analytics*_GTM_ID (Google Tag Manager / GA4)No analytics
Error trackingSentry DSNNo error reporting
TelemetryOTEL_* (any OTLP collector)No telemetry

The “VibeXP” name and logo are the project maintainer’s brand. To white-label a fork, override the site config env vars (VITE_SITE_NAME, VITE_BRAND_*, PUBLIC_ORG_NAME, etc. — see each site’s .env.example) and replace the brand assets under each service’s public/ and design-system/brand/.