v0.4.1
September 15, 2026
What's Changed
- Fix MCP sign-in for clients that use a client ID metadata document. by @jrhizor
/ CHANGELOG
Latest releases, completed work, and improvements shipped to Elmo.
September 15, 2026
September 15, 2026
elmo init now checks Docker before the setup wizard and reports whether Docker is missing or not running. by @MFA-G/api/v1 covers brands, prompts, competitors, reports, analytics, models, tags, and opportunities. /api/mcp connects Claude Code, Codex, Cursor, OpenCode, and VS Code, either by signing in from the client or with an API key. Keys belong to an organization and are issued read-only or read-write from Settings, which now also has API and MCP pages describing your own deployment. by @jrhizor/api/v1 list response now includes a data array. The brands, prompts, competitors, and reports keys still carry the same array and will be removed in a future release. by @jrhizorAugust 31, 2026
elmo init now says up front that a managed cloud option exists, and what it costs, before walking through self-hosted setup. by @jrhizorelmo init and the LLMs settings page. by @jrhizor/app/org/{organization}/brand/{brand}. by @jrhizorcrypto.randomUUID is unavailable. by @morovingerapp_metadata; it only grants membership in organizations that already exist, which are provisioned through the admin brands API. by @jrhizorAugust 10, 2026
August 6, 2026
:oxylabs targets in SCRAPE_TARGETS, upgrade before August 31, 2026 to avoid failures. by @jrhizorSCRAPE_TARGETS. This is more expensive (about $0.004 instead of $0.0006 to run). This could also impact visibility/citations as it switches to better reflect what users see in the actual chat website. If you would prefer to keep the old behavior, you will need to update your SCRAPE_TARGETS to pin the specific version of the model (chatgpt:dataforseo:gpt-5.5:online or gemini:dataforseo:gemini-2.5-flash:online) to keep using the LLM Responses API instead of the LLM Scraper API. by @jrhizorELMO_ENCRYPTION_KEY to new and upgraded deployments, which Elmo now requires to encrypt provider credentials stored in the database. by @jrhizormax_uses, OpenAI maxToolCalls), so no single tracked run can spend unboundedly. by @jrhizorJuly 21, 2026
SCRAPE_TARGETS now accepts google-ai-overview:brightdata:online, google-ai-overview:dataforseo:online, and google-ai-overview:oxylabs:online. by @jrhizorJuly 10, 2026
July 8, 2026
JINA_API_KEY env var to avoid anonymous rate limits when fetching website content during brand onboarding. by @jrhizorNOTE: If you created brands using the admin API, you will have to run this for the db migration to work:
INSERT INTO "organization" ("id", "name", "slug", "created_at")
SELECT b."id", b."name", b."id", now()
FROM "brands" b
LEFT JOIN "organization" o ON o."id" = b."id"
WHERE o."id" IS NULL;
July 1, 2026
elmo upgrade to move a local deployment to the version supported by the installed CLI: runs any registered migrations, re-pins the Docker image tags, and restarts the stack (only if it was running before). Warns when the CLI itself is behind the latest published release. by @jrhizorelmo init now offers them when you enable DataForSEO, and SCRAPE_TARGETS accepts chatgpt:dataforseo:online, perplexity:dataforseo:online, and gemini:dataforseo:online (override the underlying model via the version slug, e.g. chatgpt:dataforseo:gpt-5-mini:online). Configure via DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD. by @jrwrestelmo init now offers Oxylabs alongside BrightData and Olostep, and SCRAPE_TARGETS accepts chatgpt:oxylabs[:online], perplexity:oxylabs:online, and google-ai-mode:oxylabs:online. Configure via OXYLABS_USERNAME + OXYLABS_PASSWORD. by @jrhizorJune 12, 2026
/api/v1 DELETE endpoints now return the deleted resource directly instead of a { message, data } wrapper (the deleted prompt includes a deletedRunsCount field), PATCH endpoints reject an empty body with a 400, an unparseable website on /tools/analyze is now a 400 instead of a 500, and 500 responses no longer echo internal error messages. by @jrhizorJune 7, 2026
June 7, 2026
New
Fixes
@elmohq/cli)--dir is now a global option. It applies to init, compose, and edit, and shows up in elmo --help as well as each subcommand's help.elmo -h now makes clear what elmo edit lets you change and which targets it accepts.docker-compose.yml image tags are now pinned to the CLI's version (e.g. elmohq/elmo-web:0.2.10) instead of latest, so stacks stay on the version they were initialized with until you upgrade.elmo status — use elmo compose ps instead.May 12, 2026
~/.elmo. by @jrhizorelmo init (defaults to 1515). by @jrhizorelmo init setup no longer adds direct-API query targets — only scraping tracks ChatGPT and Google AI Mode. by @jrhizorelmo edit, drop elmo telemetry and the ~/.elmo/config.json file. elmo edit env|compose opens the file in $VISUAL / $EDITOR (fallback nano) — toggle DISABLE_TELEMETRY there instead of via the removed elmo telemetry subcommand. Telemetry state and the deployment ID now live entirely in .env; elmo init stamps the CLI version and timestamp into the .env and elmo.yaml headers, and re-running it preserves the existing DEPLOYMENT_ID. by @jrhizorelmo start, elmo stop, elmo logs, and elmo build aliases — use elmo compose <args> directly (e.g. elmo compose up -d, elmo compose down, elmo compose logs -f, elmo compose build). by @jrhizoranalyzeBrand, so the onboarding analyze step is visible in the web server logs. by @jrhizorMay 11, 2026
elmo init. by @jrhizorexample.com) in the brand website field and normalize the stored value to the origin (https://example.com/products is saved as https://example.com/). by @jrhizorboss.on("error") handler so transient pg-boss connection blips no longer crash the worker. by @jrhizorMay 10, 2026
elmohq/elmo-db-migrate images instead of always attempting to build as part of the CLI. by @jrhizorMay 10, 2026
elmohq/elmo-web and elmohq/elmo-worker. by @jrhizorog:image is now an absolute URL and renders the current page's title/description. Adds og:url, og:site_name, og:locale, and og:logo to the document head. by @jrhizorMay 6, 2026
/api/v1/brands endpoints (POST, GET, PATCH) now accept and return a single domains list instead of website + additionalDomains. This future-proofs against a future db model change. by @jrhizorMay 6, 2026
elmo init adds a recommended setup path — pick a scraper (BrightData or Olostep), pick a direct LLM API (OpenRouter, Anthropic, OpenAI, or Mistral), four prompts total. The custom path now requires at least one direct LLM API so onboarding analysis works out of the box. by @jrhizorelmo init and new elmo telemetry status|enable|disable subcommand. See Telemetry for what's collected. by @jrhizorMISTRAL_API_KEY and target via mistral:mistral-api:<model>[:online]. by @jrhizoranswer_text_markdown over answer_text when extracting response text, so prompt responses render with markdown formatting in the UI. by @jrhizorApril 24, 2026
/auth/register submission in local mode now atomically creates the default org + admin membership, so register → brand onboarding works in one pass; any subsequent signup is rejected. Demo mode narrows writable /api/auth/** endpoints to a whitelist of just sign-in and sign-out. Drops the unused DEFAULT_ORG_ID and DEFAULT_ORG_NAME env vars. by @jrhizorbrand.enabledModels, and move the visibility-bar rollup into a single SQL query — cuts load time from ~10s to under 1s on large brands. Also fixes the "unbranded" tag filter and a search clear-X flicker. by @jrhizorApril 23, 2026
DEFAULT_DELAY_HOURS env var. brand.delayOverrideHours still takes precedence. The default changed from the hard-coded 72h to 24h. by @jrhizoruser.image field so avatars actually render. by @jrhizorApril 22, 2026
DATABASE_URL prompt and note that it must be an IPv4-compatible direct connection or pooler. by @jrhizorREAD_ONLY=true) now enable supportsMultiOrg, so the /app brand switcher renders when the demo user is seeded into multiple organizations. Pure local deployments continue to auto-redirect to the default org. by @jrhizor@tailwindcss/vite emitting different CSS hashes in the client and SSR passes. by @jrhizorSCRAPE_TARGETS end-to-end via the provider registry. Deployments that configure non-default providers no longer hit AI_LoadAPIKeyError for providers they never set up, the worker fails fast at startup on misconfigured SCRAPE_TARGETS, and brand.enabledModels filters per brand. by @jrhizorApril 21, 2026
elmo init now walks through each provider one at a time. by @jrhizor