Field types

Blobify supports 13 field types. Every type can be marked translatable: true, including blocks. A translatable value is stored as a locale map such as { "en": value, "is": value }.

required is valid on every type except boolean. A boolean already has a true or false value, so a required flag has no useful meaning.

Type reference

TypeStored valueImportant configuration
textStringappearance: "color" is an optional editor hint
slugStringsourceField, unique
richtextRoot ASTallowedNodes, allowedMarks, headingLevels, allowedModels, allowedBlocks, allowAssets
numberNumberNo type-specific option
booleanBooleanCannot be required
datetimeISO datetime or YYYY-MM-DDdateOnly: true stores a date only
selectString or string arrayoptions, plus multiple: true for several values
assetAsset referenceaccept, spaceScope, spaces
arrayPrimitive arrayStrings and numbers only
referenceContent reference or reference arraymodel or models, multiple, spaceScope, spaces
linkInternal, asset, or external link objectmodel or models, allowExternal, allowAssets
blocksBlock object or block arrayallowedBlocks, multiple, optional translatable block trees
jsonAny JSON valueEscape hatch for data without an editor schema

All fields can also use the common properties label, description, defaultValue, and groupId. groupId applies to fields in a model schema, not fields in a block schema.

Text and slug

Use text for names, titles, short descriptions, and labels. The appearance option changes only the editor control. It does not change the stored string.

jsoncode
{
  "title": {
    "type": "text",
    "required": true,
    "translatable": true
  },
  "brandColor": {
    "type": "text",
    "appearance": "color",
    "defaultValue": "#2563eb"
  },
  "slug": {
    "type": "slug",
    "sourceField": "title",
    "unique": true,
    "required": true
  }
}

unique is supported on text and slug. A translatable unique field is unique per locale. A non-translatable unique field is unique globally. Saving the model derives a required field index for the unique field.

Numbers, booleans, dates, and selects

jsoncode
{
  "price": { "type": "number", "required": true },
  "featured": { "type": "boolean", "defaultValue": false },
  "publishedAt": { "type": "datetime" },
  "eventDate": { "type": "datetime", "dateOnly": true },
  "categories": {
    "type": "select",
    "options": ["news", "guide", "release"],
    "multiple": true
  }
}

A regular datetime is stored as an ISO 8601 string. A date-only field is stored as a string such as 2026-07-13. A single select stores one option string. A multiple select stores an array of option strings.

Assets

An asset field stores a semantic reference, not a final media URL:

jsoncode
{
  "coverImage": {
    "type": "asset",
    "accept": "image"
  }
}

The accepted filters are image, video, media, pdf, document, and file. Omitting accept allows every file type.

Asset values use this shape:

jsoncode
{
  "type": "asset",
  "assetId": "img_456",
  "focalPoint": { "x": 0.28, "y": 0.52 }
}

spaceId is optional for cross-space references. Per-use focalPoint and crop data can frame an image without modifying the original. Localized alternative text belongs to the shared asset metadata document, not the content-field reference. See Content JSON.

References and links

A reference points to content by model and ID. Set either model for one target model or models for a polymorphic field. Do not set both.

jsoncode
{
  "author": { "type": "reference", "model": "author" },
  "related": {
    "type": "reference",
    "models": ["article", "page"],
    "multiple": true
  }
}

Stored references are semantic:

jsoncode
{
  "model": "author",
  "id": "author_1"
}

A link field can store one of three tagged shapes:

jsoncode
{
  "internal": { "type": "internal", "model": "page", "id": "page_1" },
  "asset": { "type": "asset", "assetId": "file_1" },
  "external": { "type": "external", "url": "https://example.com" }
}

Use spaceScope: "current" for the current space, spaceScope: "all" for any space in the organization, or spaceScope: "selected" with a spaces array.

Arrays, blocks, and JSON

An array contains only strings or numbers. Use a multiple reference for repeatable content entities and blocks for repeatable embedded structures.

jsoncode
{
  "keywords": { "type": "array" },
  "sections": {
    "type": "blocks",
    "multiple": true,
    "allowedBlocks": ["hero-block", "quote-block"]
  },
  "integrationConfig": { "type": "json" }
}

Blocks default to multiple: true. With multiple: false, the field stores one block object. A non-translatable blocks field shares its structure across locales and can contain translatable inner fields. A translatable blocks field stores a separate block value for each locale.

Use json sparingly. It accepts arbitrary JSON, but the dashboard cannot provide the same structured editing and schema validation as normal fields.

Rich text

Rich text stores a root AST. It supports paragraphs, headings, lists, blockquotes, code, horizontal rules, asset nodes, embedded blocks, and internal content references. Schema options can restrict the allowed surface.

jsoncode
{
  "body": {
    "type": "richtext",
    "translatable": true,
    "allowAssets": true,
    "allowedBlocks": ["callout-block"],
    "allowedModels": ["article", "page"],
    "allowedMarks": ["bold", "italic", "code"]
  }
}

For the stored AST and block-node examples, see Content JSON.