# Penpot CMS plugin

**URL:** <https://community.penpot.app/t/penpot-cms-plugin/9821>\
**Category:** Contribution\
**Tags:** plugins\
**Created:** [September 11, 2025, 9:12am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821 "2025-09-11T09:12:00Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Belar](https://avatars.discourse-cdn.com/v4/letter/b/45deac/32.png) [@Belar](https://community.penpot.app/u/Belar)\
**Post date:** [September 11, 2025, 9:12am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/1 "2025-09-11T09:12:01Z")

</div>

Hello,  
I have an idea for a content management system plugin and thought I would share it on the forum, to see what you think about it.

With the plugin, you can take a batch of data (e.g. a spreadsheet export) and apply it to and reuse it in your design. For example, from a single template “component”, generate and showcase a button with different content options (label length, language), reuse blog post content on different components (index, post, excerpt, short list etc.), or create different versions of a promo graphic.

It’s not an attempt to turn Penpot into a website builder, but to make content reusable and quick and easy to manage, solo or within a team.

Below is a video of a small PoC, presenting:

- 🧱 batch item creation based on a data set and a template element,
- ↔️ two-way editing,
- 🏷 layer name based content pairing - the project file works without the plugin. I’m yet to test variants, but suspect it will be a great use case.

---

<div class="post-metadata">

**Author:** ![LauraKalbag](https://dub1.discourse-cdn.com/flex017/user_avatar/community.penpot.app/laurakalbag/32/5014_2.png) [@LauraKalbag](https://community.penpot.app/u/LauraKalbag)\
**Post date:** [September 12, 2025, 9:43am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/2 "2025-09-12T09:43:05Z")

</div>

Very cool! I think marketing teams would really appreciate a plugin like this.

---

<div class="post-metadata">

**Author:** ![a-ng-d](https://dub1.discourse-cdn.com/flex017/user_avatar/community.penpot.app/a-ng-d/32/11021_2.png) [@a-ng-d](https://community.penpot.app/u/a-ng-d)\
**Post date:** [September 15, 2025, 2:15pm UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/3 "2025-09-15T14:15:31Z")

</div>

That’s a cool initiative to create campaign at scale!  
May Penpot be a tool for creating marketing assets 😆

---

<div class="post-metadata">

**Author:** ![hey-carlos](https://dub1.discourse-cdn.com/flex017/user_avatar/community.penpot.app/hey-carlos/32/8274_2.png) [@hey-carlos](https://community.penpot.app/u/hey-carlos)\
**Post date:** [September 17, 2025, 12:04am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/4 "2025-09-17T00:04:27Z")

</div>

Really cool. Even something as simple as this demo would make the content migration I’m currently working on much much smoother.

Looking forward to seeing more!

---

<div class="post-metadata">

**Author:** ![Belar](https://avatars.discourse-cdn.com/v4/letter/b/45deac/32.png) [@Belar](https://community.penpot.app/u/Belar)\
**Post date:** [September 19, 2025, 11:23am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/5 "2025-09-19T11:23:45Z")

</div>

@LauraKalbag @a-ng-d Thank you. You are right, it could be a great tool for creating sets of marketing materials.

@hey-carlos Thank you. Content migration sounds like a great use case. I will make sure to post updates.

---

<div class="post-metadata">

**Author:** ![Arlo-James](https://avatars.discourse-cdn.com/v4/letter/a/bbce88/32.png) [@Arlo-James](https://community.penpot.app/u/Arlo-James)\
**Post date:** [September 25, 2025, 7:31am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/6 "2025-09-25T07:31:07Z")

</div>

This sounds like a really useful idea! Making content reusable and easier to manage could save a lot of time, especially for teams working on multiple variations. Excited to see how it develops.

---

<div class="post-metadata">

**Author:** ![Belar](https://avatars.discourse-cdn.com/v4/letter/b/45deac/32.png) [@Belar](https://community.penpot.app/u/Belar)\
**Post date:** [October 19, 2025, 11:53am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/7 "2025-10-19T11:53:19Z")

</div>

I worked on the prototype a bit more and am happy to share new findings and a demo you can run yourselves.

### Features and findings

- 📦 The item template works with components.
- ❌ Added item deletion. Same as addition, it is reflected in the project.
- 🏷 Added dynamic property names. In the prototype, they have to be unique, but I don’t expect this limitation to be present in the plugin proper. The name change is not automatically reflected in the Penpot element, but it could be.

### Demo

If you would like to try the plugin out, you can install a development preview from:

```auto
https://penpotcmspreview.authormore.com/manifest.json

```

⚠ It is a development preview and has everything that comes with such a build, like bugs, unhandled edge cases, inconsistent mechanics, and so on.

Feedback is very much welcome. Especially, I would appreciate your thoughts on how far automated the synchronisation should be - that’s changes in the sheet reflected in the project.

---

<div class="post-metadata">

**Author:** ![LauraKalbag](https://dub1.discourse-cdn.com/flex017/user_avatar/community.penpot.app/laurakalbag/32/5014_2.png) [@LauraKalbag](https://community.penpot.app/u/LauraKalbag)\
**Post date:** [October 21, 2025, 9:29am UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/8 "2025-10-21T09:29:45Z")

</div>

I’m not getting anything happening when I use the “select template shape” button. Am I doing something wrong?

---

<div class="post-metadata">

**Author:** ![Belar](https://avatars.discourse-cdn.com/v4/letter/b/45deac/32.png) [@Belar](https://community.penpot.app/u/Belar)\
**Post date:** [October 21, 2025, 12:27pm UTC](https://community.penpot.app/t/penpot-cms-plugin/9821/9 "2025-10-21T12:27:56Z")

</div>

Thank you for checking it out and sorry the mechanics are unclear. I will make sure to fix that in the plugin.

If you click the “Select template shape" button and then a template’s layer (in the Penpot’s canvas or layer tree), it should produce new elements with content from the table - matching a column and a layer based on their names.

Here is a demo file, with a project structure that matches the default table:  
[penpot-cms-demo.penpot](https://community.penpot.app/uploads/short-url/i0OpWjMfiIuWU9ZeLqn9juF5gBK.penpot) (33.2 KB)  
In this case, clicking “Select template shape” and then “TitleTemplate” or “TitleTemplateComponent” should generate new items.
