Airsc is free for everyone. If it helps you, support it with $2–$20.

Support
SkillSafeBuilding web & mobile appsSome setup

astro-strapi-loader

VirtusLab-Open-Source · VirtusLab-Open-Source/astro-strapi-loader

This integration skill for AI agents enables easy data loading from Strapi Content API into Astro projects, supporting queries, filtering, and i18n.

Integration of Astro with Strapi CMS that enables easy data loading from Strapi Content API

18 stars3License: MITUpdated 17 days ago0 opens

Preview

▍

What you can do with it

  • Generate Astro components that dynamically load content from a Strapi CMS.
  • Implement multilingual websites by fetching localized content through the Strapi API.
  • Use an AI agent to configure data fetching and content collection in Astro projects from Strapi.

Safety check

Safe

No risky patterns found in the files we scanned.

Automated scan of the repo files. Always review code you run.

From the README

Astro Strapi Loader Integration of Astro with Strapi CMS that enables easy data loading from Strapi Content API


📋 Table of Contents

📋 Requirements

  • Astro ^6.0.0 || ^7.0.0
  • Strapi ^5.0.0
  • Node.js >= 22.12.0

📦 Installation

npm install @sensinum/astro-strapi-loader
# or
yarn add @sensinum/astro-strapi-loader

🚀 Features

  • Easy integration with Astro and Strapi
  • Automatic data loading from Strapi API
  • Query, filtering and population capabilities - Strapi 5 Documentation
  • Authorization token support
  • Astro collections system integration
  • TypeScript typing
  • 🆕 Custom ID generation - Generate collection IDs from custom fields (e.g., slugs)
  • 🆕 Multiple collections - Create multiple collections from same endpoint
  • 🆕 i18n support - Built-in locale support for multilingual content

🤖 AI-native support

This repository includes optional, model-agnostic guidance for coding agents and AI-assisted workflows (Strapi REST query objects, populate / dynamic zones, locale, qs serialization, and Astro Collections usage).

LocationPurpose
.ai/AGENTS.mdShort agent instructions—non-negotiables and pointers to the skill.
.ai/astro-strapi-loader/SKILL.mdFull skill (YAML frontmatter + markdown); copy or adapt for your global or project skills directory.
.cursor/rules/astro-strapi-loader.mdcCursor rules for files such as content.config.ts (.mdc with optional globs).

You can reuse or fork these files in downstream projects that consume @sensinum/astro-strapi-loader so assistants stay aligned with Strapi 5 REST parameters and this package’s behavior. The published npm package contains only dist/; AI assets live in the GitHub tree alongside the source.

🖥️ Usage

  1. Add the integration to your src/content.config.ts:
import { generateCollections } from '@sensinum/astro-strapi-loader';

let strapiCollections: any = {};

try {
  strapiCollections = await generateCollections({
    url: import.meta.env.STRAPI_URL,
    token: import.meta.env.STRAPI_TOKEN,
    headers: {
      // ...
    },
  }, [{ // leave empty [] to fetch all the collections based on default Strapi settings
    name: "homepage",
    query: {
      populate: { seo: true },
    },
  }, {
    name: "layout",
    query: {
      populate: { header: true, footer: true },
    },
  }, 'simple-collection-name']); // Can also pass just strings
} catch (error) {
  console.error(error);
}

export const collections = {
    ...strapiCollections,
};

✅ Backward Compatible: Existing code works without any changes!

  1. Use in your Astro component:
---
import { getCollection } from 'astro:content';
import { fetchContent } from '@sensinum/astro-strapi-loader';

// Basic usage with Astro Collections
const myCollection = await getCollection('my-collection');

// Basic usage with direct Strapi Content API fetch
const myCollection = await fetchContent({
  url: import.meta.env.STRAPI_URL,
  token: import.meta.env.STRAPI_TOKEN,
  contentType: 'my-collection',
  queryParams: {
    populate: {
      // ...
    },
    filters: {
      // ...
    },
    sort: ['publishedAt:desc'],
  },
});
---

  { myCollection.map(item => (
    
      {item.title}
      {item.description}
    </article>
  )) }

⚙️ Configuration

Integration Options

OptionTypeRequiredDescription
urlstringYesStrapi API URL
tokenstringNoStrapi API access token
collectionNamestringNoCustom collection name (for multiple collections from same endpoint)
idGeneratorfunctionNoCustom function to generate IDs from item data
localestring | string[]NoSingle locale or array of locales for i18n support
headersRecord<string, string>NoAdditional headers for API request

⚠️ Note: The token must have read access to both the Content API and the Content-Type Builder API (ONLY to the "Get Content Types" endpoint).

Mixing 1.0.x and 1.1.0+

You can mix old (simple) and new (extended) format in a single generateCollections call:

strapiCollections = await generateCollections({
  url: import.meta.env.STRAPI_URL,
  token: import.meta.env.STRAPI_TOKEN,
}, [
  // ✅ Old format - works as before
  {
    name: "homepage",
    query: { populate: { seo: true } }
  },
  {
    name: "layout",
    query: { populate: { header: true, footer: true } }
  },

  // ✅ 1.1.0+ - with locale support
  {
    name: "pages",
    collectionName: "pagesEN",
    locale: "en",
    query: { sort: ['publishedAt:desc'] }
  },
  {
    name: "pages",  // Same endpoint, different config!
    collectionName: "pagesDE",
    locale: "de",
    query: { sort: ['publishedAt:desc'] }
  },

  // ✅ 1.1.0+ - with custom ID
  {
    name: "blog-posts",
    idGenerator: (data) => data.slug as string,
    query: { filters: { published: true } }
  },

  // ✅ 1.1.0+ - combining all features
  {
    name: "articles",
    collectionName: "articlesMultilang",
    locale: ["en", "de", "fr"],
    idGenerator: (data) => data.slug as string
  }
]);

// Result collections:
// - homepage (old format)
// - layout (old format)
// - pagesEN (1.1.0+)
// - pagesDE (1.1.0+)
// - blog-posts (1.1.0+)
// - articlesMultilang (1.1.0+)

Advanced Usage Examples

Custom ID Generation

Use slugs or custom fields as

View source on GitHub