# Integration store: a faster catalog to welcome 1000 integrations 🚀

**URL:** <https://community.gladysassistant.com/t/store-dintegrations-un-catalogue-plus-rapide-pour-accueillir-les-1000-integrations/11356>\
**Category:** Développement\
**Created:** [October 19, 2026, 8:27am UTC](https://community.gladysassistant.com/t/store-dintegrations-un-catalogue-plus-rapide-pour-accueillir-les-1000-integrations/11356 "2026-10-19T08:27:17Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [October 19, 2026, 8:27am UTC](https://community.gladysassistant.com/t/store-dintegrations-un-catalogue-plus-rapide-pour-accueillir-les-1000-integrations/11356/1 "2026-10-19T08:27:17Z")

</div>

Hello everyone,

The community integrations store is exploding: we’re at **611 integrations, including 585 developed by the community** , and we’re aiming for 1000 in the coming weeks. Thank you to everyone who publishes integrations!

The downside: with so many integrations, Gladys’ «&nbsp;Integrations&nbsp;» page was slow to load. And during loading, it displayed «&nbsp;36 integrations&nbsp;» (only native integrations). For a few seconds, one could therefore believe that Gladys only had that.

I’ve reworked this page, here’s what’s changing.

**A much lighter catalog**

Until now, Gladys sent your browser the complete description of each integration (configuration parameters, widgets, scene triggers…), whereas the list only displays a small part of it. The store now publishes a lightweight version of its index, with only what the list needs. Result: the catalog is about **20 times lighter** (114 KB instead of 2.4 MB). The full detail of an integration is only retrieved when you open its installation page.

**No more misleading counter during loading**

While community integrations are not loaded, the page displays «&nbsp;Loading catalog…&nbsp;» and grayed-out cards, instead of a partial total. Once loading is complete, the real total is displayed.

**A display as you scroll**

Integrations are displayed in batches of 48, and the next ones arrive automatically as you scroll down. Images are only downloaded as they approach the screen. Before, the page downloaded all integration visuals at once, over 20 MB.

**A clear message if the store is unreachable**

If Gladys cannot reach the store and has no cached copy, a message notifies you, with a «&nbsp;Retry&nbsp;» button. Before, the page simply displayed the native integrations, without explanation.

**Less work for your box**

Every 30 minutes, Gladys refreshes the list of integrations. It now downloads less than 1 MB instead of 17 MB, and writes much less to its database, which is appreciated on a small mini-PC.

**For integration developers** : nothing to change on your side, the lightweight version of the index is automatically generated from your manifests.

These improvements will arrive in the next version of Gladys.

Don’t hesitate to give me your feedback here!

The PR:

> <https://github.com/GladysAssistant/Gladys/pull/3233>
>
> \### Description
> 
> The community store is at 585 integrations (622 with the native… ones) and is expected to reach 1000 in the coming weeks. The integrations page was getting slow, and while the community list loaded, the header said "36 intégrations" (the native ones only), so for a few seconds Gladys looked like it had only those.
> 
> \*\*Where the time went (measured on the live store)\*\*
> \- Every 30 minutes, every Gladys downloaded the full \`index.json\` (17 MB, 2.7 MB gzipped) and wrote it into a \`t\_variable\`.
> \- \`GET /api/v1/external\_integration/store\` sent each full manifest (\`config\_schema\`, scene declarations, widgets…) to the browser: 10.3 MB raw / 2.4 MB gzipped on every catalog visit, \*\*and on every install page\*\*, which fetched the whole catalog to display one entry.
> \- All cards were rendered at once, twice (mobile list + desktop grid), with eager covers: about 22 MB of images before the page was usable.
> 
> \*\*Server\*\*
> \- The catalog now comes from \*\*\`index-lite.json\`\*\*, the same entries with the manifest reduced to what the list reads. The periodic refresh downloads 0.9 MB, and the catalog API answers \*\*114 KB gzipped (was 2.4 MB)\*\*.
> \- Any index kept for the catalog is reduced to the lite manifest fields (\`STORE\_INDEX\_LITE\_MANIFEST\_FIELDS\`). A full index is therefore always a valid lite one: a cache written by the previous version, or a fork without a lite variant (only \`EXTERNAL\_INTEGRATION\_STORE\_INDEX\_URL\` set).
> \- The \*\*complete manifest\*\* of one integration is fetched on demand from \`index.json\` (\`getStoreEntry\`). Only that entry is kept, for 30 minutes, so the install page and the install click share one download. \*\*Install\*\* and \*\*update\*\* use it (the update always bypasses the cache, as before).
> \- New \`GET /api/v1/external\_integration/store/integration?store\_slug=owner/repo\` (admin) returns the catalog entry with its complete manifest. It answers \`400\` without \`store\_slug\` and \`404\` when the integration is not in the index.
> 
> \*\*Front\*\*
> \- Until the community list has loaded, the header reads \*\*"Chargement du catalogue…"\*\* and the grid shows placeholder cards. There's no partial count, and no list that reshuffles when the store arrives. The sidebar only lists All / Favorites and the displayed category during that time; the other categories appear with the complete catalog.
> \- When the store could never be reached (\`refreshed\_at: null\`, or a failed request), a warning says so, with a \*\*Retry\*\* button, instead of silently showing the native integrations alone.
> \- Cards are rendered \*\*48 at a time\*\*, the next batch loading as the end of the list nears the viewport (with a "Show more" button as the keyboard path and fallback). Covers use \`loading="lazy"\`.
> \- The install page fetches only its integration, and tells "not in the store" (404) apart from "store unreachable" (with Retry).
> \- Demo mode mirrors the same split: lite list, full index fetched for the install page and the install.
> \- New i18n keys in en / fr / de / es.
> 
> \*\*Specs updated in this diff:\*\* external integrations B.7, B.8 (frontend), B.9 (store), C.5 (management API), C.6 (\`index-lite.json\` format), plus a pointer in the integration catalog spec.
> 
> \*\*Checked locally\*\*
> \- Real app against the live store. With the store response delayed, the header shows the loading text and the grid shows placeholders, then "622 intégrations" with 48 cards; scrolling loads more. A search shows "28 sur 622". The install page makes a single \`store/integration\` request. A mocked unreachable store shows the warning. Mobile layout checked too.
> \- Demo mode: the list comes from \`index-lite.json\`; the install page and the simulated install share one \`index.json\` download, and the install lands on the configuration screen.
> 
> \*\*Follow-up idea for \`integration-store\` (not in this PR):\*\* the install page and the install still download the full \`index.json\` (2.7 MB gzipped, growing with the store) to read one entry. A per-integration file published by the indexer (e.g. \`integrations/\<owner\>--\<repo\>.json\`) would make that a few KB; \`getStoreEntry\` is the only place to change.
> 
> \### Related request
> 
> 
> 
> \### Checklist
> 
> \- \[\] If a forum topic or GitHub issue exists, the description links it (\`Forum: https://community.gladysassistant.com/t/...\` or \`Closes #...\`)
> \- \[x\] Tests pass: \`cd server && npm run coverage\` (Codecov requires 100% coverage on changed lines) and Cypress (full suite run locally: 19 specs, 90/90)
> \- \[x\] Linter and prettier pass on both front and server (\`npm run eslint\`, \`npm run prettier\`); \`compare-translations\` and \`npm run build\` pass
> \- \[x\] No undocumented breaking change
> 
> 🤖 Generated with \[Claude Code\](https://claude.com/claude-code)
> 
> https://claude.ai/code/session\_017fCaFgHxdVo83AhyAJXCwo
> 
> 
> \## Summary by CodeRabbit
> 
> \* \*\*New Features\*\*
> \* The integration catalog now loads in pages with loading placeholders, lazy-loaded images, and a “show more” option.
> \* If the community store is unavailable, the catalog displays a warning and offers a retry; native integrations remain available.
> \* Integration install pages fetch complete store details directly and provide a retry option for network errors.
> \* Catalog listings use a lighter index, while full details are fetched when needed for viewing, installation, or updates.
> \* Administrators can refresh the store catalog and access complete integration details; standard users retain access to supported native integration details.
> 
> \* \*\*Documentation\*\*
> \* Updated integration-store and catalog documentation to describe the revised loading and data-fetching behavior.
