elmo
  • Pricing
  • Changelog
  • Roadmap
  • Vision
  • Docs
505Sign up
IntroductionQuick Start
OverviewDevelopment SetupCommands ReferenceArchitectureConfigurationCloud DeploymentTelemetryAI Contribution PolicyVersioning & Releases
Edit this page·View as Markdown·Report an issue·Join our Discord

Get product updates

New features and releases from Elmo, straight to your inbox.

Product

  • Features
  • Pricing
  • Off-Site AEO
  • Changelog
  • Roadmap

Resources

  • Blog
  • Documentation
  • Support
  • API Reference
  • Elmo Cloud Status
  • Provider Status
  • Issues

Learn

  • What is AEO?
  • What is GEO?
  • AEO Glossary
  • AI Search Guides
  • AI Search Statistics
  • AEO by Industry

Tools

  • Tool Directory
  • Free & Open-Source Tools
  • Compare Tools

Company

  • About
  • Vision
  • Brand Assets
  • Merch
  • llms.txt

© 2026 Blue Whale Software, LLC

TermsPrivacyCookiesSubprocessorsAcceptable Use
v0.7.6Open source on GitHub
Twitter / XLinkedInDiscordGitHub
elmo

Development Setup

Set up a local development environment for contributing to Elmo.

Prerequisites

  • Node.js 24.x
  • pnpm 10.x+ (required — npm and yarn are not supported)
  • PostgreSQL 15+ (or use Docker)
  • Docker (for running the full stack locally)

Clone and Install

git clone https://github.com/elmohq/elmo.git
cd elmo
pnpm install

Configure Environment

Copy the example environment file and fill in your values:

cp .env.example .env

At minimum, you need:

VariableDescription
DATABASE_URLPostgreSQL connection string
BETTER_AUTH_SECRETAny random string for session encryption
ELMO_ENCRYPTION_KEYKey for provider credentials stored in the database — openssl rand -base64 32

Add AI provider API keys if you want to test visibility tracking:

VariableDescription
OPENAI_API_KEYFor ChatGPT tracking
ANTHROPIC_API_KEYFor Claude tracking

Database Setup

Run Drizzle migrations to create the schema:

pnpm --filter @workspace/lib exec drizzle-kit migrate

Mention Judge

The worker judges mentions and sentiment with Jev, so it needs TYPESAFE_API_KEY, or OPENROUTER_API_KEY to call Jev through OpenRouter. For UI work without a key, set it to stub: answers get placeholder judgements and nothing is sent anywhere.

Start Development Servers

Run all development servers in parallel:

pnpm dev

This starts:

  • Web app at http://localhost:3000
  • Worker process for background jobs

Or run only the web app:

pnpm --filter @workspace/web dev

Development with Docker

For a setup closer to production, use the CLI in dev mode:

# Build from local source instead of pulling images
elmo init --dev

# Rebuild after code changes
elmo compose build
elmo compose up -d

The Docker build uses a multi-stage docker/Dockerfile with separate targets for web and worker.

Component Stories

Elmo uses Storybook for component development in isolation:

pnpm --filter @workspace/web storybook

Stories live in apps/web/src/stories/ and cover the app sidebar, prompt charts, and other components across deployment modes.

Was this page helpful?

On this page

PrerequisitesClone and InstallConfigure EnvironmentDatabase SetupMention JudgeStart Development ServersDevelopment with DockerComponent Stories