Plugins EmDash — les extensions officielles

7 plugins first-party disponibles dans le repo. L'écosystème tiers est encore embryonnaire — c'est le bon moment pour contribuer.

Comment fonctionne un plugin EmDash

Chaque plugin déclare ses capabilities dans un manifest au moment de l'installation. Il s'exécute dans un Dynamic Worker isolé — il ne peut accéder qu'à ce qu'il a déclaré, rien d'autre. Exemple réel tiré du plugin forms :

TypeScript
// plugin.manifest.ts
export default definePlugin({
  name: '@emdash-cms/plugin-forms',
  capabilities: ['email:send', 'write:media', 'network:fetch'],
  // ...
});

⚠️ Note technique : les plugins sandboxés requièrent un compte Cloudflare payant (à partir de 5$/mois) pour accéder aux Dynamic Workers. Sans compte payant, les plugins peuvent être désactivés en mode "safe mode" (exécution in-process).

Les 7 plugins officiels

Maintenus dans le repo principal. Stables pour les fonctionnalités core, en évolution pour les intégrations avancées.

forms

@emdash-cms/plugin-forms

Créez des formulaires dans l'admin, intégrez-les via Portable Text, collectez des soumissions, envoyez des notifications, exportez les données. Anti-spam : honeypot ou Cloudflare Turnstile configurable. Widget admin avec aperçu des soumissions récentes.

email:sendwrite:medianetwork:fetch

ai-moderation

@emdash-cms/plugin-ai-moderation

Modération de contenu par IA. Filtrage automatique de commentaires soumis avant publication.

content:readcontent:updateai:invoke

atproto

@emdash-cms/plugin-atproto

Intégration AT Protocol / Bluesky. Crossposter automatiquement sur Bluesky à chaque publication de contenu.

content:readnetwork:atproto

audit-log

@emdash-cms/plugin-audit-log

Journal d'audit des actions sur le CMS. Traçabilité complète de toutes les modifications : qui a fait quoi, quand.

events:readstorage:write

color

@emdash-cms/plugin-color

Gestion de palettes de couleurs. Ajoute un champ couleur natif dans les collections de contenu.

content:readcontent:write

embeds

@emdash-cms/plugin-embeds

Embeds externes via oEmbed : YouTube, Twitter/X et autres services dans le contenu Portable Text.

content:readnetwork:fetch

webhook-notifier

@emdash-cms/plugin-webhook-notifier

Notifications webhook sur événements CMS : publication, mise à jour, suppression. Déclenche n'importe quel endpoint HTTP.

events:readnetwork:fetch

🔧 Créer un plugin EmDash

Un plugin EmDash est un package TypeScript standard. Il déclare ses capabilities, ses hooks et ses routes dans un objet definePlugin(). Pas de magie, pas d'accès global — juste une interface claire.

definePlugin()

L'API centrale. Déclarez le nom, les capabilities, les hooks sur les événements CMS et les routes d'administration. → Tout ce que le plugin peut faire est déclaré à cet endroit, nulle part ailleurs.

Capabilities comme contrat

Chaque capability donne accès à une API spécifique : email:send, network:fetch, content:write… Rien d'autre n'est accessible. → Le modèle de confiance est explicite et auditable.

Hooks sur événements

Réagissez aux événements CMS : onPublish, onUpdate, onDelete, onFormSubmit… → Les plugins s'intègrent sans modifier le core.

Voir le code d'un plugin

Le code source des 7 plugins officiels est disponible dans le repo. La meilleure documentation, c'est le code.