/ CHANGELOG

Changelog

Latest releases, completed work, and improvements shipped to Elmo.

Releases

August 6, 2026

What's Changed

  • Oxylabs requests now use the asynchronous jobs API instead of the Realtime API, which Oxylabs is deprecating. If you have any :oxylabs targets in SCRAPE_TARGETS, upgrade before August 31, 2026 to avoid failures. by @jrhizor
  • Add Cloro as a scraper provider for ChatGPT, Perplexity, Copilot, Gemini, Google AI Mode, and Google AI Overview. by @jrhizor
  • BREAKING CHANGE: DataForSEO now scrapes the real ChatGPT and Gemini interfaces instead of calling their model APIs, with no change needed to existing SCRAPE_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 @jrhizor
  • Added an ELMO_ENCRYPTION_KEY to new and upgraded deployments, which Elmo now requires to encrypt provider credentials stored in the database. by @jrhizor
  • Prompts can now be added in bulk by pasting one per line. by @nosey-dewdrop
  • Brand analysis can now be pointed at a full page URL to research a sub-brand, while mentions stay tracked against the site's domain. by @snowyukitty
  • The prompts page now keeps a save bar in view that flags unsaved changes, highlights the rows you edited, and warns before you navigate away or close the tab. by @jrhizor
  • Sort prompts alphabetically on the prompt settings page. by @jrhizor
  • Fix Oxylabs Perplexity query fan-out which incorrectly included follow-up questions. by @jrhizor
  • Cap per-request spend on the direct API providers: output tokens on Anthropic, OpenAI, OpenRouter, and Mistral, plus web-search budget (Anthropic max_uses, OpenAI maxToolCalls), so no single tracked run can spend unboundedly. by @jrhizor

July 21, 2026

What's Changed

  • You can now track Google AI Overviews via the BrightData, DataForSEO, and Oxylabs providers; SCRAPE_TARGETS now accepts google-ai-overview:brightdata:online, google-ai-overview:dataforseo:online, and google-ai-overview:oxylabs:online. by @jrhizor
  • Grok is now only supported via OpenRouter, since unauthenticated access has been removed and all Grok scrapers are permanently failing. by @jrhizor
  • Competitor domains can now be added by pasting a full URL. by @jrhizor
  • You can now use the keyboard to select tags for filtering. by @jrhizor
  • Show when an opportunities report was last evaluated. by @jrhizor
  • DeepSeek and Moonshot/Kimi models render with their own logos instead of generic icons. by @jrhizor

July 10, 2026

What's Changed

  • IMPORTANT BUGFIX: Fixed OpenAI response retrieval that broke in v0.2.15, which caused repeated (but billable) failures. If you are collecting data from the direct OpenAI API using Elmo, please update immediately. by @jrhizor

July 8, 2026

What's Changed

  • Add an optional JINA_API_KEY env var to avoid anonymous rate limits when fetching website content during brand onboarding. by @jrhizor
  • Ensure the overview charts use the same timezone-specific x-axis. by @jrhizor
  • Changing some brand/org configurations behind the scenes to prepare for Elmo Cloud which requires db migrations (should run automatically on Docker Compose installations). by @jrhizor

NOTE: 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

What's Changed

  • Add 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 @jrhizor
  • Add ChatGPT, Perplexity, and Gemini support to the DataForSEO provider. elmo 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 @jrwrest
  • Add Oxylabs as a scraper provider. elmo 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 @jrhizor
  • Onboarding brand analysis now runs in the background and is more resilient to failures, avoiding timeouts on slow analyses. by @melalj

June 12, 2026

What's Changed

  • Added new citation source categories and a Google Shopping breakdown to the citations dashboard. by @jrhizor
  • Local-mode deployments now support multiple brands. The brand switcher shows a "Create new brand" option that provisions a new org + admin membership for the user. by @jrhizor
  • Added the Google Shopping breakdown to a prompt's Citations tab on the prompt details page. by @jrhizor
  • Added a sort control to the Visibility page. by @jrhizor
  • Added a Query Fan-Out section showing the searches AI engines run for your prompts, with a prompt-to-query diff, the words engines add or drop, and the searches you're missing. by @jrhizor
  • Breaking: /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 @jrhizor

June 7, 2026

What's Changed

  • Fixes bug where in some cases BrightData processing could get stuck. by @jrhizor

June 7, 2026

What's Changed

Web app

New

  • Share of Voice and Opportunities pages.

Fixes

  • "Current visibility" now shows the latest point of the carried-forward trend (the value the line ends on) instead of the whole-window average, so the headline number matches the chart beside it.
  • Fixed the sidebar showing only "Overview" after the onboarding wizard finishes in local mode (previously required a page refresh).
  • Fixed the visibility page failing to load for brands with many active prompts.

CLI (@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.
  • Generated 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.
  • Removed elmo status — use elmo compose ps instead.

May 12, 2026

What's Changed

  • Default the CLI config directory to ~/.elmo. by @jrhizor
  • Prompt for the web app port in elmo init (defaults to 1515). by @jrhizor
  • Recommended elmo init setup no longer adds direct-API query targets — only scraping tracks ChatGPT and Google AI Mode. by @jrhizor
  • Add elmo 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 @jrhizor
  • Remove elmo 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 @jrhizor
  • Fix the dashboard briefly showing "No Data Yet" with "none are currently enabled" right after the onboarding wizard finishes in local mode. by @jrhizor
  • Bulk-select prompts in the editor (settings and onboarding) to enable or disable many at once. by @jrhizor
  • Log start/done (with duration and result counts) for analyzeBrand, so the onboarding analyze step is visible in the web server logs. by @jrhizor

May 11, 2026

What's Changed

  • Clean up wording in elmo init. by @jrhizor
  • Accept bare domains (e.g. example.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 @jrhizor
  • Show the signup screen instead of login on a fresh local deployment. by @jrhizor
  • Attach a boss.on("error") handler so transient pg-boss connection blips no longer crash the worker. by @jrhizor

May 10, 2026

What's Changed

  • Publish elmohq/elmo-db-migrate images instead of always attempting to build as part of the CLI. by @jrhizor

May 10, 2026

What's Changed

  • Standardize Docker image naming between the CLI and release process on elmohq/elmo-web and elmohq/elmo-worker. by @jrhizor
  • Fix OG image generation: og: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 @jrhizor

May 6, 2026

What's Changed

  • Admin /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 @jrhizor

May 6, 2026

What's Changed

  • 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 @jrhizor
  • Add telemetry opt-out prompt during elmo init and new elmo telemetry status|enable|disable subcommand. See Telemetry for what's collected. by @jrhizor
  • Add Mistral as a direct API provider. Set MISTRAL_API_KEY and target via mistral:mistral-api:<model>[:online]. by @jrhizor
  • License Elmo under the MIT License. Add Code of Conduct, Contributing guide, Security policy, and a lightweight CLA process. by @jrhizor
  • BrightData: prefer answer_text_markdown over answer_text when extracting response text, so prompt responses render with markdown formatting in the UI. by @jrhizor

April 24, 2026

What's Changed

  • Fix local-mode registration end-to-end and lock down the auth surface. The first /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 @jrhizor
  • Redesign the Visibility and Citations filter bar (model / tags / lookback dropdowns + search), wire model filters to brand.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 @jrhizor

April 23, 2026

What's Changed

  • Make default brand cadence configurable via DEFAULT_DELAY_HOURS env var. brand.delayOverrideHours still takes precedence. The default changed from the hard-coded 72h to 24h. by @jrhizor
  • Restyle the demo login and add a preview to Storybook. by @jrhizor
  • Ensure icons/favicons are comprehensive for non-whitelabel deployments. by @jrhizor
  • Replace the page-top demo-mode banner with a compact "Demo" pill next to the sidebar logo (with a tooltip explaining the read-only behavior), and move version / elmohq.com / GitHub links into the sidebar footer for every deployment mode except whitelabel. Also reads the better-auth user.image field so avatars actually render. by @jrhizor

April 22, 2026

What's Changed

  • CLI: mask the external DATABASE_URL prompt and note that it must be an IPv4-compatible direct connection or pooler. by @jrhizor
  • Demo mode: visitors can now actually sign in — better-auth endpoints are exempt from the read-only write-block, and the login form pre-fills the seeded demo credentials. by @jrhizor
  • Demo deployments (READ_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
  • Fix missing stylesheet and favicon in Docker builds caused by @tailwindcss/vite emitting different CSS hashes in the client and SSR passes. by @jrhizor
  • Worker dispatch now reads SCRAPE_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 @jrhizor

v0.2.1

GitHub

April 21, 2026

What's Changed

  • CLI elmo init now walks through each provider one at a time. by @jrhizor

Closed Issues

August 2026

July 2026

June 2026