Plugin Development
SDK Reference

SDK Reference

Complete reference for the FeedGen CMS SDK available to plugins and themes.

Content API

Access posts, categories, authors, and tags.

sdk.content.getPosts(options)

Get paginated posts.

const result = await sdk.content.getPosts({
  filter: { category: 'news' },
  page: 1,
  limit: 10,
  sort: 'createdAt',
  order: 'desc'
});
 
// Returns:
{
  items: [...],    // Array of posts
  total: 100,      // Total count
  page: 1,         // Current page
  pages: 10        // Total pages
}

sdk.content.getPost(idOrSlug)

Get a single post by ID or slug.

const post = await sdk.content.getPost('my-post-slug');
const post = await sdk.content.getPost('507f1f77bcf86cd799439011');

sdk.content.getLatestPosts(limit)

Get latest posts.

const latest = await sdk.content.getLatestPosts(10);

sdk.content.getFeaturedPosts(limit)

Get featured posts.

const featured = await sdk.content.getFeaturedPosts(6);

sdk.content.searchPosts(query, options)

Search posts.

const results = await sdk.content.searchPosts('search term', { 
  limit: 20 
});

sdk.content.getCategories()

Get all categories.

const categories = await sdk.content.getCategories();

sdk.content.getCategory(idOrSlug)

Get a single category.

const category = await sdk.content.getCategory('news');

sdk.content.getAuthors()

Get all authors.

const authors = await sdk.content.getAuthors();

sdk.content.getAuthor(idOrSlug)

Get a single author.

const author = await sdk.content.getAuthor('john-doe');

sdk.content.getTags(options)

Get tags.

const tags = await sdk.content.getTags({ limit: 50 });

Media API

Handle images and media files.

sdk.media.getImageUrl(imageData, size)

Get image URL for a specific size.

const url = sdk.media.getImageUrl(post.featuredImageData, 'md');
 
// Sizes: 'xs', 'sm', 'md', 'lg', 'xl'

sdk.media.getSrcSet(imageData, sizes)

Generate srcset for responsive images.

const srcset = sdk.media.getSrcSet(imageData, ['sm', 'md', 'lg']);
// Returns: "image-sm.jpg 640w, image-md.jpg 1024w, image-lg.jpg 1920w"

sdk.media.getPictureElement(imageData, options)

Generate a picture element HTML.

const html = sdk.media.getPictureElement(imageData, {
  sizes: '(max-width: 640px) 100vw, 50vw',
  alt: 'Image description',
  className: 'my-image',
  loading: 'lazy'
});

sdk.media.hasImage(imageData)

Check if image exists.

if (sdk.media.hasImage(post.featuredImageData)) {
  // Has image
}

Hooks API

Register actions and filters.

sdk.hooks.addAction(name, callback, priority)

Register an action hook.

sdk.hooks.addAction('post.viewed', async (post) => {
  console.log('Post viewed:', post.title);
}, 10); // priority (lower = earlier)

sdk.hooks.addFilter(name, callback, priority)

Register a filter hook.

sdk.hooks.addFilter('post.title', (title) => {
  return title.toUpperCase();
}, 10);

sdk.hooks.removeAction(name, callback)

Remove an action.

sdk.hooks.removeAction('post.viewed', myCallback);

sdk.hooks.removeFilter(name, callback)

Remove a filter.

sdk.hooks.removeFilter('post.title', myCallback);

Available Hooks

Actions:

  • init - CMS initialized
  • post.viewed - Post was viewed
  • post.saved - Post was saved
  • plugin.activated - Plugin activated
  • plugin.deactivated - Plugin deactivated

Filters:

  • post.content - Filter post content
  • post.title - Filter post title
  • post.data - Filter entire post object
  • page.title - Filter page title

Shortcodes API

Register content shortcodes.

sdk.shortcodes.register(name, callback)

Register a shortcode.

// Simple shortcode: [greeting name="John"]
sdk.shortcodes.register('greeting', (attrs, content) => {
  return `<div>Hello, ${attrs.name}!</div>`;
});
 
// With content: [box type="info"]Content here[/box]
sdk.shortcodes.register('box', (attrs, content) => {
  return `<div class="box box-${attrs.type}">${content}</div>`;
});

sdk.shortcodes.exists(name)

Check if shortcode exists.

if (sdk.shortcodes.exists('greeting')) {
  // Shortcode is registered
}

sdk.shortcodes.getAll()

Get all registered shortcodes.

const all = sdk.shortcodes.getAll();

Widgets API

Create sidebar and footer widgets.

sdk.widgets.registerWidget(id, config)

Register a widget type.

sdk.widgets.registerWidget('my-widget', {
  name: 'My Widget',
  description: 'Widget description',
  icon: '🎯',
  
  settings: [
    { key: 'title', type: 'text', label: 'Title', default: 'My Widget' },
    { key: 'count', type: 'number', label: 'Count', default: 5 },
    { key: 'showImages', type: 'boolean', label: 'Show Images', default: true },
    { 
      key: 'style', 
      type: 'select', 
      label: 'Style',
      options: [
        { value: 'default', label: 'Default' },
        { value: 'compact', label: 'Compact' }
      ],
      default: 'default'
    }
  ],
  
  render: async (settings, sdk) => {
    return `
      <div class="my-widget">
        <h3>${settings.title}</h3>
        <!-- Widget content -->
      </div>
    `;
  }
});

sdk.widgets.registerArea(id, config)

Register a widget area (in themes).

sdk.widgets.registerArea('sidebar', {
  name: 'Sidebar',
  description: 'Main sidebar widgets',
  beforeWidget: '<div class="widget">',
  afterWidget: '</div>',
  beforeTitle: '<h3 class="widget-title">',
  afterTitle: '</h3>'
});

sdk.widgets.renderArea(areaId)

Render all widgets in an area.

const html = await sdk.widgets.renderArea('sidebar');

sdk.widgets.isAreaActive(areaId)

Check if area has widgets.

if (sdk.widgets.isAreaActive('sidebar')) {
  // Has widgets
}

Admin API

Extend the admin panel.

sdk.admin.addMenuItem(config)

Add admin menu item.

sdk.admin.addMenuItem({
  id: 'my-plugin',
  title: 'My Plugin',
  icon: '<svg>...</svg>',
  position: 50,
  capability: 'admin',
  render: async (req, res) => {
    return '<div>My admin page</div>';
  }
});

sdk.admin.addSubMenuItem(parentId, config)

Add submenu item.

sdk.admin.addSubMenuItem('my-plugin', {
  id: 'settings',
  title: 'Settings',
  render: async (req, res) => {
    return '<div>Settings page</div>';
  }
});

sdk.admin.addDashboardWidget(config)

Add dashboard widget.

sdk.admin.addDashboardWidget({
  id: 'my-stats',
  title: 'My Statistics',
  position: 'side', // 'normal' or 'side'
  render: async () => '<div>Stats content</div>'
});

sdk.admin.registerSettingsSection(config)

Add settings section.

sdk.admin.registerSettingsSection({
  id: 'my-settings',
  title: 'My Plugin Settings',
  tab: 'plugins',
  fields: [
    { key: 'apiKey', type: 'text', label: 'API Key' },
    { key: 'enabled', type: 'toggle', label: 'Enable', default: false }
  ]
});

REST API

Create custom REST endpoints.

sdk.rest.registerRoute(namespace, path, config)

Register a REST route.

// GET endpoint
sdk.rest.registerRoute('my-plugin/v1', '/items', {
  methods: ['GET'],
  permission: 'public', // 'public', 'authenticated', 'admin'
  args: {
    page: { type: 'integer', default: 1 },
    limit: { type: 'integer', default: 10 }
  },
  callback: async (req) => {
    return { items: [], total: 0 };
  }
});
 
// POST endpoint
sdk.rest.registerRoute('my-plugin/v1', '/items', {
  methods: ['POST'],
  permission: 'authenticated',
  callback: async (req) => {
    const { title } = req.body;
    // Create item...
    return { success: true, id: '123' };
  }
});

Storage API

Isolated key-value storage for plugins.

sdk.storage.set(key, value)

Store data.

await sdk.storage.set('myData', { count: 42, items: [] });

sdk.storage.get(key)

Retrieve data.

const data = await sdk.storage.get('myData');

sdk.storage.delete(key)

Delete data.

await sdk.storage.delete('myData');

Utilities

Helper functions.

sdk.utils.formatDate(date, format)

Format a date.

sdk.utils.formatDate(new Date(), 'default'); // "January 12, 2026"
sdk.utils.formatDate(new Date(), 'short');   // "Jan 12, 2026"
sdk.utils.formatDate(new Date(), 'iso');     // "2026-01-12T..."

sdk.utils.slugify(text)

Generate URL slug.

sdk.utils.slugify('Hello World!'); // "hello-world"

sdk.utils.truncate(text, length)

Truncate text.

sdk.utils.truncate('Long text here...', 100); // "Long text..."

sdk.utils.stripHtml(html)

Remove HTML tags.

sdk.utils.stripHtml('<p>Hello</p>'); // "Hello"

sdk.utils.escapeHtml(text)

Escape HTML entities.

sdk.utils.escapeHtml('<script>'); // "&lt;script&gt;"

sdk.utils.randomId(length)

Generate random ID.

sdk.utils.randomId();     // "x7k2m9p4"
sdk.utils.randomId(16);   // Longer ID

UI Components

Pre-built UI helpers.

sdk.ui.pagination(options)

Generate pagination HTML.

const html = sdk.ui.pagination({
  currentPage: 1,
  totalPages: 10,
  baseUrl: '/posts',
  maxVisible: 5
});

sdk.ui.breadcrumb(items)

Generate breadcrumb HTML.

const html = sdk.ui.breadcrumb([
  { label: 'Home', url: '/' },
  { label: 'Posts', url: '/posts' },
  { label: 'Current Post' }
]);

sdk.ui.menu(menuId)

Render a navigation menu.

const html = sdk.ui.menu('primary');

sdk.ui.shareButtons(options)

Generate share buttons.

const html = sdk.ui.shareButtons({
  url: 'https://example.com/post',
  title: 'Post Title',
  platforms: ['facebook', 'twitter', 'pinterest', 'email']
});