Properties in BCMS

In BCMS, Properties (also known as inputs) are the smallest building blocks used to define content structure. They are combined in Groups, Widgets, and Templates to define flexible and structured content types.

Each property type represents a specific kind of input field - like text, number, image, or relationship to other content.

You can configure each property as:

  • Single or Array: One or many values.

  • Required or Optional: Whether editors must fill it in to save an entry.


Basic Property Types

String

A basic text input that accepts any character.

  • Appears as a single-line text field.

  • Good for titles, slugs, or short descriptions.

{
  "title": "Hello World"
}

Options:

  • Array: Yes

  • Required: Optional


Rich Text

A content editor with formatting: headings, bold, italic, links, lists, etc.

  • Good for content bodies that allow formatting

{
  "body": [
    {
      "type": "paragraph",
      "value": "This is a paragraph."
    }
  ]
}

Options:

  • Array: Yes

  • Required: Optional

You can pass it to BCMSContentManager like this:

<BCMSContentManager
    items={myRichTextInput.nodes}
    clientConfig={bcms.getConfig()}
/>

and BCMSContentManager will automatically resolve lists, paragraphs etc, into HTML.


Number

Accepts any numeric value, including decimals.

  • Appears as a number input field.

  • Useful for prices, rankings, or metrics.

{
  "price": 19.99
}

Options:

  • Array: Yes

  • Required: Optional


Date

Date-time picker that returns a timestamp (in milliseconds).

  • Good for scheduling events, publishing content, or tracking deadlines.

{
  "publishedAt": 1712926400000
}

Options:

  • Array: Yes

  • Required: Optional


Boolean

A simple toggle input: true or false.

  • Appears as a switch in the editor.

  • Ideal for flags like “featured,” “published,” or “visible.”

{
  "featured": true
}

Options:

  • Array: Yes

  • Required: Optional


Enumeration

Predefined list of selectable options shown as a dropdown.

  • Helps enforce consistency (e.g. category: Blog, News, Guide).

  • You define the choices when setting up the property.

{
  "category": "Blog"
}

Options:

  • Array: Yes

  • Required: Optional


Relational Property Types

Entry Pointer

Lets editors select one or more entries from another template.

  • Often used for building relationships between content.

  • For example: “Recommended Articles” → list of entries from the Blog template.

{
  "relatedPosts": [
    "entry-id-1",
    "entry-id-2"
  ]
}

Options:

  • Array: Yes

  • Required: Optional


Group Pointer

Lets you embed a group of properties inside the current template/widget.

  • Reuses custom-defined input structures.

  • Example: A “Testimonial” group with name, quote, and avatar.

{
  "testimonials": [
    {
      "name": "Jane",
      "quote": "Great service!"
    }
  ]
}

Options:

  • Array: Yes

  • Required: Optional

Learn more about working with Groups.


Media

File picker that connects to the Media Library.

  • Allows selecting images, videos, or files.

  • Used often in hero sections, product images, etc.

{
  "image": {
    "_id": "media-id",
    "name": "hero.jpg"
  }
}

Options:

  • Array: Yes

  • Required: Optional

Learn more about working with Media.


Visual and Coming properties

Color picker (coming soon)

Will allow selecting color values in HEX or RGB.


Tags (Coming Soon)

Planned support for assigning free-form labels or keywords to entries.


Best practices

  • Use arrays when multiple values make sense, such as a list of features or image gallery.

  • Keep required fields minimal, so content editors aren’t blocked.

  • Use Groups for repeatable structures, and Widgets for reusable layouts across templates.


Example use in template

Let’s say you have a Blog Post template with these properties:

  • title (There by default, string)

  • slug (There by default, string)

  • publishedAt (Date)

  • author (Group Pointer)

  • coverImage (Media)

  • relatedPosts (Entry Pointer, array)

This structure allows content editors to create rich blog posts while maintaining consistency across entries.