CMS Fields Reference
Meno's CMS stores content in JSON files organized by collection. Each collection has a schema that defines its fields, and each content item is a separate JSON file. This reference covers all field types, schema configuration, system fields, and query operators.
Field Types
Type | Description | Editor Control | Value Type |
|---|---|---|---|
| Single-line text | Text input |
|
| Multi-line text | Textarea |
|
| Formatted HTML content | Rich text editor (Tiptap) |
|
| Numeric value | Number input |
|
| True/false toggle | Checkbox |
|
| Image file path | Image picker |
|
| Any file upload | File picker |
|
| Date or datetime | Date picker |
|
| Choice from options | Select dropdown |
|
| Link to another item | Reference picker |
|
| Internationalized single-line text | Per-locale text inputs |
|
| Internationalized multi-line text | Per-locale textareas |
|
Field Configuration
Every field requires a type. All other properties are optional.
Property | Type | Applies To | Description |
|---|---|---|---|
|
| All | Field type (required) |
|
| All | Display label in the editor |
|
| All | Whether the field must have a value |
| varies | All | Default value for new items |
|
| All | Help text shown below the field |
|
|
| List of allowed values |
|
|
| Allow multiple selections (stores an array) |
|
|
| MIME filter (e.g. "application/pdf", "*/*") |
|
|
| Target collection ID for references |
Field Type Details
string
Single-line text. Use for titles, names, short labels.
{
"title": { "type": "string", "label": "Title", "required": true },
"slug": { "type": "string", "label": "URL Slug", "required": true }
}text
Multi-line text. Use for descriptions, excerpts, plain-text content.
{
"excerpt": { "type": "text", "label": "Excerpt", "description": "Short summary for listing pages" }
}rich-text
HTML content stored as a string. Edited with a Tiptap-based rich text editor. Stored internally as Tiptap JSON and converted to HTML for rendering.
{
"body": { "type": "rich-text", "label": "Body Content", "required": true }
}number
Numeric value. Stored as a JavaScript number.
{
"price": { "type": "number", "label": "Price", "default": 0 },
"sortOrder": { "type": "number", "label": "Sort Order", "default": 0 }
}boolean
True/false toggle.
{
"featured": { "type": "boolean", "label": "Featured", "default": false },
"published": { "type": "boolean", "label": "Published", "default": true }
}image
Image file path. The editor provides an image picker.
{
"coverImage": { "type": "image", "label": "Cover Image" },
"thumbnail": { "type": "image", "label": "Thumbnail" }
}file
Any file upload. Use the optional accept property to restrict allowed file types by MIME pattern. Without accept, all file types are allowed.
{
"resume": { "type": "file", "label": "Resume", "accept": "application/pdf" },
"attachment": { "type": "file", "label": "Attachment" }
}date
ISO 8601 date string. The editor shows a date/datetime picker.
{
"publishedAt": { "type": "date", "label": "Publish Date" },
"eventDate": { "type": "date", "label": "Event Date", "required": true }
}select
Dropdown selection. Requires an options array. Set multiple: true to allow selecting more than one value (stored as an array).
{
"category": {
"type": "select",
"label": "Category",
"options": ["tech", "design", "marketing", "business"],
"required": true
},
"tags": {
"type": "select",
"label": "Tags",
"options": ["featured", "new", "popular", "archived"],
"multiple": true
}
}reference
Link to an item in another collection. The collection property specifies the target. Set multiple: true for arrays of references.
{
"author": {
"type": "reference",
"label": "Author",
"collection": "authors",
"required": true
},
"relatedPosts": {
"type": "reference",
"label": "Related Posts",
"collection": "posts",
"multiple": true
}
}Referenced items are resolved at render time. Access nested fields with dot notation:
{{cms.author.name}}
{{item.author.avatar}}i18n
Internationalized single-line text. Stores a value per locale.
{
"title": { "type": "i18n", "label": "Title", "required": true }
}Stored value:
{
"title": { "en": "Hello World", "pl": "Witaj" }
}i18n-text
Internationalized multi-line text. Same structure as i18n but with textarea inputs.
{
"description": { "type": "i18n-text", "label": "Description" }
}System Fields
Every CMS item automatically receives these system fields. They cannot be overridden in the schema.
Field | Type | Description |
|---|---|---|
|
| Unique identifier (UUID) |
|
| Stable filename without |
|
| Deprecated. Use |
|
| ISO timestamp of creation |
|
| ISO timestamp of last update |
|
| Computed URL path based on the collection's |
Collection Schema
Each collection is defined by a schema in the page metadata. Schemas have these properties:
Property | Type | Required | Description |
|---|---|---|---|
|
| Yes | Unique collection identifier |
|
| Yes | Display name |
|
| Yes | Field used for URL slugs |
|
| Yes | URL template, e.g., |
|
| Yes | Field definitions |
|
| No | Client-side data exposure for MenoFilter |
Schema Example
{
"id": "posts",
"name": "Blog Posts",
"slugField": "slug",
"urlPattern": "/blog/{{slug}}",
"fields": {
"title": { "type": "string", "label": "Title", "required": true },
"slug": { "type": "string", "label": "Slug", "required": true },
"excerpt": { "type": "text", "label": "Excerpt" },
"body": { "type": "rich-text", "label": "Body", "required": true },
"coverImage": { "type": "image", "label": "Cover Image" },
"author": { "type": "reference", "label": "Author", "collection": "authors" },
"category": {
"type": "select",
"label": "Category",
"options": ["tech", "design", "business"]
},
"published": { "type": "boolean", "label": "Published", "default": false },
"publishedAt": { "type": "date", "label": "Publish Date" }
}
}Client Data Configuration
The clientData property configures how CMS data is exposed for client-side filtering with MenoFilter.
Property | Type | Default | Description | ||
|---|---|---|---|---|---|
|
|
| Enable client-side data exposure | ||
| `"auto" \ | "inline" \ | "static"` |
| Delivery method |
|
|
| Item count threshold for | ||
|
| all | Subset of fields to expose (for security/size) |
Strategies:
inline: embeds JSON directly in the HTML page (best for under 500 items)static: generates a separate/data/{collection}/index.jsonfile (best for large collections)auto: chooses based on item count vs threshold
Filter Operators
Used in list node filter properties and in MenoFilter JavaScript API.
Operator | Description | Example |
|---|---|---|
| Equal to |
|
| Not equal to |
|
| Greater than |
|
| Greater than or equal |
|
| Less than |
|
| Less than or equal |
|
| String contains (case-insensitive) or array includes |
|
| String does not contain or array excludes |
|
| String starts with (case-insensitive) |
|
| String ends with (case-insensitive) |
|
| Value is in the given array |
|
| Value is not in the given array |
|
| Is empty/null ( |
|
Filter in List Node
{
"type": "list",
"sourceType": "collection",
"source": "posts",
"filter": [
{ "field": "published", "operator": "eq", "value": true },
{ "field": "category", "operator": "eq", "value": "tech" }
],
"sort": { "field": "publishedAt", "order": "desc" },
"children": [
{ "type": "node", "tag": "h3", "children": "{{post.title}}" }
]
}Filter can also be a single condition object or a shorthand record:
{
"filter": { "field": "featured", "operator": "eq", "value": true }
}CMS Template Pages
Template pages (stored in pages/templates/) use {{cms.field}} expressions to render content from the current CMS item. During static build, one HTML page is generated for each item in the collection.
{
"type": "node",
"tag": "article",
"children": [
{ "type": "node", "tag": "h1", "children": "{{cms.title}}" },
{
"type": "node",
"tag": "img",
"attributes": { "src": "{{cms.coverImage}}", "alt": "{{cms.title}}" }
},
{ "type": "embed", "html": "{{cms.body}}" },
{ "type": "node", "tag": "span", "children": "By {{cms.author.name}}" }
]
}Next Steps
Node Types -- list node for rendering collections
Template Expressions -- all template expression contexts
MenoFilter API -- client-side filtering JavaScript API
Project Config -- site-level configuration