The default input for a component configuration is a JSON text area.

If you define a JSON schema, we are able to display a nice form and let the user to fill the JSON using a set of defined inputs.

Using the configuration schema also allows us to validate the user input on frontend.
JSON schemas are well documented on the json-schema.org website.
We use RJSF (React JSON Schema Form) for rendering schemas into forms. The schema supports standard JSON Schema properties as well as custom extensions documented in UI Element Examples and Sync Action Examples.
The following format values are supported in property definitions. The Type column shows the underlying JSON Schema type; italicized entries are descriptive notes, not literal type values.
| Format | Type | Description |
|---|---|---|
password |
string | Masked password input with show/hide toggle |
textarea |
string | Multi-line text area |
editor |
string/object | CodeMirror code editor (JSON, SQL, Python, etc.) |
date |
string | Date picker input |
checkbox |
boolean | Checkbox toggle |
radio |
string | Radio button group (requires enum) |
trim |
string | Standard text input with automatic whitespace trimming |
grid / grid-strict |
object | Responsive grid layout for grouped fields |
tabs / tabs-top / categories |
object | Tabbed layout for grouped fields |
table |
array | Editable table for arrays of objects |
info |
any JSON Schema type | Static informational alert (uses title as message; Keboola UI extension) |
ssh-editor |
object | SSH key/form editor |
sync-action |
Keboola UI button widget | Action button triggering a sync action (not a JSON Schema type) |
test-connection |
Keboola UI button widget | Connection test button (not a JSON Schema type) |
The following options keys can be used in property definitions:
| Option | Description |
|---|---|
options.async |
Dynamic option loading via sync actions. See Sync Action Examples. |
options.dependencies |
Conditional field visibility based on other field values. See Dynamic Options. |
options.tags |
Enable tag-style input for multi-select arrays |
options.creatable |
Allow user-created values in select dropdowns |
options.tooltip |
Help text displayed as a tooltip icon next to the field label. Supports Markdown syntax. |
options.documentation |
Documentation link rendered as a book icon next to the field label. Value: { "link": "https://...", "tooltip": "optional hover text" } |
options.enum_titles |
Display labels for enum values |
options.hidden |
Hide the field from the UI |
options.collapsed |
Start object sections in collapsed state |
options.disable_collapse |
Prevent collapsing of object sections |
options.enabled |
Set to false to disable a field |
options.grid_columns |
Number of grid columns (1–12) in grid/grid-strict layouts |
options.grid_break |
Force a new row in grid layouts |
options.editor |
CodeMirror editor options: mode, lineNumbers, lint, input_height |
options.input_height |
Height for textarea fields (e.g., "100px") |
options.inputAttributes |
HTML input attributes (e.g., placeholder) |
options.only_keys |
SSH editor variant showing only key fields |
options.disable_array_add |
Disable adding items to arrays |
options.disable_array_delete |
Disable removing items from arrays |
options.disable_array_reorder |
Disable reordering items in arrays |
When building or iterating on a configuration schema, you need a way to see how your JSON schema renders as a form. The recommended approach is to use the live schema editor built into the Keboola UI.
The Keboola UI includes a built-in live schema editor that lets you edit a JSON schema and immediately see the rendered form side by side. This is the fastest way to iterate on your schema during development.
How to use it:
https://connection.keboola.com/admin/projects/<project-id>/components/<component-id>/<config-id>).This editor uses the same RJSF rendering library as the production UI, so what you see in the editor is exactly what end users will see. The override is local to your browser session — it does not change the schema registered in the Developer Portal.
You can also use the build-component-ui skill from the Keboola AI Kit to generate or refine configuration schemas using AI. The skill is an expert agent specialized in:
configSchema.json and configRowSchema.json structuresoptions.dependencies for conditional field visibilityTo use it, install the Keboola AI Kit as a Claude Code plugin and invoke the
@build-component-ui agent. Describe your component’s configuration needs and it will produce a complete schema
following Keboola conventions and best practices.
Let’s assume your component accepts the following configuration:
{
"username": "foo",
"#password": "baz",
"dateFrom": "yesterday",
"dateTo": "today"
}This looks like an appropriate form:

The form above can be created using this JSON Schema:
{
"title": "Parameters",
"type": "object",
"required": [
"dateFrom",
"dateTo",
"username",
"#password"
],
"properties": {
"username": {
"title": "Username",
"type": "string",
"minLength": 1,
"default": "",
"propertyOrder": 1
},
"#password": {
"title": "Password",
"type": "string",
"format": "password",
"minLength": 1,
"default": "",
"propertyOrder": 2
},
"dateFrom": {
"title": "Date from",
"type": "string",
"description": "Any date accepted by strtotime (https://www.php.net/manual/en/function.strtotime.php) function",
"minLength": 1,
"default": "",
"propertyOrder": 3
},
"dateTo": {
"title": "Date to",
"type": "string",
"description": "Any date accepted by strtotime (https://www.php.net/manual/en/function.strtotime.php) function",
"minLength": 1,
"default": "",
"propertyOrder": 4
}
}
}Note: The links feature is deprecated. Use options.documentation instead (see Supported Options).
If you want to provide links to external resources, use options.documentation to add a clickable documentation icon next to the field label:
{
"dateFrom": {
"title": "Date from",
"type": "string",
"description": "Any date accepted by the strtotime function",
"options": {
"documentation": {
"link": "https://www.php.net/manual/en/function.strtotime.php",
"tooltip": "strtotime Documentation"
}
}
}
}The old links property is no longer supported. If you have existing schemas using it, migrate to options.documentation:
{
"title": "Parameters",
"type": "object",
"required": [
"dateFrom",
"dateTo",
"username",
"#password"
],
"properties": {
"username": {
"title": "Username",
"type": "string",
"minLength": 1,
"default": "",
"propertyOrder": 1
},
"#password": {
"title": "Password",
"type": "string",
"format": "password",
"minLength": 1,
"default": "",
"propertyOrder": 2
},
"dateFrom": {
"title": "Date from",
"type": "string",
"description": "Any date accepted by the strtotime function",
"minLength": 1,
"default": "",
"propertyOrder": 3,
"links": [
{
"rel": "strtotime Documentation",
"href": "https://www.php.net/manual/en/function.strtotime.php"
}
]
},
"dateTo": {
"title": "Date to",
"type": "string",
"description": "Any date accepted by the strtotime function",
"minLength": 1,
"default": "",
"propertyOrder": 4,
"links": [
{
"rel": "strtotime Documentation",
"href": "https://www.php.net/manual/en/function.strtotime.php"
}
]
}
}
}Which renders like this:

The following features are still supported for backwards compatibility but have preferred alternatives:
enumSource / watch — Dynamic enum population based on other field values. For new schemas, prefer options.async with sync actions instead. See Sync Action Examples.The following features from the legacy JSON Editor library are no longer supported:
links — Clickable links on field descriptions. Use options.documentation with link and optional tooltip instead.