diff --git a/README.md b/README.md index 5d05afe268..318d78d24a 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ existing tools and performs at any scale. [![Deploy to Heroku](https://www.herokucdn.com/deploy/button.svg)](https://www.heroku.com/deploy/?template=https://github.com/baserow/baserow/tree/master) ```bash -docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.1.6 +docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.2.0 ``` ![Baserow database screenshot](docs/assets/screenshot.png "Baserow database screenshot") @@ -108,7 +108,7 @@ Created by Baserow B.V. - bram@baserow.io. Distributes under the MIT license. See `LICENSE` for more information. -Version: 2.1.6 +Version: 2.2.0 The official repository can be found at https://github.com/baserow/baserow. diff --git a/backend/docker/docker-entrypoint.sh b/backend/docker/docker-entrypoint.sh index bf42a0a0ac..eb1d8a6f94 100755 --- a/backend/docker/docker-entrypoint.sh +++ b/backend/docker/docker-entrypoint.sh @@ -6,7 +6,7 @@ set -euo pipefail # ENVIRONMENT VARIABLES USED DIRECTLY BY THIS ENTRYPOINT # ====================================================== -export BASEROW_VERSION="2.1.6" +export BASEROW_VERSION="2.2.0" # Used by docker-entrypoint.sh to start the dev server # If not configured you'll receive this: CommandError: "0.0.0.0:" is not a valid port number or address:port pair. diff --git a/backend/pyproject.toml b/backend/pyproject.toml index b9b1d47b0e..71876d2354 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -15,7 +15,7 @@ dynamic = ["version"] classifiers = [] dependencies = [ - "django==5.2.12", + "django==5.2.13", "django-cors-headers==4.9.0", "djangorestframework==3.16.1", "djangorestframework-simplejwt==5.5.1", diff --git a/backend/src/baserow/config/settings/base.py b/backend/src/baserow/config/settings/base.py index 44e7f69746..54072fb3ac 100644 --- a/backend/src/baserow/config/settings/base.py +++ b/backend/src/baserow/config/settings/base.py @@ -469,7 +469,7 @@ "name": "MIT", "url": "https://github.com/baserow/baserow/blob/develop/LICENSE", }, - "VERSION": "2.1.6", + "VERSION": "2.2.0", "SERVE_INCLUDE_SCHEMA": False, "TAGS": [ {"name": "Settings"}, diff --git a/backend/src/baserow/contrib/database/data_sync/postgresql_data_sync_type.py b/backend/src/baserow/contrib/database/data_sync/postgresql_data_sync_type.py index eb70f0c5c9..841ab47c38 100644 --- a/backend/src/baserow/contrib/database/data_sync/postgresql_data_sync_type.py +++ b/backend/src/baserow/contrib/database/data_sync/postgresql_data_sync_type.py @@ -13,7 +13,11 @@ TextField, ) from baserow.core.psycopg import psycopg, sql -from baserow.core.utils import ChildProgressBuilder, are_hostnames_same +from baserow.core.utils import ( + ChildProgressBuilder, + are_hostnames_same, + is_hostname_safe, +) from .exceptions import SyncError from .models import PostgreSQLDataSync @@ -155,6 +159,9 @@ def _connection(self, instance): cursor = None connection = None + if not is_hostname_safe(instance.postgresql_host): + raise SyncError("It's not allowed to connect to this hostname.") + baserow_postgresql_connection = ( settings.BASEROW_PREVENT_POSTGRESQL_DATA_SYNC_CONNECTION_TO_DATABASE and are_hostnames_same( diff --git a/backend/src/baserow/core/utils.py b/backend/src/baserow/core/utils.py index bad6d6899b..ea333ad7d3 100644 --- a/backend/src/baserow/core/utils.py +++ b/backend/src/baserow/core/utils.py @@ -4,6 +4,7 @@ import hashlib import inspect import io +import ipaddress import math import os import random @@ -1204,6 +1205,42 @@ def get_all_ips(hostname: str) -> Set: return set() +def is_hostname_safe(hostname: str) -> bool: + """ + Checks if the hostname resolves only to safe addresses. + + Unsafe addresses include: + - Wildcard (0.0.0.0, ::) + - Loopback (127.0.0.0/8, ::1) + - Link-local (169.254.0.0/16, fe80::/10) + - Reserved, multicast, etc. + + :param hostname: The hostname to check. + :return: True if all resolved IPs are safe. + """ + + ips = get_all_ips(hostname) + if not ips: + return False + + for ip in ips: + try: + ip_obj = ipaddress.ip_address(ip) + except ValueError: + return False + + if ( + ip_obj.is_unspecified # wildcard + or ip_obj.is_loopback + or ip_obj.is_link_local + or ip_obj.is_multicast + or ip_obj.is_reserved + ): + return False + + return True + + def are_hostnames_same(hostname1: str, hostname2: str) -> bool: """ Resolves the IP addresses of both hostnames, and checks they resolve to the same IP diff --git a/backend/src/baserow/version.py b/backend/src/baserow/version.py index 73bee60722..3c00bb49aa 100644 --- a/backend/src/baserow/version.py +++ b/backend/src/baserow/version.py @@ -1 +1 @@ -VERSION = "2.1.6" +VERSION = "2.2.0" diff --git a/backend/tests/baserow/core/test_core_utils.py b/backend/tests/baserow/core/test_core_utils.py index a161f42f97..c48371137e 100755 --- a/backend/tests/baserow/core/test_core_utils.py +++ b/backend/tests/baserow/core/test_core_utils.py @@ -26,6 +26,7 @@ get_baserow_saas_base_url, get_value_at_path, grouper, + is_hostname_safe, random_string, remove_duplicates, remove_invalid_surrogate_characters, @@ -683,6 +684,32 @@ def test_remove_duplicates(): def test_get_all_ips(): assert get_all_ips("localhost") == {"127.0.0.1", "::1"} + assert get_all_ips("0.0.0.0") == {"0.0.0.0"} # noqa: S104 + assert get_all_ips("::") == {"::"} + + +def test_is_hostname_safe(): + # Public address (should be safe) + assert is_hostname_safe("12.33.56.1") is True + + # Wildcard addresses are not considered safe + assert is_hostname_safe("0.0.0.0") is False # noqa: S104 IPv4 wildcard + assert is_hostname_safe("::") is False # IPv6 wildcard + + # Loopback addresse sare not considered safe + assert is_hostname_safe("127.0.0.1") is False # IPv4 loopback + assert is_hostname_safe("::1") is False # IPv6 loopback + + # Link-local addresses are not considered safe + assert is_hostname_safe("169.254.1.1") is False # IPv4 link-local + assert is_hostname_safe("fe80::1") is False # IPv6 link-local + + # Multicast addresses are not considered safe + assert is_hostname_safe("224.0.0.1") is False # IPv4 multicast + assert is_hostname_safe("ff02::1") is False # IPv6 multicast + + # Reserved addresses are not considered safe + assert is_hostname_safe("240.0.0.1") is False # IPv4 reserved def test_are_hostnames_same(): diff --git a/backend/uv.lock b/backend/uv.lock index 70fdac2ad3..76f3c9aff3 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -328,7 +328,7 @@ requires-dist = [ { name = "channels", extras = ["daphne"], specifier = "==4.3.2" }, { name = "channels-redis", specifier = "==4.3.0" }, { name = "dj-database-url", specifier = "==3.1.0" }, - { name = "django", specifier = "==5.2.12" }, + { name = "django", specifier = "==5.2.13" }, { name = "django-cachalot", specifier = "==2.8.0" }, { name = "django-celery-beat", specifier = "==2.8.1" }, { name = "django-celery-email-reboot", specifier = "==4.2.0" }, @@ -448,12 +448,12 @@ dev = [ [[package]] name = "baserow-enterprise" -version = "2.1.6" +version = "2.2.0" source = { editable = "../enterprise/backend" } [[package]] name = "baserow-premium" -version = "2.1.6" +version = "2.2.0" source = { editable = "../premium/backend" } [[package]] @@ -889,15 +889,15 @@ wheels = [ [[package]] name = "django" -version = "5.2.12" +version = "5.2.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sqlparse", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/55/b9445fc0695b03746f355c05b2eecc54c34e05198c686f4fc4406b722b52/django-5.2.12.tar.gz", hash = "sha256:6b809af7165c73eff5ce1c87fdae75d4da6520d6667f86401ecf55b681eb1eeb", size = 10860574, upload-time = "2026-03-03T13:56:05.509Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/c5/c69e338eb2959f641045802e5ea87ca4bf5ac90c5fd08953ca10742fad51/django-5.2.13.tar.gz", hash = "sha256:a31589db5188d074c63f0945c3888fad104627dfcc236fb2b97f71f89da33bc4", size = 10890368, upload-time = "2026-04-07T14:02:15.072Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/32/4b144e125678efccf5d5b61581de1c4088d6b0286e46096e3b8de0d556c8/django-5.2.12-py3-none-any.whl", hash = "sha256:4853482f395c3a151937f6991272540fcbf531464f254a347bf7c89f53c8cff7", size = 8310245, upload-time = "2026-03-03T13:56:01.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/b1/51ab36b2eefcf8cdb9338c7188668a157e29e30306bfc98a379704c9e10d/django-5.2.13-py3-none-any.whl", hash = "sha256:5788fce61da23788a8ce6f02583765ab060d396720924789f97fa42119d37f7a", size = 8310982, upload-time = "2026-04-07T14:02:08.883Z" }, ] [[package]] diff --git a/changelog.md b/changelog.md index 645d265841..96826c8340 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,78 @@ # Changelog +## Released 2.2.0 + +### New features +* [Database] Add the `array_unique` formula function to deduplicate lookup arrays. [#2326](https://gitlab.com/baserow/baserow/-/issues/2326) +* [Builder] Allow to drag and drop element on the page [#3634](https://github.com/baserow/baserow/issues/3634) +* [Database] Introduced restricted view ownership type for view-level permissions. [#3673](https://github.com/baserow/baserow/issues/3673) +* [Automation] Support automation templates [#3871](https://github.com/baserow/baserow/issues/3871) +* [Core] Improved Baserow formula function argument validation. [#4532](https://github.com/baserow/baserow/issues/4532) +* [Database] Add the `array_slice` formula function to extract sub-arrays from lookup arrays. [#5053](https://gitlab.com/baserow/baserow/-/issues/5053) +* [Database] Add instance wide data scanner. +* [Database] Introduced field type that can edit a row via a form view. [#2287](https://github.com/baserow/baserow/issues/2287) +* [Database] Allow freezing (pinning) up to 4 columns on the left side of the grid view. [#2047](https://github.com/baserow/baserow/issues/2047) +* [Database] Generalize the `index` formula to work with any array type (not just file fields) and add `first` and `last` convenience functions. [#5065](https://gitlab.com/baserow/baserow/-/issues/5065) +* [Core] Introduced optional Cloudflare Turnstile captcha during signup. + +### Bug fixes +* [Database] Fix index max size error for view sort indexes [#2040](https://github.com/baserow/baserow/issues/2040) +* [Database] Fix public view with hidden group by field [#4858](https://github.com/baserow/baserow/issues/4858) +* [Core] Switch to insecure alternative for UUID generation when on insecure context like HTTP [#4905](https://github.com/baserow/baserow/issues/4905) +* [Database] Rating field now doesn't accept 0 as a valid value in form views when the field is required [#4985](https://github.com/baserow/baserow/issues/4985) +* [Database] Fix DatatypeMismatch on bulk insert for tables with formula fields [#4992](https://github.com/baserow/baserow/issues/4992) +* [Database] Fix AIField generation for mistral API provider [#4994](https://github.com/baserow/baserow/issues/4994) +* [Automation] Fixed a bug that prevented reordering workflows in an automation. [#4995](https://github.com/baserow/baserow/issues/4995) +* [Automation] Removed a constraint that forced unique workflow names. [#4995](https://github.com/baserow/baserow/issues/4995) +* [Integration] Allow advanced formula for JSON body content of HTTP request node [#5002](https://github.com/baserow/baserow/issues/5002) +* [Database] Fix error when changing filter type on link row fields [#5014](https://github.com/baserow/baserow/issues/5014) +* [Database] Fix group by counts for link row field [#5047](https://github.com/baserow/baserow/issues/5047) +* [Core] Fix [nuxt] instance unavailable errors [#5063](https://github.com/baserow/baserow/issues/5063) +* [Database] Ensure primary field always exists on sync table [#5088](https://github.com/baserow/baserow/issues/5088) +* [Database] Fix autonumber sequence [#5115](https://github.com/baserow/baserow/issues/5115) +* [Core] Filter tokens by workspace membership [#5144](https://github.com/baserow/baserow/issues/5144) +* [Database] Fixed slow cleanup of row history table by adding a database index. +* [Builder] Data source context was not reset after a data source creation +* [Automation] Ensure known service errors are logged as warnings to reduce error monitoring noise. +* [Builder] Ensure that the correct error is shown when exceeding the max publish job count. +* [Builder] Ensure the correct error is shown when a page is not found. +* [Automation] Ensure the max publish job count error is shown when exceeding the limit for publishing an Automation Workflow. +* [Automation] Fix bad previous node result inside an iteration +* [Core] Fix date localization not working with non english languages +* [Database] Fix linked row modal checkbox +* [Automation] Fix race condition in loop handling +* [Database] Fix bug where it was not possible to open the row edit modal if the user did not have access to the related table. +* [Database] Fixed survey form navigation with required fields [#3188](https://github.com/baserow/baserow/issues/3188) +* [Integration] Fix the wrong from address changed by the email backend +* [Automation] Fixed a bug that caused a crash when trying to view an Automation's settings in development mode. +* [Builder] Fixed a bug where a broken List Rows data source could cause a crash. +* [Builder] Fixed a bug where an unknown timezone could cause a data source dispatch to fail. +* [Automation] Fixed a bug where automation workflow history entries were being deleted for running workflows. +* [Automation] Fixed a bug where node simulation errors weren't immediately shown. +* [Builder] Fixed a bug where reopening the Publish modal while the builder is still publishing can cause an error. +* [Builder] Fixed a crash when fetching custom code for a non-existent builder ID. +* [Builder] Fixed an unhandled error when a user source user logs out and their refresh token is already expired. +* [Integration] Fixed the Slack Bot Form's translations to use the correct placeholders. +* [Database] Forbid wildcard addresses in Postgres data sync +* [Automation] Resolved a bug which prevented certain Baserow field types from being used after a row-change trigger. +* [Database] Resolved an issue which caused AI field formulas to appear twice in the UI. + +### Refactors +* [Database] Filter out unactionable AxiosErrors from sentry [#5008](https://github.com/baserow/baserow/issues/5008) +* [Core] Silence defined error codes in Sentry [#5011](https://github.com/baserow/baserow/issues/5011) +* [Core] Add affected users count to frontend sentry reports [#5028](https://github.com/baserow/baserow/issues/5028) +* [Core] Harden workspace import ZIP extraction against malformed archives [#5111](https://github.com/baserow/baserow/issues/5111) +* [Core] Replace udspy with pydantic-ai +* [Database] Optimized table deletion (trash) by batching field operations. +* [Core] refactor MCP tools; share AI Assistant capabilities +* [Database] Removed the use of `advocate` for the Jira data sync so that a connection can be made to the local network. +* [Database] Replace LangChain with pydantic-ai for the AI field and the AI prompt node +* [Core] Use Postgres EXPLAIN-based approximate count for audit log pagination to avoid expensive COUNT(*) on large tables. + +### Breaking API changes +* [Integration] Instance SMTP configuration is used by default to send e-mails with the `Send email` action. Set `BASEROW_INTEGRATION_ALLOW_SMTP_SERVICE_TO_USE_INSTANCE_SETTINGS=false` env var to disable this behaviour. [#4999](https://github.com/baserow/baserow/issues/4999) + + ## Released 2.1.6 ### Bug fixes diff --git a/changelog/entries/unreleased/breaking_change/4999_instance_smtp_configuration_can_be_used_to_send_emails_with_.json b/changelog/entries/2.2.0/breaking_change/4999_instance_smtp_configuration_can_be_used_to_send_emails_with_.json similarity index 100% rename from changelog/entries/unreleased/breaking_change/4999_instance_smtp_configuration_can_be_used_to_send_emails_with_.json rename to changelog/entries/2.2.0/breaking_change/4999_instance_smtp_configuration_can_be_used_to_send_emails_with_.json diff --git a/changelog/entries/unreleased/bug/2040_fix_index_size_error.json b/changelog/entries/2.2.0/bug/2040_fix_index_size_error.json similarity index 100% rename from changelog/entries/unreleased/bug/2040_fix_index_size_error.json rename to changelog/entries/2.2.0/bug/2040_fix_index_size_error.json diff --git a/changelog/entries/unreleased/bug/4858_fix_public_view_with_hidden_group_by_field.json b/changelog/entries/2.2.0/bug/4858_fix_public_view_with_hidden_group_by_field.json similarity index 100% rename from changelog/entries/unreleased/bug/4858_fix_public_view_with_hidden_group_by_field.json rename to changelog/entries/2.2.0/bug/4858_fix_public_view_with_hidden_group_by_field.json diff --git a/changelog/entries/unreleased/bug/4905_switch_to_unsecure_alternative_for_uuid_generation_when_on_u.json b/changelog/entries/2.2.0/bug/4905_switch_to_unsecure_alternative_for_uuid_generation_when_on_u.json similarity index 100% rename from changelog/entries/unreleased/bug/4905_switch_to_unsecure_alternative_for_uuid_generation_when_on_u.json rename to changelog/entries/2.2.0/bug/4905_switch_to_unsecure_alternative_for_uuid_generation_when_on_u.json diff --git a/changelog/entries/unreleased/bug/4985_rating_field_0.json b/changelog/entries/2.2.0/bug/4985_rating_field_0.json similarity index 100% rename from changelog/entries/unreleased/bug/4985_rating_field_0.json rename to changelog/entries/2.2.0/bug/4985_rating_field_0.json diff --git a/changelog/entries/unreleased/bug/4992_fix_datatypemismatch_on_bulk_insert_for_tables_with_formula_.json b/changelog/entries/2.2.0/bug/4992_fix_datatypemismatch_on_bulk_insert_for_tables_with_formula_.json similarity index 100% rename from changelog/entries/unreleased/bug/4992_fix_datatypemismatch_on_bulk_insert_for_tables_with_formula_.json rename to changelog/entries/2.2.0/bug/4992_fix_datatypemismatch_on_bulk_insert_for_tables_with_formula_.json diff --git a/changelog/entries/unreleased/bug/4994_fix_aifield_generation_for_mistral_api_provider.json b/changelog/entries/2.2.0/bug/4994_fix_aifield_generation_for_mistral_api_provider.json similarity index 100% rename from changelog/entries/unreleased/bug/4994_fix_aifield_generation_for_mistral_api_provider.json rename to changelog/entries/2.2.0/bug/4994_fix_aifield_generation_for_mistral_api_provider.json diff --git a/changelog/entries/unreleased/bug/4995_fixed_a_bug_that_prevented_reordering_workflows_in_an_automa.json b/changelog/entries/2.2.0/bug/4995_fixed_a_bug_that_prevented_reordering_workflows_in_an_automa.json similarity index 100% rename from changelog/entries/unreleased/bug/4995_fixed_a_bug_that_prevented_reordering_workflows_in_an_automa.json rename to changelog/entries/2.2.0/bug/4995_fixed_a_bug_that_prevented_reordering_workflows_in_an_automa.json diff --git a/changelog/entries/unreleased/bug/4995_removed_a_constraint_that_forced_unique_workflow_names.json b/changelog/entries/2.2.0/bug/4995_removed_a_constraint_that_forced_unique_workflow_names.json similarity index 100% rename from changelog/entries/unreleased/bug/4995_removed_a_constraint_that_forced_unique_workflow_names.json rename to changelog/entries/2.2.0/bug/4995_removed_a_constraint_that_forced_unique_workflow_names.json diff --git a/changelog/entries/unreleased/bug/5002_allow_advanced_formula_for_json_body_content_of_http_request.json b/changelog/entries/2.2.0/bug/5002_allow_advanced_formula_for_json_body_content_of_http_request.json similarity index 100% rename from changelog/entries/unreleased/bug/5002_allow_advanced_formula_for_json_body_content_of_http_request.json rename to changelog/entries/2.2.0/bug/5002_allow_advanced_formula_for_json_body_content_of_http_request.json diff --git a/changelog/entries/unreleased/bug/5014_fix_error_when_changing_filter_type_on_link_row_fields.json b/changelog/entries/2.2.0/bug/5014_fix_error_when_changing_filter_type_on_link_row_fields.json similarity index 100% rename from changelog/entries/unreleased/bug/5014_fix_error_when_changing_filter_type_on_link_row_fields.json rename to changelog/entries/2.2.0/bug/5014_fix_error_when_changing_filter_type_on_link_row_fields.json diff --git a/changelog/entries/unreleased/bug/5047_fix_group_by_counts_for_link_row_field.json b/changelog/entries/2.2.0/bug/5047_fix_group_by_counts_for_link_row_field.json similarity index 100% rename from changelog/entries/unreleased/bug/5047_fix_group_by_counts_for_link_row_field.json rename to changelog/entries/2.2.0/bug/5047_fix_group_by_counts_for_link_row_field.json diff --git a/changelog/entries/unreleased/bug/5063_fix_nuxt_instance_unavailable_errors.json b/changelog/entries/2.2.0/bug/5063_fix_nuxt_instance_unavailable_errors.json similarity index 100% rename from changelog/entries/unreleased/bug/5063_fix_nuxt_instance_unavailable_errors.json rename to changelog/entries/2.2.0/bug/5063_fix_nuxt_instance_unavailable_errors.json diff --git a/changelog/entries/unreleased/bug/5088_ensure_primary_field_always_exists_on_sync_table.json b/changelog/entries/2.2.0/bug/5088_ensure_primary_field_always_exists_on_sync_table.json similarity index 100% rename from changelog/entries/unreleased/bug/5088_ensure_primary_field_always_exists_on_sync_table.json rename to changelog/entries/2.2.0/bug/5088_ensure_primary_field_always_exists_on_sync_table.json diff --git a/changelog/entries/unreleased/bug/5115_fix_autonumber_sequuence.json b/changelog/entries/2.2.0/bug/5115_fix_autonumber_sequuence.json similarity index 100% rename from changelog/entries/unreleased/bug/5115_fix_autonumber_sequuence.json rename to changelog/entries/2.2.0/bug/5115_fix_autonumber_sequuence.json diff --git a/changelog/entries/unreleased/bug/5144_filter_tokens_by_workspace_membership.json b/changelog/entries/2.2.0/bug/5144_filter_tokens_by_workspace_membership.json similarity index 100% rename from changelog/entries/unreleased/bug/5144_filter_tokens_by_workspace_membership.json rename to changelog/entries/2.2.0/bug/5144_filter_tokens_by_workspace_membership.json diff --git a/changelog/entries/unreleased/bug/add_index_to_resolve_slow_cleanup_of_row_history_table.json b/changelog/entries/2.2.0/bug/add_index_to_resolve_slow_cleanup_of_row_history_table.json similarity index 100% rename from changelog/entries/unreleased/bug/add_index_to_resolve_slow_cleanup_of_row_history_table.json rename to changelog/entries/2.2.0/bug/add_index_to_resolve_slow_cleanup_of_row_history_table.json diff --git a/changelog/entries/unreleased/bug/data_source_context_was_not_reset_after_a_data_source_creati.json b/changelog/entries/2.2.0/bug/data_source_context_was_not_reset_after_a_data_source_creati.json similarity index 100% rename from changelog/entries/unreleased/bug/data_source_context_was_not_reset_after_a_data_source_creati.json rename to changelog/entries/2.2.0/bug/data_source_context_was_not_reset_after_a_data_source_creati.json diff --git a/changelog/entries/unreleased/bug/ensure_service_errors_are_logged_as_warnings.json b/changelog/entries/2.2.0/bug/ensure_service_errors_are_logged_as_warnings.json similarity index 100% rename from changelog/entries/unreleased/bug/ensure_service_errors_are_logged_as_warnings.json rename to changelog/entries/2.2.0/bug/ensure_service_errors_are_logged_as_warnings.json diff --git a/changelog/entries/unreleased/bug/ensure_that_the_correct_error_is_shown_when_exceeding_the_ma.json b/changelog/entries/2.2.0/bug/ensure_that_the_correct_error_is_shown_when_exceeding_the_ma.json similarity index 100% rename from changelog/entries/unreleased/bug/ensure_that_the_correct_error_is_shown_when_exceeding_the_ma.json rename to changelog/entries/2.2.0/bug/ensure_that_the_correct_error_is_shown_when_exceeding_the_ma.json diff --git a/changelog/entries/unreleased/bug/ensure_the_correct_error_is_shown_when_a_page_is_not_found.json b/changelog/entries/2.2.0/bug/ensure_the_correct_error_is_shown_when_a_page_is_not_found.json similarity index 100% rename from changelog/entries/unreleased/bug/ensure_the_correct_error_is_shown_when_a_page_is_not_found.json rename to changelog/entries/2.2.0/bug/ensure_the_correct_error_is_shown_when_a_page_is_not_found.json diff --git a/changelog/entries/unreleased/bug/ensure_the_max_publish_job_count_error_is_shown_when_exceedi.json b/changelog/entries/2.2.0/bug/ensure_the_max_publish_job_count_error_is_shown_when_exceedi.json similarity index 100% rename from changelog/entries/unreleased/bug/ensure_the_max_publish_job_count_error_is_shown_when_exceedi.json rename to changelog/entries/2.2.0/bug/ensure_the_max_publish_job_count_error_is_shown_when_exceedi.json diff --git a/changelog/entries/unreleased/bug/fix_bad_previous_node_result_inside_an_iteration.json b/changelog/entries/2.2.0/bug/fix_bad_previous_node_result_inside_an_iteration.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_bad_previous_node_result_inside_an_iteration.json rename to changelog/entries/2.2.0/bug/fix_bad_previous_node_result_inside_an_iteration.json diff --git a/changelog/entries/unreleased/bug/fix_date_localization_not_working_with_non_english_languages.json b/changelog/entries/2.2.0/bug/fix_date_localization_not_working_with_non_english_languages.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_date_localization_not_working_with_non_english_languages.json rename to changelog/entries/2.2.0/bug/fix_date_localization_not_working_with_non_english_languages.json diff --git a/changelog/entries/unreleased/bug/fix_link_row_checkbox.json b/changelog/entries/2.2.0/bug/fix_link_row_checkbox.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_link_row_checkbox.json rename to changelog/entries/2.2.0/bug/fix_link_row_checkbox.json diff --git a/changelog/entries/unreleased/bug/fix_race_condition_in_loop_handling.json b/changelog/entries/2.2.0/bug/fix_race_condition_in_loop_handling.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_race_condition_in_loop_handling.json rename to changelog/entries/2.2.0/bug/fix_race_condition_in_loop_handling.json diff --git a/changelog/entries/unreleased/bug/fix_read_only_link_row_edit_modal.json b/changelog/entries/2.2.0/bug/fix_read_only_link_row_edit_modal.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_read_only_link_row_edit_modal.json rename to changelog/entries/2.2.0/bug/fix_read_only_link_row_edit_modal.json diff --git a/changelog/entries/unreleased/bug/fix_survey_form_next.json b/changelog/entries/2.2.0/bug/fix_survey_form_next.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_survey_form_next.json rename to changelog/entries/2.2.0/bug/fix_survey_form_next.json diff --git a/changelog/entries/unreleased/bug/fix_the_wrong_from_address_changed_by_the_email_backend.json b/changelog/entries/2.2.0/bug/fix_the_wrong_from_address_changed_by_the_email_backend.json similarity index 100% rename from changelog/entries/unreleased/bug/fix_the_wrong_from_address_changed_by_the_email_backend.json rename to changelog/entries/2.2.0/bug/fix_the_wrong_from_address_changed_by_the_email_backend.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_that_caused_a_crash_when_trying_to_view_an_autom.json b/changelog/entries/2.2.0/bug/fixed_a_bug_that_caused_a_crash_when_trying_to_view_an_autom.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_that_caused_a_crash_when_trying_to_view_an_autom.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_that_caused_a_crash_when_trying_to_view_an_autom.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_where_a_broken_list_rows_data_source_could_cause.json b/changelog/entries/2.2.0/bug/fixed_a_bug_where_a_broken_list_rows_data_source_could_cause.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_where_a_broken_list_rows_data_source_could_cause.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_where_a_broken_list_rows_data_source_could_cause.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_where_an_unknown_timezone_could_cause_a_data_sou.json b/changelog/entries/2.2.0/bug/fixed_a_bug_where_an_unknown_timezone_could_cause_a_data_sou.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_where_an_unknown_timezone_could_cause_a_data_sou.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_where_an_unknown_timezone_could_cause_a_data_sou.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_where_automation_workflow_history_entries_where_.json b/changelog/entries/2.2.0/bug/fixed_a_bug_where_automation_workflow_history_entries_where_.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_where_automation_workflow_history_entries_where_.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_where_automation_workflow_history_entries_where_.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_where_node_simulation_errors_werent_immediately_.json b/changelog/entries/2.2.0/bug/fixed_a_bug_where_node_simulation_errors_werent_immediately_.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_where_node_simulation_errors_werent_immediately_.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_where_node_simulation_errors_werent_immediately_.json diff --git a/changelog/entries/unreleased/bug/fixed_a_bug_where_reopening_the_publish_modal_while_the_buil.json b/changelog/entries/2.2.0/bug/fixed_a_bug_where_reopening_the_publish_modal_while_the_buil.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_bug_where_reopening_the_publish_modal_while_the_buil.json rename to changelog/entries/2.2.0/bug/fixed_a_bug_where_reopening_the_publish_modal_while_the_buil.json diff --git a/changelog/entries/unreleased/bug/fixed_a_crash_when_querying_custom_code_endpoint_with_an_inv.json b/changelog/entries/2.2.0/bug/fixed_a_crash_when_querying_custom_code_endpoint_with_an_inv.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_a_crash_when_querying_custom_code_endpoint_with_an_inv.json rename to changelog/entries/2.2.0/bug/fixed_a_crash_when_querying_custom_code_endpoint_with_an_inv.json diff --git a/changelog/entries/unreleased/bug/fixed_an_unhandled_error_when_a_user_source_user_logs_out_an.json b/changelog/entries/2.2.0/bug/fixed_an_unhandled_error_when_a_user_source_user_logs_out_an.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_an_unhandled_error_when_a_user_source_user_logs_out_an.json rename to changelog/entries/2.2.0/bug/fixed_an_unhandled_error_when_a_user_source_user_logs_out_an.json diff --git a/changelog/entries/unreleased/bug/fixed_the_slack_bot_forms_translations_to_use_the_correct_pl.json b/changelog/entries/2.2.0/bug/fixed_the_slack_bot_forms_translations_to_use_the_correct_pl.json similarity index 100% rename from changelog/entries/unreleased/bug/fixed_the_slack_bot_forms_translations_to_use_the_correct_pl.json rename to changelog/entries/2.2.0/bug/fixed_the_slack_bot_forms_translations_to_use_the_correct_pl.json diff --git a/changelog/entries/2.2.0/bug/postgres_sync_wildcard_address.json b/changelog/entries/2.2.0/bug/postgres_sync_wildcard_address.json new file mode 100644 index 0000000000..76e2f0bcad --- /dev/null +++ b/changelog/entries/2.2.0/bug/postgres_sync_wildcard_address.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Forbid wildcard addresses in Postgres data sync", + "issue_origin": null, + "issue_number": null, + "domain": "database", + "bullet_points": [], + "created_at": "2026-04-07" +} diff --git a/changelog/entries/unreleased/bug/resolved_a_bug_which_prevented_certain_baserow_field_types_f.json b/changelog/entries/2.2.0/bug/resolved_a_bug_which_prevented_certain_baserow_field_types_f.json similarity index 100% rename from changelog/entries/unreleased/bug/resolved_a_bug_which_prevented_certain_baserow_field_types_f.json rename to changelog/entries/2.2.0/bug/resolved_a_bug_which_prevented_certain_baserow_field_types_f.json diff --git a/changelog/entries/unreleased/bug/resolved_an_issue_which_caused_ai_field_formulas_to_appear_t.json b/changelog/entries/2.2.0/bug/resolved_an_issue_which_caused_ai_field_formulas_to_appear_t.json similarity index 100% rename from changelog/entries/unreleased/bug/resolved_an_issue_which_caused_ai_field_formulas_to_appear_t.json rename to changelog/entries/2.2.0/bug/resolved_an_issue_which_caused_ai_field_formulas_to_appear_t.json diff --git a/changelog/entries/unreleased/feature/2326_array_unique_formula.json b/changelog/entries/2.2.0/feature/2326_array_unique_formula.json similarity index 100% rename from changelog/entries/unreleased/feature/2326_array_unique_formula.json rename to changelog/entries/2.2.0/feature/2326_array_unique_formula.json diff --git a/changelog/entries/unreleased/feature/3634_allow_to_drag_and_drop_element_on_the_page.json b/changelog/entries/2.2.0/feature/3634_allow_to_drag_and_drop_element_on_the_page.json similarity index 100% rename from changelog/entries/unreleased/feature/3634_allow_to_drag_and_drop_element_on_the_page.json rename to changelog/entries/2.2.0/feature/3634_allow_to_drag_and_drop_element_on_the_page.json diff --git a/changelog/entries/unreleased/feature/3673_view_level_permissions.json b/changelog/entries/2.2.0/feature/3673_view_level_permissions.json similarity index 100% rename from changelog/entries/unreleased/feature/3673_view_level_permissions.json rename to changelog/entries/2.2.0/feature/3673_view_level_permissions.json diff --git a/changelog/entries/unreleased/feature/3871_support_automation_templates.json b/changelog/entries/2.2.0/feature/3871_support_automation_templates.json similarity index 100% rename from changelog/entries/unreleased/feature/3871_support_automation_templates.json rename to changelog/entries/2.2.0/feature/3871_support_automation_templates.json diff --git a/changelog/entries/unreleased/feature/4532_improved_baserow_formula_function_argument_validation.json b/changelog/entries/2.2.0/feature/4532_improved_baserow_formula_function_argument_validation.json similarity index 100% rename from changelog/entries/unreleased/feature/4532_improved_baserow_formula_function_argument_validation.json rename to changelog/entries/2.2.0/feature/4532_improved_baserow_formula_function_argument_validation.json diff --git a/changelog/entries/unreleased/feature/array_slice_formula.json b/changelog/entries/2.2.0/feature/array_slice_formula.json similarity index 100% rename from changelog/entries/unreleased/feature/array_slice_formula.json rename to changelog/entries/2.2.0/feature/array_slice_formula.json diff --git a/changelog/entries/unreleased/feature/data_scanner.json b/changelog/entries/2.2.0/feature/data_scanner.json similarity index 76% rename from changelog/entries/unreleased/feature/data_scanner.json rename to changelog/entries/2.2.0/feature/data_scanner.json index a2c9806adb..802dd35980 100644 --- a/changelog/entries/unreleased/feature/data_scanner.json +++ b/changelog/entries/2.2.0/feature/data_scanner.json @@ -1,6 +1,6 @@ { "type": "feature", - "message": "Add instace wide data scanner.", + "message": "Add instance wide data scanner.", "issue_origin": "github", "issue_number": null, "domain": "database", diff --git a/changelog/entries/unreleased/feature/editable_form_view_via_field_type.json b/changelog/entries/2.2.0/feature/editable_form_view_via_field_type.json similarity index 100% rename from changelog/entries/unreleased/feature/editable_form_view_via_field_type.json rename to changelog/entries/2.2.0/feature/editable_form_view_via_field_type.json diff --git a/changelog/entries/unreleased/feature/freeze_columns.json b/changelog/entries/2.2.0/feature/freeze_columns.json similarity index 100% rename from changelog/entries/unreleased/feature/freeze_columns.json rename to changelog/entries/2.2.0/feature/freeze_columns.json diff --git a/changelog/entries/unreleased/feature/generalize_index_first_last.json b/changelog/entries/2.2.0/feature/generalize_index_first_last.json similarity index 100% rename from changelog/entries/unreleased/feature/generalize_index_first_last.json rename to changelog/entries/2.2.0/feature/generalize_index_first_last.json diff --git a/changelog/entries/unreleased/feature/introduced_cloudflare_turnstile_captcha.json b/changelog/entries/2.2.0/feature/introduced_cloudflare_turnstile_captcha.json similarity index 100% rename from changelog/entries/unreleased/feature/introduced_cloudflare_turnstile_captcha.json rename to changelog/entries/2.2.0/feature/introduced_cloudflare_turnstile_captcha.json diff --git a/changelog/entries/unreleased/refactor/5008_filter_out_unactionable_axioserrors_from_sentry.json b/changelog/entries/2.2.0/refactor/5008_filter_out_unactionable_axioserrors_from_sentry.json similarity index 100% rename from changelog/entries/unreleased/refactor/5008_filter_out_unactionable_axioserrors_from_sentry.json rename to changelog/entries/2.2.0/refactor/5008_filter_out_unactionable_axioserrors_from_sentry.json diff --git a/changelog/entries/unreleased/refactor/5011_silence_defined_error_codes_in_sentry.json b/changelog/entries/2.2.0/refactor/5011_silence_defined_error_codes_in_sentry.json similarity index 100% rename from changelog/entries/unreleased/refactor/5011_silence_defined_error_codes_in_sentry.json rename to changelog/entries/2.2.0/refactor/5011_silence_defined_error_codes_in_sentry.json diff --git a/changelog/entries/unreleased/refactor/5028_add_affected_users_count_to_frontend_sentry_reports.json b/changelog/entries/2.2.0/refactor/5028_add_affected_users_count_to_frontend_sentry_reports.json similarity index 100% rename from changelog/entries/unreleased/refactor/5028_add_affected_users_count_to_frontend_sentry_reports.json rename to changelog/entries/2.2.0/refactor/5028_add_affected_users_count_to_frontend_sentry_reports.json diff --git a/changelog/entries/unreleased/refactor/5111_harden_workspace_import_zip_extraction_against_malformed_arc.json b/changelog/entries/2.2.0/refactor/5111_harden_workspace_import_zip_extraction_against_malformed_arc.json similarity index 100% rename from changelog/entries/unreleased/refactor/5111_harden_workspace_import_zip_extraction_against_malformed_arc.json rename to changelog/entries/2.2.0/refactor/5111_harden_workspace_import_zip_extraction_against_malformed_arc.json diff --git a/changelog/entries/unreleased/refactor/Replace udspy with pydantic-ai_replace_udspy_with_pydanticai.json b/changelog/entries/2.2.0/refactor/Replace udspy with pydantic-ai_replace_udspy_with_pydanticai.json similarity index 100% rename from changelog/entries/unreleased/refactor/Replace udspy with pydantic-ai_replace_udspy_with_pydanticai.json rename to changelog/entries/2.2.0/refactor/Replace udspy with pydantic-ai_replace_udspy_with_pydanticai.json diff --git a/changelog/entries/unreleased/refactor/optimize_table_trash_n_plus_1_queries.json b/changelog/entries/2.2.0/refactor/optimize_table_trash_n_plus_1_queries.json similarity index 100% rename from changelog/entries/unreleased/refactor/optimize_table_trash_n_plus_1_queries.json rename to changelog/entries/2.2.0/refactor/optimize_table_trash_n_plus_1_queries.json diff --git a/changelog/entries/unreleased/refactor/refactor_mcp_tools_share_ai_assistant_capabilities.json b/changelog/entries/2.2.0/refactor/refactor_mcp_tools_share_ai_assistant_capabilities.json similarity index 100% rename from changelog/entries/unreleased/refactor/refactor_mcp_tools_share_ai_assistant_capabilities.json rename to changelog/entries/2.2.0/refactor/refactor_mcp_tools_share_ai_assistant_capabilities.json diff --git a/changelog/entries/unreleased/refactor/remove_jira_data_sync_advocate.json b/changelog/entries/2.2.0/refactor/remove_jira_data_sync_advocate.json similarity index 100% rename from changelog/entries/unreleased/refactor/remove_jira_data_sync_advocate.json rename to changelog/entries/2.2.0/refactor/remove_jira_data_sync_advocate.json diff --git a/changelog/entries/unreleased/refactor/replace_langchain_with_pydanticai_for_the_ai_field_and_the_a.json b/changelog/entries/2.2.0/refactor/replace_langchain_with_pydanticai_for_the_ai_field_and_the_a.json similarity index 100% rename from changelog/entries/unreleased/refactor/replace_langchain_with_pydanticai_for_the_ai_field_and_the_a.json rename to changelog/entries/2.2.0/refactor/replace_langchain_with_pydanticai_for_the_ai_field_and_the_a.json diff --git a/changelog/entries/unreleased/refactor/speedup_audit_log_pagination_with_approximate_count.json b/changelog/entries/2.2.0/refactor/speedup_audit_log_pagination_with_approximate_count.json similarity index 100% rename from changelog/entries/unreleased/refactor/speedup_audit_log_pagination_with_approximate_count.json rename to changelog/entries/2.2.0/refactor/speedup_audit_log_pagination_with_approximate_count.json diff --git a/changelog/releases.json b/changelog/releases.json index 3b724e6700..147840189c 100644 --- a/changelog/releases.json +++ b/changelog/releases.json @@ -1,5 +1,9 @@ { "releases": [ + { + "name": "2.2.0", + "created_at": "2026-04-08" + }, { "name": "2.1.6", "created_at": "2026-03-13" diff --git a/deploy/all-in-one/README.md b/deploy/all-in-one/README.md index 489ed8e385..052a2819dd 100644 --- a/deploy/all-in-one/README.md +++ b/deploy/all-in-one/README.md @@ -15,7 +15,7 @@ tool gives you the powers of a developer without leaving your browser. [Vue.js](https://vuejs.org/) and [PostgreSQL](https://www.postgresql.org/). ```bash -docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.1.6 +docker run -v baserow_data:/baserow/data -p 80:80 -p 443:443 baserow/baserow:2.2.0 ``` ## Quick Reference @@ -52,7 +52,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` * Change `BASEROW_PUBLIC_URL` to `https://YOUR_DOMAIN` or `http://YOUR_IP` to enable @@ -75,7 +75,7 @@ docker run \ ## Image Feature Overview -The `baserow/baserow:2.1.6` image by default runs all of Baserow's various services in +The `baserow/baserow:2.2.0` image by default runs all of Baserow's various services in a single container for maximum ease of use. > This image is designed for simple single server deployments or simple container @@ -223,7 +223,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Behind a reverse proxy already handling ssl @@ -236,7 +236,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### On a nonstandard HTTP port @@ -249,7 +249,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 3001:80 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external PostgresSQL server @@ -268,7 +268,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external Redis server @@ -289,7 +289,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external email server @@ -309,7 +309,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With a Postgresql server running on the same host as the Baserow docker container @@ -347,7 +347,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ -p 443:443 \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Supply secrets using files @@ -374,7 +374,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ -p 443:443 \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Start just the embedded database @@ -387,7 +387,7 @@ docker run -it \ --name baserow \ -p 5432:5432 \ -v baserow_data:/baserow/data \ - baserow/baserow:2.1.6 \ + baserow/baserow:2.2.0 \ start-only-db # Now get the password from docker exec -it baserow cat /baserow/data/.pgpass @@ -419,7 +419,7 @@ docker run -it \ --rm \ --name baserow \ -v baserow_data:/baserow/data \ - baserow/baserow:2.1.6 \ + baserow/baserow:2.2.0 \ backend-cmd-with-db manage dbshell ``` @@ -542,19 +542,19 @@ the command below. ```bash # First read the help message for this command -docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.1.6 \ +docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.2.0 \ backend-cmd-with-db backup --help # Stop Baserow instance docker stop baserow # The command below backs up Baserow to the backups folder in the baserow_data volume: -docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.1.6 \ +docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.2.0 \ backend-cmd-with-db backup -f /baserow/data/backups/backup.tar.gz # Or backup to a file on your host instead run something like: docker run -it --rm -v baserow_data:/baserow/data -v $PWD:/baserow/host \ - baserow/baserow:2.1.6 backend-cmd-with-db backup -f /baserow/host/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db backup -f /baserow/host/backup.tar.gz ``` ### Restore only Baserow's Postgres Database @@ -570,13 +570,13 @@ docker stop baserow docker run -it --rm \ -v old_baserow_data_volume_containing_the_backup_tar_gz:/baserow/old_data \ -v new_baserow_data_volume_to_restore_into:/baserow/data \ - baserow/baserow:2.1.6 backend-cmd-with-db restore -f /baserow/old_data/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db restore -f /baserow/old_data/backup.tar.gz # Or to restore from a file on your host instead run something like: docker run -it --rm \ -v baserow_data:/baserow/data -v \ $(pwd):/baserow/host \ - baserow/baserow:2.1.6 backend-cmd-with-db restore -f /baserow/host/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db restore -f /baserow/host/backup.tar.gz ``` ## Running healthchecks on Baserow @@ -627,7 +627,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` Or you can just store it directly in the volume at `baserow_data/env` meaning it will be @@ -636,7 +636,7 @@ loaded whenever you mount in this data volume. ### Building your own image from Baserow ```dockerfile -FROM baserow/baserow:2.1.6 +FROM baserow/baserow:2.2.0 # Any .sh files found in /baserow/supervisor/env/ will be sourced and loaded at startup # useful for storing your own environment variable overrides. diff --git a/deploy/all-in-one/supervisor/start.sh b/deploy/all-in-one/supervisor/start.sh index 3a52396c7f..25c022a6c0 100755 --- a/deploy/all-in-one/supervisor/start.sh +++ b/deploy/all-in-one/supervisor/start.sh @@ -14,7 +14,7 @@ cat << EOF ██████╔╝██║ ██║███████║███████╗██║ ██║╚██████╔╝╚███╔███╔╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ -Version 2.1.6 +Version 2.2.0 ========================================================================================= EOF diff --git a/deploy/cloudron/CloudronManifest.json b/deploy/cloudron/CloudronManifest.json index 9ede2593d2..255832f8a2 100644 --- a/deploy/cloudron/CloudronManifest.json +++ b/deploy/cloudron/CloudronManifest.json @@ -8,7 +8,7 @@ "contactEmail": "bram@baserow.io", "icon": "file://logo.png", "tags": ["no-code", "nocode", "database", "data", "collaborate", "airtable"], - "version": "2.1.6", + "version": "2.2.0", "healthCheckPath": "/api/_health/", "httpPort": 80, "addons": { diff --git a/deploy/cloudron/Dockerfile b/deploy/cloudron/Dockerfile index ad242657e5..48a0c0932f 100644 --- a/deploy/cloudron/Dockerfile +++ b/deploy/cloudron/Dockerfile @@ -1,4 +1,4 @@ -ARG FROM_IMAGE=baserow/baserow:2.1.6 +ARG FROM_IMAGE=baserow/baserow:2.2.0 # This is pinned as version pinning is done by the CI setting FROM_IMAGE. # hadolint ignore=DL3006 FROM $FROM_IMAGE AS image_base diff --git a/deploy/helm/baserow/Chart.lock b/deploy/helm/baserow/Chart.lock index 06a0ec7469..106df126a6 100644 --- a/deploy/helm/baserow/Chart.lock +++ b/deploy/helm/baserow/Chart.lock @@ -1,28 +1,28 @@ dependencies: - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: baserow repository: file://charts/baserow-common - version: 1.0.49 + version: 1.0.50 - name: redis repository: https://charts.bitnami.com/bitnami version: 19.5.5 @@ -35,5 +35,5 @@ dependencies: - name: caddy-ingress-controller repository: https://caddyserver.github.io/ingress version: 1.1.0 -digest: sha256:ba10d4e7125582b7df66a79fea702c264eda40c05319b8299f46bf4a602634e7 -generated: "2026-03-13T14:08:34.443835+01:00" +digest: sha256:88c8ed8b17c1b82180cf3b9b6fba5b0b1a724aef46d109a320ad6883388c7a05 +generated: "2026-04-08T19:01:15.468891+02:00" diff --git a/deploy/helm/baserow/Chart.yaml b/deploy/helm/baserow/Chart.yaml index 8f78039724..7cd38d3cbb 100644 --- a/deploy/helm/baserow/Chart.yaml +++ b/deploy/helm/baserow/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: baserow description: The open platform to create scalable databases and applications—without coding. type: application -version: 1.0.49 -appVersion: "2.1.6" +version: 1.0.50 +appVersion: "2.2.0" home: https://github.com/baserow/baserow/blob/develop/deploy/helm/baserow?ref_type=heads icon: https://baserow.io/img/favicon_192.png sources: @@ -13,43 +13,43 @@ sources: dependencies: - name: baserow alias: baserow-backend-asgi - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-backend-wsgi - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-frontend - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-celery-beat-worker - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-celery-export-worker - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-celery-worker - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" - name: baserow alias: baserow-celery-flower - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" condition: baserow-celery-flower.enabled - name: baserow alias: baserow-embeddings - version: "1.0.49" + version: "1.0.50" repository: "file://charts/baserow-common" condition: baserow-embeddings.enabled diff --git a/deploy/helm/baserow/README.md b/deploy/helm/baserow/README.md index e00c95942a..21b94ddd1b 100644 --- a/deploy/helm/baserow/README.md +++ b/deploy/helm/baserow/README.md @@ -232,7 +232,7 @@ caddy: | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | ----------------------- | | `global.baserow.imageRegistry` | Global Docker image registry | `baserow` | | `global.baserow.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.baserow.image.tag` | Global Docker image tag | `2.1.6` | +| `global.baserow.image.tag` | Global Docker image tag | `2.2.0` | | `global.baserow.serviceAccount.shared` | Set to true to share the service account between all application components. | `true` | | `global.baserow.serviceAccount.create` | Set to true to create a service account to share between all application components. | `true` | | `global.baserow.serviceAccount.name` | Configure a name for service account to share between all application components. | `baserow` | diff --git a/deploy/helm/baserow/charts/baserow-common/Chart.yaml b/deploy/helm/baserow/charts/baserow-common/Chart.yaml index 0b3452aed6..33f120a1f3 100644 --- a/deploy/helm/baserow/charts/baserow-common/Chart.yaml +++ b/deploy/helm/baserow/charts/baserow-common/Chart.yaml @@ -15,10 +15,10 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.0.49 +version: 1.0.50 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "2.1.6" +appVersion: "2.2.0" diff --git a/deploy/helm/baserow/charts/baserow-common/README.md b/deploy/helm/baserow/charts/baserow-common/README.md index 339e2c07de..446b484abd 100644 --- a/deploy/helm/baserow/charts/baserow-common/README.md +++ b/deploy/helm/baserow/charts/baserow-common/README.md @@ -6,7 +6,7 @@ | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | `global.baserow.imageRegistry` | Global Docker image registry | `baserow` | | `global.baserow.imagePullSecrets` | Global Docker registry secret names as an array | `[]` | -| `global.baserow.image.tag` | Global Docker image tag | `2.1.6` | +| `global.baserow.image.tag` | Global Docker image tag | `2.2.0` | | `global.baserow.serviceAccount.shared` | Set to true to share the service account between all application components. | `true` | | `global.baserow.serviceAccount.create` | Set to true to create a service account to share between all application components. | `true` | | `global.baserow.serviceAccount.name` | Configure a name for service account to share between all application components. | `baserow` | diff --git a/deploy/helm/baserow/charts/baserow-common/values.yaml b/deploy/helm/baserow/charts/baserow-common/values.yaml index 09be4089c3..b98cceb41e 100644 --- a/deploy/helm/baserow/charts/baserow-common/values.yaml +++ b/deploy/helm/baserow/charts/baserow-common/values.yaml @@ -38,7 +38,7 @@ global: baserow: imageRegistry: baserow image: - tag: 2.1.6 + tag: 2.2.0 imagePullSecrets: [] serviceAccount: shared: true @@ -83,7 +83,7 @@ global: ## image: repository: baserow/baserow # Docker image repository - tag: 2.1.6 # Docker image tag + tag: 2.2.0 # Docker image tag pullPolicy: IfNotPresent # Image pull policy ## @param workingDir Application container working directory diff --git a/deploy/helm/baserow/values.yaml b/deploy/helm/baserow/values.yaml index fb9615f178..d4fd2b8738 100644 --- a/deploy/helm/baserow/values.yaml +++ b/deploy/helm/baserow/values.yaml @@ -43,7 +43,7 @@ global: baserow: imageRegistry: baserow image: - tag: 2.1.6 + tag: 2.2.0 imagePullSecrets: [] serviceAccount: shared: true diff --git a/deploy/render/Dockerfile b/deploy/render/Dockerfile index da5e07c28f..bed5f7f80e 100644 --- a/deploy/render/Dockerfile +++ b/deploy/render/Dockerfile @@ -1,4 +1,4 @@ -ARG FROM_IMAGE=baserow/baserow:2.1.6 +ARG FROM_IMAGE=baserow/baserow:2.2.0 # This is pinned as version pinning is done by the CI setting FROM_IMAGE. # hadolint ignore=DL3006 FROM $FROM_IMAGE AS image_base diff --git a/docker-compose.all-in-one.yml b/docker-compose.all-in-one.yml index fc5c2040ad..01e9f161ab 100644 --- a/docker-compose.all-in-one.yml +++ b/docker-compose.all-in-one.yml @@ -3,7 +3,7 @@ services: baserow: container_name: baserow - image: baserow/baserow:${BASEROW_VERSION:-2.1.6} + image: baserow/baserow:${BASEROW_VERSION:-2.2.0} environment: BASEROW_PUBLIC_URL: 'http://localhost' ports: diff --git a/docker-compose.no-caddy.yml b/docker-compose.no-caddy.yml index 354f369775..d15956d3fe 100644 --- a/docker-compose.no-caddy.yml +++ b/docker-compose.no-caddy.yml @@ -196,7 +196,7 @@ x-backend-variables: services: backend: - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 restart: unless-stopped ports: - "${HOST_PUBLISH_IP:-127.0.0.1}:8000:8000" @@ -211,7 +211,7 @@ services: local: web-frontend: - image: baserow/web-frontend:2.1.6 + image: baserow/web-frontend:2.2.0 restart: unless-stopped ports: - "${HOST_PUBLISH_IP:-127.0.0.1}:3000:3000" @@ -258,7 +258,7 @@ services: local: celery: - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 restart: unless-stopped environment: <<: *backend-variables @@ -279,7 +279,7 @@ services: local: celery-export-worker: - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 restart: unless-stopped command: celery-exportworker environment: @@ -300,7 +300,7 @@ services: local: celery-beat-worker: - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 restart: unless-stopped command: celery-beat environment: diff --git a/docker-compose.yml b/docker-compose.yml index 917755e525..7de5f13adc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -277,7 +277,7 @@ services: local: backend: - image: baserow/backend:${BASEROW_VERSION:-2.1.6} + image: baserow/backend:${BASEROW_VERSION:-2.2.0} restart: unless-stopped environment: @@ -291,7 +291,7 @@ services: local: web-frontend: - image: baserow/web-frontend:${BASEROW_VERSION:-2.1.6} + image: baserow/web-frontend:${BASEROW_VERSION:-2.2.0} restart: unless-stopped environment: BASEROW_PUBLIC_URL: ${BASEROW_PUBLIC_URL-http://localhost} @@ -343,7 +343,7 @@ services: local: celery: - image: baserow/backend:${BASEROW_VERSION:-2.1.6} + image: baserow/backend:${BASEROW_VERSION:-2.2.0} restart: unless-stopped environment: <<: *backend-variables @@ -365,7 +365,7 @@ services: local: celery-export-worker: - image: baserow/backend:${BASEROW_VERSION:-2.1.6} + image: baserow/backend:${BASEROW_VERSION:-2.2.0} restart: unless-stopped command: celery-exportworker environment: @@ -387,7 +387,7 @@ services: local: celery-beat-worker: - image: baserow/backend:${BASEROW_VERSION:-2.1.6} + image: baserow/backend:${BASEROW_VERSION:-2.2.0} restart: unless-stopped command: celery-beat healthcheck: diff --git a/docs/installation/install-behind-apache.md b/docs/installation/install-behind-apache.md index 4c405c7f27..9ef794d076 100644 --- a/docs/installation/install-behind-apache.md +++ b/docs/installation/install-behind-apache.md @@ -3,7 +3,7 @@ If you have an [Apache server](https://www.apache.com/) this guide will explain how to configure it to pass requests through to Baserow. -We strongly recommend you use our `baserow/baserow:2.1.6` image or the example +We strongly recommend you use our `baserow/baserow:2.2.0` image or the example `docker-compose.yml` files (excluding the `.no-caddy.yml` variant) provided in our [git repository](https://github.com/baserow/baserow/tree/master/deploy/apache/). @@ -18,8 +18,8 @@ simplifies your life by: > If you do not want to use our embedded Caddy service behind your Apache then > make sure you are using one of the two following deployment methods: > -> * Your own container setup with our single service `baserow/backend:2.1.6` - and `baserow/web-frontend:2.1.6` images. +> * Your own container setup with our single service `baserow/backend:2.2.0` + and `baserow/web-frontend:2.2.0` images. > * Or our `docker-compose.no-caddy.yml` example file in our [git repository](https://github.com/baserow/baserow/tree/master/deploy/apache/). > > Then you should use **Option 2: Without our embedded Caddy** section instead. @@ -32,7 +32,7 @@ simplifies your life by: Follow this option if you are using: -* The all-in-one Baserow image `baserow/baserow:2.1.6` +* The all-in-one Baserow image `baserow/baserow:2.2.0` * Any of the example compose files found in the root of our git repository `docker-compose.yml`/`docker-compose.all-in-one.yml` @@ -115,7 +115,7 @@ You should now be able to access Baserow on you configured subdomain. Follow this option if you are using: -* Our standalone `baserow/backend:2.1.6` and `baserow/web-frontend:2.1.6` images with +* Our standalone `baserow/backend:2.2.0` and `baserow/web-frontend:2.2.0` images with your own container orchestrator. * Or the `docker-compose.no-caddy.yml` example docker compose file in the root of our git repository. @@ -147,7 +147,7 @@ sudo systemctl restart apache2 You need to ensure user uploaded files are accessible in a folder for Apache to serve. In the rest of the guide we will use the example `/var/web` folder for this purpose. -If you are using the `baserow/backend:2.1.6` image then you can do this by adding +If you are using the `baserow/backend:2.2.0` image then you can do this by adding `-v /var/web:/baserow/data/media` to your normal `docker run` command used to launch the Baserow backend. diff --git a/docs/installation/install-behind-nginx.md b/docs/installation/install-behind-nginx.md index 1211a858aa..9e1ea68eb4 100644 --- a/docs/installation/install-behind-nginx.md +++ b/docs/installation/install-behind-nginx.md @@ -3,7 +3,7 @@ If you have an [Nginx server](https://www.nginx.com/) this guide will explain how to configure it to pass requests through to Baserow. -We strongly recommend you use our `baserow/baserow:2.1.6` image or the example +We strongly recommend you use our `baserow/baserow:2.2.0` image or the example `docker-compose.yml` files (excluding the `.no-caddy.yml` variant) provided in our [git repository](https://github.com/baserow/baserow/tree/master/deploy/nginx/). @@ -18,8 +18,8 @@ simplifies your life by: > If you do not want to use our embedded Caddy service behind your Nginx then > make sure you are using one of the two following deployment methods: > -> * Your own container setup with our single service `baserow/backend:2.1.6` - and `baserow/web-frontend:2.1.6` images. +> * Your own container setup with our single service `baserow/backend:2.2.0` + and `baserow/web-frontend:2.2.0` images. > * Or our `docker-compose.no-caddy.yml` example file in our [git repository](https://github.com/baserow/baserow/tree/master/deploy/nginx/). > > Then you should use **Option 2: Without our embedded Caddy** section instead. @@ -32,7 +32,7 @@ simplifies your life by: Follow this option if you are using: -* The all-in-one Baserow image `baserow/baserow:2.1.6` +* The all-in-one Baserow image `baserow/baserow:2.2.0` * Any of the example compose files found in the root of our git repository `docker-compose.yml`/`docker-compose.all-in-one.yml` @@ -107,7 +107,7 @@ You should now be able to access Baserow on you configured subdomain. Follow this option if you are using: -* Our standalone `baserow/backend:2.1.6` and `baserow/web-frontend:2.1.6` images with +* Our standalone `baserow/backend:2.2.0` and `baserow/web-frontend:2.2.0` images with your own container orchestrator. * Or the `docker-compose.no-caddy.yml` example docker compose file in the root of our git repository. @@ -126,7 +126,7 @@ but you might have to run different commands. You need to ensure user uploaded files are accessible in a folder for Nginx to serve. In the rest of the guide we will use the example `/var/web` folder for this purpose. -If you are using the `baserow/backend:2.1.6` image then you can do this by adding +If you are using the `baserow/backend:2.2.0` image then you can do this by adding `-v /var/web:/baserow/data/media` to your normal `docker run` command used to launch the Baserow backend. diff --git a/docs/installation/install-on-aws.md b/docs/installation/install-on-aws.md index fd2460ca0f..ad92b0cd3c 100644 --- a/docs/installation/install-on-aws.md +++ b/docs/installation/install-on-aws.md @@ -49,7 +49,7 @@ overview this is what any AWS deployment of Baserow will need: ## Option 1) Deploying the all-in-one image to Fargate/ECS -The `baserow/baserow:2.1.6` image runs all of Baserow’s various services inside the +The `baserow/baserow:2.2.0` image runs all of Baserow’s various services inside the container for ease of use. This image is designed for single server deployments or simple deployments to @@ -67,7 +67,7 @@ Run. * You don't need to worry about configuring and linking together the different services that make up a Baserow deployment. * Configuring load balancers is easier as you can just directly route through all - requests to any horizontally scaled container running `baserow/baserow:2.1.6`. + requests to any horizontally scaled container running `baserow/baserow:2.2.0`. #### Cons @@ -75,7 +75,7 @@ Run. * Potentially higher resource usage overall as each of the all-in-one containers will come with its internal services, so you have less granular control over scaling specific services. - * For example if you deploy 10 `baserow/baserow:2.1.6` containers horizontally you + * For example if you deploy 10 `baserow/baserow:2.2.0` containers horizontally you by default end up with: * 10 web-frontend services * 10 backend services @@ -188,18 +188,18 @@ Generally, the Redis server is not the bottleneck in Baserow deployments as they Now create a target group on port 80 and ALB ready to route traffic to the Baserow containers. -When setting up the health check for the ALB the `baserow/baserow:2.1.6` container +When setting up the health check for the ALB the `baserow/baserow:2.2.0` container ,which you'll be deploying next, choose port `80` and health check URL `/api/_health/`. We recommend a long grace period of 900 seconds to account for first-time migrations being run on the first container's startup. #### 5) Launching Baserow on ECS/Fargate -Now we are ready to spin up our `baserow/baserow:2.1.6` containers. See below for a +Now we are ready to spin up our `baserow/baserow:2.2.0` containers. See below for a full task definition and environment variables. We recommend launching the containers with 2vCPUs and 4 GB of RAM each to start with. In short, you will want to: -1. Select the `baserow/baserow:2.1.6` image. +1. Select the `baserow/baserow:2.2.0` image. 2. Add a port mapping of `80` on TCP as this is where this images HTTP server is listening by default. 3. Mark the container as essential. @@ -244,7 +244,7 @@ container_definitions = < We recommend setting the timeout of each HTTP API request to 60 seconds in the @@ -484,7 +484,7 @@ This service is our HTTP REST API service. When creating the task definition you This service is our Websocket API service and when configuring the task definition you should: -1. Use the `baserow/backend:2.1.6` +1. Use the `baserow/backend:2.2.0` 2. Under docker configuration set `gunicorn` as the Command. 3. We recommend 2vCPUs and 4 GB of RAM per container to start with. 4. Map the container port `8000`/`TCP` @@ -496,7 +496,7 @@ should: This service is our asynchronous high priority task worker queue used for realtime collaboration and sending emails. -1. Use the `baserow/backend:2.1.6` image with `celery-worker` as the image command. +1. Use the `baserow/backend:2.2.0` image with `celery-worker` as the image command. 2. Under docker configuration set `celery-worker` as the Command. 3. No port mappings needed. 4. We recommend 2vCPUs and 4 GB of RAM per container to start with. @@ -509,7 +509,7 @@ This service is our asynchronous slow/low priority task worker queue for batch processes and running potentially slow operations for users like table exports and imports etc. -1. Use the `baserow/backend:2.1.6` image. +1. Use the `baserow/backend:2.2.0` image. 2. Under docker configuration set `celery-exportworker` as the Command. 3. No port mappings needed. 4. We recommend 2vCPUs and 4 GB of RAM per container to start with. @@ -520,7 +520,7 @@ imports etc. This service is our CRON task scheduler that can have multiple replicas deployed. -1. Use the `baserow/backend:2.1.6` image. +1. Use the `baserow/backend:2.2.0` image. 2. Under docker configuration set `celery-beat` as the Command. 3. No port mapping needed. 4. We recommend 1vCPUs and 3 GB of RAM per container to start with. @@ -537,7 +537,7 @@ This service is our CRON task scheduler that can have multiple replicas deployed Finally, this service is used for server side rendering and serving the frontend of Baserow. -1. Use the `baserow/web-frontend:2.1.6` image with no arguments needed. +1. Use the `baserow/web-frontend:2.2.0` image with no arguments needed. 2. Map the container port `3000` 3. We recommend 2vCPUs and 4 GB of RAM per container to start with. 4. Mark the container as essential. diff --git a/docs/installation/install-on-cloudron.md b/docs/installation/install-on-cloudron.md index 86ab18dd94..3eb53ffae0 100644 --- a/docs/installation/install-on-cloudron.md +++ b/docs/installation/install-on-cloudron.md @@ -46,7 +46,7 @@ $ cd baserow/deploy/cloudron After that you can install the Baserow Cloudron app by executing the following commands. ``` -$ cloudron install -l baserow.{YOUR_DOMAIN} --image baserow/cloudron:2.1.6 +$ cloudron install -l baserow.{YOUR_DOMAIN} --image baserow/cloudron:2.2.0 App is being installed. ... App is installed. @@ -89,7 +89,7 @@ the `baserow/deploy/cloudron` folder, you can upgrade your cloudron baserow serv the latest version by running the following command: ``` -cloudron update --app {YOUR_APP_ID} --image baserow/cloudron:2.1.6 +cloudron update --app {YOUR_APP_ID} --image baserow/cloudron:2.2.0 ``` > Note that you must replace the image with the most recent image of Baserow. The diff --git a/docs/installation/install-on-digital-ocean.md b/docs/installation/install-on-digital-ocean.md index c1327ac09d..62ccc19a90 100644 --- a/docs/installation/install-on-digital-ocean.md +++ b/docs/installation/install-on-digital-ocean.md @@ -51,7 +51,7 @@ Navigate to the `Apps` page in the left sidebar of your Digital Ocean dashboard. on `Create App`, select `Docker Hub`, and fill out the following: Repository: `baserow/baserow` -Image tag or digest: `2.1.6` +Image tag or digest: `2.2.0` Click on `Next`, then on the `Edit` button of the `baserow-baserow` web service. Here you must change the HTTP Port to 80, and then click on `Back`. Click on the `Next` @@ -124,7 +124,7 @@ environment. In order to update the Baserow version, you simply need to replace the image tag. Navigate to the `Settings` tag of your created app, click on the `baserow-baserow` component, then click on the `Edit` button next to source, change the `Image tag` into -the desired version (latest is `2.1.6`), and click on save. The app will redeploy +the desired version (latest is `2.2.0`), and click on save. The app will redeploy with the latest version. ## External email server diff --git a/docs/installation/install-on-ubuntu.md b/docs/installation/install-on-ubuntu.md index 8fe2cffbfc..98ba724c8c 100644 --- a/docs/installation/install-on-ubuntu.md +++ b/docs/installation/install-on-ubuntu.md @@ -34,7 +34,7 @@ docker run -e BASEROW_PUBLIC_URL=http://localhost \ -v baserow_data:/baserow/data \ -p 80:80 \ -p 443:443 \ -baserow/baserow:2.1.6 +baserow/baserow:2.2.0 # Watch the logs for Baserow to come available by running: docker logs baserow ``` @@ -147,7 +147,7 @@ docker run \ -v /baserow/media:/baserow/data/media \ -p 80:80 \ -p 443:443 \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 # Check the logs and wait for Baserow to become available docker logs baserow ``` diff --git a/docs/installation/install-using-standalone-images.md b/docs/installation/install-using-standalone-images.md index d6abae493c..81df4688dc 100644 --- a/docs/installation/install-using-standalone-images.md +++ b/docs/installation/install-using-standalone-images.md @@ -10,9 +10,9 @@ Baserow consists of a number of services, two of which are built and provided as separate standalone images by us: -* `baserow/backend:2.1.6` which by default starts the Gunicorn Django backend server +* `baserow/backend:2.2.0` which by default starts the Gunicorn Django backend server for Baserow but is also used to start the celery workers and celery beat services. -* `baserow/web-frontend:2.1.6` which is a Nuxt server providing Server Side rendering +* `baserow/web-frontend:2.2.0` which is a Nuxt server providing Server Side rendering for the website. If you want to use your own container orchestration software like Kubernetes then these @@ -27,10 +27,10 @@ in the root of our repository. These are all the services you need to set up to run a Baserow using the standalone images: -* `baserow/backend:2.1.6` (default command is `gunicorn`) -* `baserow/backend:2.1.6` with command `celery-worker` -* `baserow/backend:2.1.6` with command `celery-export-worker` -* `baserow/web-frontend:2.1.6` (default command is `nuxt-prod`) +* `baserow/backend:2.2.0` (default command is `gunicorn`) +* `baserow/backend:2.2.0` with command `celery-worker` +* `baserow/backend:2.2.0` with command `celery-export-worker` +* `baserow/web-frontend:2.2.0` (default command is `nuxt-prod`) * A postgres database * A redis server diff --git a/docs/installation/install-with-docker-compose.md b/docs/installation/install-with-docker-compose.md index 0cf3708bbb..662c0d6d07 100644 --- a/docs/installation/install-with-docker-compose.md +++ b/docs/installation/install-with-docker-compose.md @@ -15,7 +15,7 @@ guide on the specifics of how to work with this image. services: baserow: container_name: baserow - image: baserow/baserow:2.1.6 + image: baserow/baserow:2.2.0 environment: BASEROW_PUBLIC_URL: 'http://localhost' ports: diff --git a/docs/installation/install-with-docker.md b/docs/installation/install-with-docker.md index ec6c61c794..f5defa1e7b 100644 --- a/docs/installation/install-with-docker.md +++ b/docs/installation/install-with-docker.md @@ -29,7 +29,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` * Change `BASEROW_PUBLIC_URL` to `https://YOUR_DOMAIN` or `http://YOUR_IP` to enable @@ -52,7 +52,7 @@ docker run \ ## Image Feature Overview -The `baserow/baserow:2.1.6` image by default runs all of Baserow's various services in +The `baserow/baserow:2.2.0` image by default runs all of Baserow's various services in a single container for maximum ease of use. > This image is designed for simple single server deployments or simple container @@ -200,7 +200,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Behind a reverse proxy already handling ssl @@ -213,7 +213,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### On a nonstandard HTTP port @@ -226,7 +226,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 3001:80 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external PostgresSQL server @@ -245,7 +245,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external Redis server @@ -266,7 +266,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With an external email server @@ -286,7 +286,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### With a Postgresql server running on the same host as the Baserow docker container @@ -324,7 +324,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ -p 443:443 \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Supply secrets using files @@ -351,7 +351,7 @@ docker run \ -v baserow_data:/baserow/data \ -p 80:80 \ -p 443:443 \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` ### Start just the embedded database @@ -364,7 +364,7 @@ docker run -it \ --name baserow \ -p 5432:5432 \ -v baserow_data:/baserow/data \ - baserow/baserow:2.1.6 \ + baserow/baserow:2.2.0 \ start-only-db # Now get the password from docker exec -it baserow cat /baserow/data/.pgpass @@ -396,7 +396,7 @@ docker run -it \ --rm \ --name baserow \ -v baserow_data:/baserow/data \ - baserow/baserow:2.1.6 \ + baserow/baserow:2.2.0 \ backend-cmd-with-db manage dbshell ``` @@ -519,19 +519,19 @@ the command below. ```bash # First read the help message for this command -docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.1.6 \ +docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.2.0 \ backend-cmd-with-db backup --help # Stop Baserow instance docker stop baserow # The command below backs up Baserow to the backups folder in the baserow_data volume: -docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.1.6 \ +docker run -it --rm -v baserow_data:/baserow/data baserow/baserow:2.2.0 \ backend-cmd-with-db backup -f /baserow/data/backups/backup.tar.gz # Or backup to a file on your host instead run something like: docker run -it --rm -v baserow_data:/baserow/data -v $PWD:/baserow/host \ - baserow/baserow:2.1.6 backend-cmd-with-db backup -f /baserow/host/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db backup -f /baserow/host/backup.tar.gz ``` ### Restore only Baserow's Postgres Database @@ -547,13 +547,13 @@ docker stop baserow docker run -it --rm \ -v old_baserow_data_volume_containing_the_backup_tar_gz:/baserow/old_data \ -v new_baserow_data_volume_to_restore_into:/baserow/data \ - baserow/baserow:2.1.6 backend-cmd-with-db restore -f /baserow/old_data/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db restore -f /baserow/old_data/backup.tar.gz # Or to restore from a file on your host instead run something like: docker run -it --rm \ -v baserow_data:/baserow/data -v \ $(pwd):/baserow/host \ - baserow/baserow:2.1.6 backend-cmd-with-db restore -f /baserow/host/backup.tar.gz + baserow/baserow:2.2.0 backend-cmd-with-db restore -f /baserow/host/backup.tar.gz ``` ## Running healthchecks on Baserow @@ -604,7 +604,7 @@ docker run \ -p 80:80 \ -p 443:443 \ --restart unless-stopped \ - baserow/baserow:2.1.6 + baserow/baserow:2.2.0 ``` Or you can just store it directly in the volume at `baserow_data/env` meaning it will be @@ -613,7 +613,7 @@ loaded whenever you mount in this data volume. ### Building your own image from Baserow ```dockerfile -FROM baserow/baserow:2.1.6 +FROM baserow/baserow:2.2.0 # Any .sh files found in /baserow/supervisor/env/ will be sourced and loaded at startup # useful for storing your own environment variable overrides. diff --git a/docs/installation/install-with-helm.md b/docs/installation/install-with-helm.md index f71e9cad4b..f31ef868fb 100644 --- a/docs/installation/install-with-helm.md +++ b/docs/installation/install-with-helm.md @@ -133,7 +133,7 @@ You can specify a particular Baserow version by updating your `config.yaml`: ```yaml global: baserow: - image: 2.1.6 + image: 2.2.0 ``` Or specify the chart version directly: diff --git a/docs/installation/install-with-k8s.md b/docs/installation/install-with-k8s.md index c456aa77bd..a0d4f87ca8 100644 --- a/docs/installation/install-with-k8s.md +++ b/docs/installation/install-with-k8s.md @@ -167,7 +167,7 @@ spec: topologyKey: "kubernetes.io/hostname" containers: - name: backend-asgi - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 workingDir: /baserow args: - "gunicorn" @@ -224,7 +224,7 @@ spec: topologyKey: "kubernetes.io/hostname" containers: - name: backend-wsgi - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 workingDir: /baserow args: - "gunicorn-wsgi" @@ -283,7 +283,7 @@ spec: topologyKey: "kubernetes.io/hostname" containers: - name: backend-worker - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 args: - "celery-worker" imagePullPolicy: Always @@ -300,7 +300,7 @@ spec: - secretRef: name: YOUR_ENV_SECRET_REF - name: backend-export-worker - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 args: - "celery-exportworker" imagePullPolicy: Always @@ -317,7 +317,7 @@ spec: - secretRef: name: YOUR_ENV_SECRET_REF - name: backend-beat-worker - image: baserow/backend:2.1.6 + image: baserow/backend:2.2.0 args: - "celery-beat" imagePullPolicy: Always @@ -358,7 +358,7 @@ spec: topologyKey: "kubernetes.io/hostname" containers: - name: web-frontend - image: baserow/web-frontend:2.1.6 + image: baserow/web-frontend:2.2.0 args: - nuxt ports: diff --git a/docs/installation/install-with-traefik.md b/docs/installation/install-with-traefik.md index d87f7ea5b9..3b6d2fd075 100644 --- a/docs/installation/install-with-traefik.md +++ b/docs/installation/install-with-traefik.md @@ -10,7 +10,7 @@ See below for an example docker-compose file that will enable Baserow with Traef ``` services: baserow: - image: baserow/baserow:2.1.6 + image: baserow/baserow:2.2.0 container_name: baserow labels: # Explicitly tell Traefik to expose this container diff --git a/docs/installation/supported.md b/docs/installation/supported.md index b3629db2f5..f958df1bc0 100644 --- a/docs/installation/supported.md +++ b/docs/installation/supported.md @@ -8,7 +8,7 @@ Software versions are divided into the following groups: before the release. * `Recommended`: Recommended software for the best experience. -## Baserow 2.1.6 +## Baserow 2.2.0 | Dependency | Supported versions | Tested versions | Recommended versions | diff --git a/docs/plugins/creation.md b/docs/plugins/creation.md index 4b32329c83..bf711e3815 100644 --- a/docs/plugins/creation.md +++ b/docs/plugins/creation.md @@ -122,7 +122,7 @@ containing metadata about your plugin. It should have the following JSON structu { "name": "TODO", "version": "TODO", - "supported_baserow_versions": "2.1.6", + "supported_baserow_versions": "2.2.0", "plugin_api_version": "0.0.1-alpha", "description": "TODO", "author": "TODO", diff --git a/docs/plugins/installation.md b/docs/plugins/installation.md index dcc7778d13..55661147b2 100644 --- a/docs/plugins/installation.md +++ b/docs/plugins/installation.md @@ -36,7 +36,7 @@ build your own image based off the Baserow all-in-one image. 4. Next copy the contents shown into your `Dockerfile` ```dockerfile -FROM baserow/baserow:2.1.6 +FROM baserow/baserow:2.2.0 # You can install a plugin found in a git repo: RUN /baserow/plugins/install_plugin.sh \ @@ -70,9 +70,9 @@ RUN /baserow/plugins/install_plugin.sh \ 5. Choose which of the `RUN` commands you'd like to use to install your plugins and delete the rest, replace the example URLs with ones pointing to your plugin. 6. Now build your custom Baserow with the plugin installed by running: - `docker build -t my-customized-baserow:2.1.6 .` + `docker build -t my-customized-baserow:2.2.0 .` 7. Finally, you can run your new customized image just like the normal Baserow image: - `docker run -p 80:80 -v baserow_data:/baserow/data my-customized-baserow:2.1.6` + `docker run -p 80:80 -v baserow_data:/baserow/data my-customized-baserow:2.2.0` ### Installing in an existing Baserow all-in-one container @@ -111,7 +111,7 @@ docker run \ -v baserow_data:/baserow/data \ # ... All your normal launch args go here -e BASEROW_PLUGIN_GIT_REPOS=https://example.com/example/plugin1.git,https://example.com/example/plugin2.git - baserow:2.1.6 + baserow:2.2.0 ``` These variables will only trigger and installation when found on startup of the @@ -120,7 +120,7 @@ container. To uninstall a plugin you must still manually follow the instructions ### Caveats when installing into an existing container If you ever delete the container you've installed plugins into at runtime and re-create -it, the new container is created from the `baserow/baserow:2.1.6` image which does not +it, the new container is created from the `baserow/baserow:2.2.0` image which does not have any plugins installed. However, when a plugin is installed at runtime or build time it is stored in the @@ -135,7 +135,7 @@ scratch. ### Installing into standalone Baserow service images -Baserow also provides `baserow/backend:2.1.6` and `baserow/web-frontend:2.1.6` images +Baserow also provides `baserow/backend:2.2.0` and `baserow/web-frontend:2.2.0` images which only run the respective backend/celery/web-frontend services. These images are used for more advanced self-hosted deployments like a multi-service docker-compose, k8s etc. @@ -145,8 +145,8 @@ used with docker run and a specified command and the plugin env vars shown above example: ``` -docker run --rm baserow/backend:2.1.6 install-plugin ... -docker run -e BASEROW_PLUGIN_GIT_REPOS=https://example.com/example/plugin1.git,https://example.com/example/plugin2.git --rm baserow/backend:2.1.6 +docker run --rm baserow/backend:2.2.0 install-plugin ... +docker run -e BASEROW_PLUGIN_GIT_REPOS=https://example.com/example/plugin1.git,https://example.com/example/plugin2.git --rm baserow/backend:2.2.0 ``` You can use these scripts exactly as you would in the sections above to install a plugin @@ -169,13 +169,13 @@ associated data permanently. [Docker install guide backup section](../installation/install-with-docker.md) for more details on how to do this. 2. Stop your Baserow server first - `docker stop baserow` -3. `docker run --rm -v baserow_data:/baserow/data baserow:2.1.6 uninstall-plugin plugin_name` +3. `docker run --rm -v baserow_data:/baserow/data baserow:2.2.0 uninstall-plugin plugin_name` 4. Now the plugin has uninstalled itself and all associated data has been removed. 5. Edit your custom `Dockerfile` and remove the plugin. -6. Rebuild your image - `docker build -t my-customized-baserow:2.1.6 .` +6. Rebuild your image - `docker build -t my-customized-baserow:2.2.0 .` 7. Remove the old container using the old image - `docker rm baserow` 8. Run your new image with the plugin removed - - `docker run -p 80:80 -v baserow_data:/baserow/data my-customized-baserow:2.1.6` + - `docker run -p 80:80 -v baserow_data:/baserow/data my-customized-baserow:2.2.0` 9. If you fail to do this if you ever recreate the container, your custom image still has the plugin installed and the new container will start up again with the plugin re-installed. @@ -207,7 +207,7 @@ associated data permanently. restart as the environment variable will still contain the old plugin. To do this you must: 1. `docker stop baserow` - 2. `docker run --rm -v baserow_data:/baserow/data baserow:2.1.6 uninstall-plugin plugin_name` + 2. `docker run --rm -v baserow_data:/baserow/data baserow:2.2.0 uninstall-plugin plugin_name` 3. Now the plugin has uninstalled itself and all associated data has been removed. 4. Finally, recreate your Baserow container by using the same `docker run` command you launched it with, just make sure the plugin you uninstalled has been removed @@ -222,7 +222,7 @@ check what plugins are currently installed. docker run \ --rm \ -v baserow_data:/baserow/data \ - baserow:2.1.6 list-plugins + baserow:2.2.0 list-plugins # or on a running container diff --git a/enterprise/backend/pyproject.toml b/enterprise/backend/pyproject.toml index f06cddf969..fce5289a39 100644 --- a/enterprise/backend/pyproject.toml +++ b/enterprise/backend/pyproject.toml @@ -12,7 +12,7 @@ description = """Baserow is an open source no-code database tool and Airtable \ # mixed license license = { file = "../LICENSE" } requires-python = "==3.14.*" -version = "2.1.6" +version = "2.2.0" classifiers = [] [project.urls] diff --git a/enterprise/backend/website_export.csv b/enterprise/backend/website_export.csv index 33557991c6..68be57cd3b 100644 --- a/enterprise/backend/website_export.csv +++ b/enterprise/backend/website_export.csv @@ -1836,8 +1836,6 @@ This guide covers how to use Baserow's Grid view for spreadsheet-style data mana Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) - - ## Grid view vs other view types | Feature | Grid | Gallery | Kanban | Calendar | Timeline | Form | @@ -2069,7 +2067,7 @@ Still need help? If you're looking for something else, please feel free to make [1]: https://baserow.io/user-docs/navigating-row-configurations [2]: https://baserow.io/user-docs/how-to-make-new-rows [3]: https://baserow.io/user-docs/export-tables - [4]: https://baserow.io/user-docs/paste-data-into-baserow-table",,baserow_user_docs,https://baserow.io/user-docs/guide-to-grid-view + [4]: https://baserow.io/user-docs/paste-data-into-baserow-table",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-grid-view 14,Gallery view,guide-to-gallery-view,Baserow gallery view guide: Organize your data,"# Gallery view Gallery view transforms your data into visual cards with cover images and customizable field layouts, making it ideal for portfolios, product catalogs, and any data where visuals matter. @@ -2291,7 +2289,7 @@ Still need help? If you're looking for something else, please feel free to make [3]: https://baserow.io/user-docs/import-data-into-an-existing-table [4]: https://baserow.io/user-docs/collaborative-views [5]: https://baserow.io/user-docs/webhooks - [6]: https://baserow.io/user-docs/view-customization",,baserow_user_docs,https://baserow.io/user-docs/guide-to-gallery-view + [6]: https://baserow.io/user-docs/view-customization",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-gallery-view 15,Form view,guide-to-creating-forms-in-baserow,Baserow form view guide,"# Form view Form view transforms your table into shareable web forms for collecting data from anyone, with automatic validation and customizable thank-you pages. @@ -2306,8 +2304,6 @@ Form view creates web forms automatically from your table fields. Instead of man **Form view excels at:** Customer feedback collection, lead generation, event registrations, survey responses, job applications, order forms, contact forms, and any scenario where you need external users to submit structured data. - - ## Form view vs other view types | Feature | Form | Grid | Gallery | Kanban | @@ -2320,6 +2316,8 @@ Form view creates web forms automatically from your table fields. Instead of man | **Pre-filling** | ✓ URL parameters | – | – | – | | **Branding** | ✓ Logo & cover | – | ✓ Cover only | – | +[Edit row link field][3] type lets you connect a row to a form view. Each row gets its own secure URL. When someone opens the link, they see a pre-filled form, they update the values, and the row is updated on submit. + Learn more: [Grid view](/user-docs/guide-to-grid-view) | [Gallery view](/user-docs/guide-to-gallery-view) | [Kanban view](/user-docs/guide-to-kanban-view) ## Create a Form view @@ -2550,7 +2548,7 @@ Most field types work in forms. **Compatible:** Text, Number, Rating, Boolean, D ### Can I edit form submissions after they're submitted? -Forms only create new records; they don't edit existing ones. Once submitted, responses become regular table rows that you can edit manually in Grid view or other views. For editing existing data, share appropriate views instead of forms. +[Edit row link field][3] type lets you connect a row to a form view. Each row gets its own secure URL. When someone opens the link, they see a pre-filled form, they update the values, and the row is updated on submit. ### How do I prevent duplicate form submissions? @@ -2620,7 +2618,8 @@ Still need help? If you're looking for something else, please feel free to make [1]: https://baserow.io/user-docs/form-survey-mode - [2]: https://baserow.io/user-docs/adding-a-field",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [2]: https://baserow.io/user-docs/adding-a-field + [3]: https://baserow.io/user-docs/edit-rows-via-form",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-creating-forms-in-baserow 16,Kanban view,guide-to-kanban-view,Kanban view in Baserow,"# Kanban view Kanban view displays records as cards organized into columns, making it perfect for tracking work through stages like sales pipelines, project workflows, or content production. @@ -2637,8 +2636,6 @@ Kanban view organizes records into vertical columns based on a Single select fie **Kanban view excels at:** Sales pipelines (Lead → Qualified → Proposal → Closed), bug tracking (New → In Progress → Testing → Resolved), content calendars (Idea → Draft → Review → Published), recruitment workflows (Applied → Screening → Interview → Hired), and any process with clear stages. - - ## Kanban view vs other view types | Feature | Kanban | Grid | Gallery | Calendar | @@ -3014,6 +3011,7 @@ Click and drag your mouse across multiple row numbers to select them quickly. **Selection limit:** Baserow limits selections to 200 rows at once due to lazy loading, which loads rows progressively as you scroll. This design allows efficient handling of tables containing millions of rows without downloading everything upfront. +![Copying and pasting data between rows](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4e458d6-32fa-404a-b35a-e9f1df26d1af/Moving%20rows%20using%20copy-and-paste%20functions.webp) ## How to edit rows @@ -3028,7 +3026,9 @@ Click the [enlarge icon][5] on any row to open a comprehensive view showing all ### Bulk editing with paste Copy data from spreadsheets or other sources and paste it directly into your table using **Ctrl/Cmd + V**. Baserow maps the pasted data to your selected cells automatically. See [pasting data into cells][6] for detailed instructions. -![Copying and pasting data between rows](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4e458d6-32fa-404a-b35a-e9f1df26d1af/Moving%20rows%20using%20copy-and-paste%20functions.webp) +### Edit existing rows via form + +[Edit row link][7] field type lets you connect a row to a form view. Each row gets its own secure URL. When someone opens the link, they see a pre-filled form, they update the values, and the row is updated on submit. ## How to copy rows @@ -3041,17 +3041,17 @@ Copying rows in Baserow allows you to quickly duplicate or share data between ta 3. Select **Copy row URL** ### Copy multiple rows -1. Select multiple rows using [any selection method][7] +1. Select multiple rows using [any selection method][8] 2. Click the **Copy cells** or **Copy cells with header** When you paste the copied content into a spreadsheet application like Excel or Google Sheets, each value will appear in its corresponding cell. If you include headers, they’ll appear in the first row, making it easier to map or import your data elsewhere. -![Image copy rows in Baserow][8] +![Image copy rows in Baserow][9] ## How to delete rows -Delete individual rows or multiple rows at once. Deleted rows move to trash with a [grace period][9] for recovery. +Delete individual rows or multiple rows at once. Deleted rows move to trash with a [grace period][10] for recovery. ### Delete a single row 1. Navigate to the row you want to delete @@ -3059,10 +3059,10 @@ Delete individual rows or multiple rows at once. Deleted rows move to trash with 3. Select **Delete row** ### Delete multiple rows -1. Select multiple rows using [any selection method][7] +1. Select multiple rows using [any selection method][8] 2. Press the **Delete** key, or right-click and choose **Delete rows** -> Once the [trash grace period][9] expires, deletion becomes permanent. Recover deleted rows from the trash before the period ends. +> Once the [trash grace period][10] expires, deletion becomes permanent. Recover deleted rows from the trash before the period ends. ![Deleting a row via context menu][1] @@ -3082,7 +3082,7 @@ No, row height settings are view-specific. You can set different row heights for ### Can I recover deleted rows? -Yes, deleted rows move to trash with a [grace period][9] for recovery. Access the trash to restore rows before the [grace period][9] expires. After expiration, deletion is permanent, and rows cannot be recovered. +Yes, deleted rows move to trash with a [grace period][10] for recovery. Access the trash to restore rows before the [grace period][10] expires. After expiration, deletion is permanent, and rows cannot be recovered. ### What's the fastest way to edit multiple rows with the same value? @@ -3091,11 +3091,11 @@ Select multiple cells in a column, type your new value, and press **Ctrl/Cmd + E ## Related content - [Rows overview][2] - Learn fundamental row concepts -- [Create a row][10] - Add new records to your tables +- [Create a row][11] - Add new records to your tables - [Paste data into cells][6] - Import data from spreadsheets -- [Row coloring][11] - Apply conditional formatting to rows -- [Row commenting and mentions][12] - Collaborate on specific records -- [Keyboard shortcuts][13] - Speed up row operations +- [Row coloring][12] - Apply conditional formatting to rows +- [Row commenting and mentions][13] - Collaborate on specific records +- [Keyboard shortcuts][14] - Speed up row operations --- @@ -3113,13 +3113,14 @@ Still need help? If you're looking for something else, please feel free to make [4]: /user-docs/guide-to-grid-view [5]: https://baserow.io/user-docs/enlarging-rows [6]: /user-docs/paste-data-into-baserow-table - [7]: https://baserow.io/user-docs/navigating-row-configurations#how-to-select-rows - [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9d18f38a-273b-40f3-a26b-67b395e3819f/How%20to%20copy%20rows.jpg - [9]: https://baserow.io/user-docs/data-recovery-and-deletion - [10]: /user-docs/how-to-make-new-rows - [11]: /user-docs/row-coloring - [12]: /user-docs/row-commenting - [13]: /user-docs/baserow-keyboard-shortcuts",,baserow_user_docs,https://baserow.io/user-docs/navigating-row-configurations + [7]: https://baserow.io/user-docs/edit-rows-via-form + [8]: https://baserow.io/user-docs/navigating-row-configurations#how-to-select-rows + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9d18f38a-273b-40f3-a26b-67b395e3819f/How%20to%20copy%20rows.jpg + [10]: https://baserow.io/user-docs/data-recovery-and-deletion + [11]: /user-docs/how-to-make-new-rows + [12]: /user-docs/row-coloring + [13]: /user-docs/row-commenting + [14]: /user-docs/baserow-keyboard-shortcuts",row,baserow_user_docs,https://baserow.io/user-docs/navigating-row-configurations 18,Collaboration overview,managing-workspace-collaborators,Baserow workspace collaboration overview,"# Collaboration overview Baserow provides multiple collaboration tools for teams to work together on databases, communicate about data, and manage access control. @@ -4497,7 +4498,7 @@ Manual exports work well for occasional needs, but frequent exports benefit from Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. - [Ask the Baserow community](https://community.baserow.io) -- [Contact support](/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/export-tables +- [Contact support](/contact) for questions about Baserow or help with your account.",table,baserow_user_docs,https://baserow.io/user-docs/export-tables 26,Configure table options,customize-a-table,Configure and customize tables in Baserow,"# Table configuration and customization Table settings let you organize, secure, and automate your data without changing the actual content or structure. @@ -7032,83 +7033,83 @@ These examples demonstrate frequently used formula patterns. Replace field names **Calculate total price:** ``` -field('Quantity') * field('Unit Price') +[Quantity] * [Unit Price] ``` **Apply percentage discount:** ``` -field('Price') * (1 - field('Discount Percent') / 100) +[Price] * (1 - [Discount Percent] / 100) ``` **Round to 2 decimal places:** ``` -round(field('Amount'), 2) +round([Amount], 2) ``` **Find the greater value:** ``` -greatest(field('Value A'), field('Value B')) +greatest([Value A], [Value B]) ``` ### Text operations **Combine first and last name:** ``` -concat(field('First Name'), ' ', field('Last Name')) +concat([First Name], ' ', [Last Name]) ``` **Convert to uppercase:** ``` -upper(field('Product Code')) +upper([Product Code]) ``` **Extract first 10 characters:** ``` -left(field('Description'), 10) +left([Description], 10) ``` **Check if text contains a word:** ``` -contains(field('Notes'), 'urgent') +contains([Notes], 'urgent') ``` ### Date and time **Calculate days between dates:** ``` -date_diff('day', field('Start Date'), field('End Date')) +date_diff('day', [Start Date], [End Date]) ``` **Format date as text:** ``` -datetime_format(field('Created'), 'YYYY-MM-DD') +datetime_format([Created], 'YYYY-MM-DD') ``` **Check if date is in the past:** ``` -field('Due Date') < today() +[Due Date] < today() ``` **Get the year from a date:** ``` -year(field('Date Field')) +year([Date Field]) ``` ### Conditional logic **Display different text based on status:** ``` -if(field('Status') = 'Complete', '✓ Done', '⧗ Pending') +if([Status] = 'Complete', '✓ Done', '⧗ Pending') ``` **Use default value when field is empty:** ``` -when_empty(field('Notes'), 'No notes added') +when_empty([Notes], 'No notes added') ``` **Combine multiple conditions:** ``` -if(and(field('Quantity') > 0, field('Price') > 100), 'In Stock - Premium', 'Standard') +if(and([Quantity] > 0, [Price] > 100), 'In Stock - Premium', 'Standard') ``` ### Working with linked tables @@ -7120,7 +7121,7 @@ sum(lookup('Orders', 'Total')) **Count linked items:** ``` -count(field('Related Items')) +count([Related Items]) ``` **Join text from multiple records:** @@ -7137,72 +7138,68 @@ sum(filter(lookup('Items', 'Price'), lookup('Items', 'Status') = 'Active')) **Create a clickable button:** ``` -button('https://example.com/' + field('ID'), 'View Details') +button('https://example.com/' + [ID], 'View Details') ``` **Link to email address:** ``` -link('mailto:' + field('Email')) +link('mailto:' + [Email]) ``` ![Formula buttons in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/81b52ee9-8b60-4bab-a546-f9241f641d60/Untitled.png) -## Advanced formulas in workflows +## Expert formulas in workflows -Beyond table fields, Baserow formulas power advanced logic in the **[Workflow Builder][1]** and **[Application Builder][2]**. While standard fields use the basic formula editor, automation nodes offer an **Advanced formula builder** to handle complex conditions and dynamic content. +Beyond table fields, Baserow formulas power advanced logic in the **[Workflow Builder][1]** and **[Application Builder][2]**. The **Expert formula builder** handles complex conditions and dynamic content. ### Router conditions -When configuring an [action node](https://baserow.io/user-docs/workflow-automation), you can switch from the standard visual builder to **Advanced input**. This allows you to write raw formula expressions for your conditions using operators and functions. +When configuring an [action node](https://baserow.io/user-docs/workflow-automation), you can switch from the basic visual builder to **Expert input**. This allows you to write raw formula expressions for your conditions using operators and functions. -- **Standard mode:** Restricts you to simple `Field = Value` logic. -- **Advanced mode:** Unlocks the full formula engine. You can use operators to compare values directly within the router configuration. +- **Basic mode:** Restricts you to simple `Field = Value` logic. +- **Expert mode:** Unlocks the full formula engine. You can use operators to compare values directly within the router configuration. Example: Complex price calculation Instead of just checking if a price equals 100, you can check if the calculated total (quantity × price) exceeds a threshold. -`(field('Quantity') * field('Price')) > 1000` +`([Quantity] * [Price]) > 1000` Example: Text normalization Ensure a status match regardless of case (uppercase/lowercase) using the upper() function. -`upper(field('Status')) = 'URGENT'` +`upper([Status]) = 'URGENT'` ### Dynamic content -In [actions][3] like the **AI Prompt** or **Iterators**, you can check the **Advanced formula mode** box. This changes the input from a static text box to a dynamic expression editor. +In [actions][3] like the **AI Prompt** or **Iterators**, you can check the **Expert formula mode** box. This changes the input from a static text box to a dynamic expression editor. -- **Standard mode:** You type static text and insert variables (e.g., `Summarize [Notes]`). -- **Advanced mode:** You write a formula that generates the entire text string dynamically. This is useful when the structure of your prompt or source list needs to change based on other data. +- **Basic mode:** You type static text and insert variables (e.g., `Summarize [Notes]`). +- **Expert mode:** You write a formula that generates the entire text string dynamically. This is useful when the structure of your prompt or source list needs to change based on other data. Example: Dynamic AI Prompt Dynamically generate a prompt that asks for different tasks based on the record type. -`concat('Please write a ', if(field('Type')='Blog', 'creative', 'formal'), ' summary for: ', field('Notes'))` +`concat('Please write a ', if([Type]='Blog', 'creative', 'formal'), ' summary for: ', [Notes])` ## Frequently asked questions -### How do I reference other fields in formulas? - -Use the `field()` function with the exact field name in single quotes: `field('Field Name')`. Field names are case-sensitive and must match exactly. - ### Why isn't my formula working with Lookup or Link-to-table fields? Lookup and Link-to-table fields contain arrays (multiple values), not single values. Most functions expect single values. Use aggregation functions like `sum()`, `join()`, `count()`, or `avg()` to convert arrays into single values. **Example problem:** ``` -isblank(field('Organization')) // Won't work if Organization is a link field +isblank([Organization]) // Won't work if Organization is a link field ``` **Solution:** ``` -isblank(join(field('Organization'), '')) // Converts array to text first +isblank(join([Organization], '')) // Converts array to text first ``` ### Can I use formulas with Duration fields? @@ -7213,7 +7210,7 @@ Yes. Duration fields support mathematical operations directly. You can add, subt Use `datetime_format()` with the 'D' format code, where Sunday = 1, Monday = 2, etc: ``` -datetime_format(field('Date Field'), 'D') = '1' // Returns true if Sunday +datetime_format([Date Field], 'D') = '1' // Returns true if Sunday ``` For more date formatting options, see the [PostgreSQL formatting documentation](https://www.postgresql.org/docs/current/functions-formatting.html). @@ -7226,17 +7223,17 @@ Yes. Both functions update every 10 minutes. Use `today()` for the current date Use `when_empty()` to provide fallback values, or `isblank()` to check if a field is empty: ``` -when_empty(field('Optional Field'), 'Default Value') +when_empty([Optional Field], 'Default Value') ``` ``` -if(isblank(field('Name')), 'No name provided', field('Name')) +if(isblank([Name]), 'No name provided', [Name]) ``` ### Can I use regular expressions in formulas? Yes. Use `regex_replace()` to find and replace text patterns: ``` -regex_replace(field('Phone'), '[^0-9]', '') // Removes non-numeric characters +regex_replace([Phone], '[^0-9]', '') // Removes non-numeric characters ``` @@ -7541,8 +7538,6 @@ Views let you see the same table data in different formats without duplicating i When you change data in any view, that change appears in all other views because they all reference the same underlying records. Views are table-specific and don't carry across different tables or databases. - - ## How views work Every table starts with a default Grid view that displays data in rows and columns like a spreadsheet. You can create additional views to show this data in different formats, each optimized for specific use cases. @@ -7584,7 +7579,7 @@ The current view tab in the table's upper left corner helps in navigating all of ![Switching between views in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a2ffbd1a-9059-49a2-87ba-1d621830b6ec/Switch%20view.webp) -The view dropdown shows all collaborative views and your personal views. Other users' personal views won't appear in your list. +The view dropdown shows all [collaborative views][1] and your [personal views][2]. Other users' personal views won't appear in your list. ### Search existing views @@ -7595,7 +7590,7 @@ If you created a lot of views in your table, it might be helpful to locate a vie 3. Results filter in real-time as you type. 4. Select the view to navigate to -Search works across both collaborative and personal views that you have access to. +Search works across both [collaborative][1] and [personal views][2] that you have access to. ![Search for existing views in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/027084d14cbfd67c97bd15cb4891ed1ffaf5ab03.webp) @@ -7605,18 +7600,20 @@ Each view has independent [configuration options](/user-docs/view-customization) - **Filters** - Show only records matching specific conditions - **Sorts** - Order records by field values - **Field visibility** - Hide or show specific columns -- **[Grouping][2]** - Group records by field values (grid view) +- **[Grouping][3]** - Group records by field values (grid view) - **Colors** - Apply conditional formatting based on data -![View permissions allow all members to create and modify views][3] +![View permissions allow all members to create and modify views][4] -## Collaborative vs personal views +## Collaborative, personal, restrictive views -Baserow offers two types of views: +Baserow offers various types of views: -**[Collaborative views](/user-docs/collaborative-views)** are shared with all workspace members. Everyone sees the same view configuration, making them ideal for team dashboards and shared workflows. +**[Collaborative views](/user-docs/collaborative-views)** are shared with all workspace members who have access to the table. Everyone sees the same view configuration, making them ideal for team dashboards and shared workflows. -**[Personal views](/user-docs/personal-views)** are private to individual users. Create custom views with your preferred filters and sorts without affecting others' views. +**[Personal views](/user-docs/personal-views)** are private to individual users and don't appear in other users' view lists. Create custom views with your preferred filters and sorts without affecting others' views. Personal views are perfect for custom filters or sorts you use frequently. + +**[Restrictive views](/user-docs/view-level-permissions)** allow you to give specific users access to only the exact data they should see. ## Frequently asked questions @@ -7632,10 +7629,6 @@ Yes. Each view has independent filters. Your Grid view might show all records, w There's no limit to the number of views per table. Create as many views as you need for different workflows, team members, or use cases. However, views only exist within their table and don't transfer to other tables or databases. -### What's the difference between collaborative and personal views? - -[Collaborative views](/user-docs/collaborative-views) are shared with all workspace members who have access to the table. [Personal views](/user-docs/personal-views) are private to you and don't appear in other users' view lists. Personal views are perfect for custom filters or sorts you use frequently. - ### Can I import data directly into a specific view? When you [import data](/user-docs/import-data-into-an-existing-table) (CSV, JSON, or XML files), it's added to the table itself, not to a specific view. Once imported, the data appears in all views, subject to each view's filter settings. @@ -7647,10 +7640,11 @@ No. Views are table-specific. Each view displays and filters records from a sing ## Related content ### Getting started -- [Create custom views of your data](/user-docs/create-custom-views-of-your-data) - Step-by-step guide -- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings -- [Collaborative views](/user-docs/collaborative-views) - Shared team views -- [Personal views](/user-docs/personal-views) - Private, individual views + - [Create custom views of your data](/user-docs/create-custom-views-of-your-data) - Step-by-step guide + - [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings + - [Collaborative views](/user-docs/collaborative-views) - Shared team views + - [Personal views](/user-docs/personal-views) - Private, individual views + - [View-level RBAC (restricted views)][5] ### View types - [Grid view guide](/user-docs/guide-to-grid-view) - Spreadsheet-style interface @@ -7675,9 +7669,11 @@ Still need help? If you're looking for something else, please feel free to make - [Contact support](/contact) for questions about Baserow or help with your account - [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52f03c5a-abc4-4eb1-8687-4db83ae1fcc5/kanban_view.png - [2]: https://baserow.io/user-docs/group-rows-in-baserow - [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b85a937-a728-4b7d-a887-167c31dfff9e/View%20permissions%20allow%20all%20members%20to%20create%20and%20modify%20views.jpg",,baserow_user_docs,https://baserow.io/user-docs/overview-of-baserow-views + [1]: https://baserow.io/user-docs/collaborative-views + [2]: https://baserow.io/user-docs/personal-views + [3]: https://baserow.io/user-docs/group-rows-in-baserow + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b85a937-a728-4b7d-a887-167c31dfff9e/View%20permissions%20allow%20all%20members%20to%20create%20and%20modify%20views.jpg + [5]: https://baserow.io/user-docs/view-level-permissions",view,baserow_user_docs,https://baserow.io/user-docs/overview-of-baserow-views 48,Create a table,create-a-table,How to create a table in Baserow database,"# Create a table in Baserow Baserow makes table creation flexible; choose the approach that saves you the most time. @@ -8230,7 +8226,6 @@ Both processes include pro rata billing calculations, meaning you only pay for t | **User management** | Automatic billing per active workspace collaborator | Manual seat assignment | | **Upgraded access** | All workspace collaborators | Only assigned seat holders | | **Plan flexibility** | Premium or Advanced per workspace | Premium, Advanced seats or Enterprise instance-wide | -| **User mixing** | Cannot be mixed with Free users | Premium and Advanced plans can be mixed with Free users, as license is instance-based. | | **License management** | Automatic activation | Manual key registration | | **User assignment** | All workspace members | Admin controls seats | | **Feature activation** | Per-workspace basis | Per-user basis | @@ -8269,6 +8264,14 @@ Understanding which users count toward your subscription helps you manage costs | Self-Hosted Advanced plan | Any user with the roles of Editor, Builder, or Admin can be assigned a seat. First, purchase the number of paid seats you need. After your license is active, you can invite additional users as free members without being charged. | | Self-Hosted Enterprise plan | Users classed as billable will be decided with Baserow’s sales team. Baserow Enterprise plan is designed for large businesses that want to get the most out of Baserow. Please [contact a sales representative ](/contact-sales) to understand how the Enterprise plan will work for your team. | +## Mix free and paid users + +Depending on your plan, you can choose exactly which team members receive access to advanced views, exports, and collaboration tools. + + - **Self-Hosted Premium**: Yes. You can mix Free and Premium users on the same instance. You can choose exactly which users are assigned a Premium license and have access to Premium features through manual seat assignment. If you have 100 free users in total, you can buy a license for 10 seats and assign 10 users to it, meaning 10 users will have premium and 90 are free. This can be combined. + - **Self-Hosted Advanced**: No, all active users must be on the Advanced plan because features like role-based access control and audit logs apply to the entire instance. All users with Admin, Builder, or Editor roles require a paid license. However, you can have unlimited free users if they are assigned the Viewer or Commenter roles. + - **Baserow Cloud**: Cloud subscriptions are per-workspace. All active contributors within a workspace must be on the same plan tier, meaning you cannot mix Free and Paid active contributors. However, just like Advanced, users with the Viewer or Commenter roles are always free. + ## Pro rata billing explained Pro rata billing ensures fair pricing when you make subscription changes mid-cycle. All Baserow [subscription changes][5] trigger pro rata billing adjustments that account for the timing of your modifications. @@ -8329,7 +8332,7 @@ Still need help? If you're looking for something else, please feel free to make [5]: https://baserow.io/user-docs/get-a-licence-key [7]: https://baserow.io/user-docs/change-a-paid-subscription [8]: https://baserow.io/user-docs/self-hosted-licenses - [9]: https://baserow.io/user-docs/cancel-subscriptions",,baserow_user_docs,https://baserow.io/user-docs/subscriptions-overview + [9]: https://baserow.io/user-docs/cancel-subscriptions",billing,baserow_user_docs,https://baserow.io/user-docs/subscriptions-overview 52,Buy cloud subscription,buying-a-subscription,Purchase a cloud subscription in Baserow,"# Purchase Baserow cloud subscription Baserow offers Premium, Advanced and Enterprise subscriptions for both cloud and self-hosted instances. Purchase requires a baserow.io account. Self-hosted users get unlimited storage, while hosted users have storage limits. @@ -8398,7 +8401,7 @@ Billing is based on [billable users][4]. Adding billable users increases costs i ### Can I mix free and paid users in cloud plans? -No, cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. However, in Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. +No, cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. [See this section][10]. ### What happens if I exceed storage limits on cloud plans? Premium cloud plans include 20GB storage, and Advanced plans include 100GB. [Contact support](https://baserow.io/contact) if you approach these limits to discuss upgrade options or data management strategies. @@ -8406,12 +8409,12 @@ Premium cloud plans include 20GB storage, and Advanced plans include 100GB. [Con ## Related content - [Baserow pricing and plans][2] - - [Purchase subscription][10] - - [Manage instance ID][11] - - [Manage Baserow licenses][12] + - [Purchase subscription][11] + - [Manage instance ID][12] + - [Manage Baserow licenses][13] - [Install self-hosted license][1] - - [Self-hosted licenses][13] - - [Cancel Subscriptions][14] + - [Self-hosted licenses][14] + - [Cancel Subscriptions][15] --- @@ -8432,11 +8435,12 @@ Still need help? If you're looking for something else, please feel free to make [7]: /user-docs/setting-up-a-workspace [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9c36b33c-a3a4-46a5-b570-c69017efa86d/Workspace%20and%20plan%20selection%20screen.jpg [9]: https://baserow.io/user-docs/subscriptions-overview#understanding-subscription-status-types - [10]: https://baserow.io/user-docs/buying-a-subscription - [11]: https://baserow.io/user-docs/getting-and-changing-the-instance-id - [12]: https://baserow.io/user-docs/change-a-paid-subscription - [13]: https://baserow.io/user-docs/self-hosted-licenses - [14]: https://baserow.io/user-docs/cancel-subscriptions",,baserow_user_docs,https://baserow.io/user-docs/buying-a-subscription + [10]: https://baserow.io/user-docs/subscriptions-overview#mix-free-and-paid-users + [11]: https://baserow.io/user-docs/buying-a-subscription + [12]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [13]: https://baserow.io/user-docs/change-a-paid-subscription + [14]: https://baserow.io/user-docs/self-hosted-licenses + [15]: https://baserow.io/user-docs/cancel-subscriptions",billing,baserow_user_docs,https://baserow.io/user-docs/buying-a-subscription 53,Buy self-hosted license,get-a-licence-key,Buy Baserow self-hosted license,"# How to purchase and install a self-hosted license Baserow paid licenses unlock [paid features][1] on self-hosted installations. This approach gives you complete control over which users access paid features while maintaining data sovereignty on your servers. @@ -8567,9 +8571,7 @@ To upgrade your self-hosted instance to the latest version, please review the [d ### Can I mix free and billable users in the same workspace? -Yes, billable and free users can collaborate in the same workspaces as the license is instance-based. Billable users access paid features while free users work within standard limitations. Choose exactly which team members receive access to advanced views, exports, and collaboration tools. - -Premium and Advanced licensing allow mixing free and billable users within the same instance through manual seat assignment. If you have 100 free users in total, you can buy a license for 10 seats and assign 10 users to it, meaning 10 users will have premium and 90 are free. This can be combined. +Yes, billable and free users can collaborate in the same workspaces as the license is instance-based. Billable users access paid features while free users work within standard limitations. [See this section][14]. ### How does billing work when switching plans? @@ -8616,7 +8618,8 @@ Still need help? If you're looking for something else, please feel free to make [10]: https://baserow.io/user-docs/subscriptions-overview#user-billing-classifications [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7fc3aedc-e73d-494d-9da1-2aa456ec752c/Register%20License.jpg [12]: https://baserow.io/user-docs/getting-and-changing-the-instance-id - [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0faf781e-e048-4af8-b9c5-4209f86cabd4/view%20your%20license%20ID.jpg",billing,baserow_user_docs,https://baserow.io/user-docs/get-a-licence-key + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0faf781e-e048-4af8-b9c5-4209f86cabd4/view%20your%20license%20ID.jpg + [14]: https://baserow.io/user-docs/subscriptions-overview#mix-free-and-paid-users",billing,baserow_user_docs,https://baserow.io/user-docs/get-a-licence-key 54,Manage licenses,getting-and-changing-the-instance-id,Manage licenses in Baserow self-hosted instance,"# Manage licenses in self-hosted Baserow This guide covers how to view, register, assign, and manage licenses for your self-hosted Baserow instance through the admin panel. @@ -8883,25 +8886,25 @@ To purchase a new subscription, [visit this page][3]. ## Overview Baserow subscription management controls who can access [paid features][4] in your workspace or self-hosted instance. The approach differs significantly between cloud and self-hosted deployments, with cloud subscriptions automatically scaling based on workspace membership while self-hosted licenses require manual seat allocation. -Learn more about [how subscriptions work in Baserow][6]. +Learn more about [how subscriptions work in Baserow][5]. ## Update a subscription or license Sign in to https://baserow.io, then click on your workspace in the top left corner -> Subscriptions. -The subscription details page provides comprehensive information about the [subscription status][7], your current usage, including next payment date, and available modification options. +The subscription details page provides comprehensive information about the [subscription status][6], your current usage, including next payment date, and available modification options. -![Subscription details interface][8] +![Subscription details interface][7] Click on **More details**. Within the subscription details view, you can access several management functions. For workspace subscriptions, you can view the [billing plan][4], status, cost, paid users, billing period, features enabled, including how to change payment method, receipt downloads, and usage monitoring. -For self-hosted licences, you can view the [billing plan][4], [license ID][9], [instance ID][10], license key, status, seats, cost, paid users, billing period, features enabled, including how to change payment method, and receipt downloads. +For self-hosted licences, you can view the [billing plan][4], [license ID][8], [instance ID][9], license key, status, seats, cost, paid users, billing period, features enabled, including how to change payment method, and receipt downloads. This helps you understand both your current seat, row usage and storage consumption and upcoming billing obligations. -![Subscription management option][11] +![Subscription management option][10] To update a subscription, click **Change subscription** and select your desired options. @@ -8909,7 +8912,7 @@ For workspace subscriptions, you can update the billing period, billing plan or For self-hosted licenses, you can update the number of seats, instance ID, billing period, billing plan or [cancel the subscription][2]. -![view your license ID][12] +![view your license ID][11] The interface shows you the immediate billing impact of your changes before you commit to them. Click **Confirm change** to implement your modifications. @@ -8921,7 +8924,7 @@ To adjust seat counts for self-hosted subscriptions, you must access the Baserow Navigate to your subscription details and click **More details** to access the modification interface. The self-hosted subscription management page allows you to adjust seat counts, change plans, update instance IDs, and modify payment periods all from a single interface. -![License update interface][13] +![License update interface][12] As you modify seat counts, the interface displays the immediate billing impact of your changes. Adding seats results in immediate charges for the pro rata difference, while reducing seats credits your account for future billing cycles. @@ -8942,24 +8945,24 @@ Once you confirm the change, the system processes seat additions immediately, ch Billing changes process immediately for additions and upgrades, with charges appearing within 24 hours. Downgrades and removals credit your account for future billing cycles rather than providing immediate refunds. ### Can I mix free and billable users in the same workspace or instance? -In Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. Cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. +This depends on your plan. [See this section][13]. ### What happens to my data if I cancel my subscription? Your subscription remains active until the end of the prepaid period, giving you time to export data or transition workflows. After cancellation, you retain access to basic Baserow features but lose upgraded capabilities like advanced views and integrations. ### How do I transfer a license between different self-hosted servers? -Use the [instance ID change feature][10] in your subscription management interface to transfer licenses between servers. This allows you to migrate installations or change infrastructure without purchasing new licenses. +Use the [instance ID change feature][9] in your subscription management interface to transfer licenses between servers. This allows you to migrate installations or change infrastructure without purchasing new licenses. ### Why do I need to use baserow.io to manage my self-hosted subscription? Baserow uses a unified billing system that manages licenses for both cloud and self-hosted deployments. This approach ensures consistent license tracking, simplified payment processing, and integrated support across all deployment types. ## Related content - - [Subscriptions overview][6] + - [Subscriptions overview][5] - [Baserow pricing and plans][4] - [Purchase subscription][3] - - [Install self-hosted license][9] - - [Manage instance ID][10] + - [Install self-hosted license][8] + - [Manage instance ID][9] - [Self-hosted licenses][14] - [Update payment methods][1] - [Cancel subscriptions][2] @@ -8976,16 +8979,16 @@ Still need help? If you're looking for something else, please feel free to make [2]: https://baserow.io/user-docs/cancel-subscriptions [3]: https://baserow.io/user-docs/buying-a-subscription [4]: https://baserow.io/user-docs/pricing-plans - [5]: https://baserow.io/user-docs/subscriptions-overview#user-billing-classifications - [6]: https://baserow.io/user-docs/subscriptions-overview - [7]: https://baserow.io/user-docs/subscriptions-overview#understanding-subscription-status-types - [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d448c39d-eb99-4323-a25b-dba38b57f6b0/Subscription%20details%20interface.jpg - [9]: https://baserow.io/user-docs/get-a-licence-key - [10]: https://baserow.io/user-docs/getting-and-changing-the-instance-id - [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07426a7-89b0-479e-855a-072bb6079a44/Subscription%20management%20option.jpg - [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bff6f7c3-6ccc-453b-942d-4ae2f012abec/view%20your%20license%20ID.jpg - [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d32255fb-252e-46ab-9709-2490c92bff89/License%20update%20interface.jpg - [14]: https://baserow.io/user-docs/self-hosted-licenses",,baserow_user_docs,https://baserow.io/user-docs/change-a-paid-subscription + [5]: https://baserow.io/user-docs/subscriptions-overview + [6]: https://baserow.io/user-docs/subscriptions-overview#understanding-subscription-status-types + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d448c39d-eb99-4323-a25b-dba38b57f6b0/Subscription%20details%20interface.jpg + [8]: https://baserow.io/user-docs/get-a-licence-key + [9]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07426a7-89b0-479e-855a-072bb6079a44/Subscription%20management%20option.jpg + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bff6f7c3-6ccc-453b-942d-4ae2f012abec/view%20your%20license%20ID.jpg + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d32255fb-252e-46ab-9709-2490c92bff89/License%20update%20interface.jpg + [13]: https://baserow.io/user-docs/subscriptions-overview#mix-free-and-paid-users + [14]: https://baserow.io/user-docs/self-hosted-licenses",billing,baserow_user_docs,https://baserow.io/user-docs/change-a-paid-subscription 56,Collaborator field,collaborator-field,Collaborator field in Baserow,"# Working with the Collaborator field The **Collaborator field** lets you easily assign specific [workspace members][1] to individual rows, making it clear who is responsible for a task or record. @@ -11609,18 +11612,18 @@ The Premium plan unlocks professional features for growing teams and projects re **Enhanced limits:** - Cloud: 50,000 rows, 20GB storage per workspace - - [JSON, Excel and XML export][3] for comprehensive data portability - - [Kanban view][4] for agile project management workflows - - [Calendar view][5] for time-based data visualization and planning - - [Survey form mode][6] for enhanced data collection experiences - - [Timeline view][7] - - [Personal views][8] - - [Graph widget][9] - - [Row comments][10] for collaborative feedback and discussion - - [Row coloring][11] for visual data organization and categorization - - [Baserow branding removal][12] from forms for professional branding - - [AI field][13] - - [AI formula generator][14] + - [JSON, Excel and XML export][2] for comprehensive data portability + - [Kanban view][3] for agile project management workflows + - [Calendar view][4] for time-based data visualization and planning + - [Survey form mode][5] for enhanced data collection experiences + - [Timeline view][6] + - [Personal views][7] + - [Graph widget][8] + - [Row comments][9] for collaborative feedback and discussion + - [Row coloring][10] for visual data organization and categorization + - [Baserow branding removal][11] from forms for professional branding + - [AI field][12] + - [AI formula generator][13] Role-based permissions and administrative features remain unavailable. These require Advanced or Enterprise plans. @@ -11631,14 +11634,14 @@ The Advanced plan offers enterprise-grade security and management features for l **Everything from Premium, plus:** - Enhanced limits: 250,000 rows, 100GB storage (cloud) - - [Role-based permissions][15] for granular access control - - [Field-level permissions][16] + - [Role-based permissions][14] for granular access control + - [Field-level permissions][15] - Direct priority support for faster issue resolution - - [Audit logging][17] for compliance and security monitoring - - [Applications][18] - File upload element, SSO user authentication + - [Audit logging][16] for compliance and security monitoring + - [Applications][17] - File upload element, SSO user authentication - White label application branding - - [Data sync][19] - Baserow table, Jira issues, GitLab issues, HubSpot customers, GitHub issues - - [Single Sign-On][20] integration for streamlined authentication + - [Data sync][18] - Baserow table, Jira issues, GitLab issues, HubSpot customers, GitHub issues + - [Single Sign-On][19] integration for streamlined authentication The primary differentiator between Advanced and Premium is role-based permissions, allowing granular control over who can view, edit, or manage databases and workspaces within your organization. @@ -11664,7 +11667,7 @@ Baserow charges per active user (non-viewer). [Learn more about user types](/use ### Can I mix free and paid users? -Yes, in Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. Cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. +This depends on your plan and hosting method. [See this section][20]. ### How many users can collaborate in a workspace? @@ -11716,25 +11719,25 @@ Still need help? If you're looking for something else, please feel free to make [1]: https://baserow.io/pricing - [3]: https://baserow.io/user-docs/export-tables - [4]: https://baserow.io/user-docs/guide-to-kanban-view - [5]: https://baserow.io/user-docs/guide-to-calendar-view - [6]: https://baserow.io/user-docs/form-survey-mode - [7]: https://baserow.io/user-docs/guide-to-timeline-view - [8]: https://baserow.io/user-docs/personal-views - [9]: https://baserow.io/user-docs/dashboards-overview - [10]: https://baserow.io/user-docs/row-commenting - [11]: https://baserow.io/user-docs/row-coloring - [12]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow - [13]: https://baserow.io/user-docs/ai-field - [14]: https://baserow.io/user-docs/generate-formulas-with-baserow-ai - [15]: https://baserow.io/user-docs/permissions-overview - [16]: https://baserow.io/user-docs/field-level-permissions - [17]: https://baserow.io/user-docs/admin-panel-audit-logs - [18]: https://baserow.io/user-docs/elements-overview - [19]: https://baserow.io/user-docs/data-sync-in-baserow - [20]: https://baserow.io/user-docs/single-sign-on-sso-overview - [21]: https://baserow.io/user-docs/enterprise-admin-panel",billing,baserow_user_docs,https://baserow.io/user-docs/pricing-plans + [2]: https://baserow.io/user-docs/export-tables + [3]: https://baserow.io/user-docs/guide-to-kanban-view + [4]: https://baserow.io/user-docs/guide-to-calendar-view + [5]: https://baserow.io/user-docs/form-survey-mode + [6]: https://baserow.io/user-docs/guide-to-timeline-view + [7]: https://baserow.io/user-docs/personal-views + [8]: https://baserow.io/user-docs/dashboards-overview + [9]: https://baserow.io/user-docs/row-commenting + [10]: https://baserow.io/user-docs/row-coloring + [11]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [12]: https://baserow.io/user-docs/ai-field + [13]: https://baserow.io/user-docs/generate-formulas-with-baserow-ai + [14]: https://baserow.io/user-docs/permissions-overview + [15]: https://baserow.io/user-docs/field-level-permissions + [16]: https://baserow.io/user-docs/admin-panel-audit-logs + [17]: https://baserow.io/user-docs/elements-overview + [18]: https://baserow.io/user-docs/data-sync-in-baserow + [19]: https://baserow.io/user-docs/single-sign-on-sso-overview + [20]: https://baserow.io/user-docs/subscriptions-overview#mix-free-and-paid-users",billing,baserow_user_docs,https://baserow.io/user-docs/pricing-plans 107,Delete account,delete-your-baserow-account,Delete your user account in Baserow,"# Delete your Baserow account Deleting your account is permanent and removes all personal data from Baserow. Consider exporting important data before deletion. @@ -13513,6 +13516,8 @@ Enterprise includes all Advanced plan features. Scope depends on your organizati | **[Branding][2]** | Logo removal available | Full tool co-branding | | **SLA** | Standard | Custom SLA agreements | +Self-hosted Enterprise instances include a built-in [Data Scanner][3] to help instance administrators monitor compliance risks and detect exposed personal data (PII) across all workspaces. + Learn more about [Advanced plan features](/user-docs/pricing-plans). ## Enterprise licensing model @@ -13580,7 +13585,8 @@ Still need help? If you're looking for something else, please feel free to make [1]: https://baserow.io/user-docs/pricing-plans - [2]: https://baserow.io/user-docs/admin-panel-settings#branding",enterprise,baserow_user_docs,https://baserow.io/user-docs/enterprise-license-overview + [2]: https://baserow.io/user-docs/admin-panel-settings#branding + [3]: https://baserow.io/user-docs/enterprise-admin-panel",enterprise,baserow_user_docs,https://baserow.io/user-docs/enterprise-license-overview 118,Instance-wide users,admin-panel-users,Baserow admin panel: Manage users,"# Manage users instance-wide The **Users** page in the Admin Panel allows Instance Admins to view, manage, and control access for all user accounts registered on the self-hosted instance. @@ -14245,11 +14251,12 @@ The sidebar is organized into three logical sections: **General**, **People**, a ### General - * **Dashboard:** The overview page with a high-level snapshot of your instance's usage and activity. - * **[Authentication][2]:** Manage login methods, including Email/Password and Single Sign-On (SSO) providers (e.g., Google, Facebook, OpenID, SAML). - * **[Audit Log][1]:** A comprehensive chronological record of all actions performed across the instance. Useful for security and compliance. - * **[Settings][5]:** Configure global instance settings, such as allowing new user sign-ups or enabling/disabling account deletion. - * **Health:** Insights into the technical status of your installation. + * **Dashboard:** The overview page with a high-level snapshot of your instance's usage and activity. + * **[Authentication][2]:** Manage login methods, including Email/Password and Single Sign-On (SSO) providers (e.g., Google, Facebook, OpenID, SAML). + * **[Audit Log][1]:** A comprehensive chronological record of all actions performed across the instance. Useful for security and compliance. + * **[Settings][5]:** Configure global instance settings, such as allowing new user sign-ups or enabling/disabling account deletion. + * **Health:** Insights into the technical status of your installation. + * **Data Scanner (Enterprise)**: Automatically detect sensitive data or personal identifiers across your entire instance to monitor compliance risks. ### People @@ -14289,12 +14296,12 @@ The **Health** page offers critical insights into the technical status of your i The page displays the status (Pass/Fail) of the following components: - * **Cache Backend:** Checks default, generated models, and throttling caches. - * **Database Backend:** Verifies connection to the PostgreSQL database. - * **Redis:** Verifies connection to the Redis queue. - * **Celery:** Checks the asynchronous task queue (Ping, Queue size, Export queue size). - * **Storage:** Verifies disk usage and S3/MinIO connection (if configured). - * **Configuration:** Checks Debug mode status and migration health. + * **Cache Backend:** Checks default, generated models, and throttling caches. + * **Database Backend:** Verifies connection to the PostgreSQL database. + * **Redis:** Verifies connection to the Redis queue. + * **Celery:** Checks the asynchronous task queue (Ping, Queue size, Export queue size). + * **Storage:** Verifies disk usage and S3/MinIO connection (if configured). + * **Configuration:** Checks Debug mode status and migration health. ### Testing tools @@ -14303,6 +14310,22 @@ The Health page also includes manual triggers to verify system responsiveness: * **Email Tester:** Sends a test email to a target address to verify SMTP settings. * **Error Tester:** Intentionally triggers a backend error to test logging and alerting configurations. +![Baserow Data scanner][10] + +## Data scanner + +Self-hosted Enterprise instances include a built-in Data Scanner to help instance administrators monitor compliance risks and detect exposed personal data (PII) across all workspaces. + +From the Data Scanner interface, Instance Admins can: + + * **Scan for patterns:** Automatically detect sensitive formats like Social Security Numbers, credit card numbers, or specific ID structures. + * **Scan for exact values:** Search the entire instance for specific text strings or exposed sensitive data. + * **Automate scanning:** Run scans manually when needed, or set them up to run on a regular schedule. + +When the scanner finds matching data, the results are securely logged, and admins are notified so they can take immediate action to secure or remove the exposed information. + +> *Note: This feature requires an active self-hosted Enterprise license.* + ## Frequently Asked Questions (FAQ) ### Who can access the Baserow Admin Panel? @@ -14328,6 +14351,10 @@ Instance Admins have access to Admin Tools; Workspace Admins do not. No. Admin Tools is exclusively for self-hosted installations. Cloud users on Baserow.io manage their workspaces through standard workspace settings; they don't have access to instance-level administration. +### Can I scan my Baserow instance for sensitive data or PII? + +Yes, if you are on a self-hosted Enterprise plan. Instance Admins can use the **Data scanner** in the Admin Panel to automatically detect sensitive data across the entire instance. You can set up manual or scheduled scans to look for specific patterns (like ID numbers or credit cards) or exact values. When sensitive data is found, the results are logged, and admins are notified to help monitor compliance risks. + ## Troubleshooting ### Cannot see Admin option in sidebar @@ -14388,7 +14415,7 @@ Still need help? If you're looking for something else, please feel free to make [7]: /user-docs/admin-panel-workspaces [8]: https://baserow.io/user-docs/getting-and-changing-the-instance-id [9]: /user-docs/get-a-licence-key - [10]: https://baserow.io/user-docs/get-a-licence-key",account management,baserow_user_docs,https://baserow.io/user-docs/enterprise-admin-panel + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fd2fc4aa-1e6e-42f5-b77d-a84d4086b7b8/Data%20scanner.png",account management,baserow_user_docs,https://baserow.io/user-docs/enterprise-admin-panel 123,Install Enterprise license,activate-enterprise-license,Activate Enterprise license in Baserow self-hosted,"# Activate Enterprise license in self-hosted Baserow Activating your license is the key to unlocking enterprise capabilities. Activating your Baserow Enterprise license connects your self-hosted instance to your premium, secure, and scalable features. @@ -15800,8 +15827,6 @@ Fields in Baserow are the building blocks of structured data; transforming simpl This guide explains what fields are in Baserow, how to choose the right field type for your data, and how to use computed fields to create dynamic, interconnected databases. - - ## Overview Fields (columns) define what type of data each part of your record can contain. Unlike spreadsheet columns that accept any text or number, Baserow fields enforce data types, ensuring email fields contain valid emails, date fields store proper dates, and link fields create genuine relationships between tables. @@ -15910,11 +15935,12 @@ Common computed field types include [Formula fields][19], [Lookup fields][16], [ Each [field can be configured][27] to match your specific needs: -- **[Sorting][27]:** Arrange rows by field values (A-Z, newest first, highest to lowest) -- **[Filtering][28]:** Show only rows matching specific field criteria -- **[Grouping][29]:** Organize rows into collapsible sections by field values -- **[Hiding][27]:** Control field visibility per view without deleting data -- **[Descriptions][30]:** Add explanatory text to help users understand field purpose + - **[Sorting][27]:** Arrange rows by field values (A-Z, newest first, highest to lowest) + - **[Filtering][28]:** Show only rows matching specific field criteria + - **[Grouping][29]:** Organize rows into collapsible sections by field values + - **Pinning**: Lock columns to the left side of the screen so they remain visible while scrolling horizontally. + - **[Hiding][27]:** Control field visibility per view without deleting data + - **[Descriptions][30]:** Add explanatory text to help users understand field purpose These operations are view-specific; customize each view differently without affecting others or your underlying data. @@ -17156,7 +17182,7 @@ Still need help? If you're looking for something else, please feel free to make [3]: https://baserow.io/user-docs/collaborative-views [4]: https://baserow.io/user-docs/webhooks [5]: https://baserow.io/user-docs/view-customization - [6]: https://baserow.io/user-docs/date-and-time-fields",,baserow_user_docs,https://baserow.io/user-docs/guide-to-calendar-view + [6]: https://baserow.io/user-docs/date-and-time-fields",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-calendar-view 138,Create a table via import,create-a-table-via-import,Import data to Baserow to create a table,"# Import data to create a table Baserow's import feature converts your existing data into organized tables; bring your spreadsheets to life with database capabilities. @@ -20665,6 +20691,7 @@ While the [Baserow Database][1] handles your ""backend"" (storing and organizing You can use the Application Builder to design public-facing websites without writing code. Applications consist of pages, visual elements, and logic that connect directly to your tables. When a user interacts with an application (e.g., clicking a button), it can [trigger actions][2] like updating a row or sending a notification. +> [Kuma builds apps][3]. Describe what you want, and Kuma creates full applications with pages, elements, and data. ## Core concepts @@ -20672,11 +20699,11 @@ To build an application effectively, it is helpful to understand the five main c | Concept | Description | | :--- | :--- | -| **[Pages][3]** | Pages act like the screens of your application. An application can have multiple pages, each with its own URL path and settings. You manage these in the left sidebar. | -| **[Elements][4]** | These are the visual building blocks (e.g., headings, input fields, tables, buttons). You stack elements on a page to design the layout. | -| **[Data Sources][5]** | Data sources act as the bridge between your application and your database. They allow you to fetch, filter, and display records from specific Baserow tables. | +| **[Pages][4]** | Pages act like the screens of your application. An application can have multiple pages, each with its own URL path and settings. You manage these in the left sidebar. | +| **[Elements][5]** | These are the visual building blocks (e.g., headings, input fields, tables, buttons). You stack elements on a page to design the layout. | +| **[Data Sources][6]** | Data sources act as the bridge between your application and your database. They allow you to fetch, filter, and display records from specific Baserow tables. | | **[Events][2]** | Events define the logic of your app. For example, you can configure a ""Submit"" button to create a new row in your database or redirect a user to a different page. | -| **[Domains][6]** | To make your application accessible, you publish it to a domain. You can use a generic subdomain or connect your own custom domain name. | +| **[Domains][7]** | To make your application accessible, you publish it to a domain. You can use a generic subdomain or connect your own custom domain name. | ## Navigate the Application Builder @@ -20686,66 +20713,67 @@ The Application Builder interface is designed to be intuitive. Here is how to fi From your workspace homepage, select an existing application or click **+ Add new** -> **Application**. ### 2. The sidebar (Pages) -The left sidebar lists all [pages][3] within your application. Clicking a page name will load it into the center canvas for editing. +The left sidebar lists all [pages][4] within your application. Clicking a page name will load it into the center canvas for editing. ### 3. Top bar controls The top navigation bar contains your primary design tools: -* **[Elements][4]:** Add visual components to your page. -* **[Data][5]:** Configure which table data is available to the page. -* **[Page settings][3]:** Manage page paths and parameters. +* **[Elements][5]:** Add visual components to your page. +* **[Data][6]:** Configure which table data is available to the page. +* **[Page settings][4]:** Manage page paths and parameters. * **Device view:** In the center, toggle between **Desktop**, **Tablet**, and **Mobile** icons to preview how your application responds to different screen sizes. ### 4. Preview and Publish Located at the top right: - * **[Preview][7]:** See your application exactly as a user would, allowing you to test functionality without going live. - * **[Publish][7]:** Push your latest changes to the live production environment. + * **[Preview][8]:** See your application exactly as a user would, allowing you to test functionality without going live. + * **[Publish][8]:** Push your latest changes to the live production environment. ![Application Builder interface](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dc58410f-3ff7-41ac-89f7-1551d27c7943/Untitled%201.png) ## Frequently asked questions (FAQ) ### Is the Application Builder separate from the Database? -Yes and no. They are separate modules, but they are deeply integrated. The Application Builder sits on top of your [database][1], using your existing [tables][8] as the source of truth for data. +Yes and no. They are separate modules, but they are deeply integrated. The Application Builder sits on top of your [database][1], using your existing [tables][9] as the source of truth for data. ### Can I use my own domain name? -Yes. You can publish your application to a custom [domain][6] (e.g., `portal.yourcompany.com`) or use a default Baserow subdomain. +Yes. You can publish your application to a custom [domain][7] (e.g., `portal.yourcompany.com`) or use a default Baserow subdomain. ### Do I need to know how to code? No. The Application Builder is a visual, drag-and-drop tool. However, it offers advanced configuration options for formulas and filters if you need complex logic. ### How do I import an Application? -To [import][9] or [export][10] an Application, Database or Application Builder, you must import or export the Workspace file that contains it. Baserow exports are handled at the Workspace level. +To [import][10] or [export][11] an Application, Database or Application Builder, you must import or export the Workspace file that contains it. Baserow exports are handled at the Workspace level. ## Related content - * [Create your first application][11] - * [Overview of available Elements][4] - * [Connecting Data Sources][5] - * [Publishing an application][7] + * [Create your first application][12] + * [Overview of available Elements][5] + * [Connecting Data Sources][6] + * [Publishing an application][8] ---------- Still need help? If you’re looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. - - [Ask the Baserow community][12] - - [Contact support][13] for questions about Baserow or help with your account + - [Ask the Baserow community][13] + - [Contact support][14] for questions about Baserow or help with your account [1]: /user-docs/intro-to-databases [2]: /user-docs/element-events - [3]: /user-docs/pages-in-the-application-builder - [4]: /user-docs/elements-overview - [5]: /user-docs/data-sources - [6]: /user-docs/add-a-domain-to-an-application - [7]: /user-docs/preview-and-publish-application - [8]: /user-docs/intro-to-tables - [9]: https://baserow.io/user-docs/import-workspaces - [10]: https://baserow.io/user-docs/export-workspaces - [11]: /user-docs/create-an-application - [12]: https://community.baserow.io/ - [13]: https://baserow.io/contact",application builder,baserow_user_docs,https://baserow.io/user-docs/application-builder-overview + [3]: https://baserow.io/user-docs/build-applications-with-ai + [4]: /user-docs/pages-in-the-application-builder + [5]: /user-docs/elements-overview + [6]: /user-docs/data-sources + [7]: /user-docs/add-a-domain-to-an-application + [8]: /user-docs/preview-and-publish-application + [9]: /user-docs/intro-to-tables + [10]: https://baserow.io/user-docs/import-workspaces + [11]: https://baserow.io/user-docs/export-workspaces + [12]: /user-docs/create-an-application + [13]: https://community.baserow.io/ + [14]: https://baserow.io/contact",application builder,baserow_user_docs,https://baserow.io/user-docs/application-builder-overview 163,Create an application,create-an-application,Create a new application in Baserow,"# Create an application in Baserow Creating a new application in Baserow allows you to build a visual frontend for your databases. You can start from a blank canvas, duplicate an existing workflow, or install a pre-configured template to get started immediately. @@ -21966,10 +21994,13 @@ Learn more about [adding a data source][1]. Baserow provides flexible tools to organize your page structure. You can perform these actions using the mouse or [keyboard shortcuts][26]. ### Move and arrange elements + +Elements can be reordered within a container or moved across containers to adjust layouts without recreating elements. You can drag & drop inside the Application Builder. + To change the position of an element: 1. Select the element. 2. Use the **Up/Down arrows** in the toolbar to shift its order. -3. Alternatively, drag and drop the element to a new location. +3. Alternatively, move elements visually by dragging and dropping the element in a new location. ![Move element up and down][27] @@ -24041,7 +24072,7 @@ Still need help? If you're looking for something else, please feel free to make [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e83fb1b4-6547-437d-8652-d723fd83b35b/Paste%20a%20single%20value%20into%20all%20selected%20cells.jpg",row,baserow_user_docs,https://baserow.io/user-docs/paste-data-into-baserow-table 191,AI prompt field,ai-field,AI prompt field in Baserow table,"# AI prompt field in Baserow -The AI prompt field lets you generate text, summaries, classifications, and insights directly in your Baserow tables using dynamic prompts that reference other fields. It supports [multiple AI providers][1] and can process documents (PDF, DOCX, TXT, MD) for automated analysis. +The AI prompt field lets you generate text, summaries, classifications, and insights directly in your Baserow tables using dynamic prompts that reference other fields. It supports [multiple AI providers][1] and can process documents and images for automated analysis. > The AI prompt field is available on Premium plans and higher. [Upgrade your subscription](https://baserow.io/pricing) to access this feature. @@ -24051,7 +24082,7 @@ The AI prompt field transforms your Baserow tables into intelligent automation e These prompts can reference other fields in your table, making responses contextual and dynamic. Configure the model, temperature, and output format, then click generate in any row to produce AI-powered results. -## How it works +## Overview AI prompt fields use large language models (LLMs) to process prompts you create. Unlike simple text inputs, these prompts function like formulas. You can combine static text, field references, and data manipulation functions to guide the AI. @@ -24063,6 +24094,12 @@ Each cell includes a generate button that processes your prompt on demand. You c - Generate product descriptions from specifications - Extract key information from uploaded documents - Create personalized email drafts based on customer data + - extract text from documents or screenshots + - categorize files (e.g. receipts, assets, documents) + - update fields based on file content + - trigger automations using uploaded files + +The AI prompt field works with multiple files. You can include several files in one prompt and process them together. This makes it easier to process incoming files and turn them into structured data automatically. ![AI prompt field configuration interface][3] @@ -24108,13 +24145,15 @@ You have two ways to generate content: - **Single Row**: Click the **Generate** button in a specific cell to process just that item. Results appear in the cell once generation completes. - **Bulk Generation**: Click the **Generate all AI values** button in the [field header][6] to process every empty or outdated row in the view at once. +Once the data is in Baserow, you can use its built‑in views, filters, formulas, or further automations to analyze the information. + ![AI prompt field with generate button][7] ## Use AI with file fields ### Supported file formats -The AI prompt field can analyze text-based documents directly. This is ideal for extracting invoice numbers, summarizing contracts, or standardizing resumes. +The AI prompt field can analyze text-based documents directly. The AI field supports most [field types][2], PNG images, Single Line Text, Long Text, etc. This is ideal for extracting invoice numbers, summarizing contracts, or standardizing resumes. | Format | Extension | Common Use | |--------|-----------|------------| @@ -24122,6 +24161,7 @@ The AI prompt field can analyze text-based documents directly. This is ideal for | Markdown | `.md` | Documentation, articles | | PDF | `.pdf` | Invoices, reports, contracts | | Word | `.docx` | Documents, proposals | +| PNG | `.png` | Images | ### Setup file analysis @@ -24167,12 +24207,6 @@ Temperature controls response randomness: ![Regenerate when referenced fields change][9] -## Supported inputs - -The AI field supports most [field types][2], Single Line Text, Long Text, etc. - -Currently, the AI field cannot process images (OCR) or file attachments directly. For image analysis, use an external OCR service (such as Google Cloud Vision, AWS Textract, Azure Computer Vision, etc.) to process the receipt image, then import the extracted data back into Baserow. Once the data is in Baserow, you can use its built‑in views, filters, formulas, or further automations to analyze the receipt information. - ## Troubleshooting **The self-hosted version of Baserow has no AI prompt** @@ -24205,7 +24239,7 @@ Yes. Reference unlimited fields and select from your table's fields. Example: `C ### What happens if file analysis fails? -Common causes include unsupported file formats, corrupted files, or files exceeding the model's token limit. Ensure files are in supported formats (.txt, .md, .pdf, .docx) and under 10MB. Check error messages in the cell for specific guidance. +Common causes include unsupported file formats, corrupted files, or files exceeding the model's token limit. Ensure files are in [supported formats][11] and under 10MB. Check error messages in the cell for specific guidance. ### Can I bulk-generate results for multiple rows? @@ -24222,9 +24256,9 @@ Yes. You can generate all AI values in one go by clicking the **Generate all AI - [Premium pricing plans](/user-docs/pricing-plans) - Upgrade for AI prompt field access ## Tutorials - - [How to enable and configure the AI field in Baserow][11] - - [How to transform data into actionable insights with Baserow AI][12] - - [How to use Baserow AI to analyze documents][13] + - [How to enable and configure the AI field in Baserow][12] + - [How to transform data into actionable insights with Baserow AI][13] + - [How to use Baserow AI to analyze documents][14] --- @@ -24241,9 +24275,10 @@ Yes. You can generate all AI values in one go by clicking the **Generate all AI [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e9472557-303b-4107-a77e-bc14a622b0d7/File%20field%20support%20for%20the%20AI%20field.png [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5edffc08-d308-470b-b6a0-7614f6123217/AI%20field-1.png [10]: https://baserow.io/docs/installation/configuration - [11]: https://baserow.io/blog/configure-ai-field-in-baserow - [12]: https://baserow.io/blog/transform-data-into-insights-with-baserow-ai - [13]: https://baserow.io/blog/use-baserow-ai-analyze-documents",field,baserow_user_docs,https://baserow.io/user-docs/ai-field + [11]: https://baserow.io/user-docs/ai-field#supported-file-formats + [12]: https://baserow.io/blog/configure-ai-field-in-baserow + [13]: https://baserow.io/blog/transform-data-into-insights-with-baserow-ai + [14]: https://baserow.io/blog/use-baserow-ai-analyze-documents",field,baserow_user_docs,https://baserow.io/user-docs/ai-field 192,Repeat element,application-builder-repeat-element,Repeat element in Baserow Application Builder,"# Application Builder - Repeat element @@ -24966,7 +25001,7 @@ Still need help? If you're looking for something else, please feel free to make [3]: https://baserow.io/user-docs/collaborative-views [4]: https://baserow.io/user-docs/webhooks [5]: https://baserow.io/user-docs/view-customization - [6]: https://baserow.io/user-docs/date-and-time-fields",,baserow_user_docs,https://baserow.io/user-docs/guide-to-timeline-view + [6]: https://baserow.io/user-docs/date-and-time-fields",view,baserow_user_docs,https://baserow.io/user-docs/guide-to-timeline-view 228,Data sync,data-sync-in-baserow,Create a table in Baserow using data sync,"# Create a Baserow table via data sync Data synchronization ensures your external data is consistent and up-to-date across multiple platforms and tables. Perfect for dashboards and unified reporting. @@ -26420,19 +26455,17 @@ The MCP server supports all standard CRUD operations through natural language pr - Enter a descriptive name (e.g., ""Marketing Database Assistant"") - Select the workspace you want to connect to, then create the endpoint. -**3. Choose your LLM client** +**3. Copy your MCP URL** +Baserow will generate a unique endpoint URL. **Treat this URL as a password**; it grants full access to modify data in your workspace. + +**4. Configure your LLM client** +Follow the specific configuration instructions for your chosen LLM (detailed in sections below) After you create the endpoint, click **More Details** to view configuration options Select from the available options: - Claude - Cursor - Windsurf -**4. Copy your MCP URL** -Baserow will generate a unique endpoint URL. **Treat this URL as a password**; it grants full access to modify data in your workspace. - -**5. Configure your LLM client** -Follow the specific configuration instructions for your chosen LLM (detailed in sections below) - ## Configure your LLM client ### Claude Desktop @@ -26543,7 +26576,7 @@ While powerful, AI interpretations depend on model quality and prompt clarity. A **Still need help?** If you have questions about MCP Server setup or usage, visit the [Baserow community](https://community.baserow.io) or [contact support](/contact). - [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d5d74fe1-99e2-4bb6-80bf-993c7b177dfa/MCP%20server.png",,baserow_user_docs,https://baserow.io/user-docs/mcp-server + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d5d74fe1-99e2-4bb6-80bf-993c7b177dfa/MCP%20server.png",mcp,baserow_user_docs,https://baserow.io/user-docs/mcp-server 362,Field permissions,field-level-permissions,Field level permissions in Baserow table,"# Field-level permissions Field-level permissions work alongside Baserow's role hierarchy (workspace → database → table) as an additional security layer. Members who can access a table may still be restricted from editing certain fields based on their role level. @@ -27243,22 +27276,22 @@ Self-hosted licensing makes it easy to control user access and costs while maint Baserow self-hosted offers three license types: Premium, Advanced, and Enterprise. Each has different seat management and scaling approaches. -> [Visit this page][5] to learn more about purchasing a self-hosted license. +> [Visit this page][1] to learn more about purchasing a self-hosted license. ## Overview Self-hosted Baserow licenses determine how paid features are distributed to users in your instance. You can change between plans as your needs evolve. -Self-hosted licenses also support [instance ID changes][3], allowing you to transfer licenses between different servers, migrate to new infrastructure without losing licensing, and maintain licensing continuity during deployment changes. +Self-hosted licenses also support [instance ID changes][2], allowing you to transfer licenses between different servers, migrate to new infrastructure without losing licensing, and maintain licensing continuity during deployment changes. -![Access Manage Licenses page][6] +![Access Manage Licenses page][3] ## License type comparison -The admin [subscribes per seat][1] and manually assigns users to seats. Mixing free and billable users within the same instance makes it possible to have multiple licenses in one instance and pay only for users who need upgraded features. The key difference lies in seat assignment. +The admin [subscribes per seat][4] and manually assigns users to seats. [Mixing free and billable users within the same instance][5] makes it possible to have multiple licenses in one instance and pay only for users who need upgraded features. The key difference lies in seat assignment. Understanding these differences helps you choose the right approach for your organization's size, budget, and administrative preferences. @@ -27268,7 +27301,7 @@ Premium self-hosted licenses provide precise control over which users access pai ### Advanced self-hosted licenses -Advanced self-hosted licenses grant paid access to users on your instance, simplifying administration while providing [comprehensive features][4]. +Advanced self-hosted licenses grant paid access to users on your instance, simplifying administration while providing [comprehensive features][6]. ### Enterprise licenses @@ -27282,7 +27315,7 @@ Enterprise licensing requires direct consultation with Baserow's sales team to e If you disconnect a license while it's active, the related users won’t have access to the plan anymore. It will effectively remove the license. - Learn more: [Manage self-hosted licenses][3] + Learn more: [Manage self-hosted licenses][2] ## Frequently asked questions @@ -27298,7 +27331,7 @@ No, you cannot combine different license types. Each instance must use a single ### How do license transfers work between instances? -You can [change the instance ID][3] associated with your subscription, allowing license transfer between different server deployments as your infrastructure needs evolve. +You can [change the instance ID][2] associated with your subscription, allowing license transfer between different server deployments as your infrastructure needs evolve. ### Can I have some users on free and others on self-hosted? @@ -27306,11 +27339,11 @@ Yes, billable and free users can collaborate in the same workspaces as license i ### What if I need to change my instance ID? -You can [modify the instance ID][3] associated with your subscription through the baserow.io subscription management interface. This supports server migrations and infrastructure changes. +You can [modify the instance ID][2] associated with your subscription through the baserow.io subscription management interface. This supports server migrations and infrastructure changes. ### Do I need to restart my instance after license installation? -License activation typically requires an instance restart to enable paid features and apply new configurations. Learn more about [getting started with self-hosted licensing][5]. +License activation typically requires an instance restart to enable paid features and apply new configurations. Learn more about [getting started with self-hosted licensing][1]. Ready to upgrade your self-hosted Baserow instance? Visit the [Baserow pricing page](https://baserow.io/pricing) to compare plans and features. @@ -27330,12 +27363,12 @@ Still need help? If you're looking for something else, please feel free to make - [Contact support](/contact) for questions about Baserow or help with your account. - [1]: https://baserow.io/user-docs/subscriptions-overview - [2]: https://baserow.io/user-docs/buying-a-subscription - [3]: https://baserow.io/user-docs/getting-and-changing-the-instance-id - [4]: https://baserow.io/user-docs/pricing-plans - [5]: https://baserow.io/user-docs/get-a-licence-key - [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2b06ac5c-d68d-451f-a5ca-021a0193701c/Access%20Manage%20Licenses%20page.jpg",hosting,baserow_user_docs,https://baserow.io/user-docs/self-hosted-licenses + [1]: https://baserow.io/user-docs/get-a-licence-key + [2]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2b06ac5c-d68d-451f-a5ca-021a0193701c/Access%20Manage%20Licenses%20page.jpg + [4]: https://baserow.io/user-docs/subscriptions-overview + [5]: https://baserow.io/user-docs/subscriptions-overview#mix-free-and-paid-users + [6]: https://baserow.io/user-docs/pricing-plans",hosting,baserow_user_docs,https://baserow.io/user-docs/self-hosted-licenses 426,Cancel subscription,cancel-subscriptions,Cancel Baserow subscription,"# How to cancel your Baserow subscription In this section, we'll cover how to cancel your Baserow subscription. When you cancel, [paid features][1] continue working until your next scheduled payment date, but no refunds are provided for unused time. @@ -27432,7 +27465,7 @@ If you're looking for something else or need further assistance with your Basero [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d32255fb-252e-46ab-9709-2490c92bff89/License%20update%20interface.jpg [5]: https://baserow.io/user-docs/buying-a-subscription [6]: https://baserow.io/user-docs/subscriptions-overview - [7]: https://baserow.io/user-docs/get-a-licence-key",,baserow_user_docs,https://baserow.io/user-docs/cancel-subscriptions + [7]: https://baserow.io/user-docs/get-a-licence-key",billing,baserow_user_docs,https://baserow.io/user-docs/cancel-subscriptions 427,Update payment method,update-payment-methods,Update payment method in Baserow,"# How to update payment method in Baserow Baserow's unified billing system lets you update payment methods for any subscription type through a single interface. Whether you're running Baserow in the cloud or self-hosting your instance, all payment management happens through the same secure portal. @@ -27532,7 +27565,7 @@ If you're looking for something else or need further assistance with your Basero [6]: https://baserow.io/user-docs/buying-a-subscription [7]: https://baserow.io/user-docs/get-a-licence-key [8]: https://baserow.io/user-docs/change-a-paid-subscription - [9]: https://baserow.io/user-docs/getting-and-changing-the-instance-id",,baserow_user_docs,https://baserow.io/user-docs/update-payment-methods + [9]: https://baserow.io/user-docs/getting-and-changing-the-instance-id",billing,baserow_user_docs,https://baserow.io/user-docs/update-payment-methods 458,Generative AI,configure-generative-ai,Configure AI models in Baserow,"# Configure generative AI in Baserow Baserow integrates with multiple AI providers (OpenAI, Anthropic, Ollama, OpenRouter, Mistral) to power the [AI field][1] and generative features. @@ -27905,6 +27938,8 @@ Handle empty fields explicitly: ""If `Field` is blank, return 'N/A'."" Baserow Automation lets you build custom, no-code workflows that automatically perform tasks when specific events occur in your database. Connect triggers and actions to automate data entry, send notifications, and integrate external services, all without writing a single line of code. +You can [install templates][1] that include workflows. This makes it easier to reuse automation setups and get started faster with common use cases. + ## Overview Baserow Automation makes it easy to save time and streamline your database management by connecting triggers and actions into seamless, repeatable processes. @@ -27913,7 +27948,7 @@ With workflow automation, you can automatically perform tasks based on specific Automations support formulas and variables, giving you more control and flexibility. Use formulas in conditions and router nodes (for example, only run if `priority = ""High""` and `due_date = today()`), or pass data between steps with automation variables to reuse results later in the workflow. -![Image showing Baserow workflow automation][1] +![Image showing Baserow workflow automation][2] ### How automation is structured @@ -27935,8 +27970,8 @@ Every workflow starts with a trigger and continues with one or more actions. | Node type | Function | Position in workflow | Can be deleted? | |-----------|----------|---------------------|----------------| -| **[Trigger][2]** | The starting event that initiates the workflow | Always first | No, only replaced | -| **[Action][3]** | A task that reads/modifies records, interacts with tables, or controls workflow flow | Follows the trigger | Yes | +| **[Trigger][3]** | The starting event that initiates the workflow | Always first | No, only replaced | +| **[Action][4]** | A task that reads/modifies records, interacts with tables, or controls workflow flow | Follows the trigger | Yes | **Example workflow:** When a new customer row is created (Trigger) → Send a welcome email (Action) → Add them to a mailing list (Action). @@ -27955,7 +27990,7 @@ You can also click **Start test run** to test the entire workflow. Test runs mus > Workflows do not run in **Draft** mode. All new workflows start in the **Draft** state by default. Your automation will not process any data until you explicitly click the Publish button in the top right corner of the workflow editor. -Learn more: [Publishing and Managing Workflows][4] +Learn more: [Publishing and Managing Workflows][5] ### Workflow history @@ -27970,7 +28005,7 @@ The History tab logs all workflow executions, both successful and failed. Use th 3. Select **Automation** from the dropdown menu 4. (Optional) Click the ellipsis beside the automation name and select **Rename** to give it a descriptive name or **Duplicate** to create a copy of an automation. -> Learn more about [how snapshots work in Baserow][5]. +> Learn more about [how snapshots work in Baserow][6]. ### Building your workflow @@ -27999,9 +28034,9 @@ Baserow workflows allow you to automate complex tasks within your database. Howe You must publish your workflow for it to begin processing real data. Baserow workflow publishing turns your drafted logic into active, always-on automation without complex deployment steps. -Learn more: [Publishing and managing workflows][4] +Learn more: [Publishing and managing workflows][5] -![image Baserow router automation][6] +![image Baserow router automation][7] ## Frequently asked questions @@ -28042,12 +28077,13 @@ Still need help? If you're looking for something else, please feel free to make - [Contact support](/contact) for questions about Baserow or help with your account. - [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cc7a3dde-3ad3-4ae8-9776-bd1cebf1d9c1/Baserow%20workflow%20automation.jpg - [2]: https://baserow.io/user-docs/automation-triggers - [3]: https://baserow.io/user-docs/automation-actions - [4]: https://baserow.io/user-docs/workflow-management - [5]: https://baserow.io/user-docs/snapshots - [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/14d8595d-2484-458a-b77b-dc25018110b1/Baserow%20router%20automation.jpg",automation,baserow_user_docs,https://baserow.io/user-docs/workflow-automation + [1]: https://baserow.io/templates + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cc7a3dde-3ad3-4ae8-9776-bd1cebf1d9c1/Baserow%20workflow%20automation.jpg + [3]: https://baserow.io/user-docs/automation-triggers + [4]: https://baserow.io/user-docs/automation-actions + [5]: https://baserow.io/user-docs/workflow-management + [6]: https://baserow.io/user-docs/snapshots + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/14d8595d-2484-458a-b77b-dc25018110b1/Baserow%20router%20automation.jpg",automation,baserow_user_docs,https://baserow.io/user-docs/workflow-automation 525,Workflow triggers,automation-triggers,Baserow workflow triggers,"# Workflow triggers: How to start an automation Triggers are the starting point of every Baserow workflow. They define when your automation runs, whether on a schedule, when data changes in your tables, or when external services send requests. Configure your trigger first, then build actions that respond to it. @@ -28543,6 +28579,8 @@ Learn more about [Baserow database tokens][10]. This action allows your workflow to automatically notify users, teams, or customers when specific events occur. It sends emails using your configured SMTP settings, enabling immediate communication from your automation. +> Automations can use a pre-configured SMTP server when [self-hosting][11]. This removes the need to configure email settings for each automation individually, while still allowing custom configurations when needed. + **Configuration:** **SMTP configuration for email actions** @@ -28578,7 +28616,7 @@ Common use cases include welcoming new users after registration, sending order c ### AI Prompt -The AI Prompt node connects to [generative AI models][11] to execute prompts, analyze data, or generate content directly within your workflow. This allows you to build powerful automations that can summarize text, categorize customer feedback, translate languages, or generate email replies based on your Baserow data. +The AI Prompt node connects to [generative AI models][12] to execute prompts, analyze data, or generate content directly within your workflow. This allows you to build powerful automations that can summarize text, categorize customer feedback, translate languages, or generate email replies based on your Baserow data. **Configuration:** @@ -28588,7 +28626,7 @@ To use the AI Prompt, you must first configure an AI integration. * Click the **AI integration** dropdown. If you have already set up AI in your workspace, you can select it here. * To add a new one, click **Add new integration**. A modal will appear. - * **Workspace AI Settings:** By default, new integrations inherit [settings from your workspace][11]. You can override specific AI providers with different API keys or models if needed. + * **Workspace AI Settings:** By default, new integrations inherit [settings from your workspace][12]. You can override specific AI providers with different API keys or models if needed. * Click **Create** to save the integration. 2. **Configure AI action:** @@ -28695,7 +28733,7 @@ The condition formula isn't returning a boolean value or has syntax errors. Test ### I’m trying to create a new row, but I’m getting an error or no response. -This usually happens when your workspace has reached its row limit. Check your current plan to confirm that it allows additional rows. If the workspace has exceeded its row limit, you’ll need to either delete some rows to stay within your plan’s limit or upgrade your plan to continue adding new rows. Learn more about [Baserow pricing plan and limits][12]. +This usually happens when your workspace has reached its row limit. Check your current plan to confirm that it allows additional rows. If the workspace has exceeded its row limit, you’ll need to either delete some rows to stay within your plan’s limit or upgrade your plan to continue adding new rows. Learn more about [Baserow pricing plan and limits][13]. ## Related content @@ -28726,8 +28764,9 @@ Still need help? If you're looking for something else, please feel free to make [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f1b84bbf-6bb8-463b-ad37-3f9af542b9bd/Baserow%20router%20automation.jpg [9]: https://api.slack.com/apps [10]: https://baserow.io/user-docs/personal-api-tokens - [11]: https://baserow.io/user-docs/configure-generative-ai - [12]: https://baserow.io/user-docs/pricing-plans",automation,baserow_user_docs,https://baserow.io/user-docs/automation-actions + [11]: https://baserow.io/user-docs/set-up-baserow + [12]: https://baserow.io/user-docs/configure-generative-ai + [13]: https://baserow.io/user-docs/pricing-plans",automation,baserow_user_docs,https://baserow.io/user-docs/automation-actions 527,Publish & manage workflow,workflow-management,Baserow Workflow settings and management,"# Manage workflow automation in Baserow Automation management gives you full control over the lifecycle of your workflows, from initial testing to real-time, published execution. @@ -29128,37 +29167,48 @@ Kuma is a powerful builder's assistant. You can ask it to perform a wide range o Instead of manually [creating tables][5] and [adding each field][6], you can describe what you need to Kuma. Kuma will build the database for you, complete with relevant fields, views, and relationships. **Examples:** -* `""Create a project management table.""` -* `""Add a 'Priority' single select field with options for High, Medium, and Low to my 'Tasks' table.""` -* `""Create a new table to track customer orders and link it to my 'Customers' table.""` +* ""Create a project management table."" +* ""Add a 'Priority' single select field with options for High, Medium, and Low to my 'Tasks' table."" +* ""Create a new table to track customer orders and link it to my 'Customers' table."" ### Write formulas Stop trying to remember complex syntax. Describe the calculation you need, and Kuma will write the formula for you. It can [create a new Formula field][7] or update an existing one instantly. **Examples:** -* `""Write a formula that calculates the number of days until the deadline.""` -* `""I need a formula that combines the 'First Name' and 'Last Name' fields.""` -* `""Create a formula that shows 'Overdue' if the due date is in the past and the status isn't 'Done'.""` +* ""Write a formula that calculates the number of days until the deadline."" +* ""I need a formula that combines the 'First Name' and 'Last Name' fields."" +* ""Create a formula that shows 'Overdue' if the due date is in the past and the status isn't 'Done'."" ### Organize and manage your data Use plain language to quickly [manage your data views][8]. Kuma can [create new views][9] or modify your current view by adding filters, sorting rules, or grouping. **Examples:** -* `""Create a new Grid view in my 'Tasks' table called 'High Priority Tasks'.""` -* `""In this view, only show me rows where the status is 'To-Do' and the priority is 'High'.""` -* `""Group this view by the 'Assignee' field.""` -* `""Sort this view by the 'Due Date' field, from earliest to latest.""` +* ""Create a new Grid view in my 'Tasks' table called 'High Priority Tasks'."" +* ""In this view, only show me rows where the status is 'To-Do' and the priority is 'High'."" +* ""Group this view by the 'Assignee' field."" +* ""Sort this view by the 'Due Date' field, from earliest to latest."" ### Search the documentation -If you're unsure how a feature works or where to find a setting, just ask Kuma. It can search the Baserow documentation and walk you through the steps directly in the chat. +If you're unsure how a feature works or where to find a setting, ask Kuma. It can search the Baserow documentation and walk you through the steps directly in the chat. + +**Examples:** +* ""Explain how to use automations."" +* ""How do I set up a form view?"" +* ""What's the difference between a lookup and a rollup field?"" + +### Build full applications + +Kuma goes beyond helping with databases and automations; it can [build complete, working applications][10]. Describe what you want in plain language, and Kuma will generate application pages, connect data sources, add forms, and apply styling. **Examples:** -* `""Explain how to use automations.""` -* `""How do I set up a form view?""` -* `""What's the difference between a lookup and a rollup field?""` +* ""Create an app with a task list page, a task detail page, and a form page to add tasks."" +* ""Create a contact form and store submissions."" +* ""Change the layout to two columns and add a header with navigation."" + +[Learn more about building apps with Kuma ->][11] ## View your chat history @@ -29178,7 +29228,7 @@ The Kuma AI assistant is part of the newer AI features introduced in Baserow 2.0 If you’re on an older version or your deployment doesn’t yet include the Kuma UI or AI settings, you’ll need to upgrade to a release that includes the AI assistant features and configure your AI provider options. -Learn more about [Baserow AI-Assistant: Quick DevOps Setup][10]. This guide shows how to enable the AI-assistant in Baserow, configure the required environment variables, and turn on knowledge-base lookups via an embeddings server. +Learn more about [Baserow AI-Assistant: Quick DevOps Setup][12]. This guide shows how to enable the AI-assistant in Baserow, configure the required environment variables, and turn on knowledge-base lookups via an embeddings server. ## Frequently Asked Questions (FAQs) @@ -29220,7 +29270,9 @@ Still need help? If you're looking for something else, please feel free to make [7]: /user-docs/formula-field-overview [8]: /user-docs/view-customization [9]: /user-docs/create-custom-views-of-your-data - [10]: /docs/installation/ai-assistant",workspace,baserow_user_docs,https://baserow.io/user-docs/ai-assistant + [10]: https://baserow.io/user-docs/application-builder-overview + [11]: https://baserow.io/user-docs/build-applications-with-ai + [12]: /docs/installation/ai-assistant",workspace,baserow_user_docs,https://baserow.io/user-docs/ai-assistant 623,Two-factor auth,two-factor-auth,Two-factor authentication in Baserow,"# Two-factor authentication (2FA) Two-factor authentication (2FA) adds an extra layer of security to your Baserow account. In addition to your password, you will need to provide a unique verification code generated by an authenticator app on your phone to log in. @@ -29299,9 +29351,7 @@ Still need help? If you're looking for something else, please feel free to make - [Ask the Baserow community](https://community.baserow.io) - [Contact support](/contact) for questions about Baserow or help with your account",account management,baserow_user_docs,https://baserow.io/user-docs/two-factor-auth -656,Power BI integration,power-bi-integration,Baserow Power BI integration,"# Power BI integration - -Integrate Baserow with Power BI to visualize your database data. +656,Power BI integration,power-bi-integration,Baserow Power BI integration,"# Visualize Power BI data in Baserow You’ve built a database in Baserow. Your data is organized, your workflows are automated, and everything is running smoothly. But now you need to visualize that data in Power BI dashboards. @@ -30053,7 +30103,7 @@ By the end of this guide, you will have: - A flow that sends an email from Baserow data. - A way to trigger flows instantly using Webhooks. -![Build a Baserow custom connector in Power Automate][1] + ## Integration Architecture @@ -30072,6 +30122,8 @@ You can use generic HTTP requests, but it requires you to write JSON code every - **Baserow account:** You need a [Token](https://baserow.io/user-docs/personal-api-tokens). Baserow distinguishes between Data actions (which use the Database Token) and User/File actions (which require a JWT User Token). - **[Power Automate](https://learn.microsoft.com/en-us/flow/sign-up-sign-in)** account with access to make flows. +![Build a Baserow custom connector in Power Automate][1] + ## Configuration guide integrating Baserow into the Microsoft Power Platform via OpenAPI To create a custom connector, you must define the API you want to connect to so that the connector understands the API's operations and data structures. @@ -30324,6 +30376,1901 @@ Still need help? If you're looking for something else, please feel free to make [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/231e249c-91c2-4f40-9cf8-c40ac904a151/The_connector_definition.jpg [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7f81b7fe-4f13-4a60-8942-bf533c119184/Define_the_Actions.jpg [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9771c2c2-0469-4fa5-92bd-40323a0d57cf/Test_the_Connection.jpg",integrations,baserow_user_docs,https://baserow.io/user-docs/power-automate-integration +722,Baserow AI Security,baserow-ai-security,Baserow AI Security & Data Governance,"# Baserow AI Security & Data Governance + +Baserow’s AI architecture is built on the fundamental principles of security, sovereignty, flexibility and user control. + +**This whitepaper provides a transparent technical explanation of how Baserow protects your data across both hosting environments, detailing our encryption standards, data flow paths, and retention policies.** + +## Section 1. Executive Summary + +Artificial Intelligence has fundamentally changed how organizations manage data, offering the ability to transform natural language into complex formulas, summarize vast datasets, and automate insights instantly. However, the adoption of generative AI brings critical questions regarding data privacy, residency, and ownership. + +At Baserow, we believe that using AI tools should never require sacrificing control over your data. Unlike rigid SaaS platforms that force all data through a central processing funnel, Baserow offers a dual-governance model designed for flexibility: + +- **For Cloud Users (SaaS):** A secure, managed enterprise proxy that ensures GDPR compliance and ease of use. +- **For Self-Hosted Users:** Data travels directly from your infrastructure to the AI provider, ensuring Baserow never sees, logs, or processes your AI content. + +![Some of the AI functionality at Baserow][1] + +## Section 2. Shared Security Foundation + +*This section details the security measures and policies that apply to all Baserow users, regardless of deployment type.* + +Baserow's AI architecture is designed to support two distinct operational models. Baserow allows you to configure the data path, the model provider, and the security boundary according to your organization's specific compliance requirements. + +### 2.1 ""Bring Your Own Key"" (BYOK) Architecture + +Central to our architecture is the Bring Your Own Key (BYOK) architecture. Rather than purchasing AI credits, Baserow allows you to connect your workspace directly to your preferred AI providers, including OpenAI, Anthropic, Mistral, OpenRouter, and Ollama. + +This approach offers three critical security and operational benefits: + +- **Direct Contract:** You are not subject to a secondary sub-processor agreement for AI data. Your data privacy terms exist directly between your organization and the AI provider (e.g., OpenAI Enterprise). +- **Granular Governance (Instance vs. Workspace):** Administrators can enforce global policies at the Instance Level (applying to the entire instance), while individual teams can override these for supported features at the Workspace Level to use specific models or API keys. +- **Model Transparency:** You control exactly which model version is being used, preventing unexpected changes in output quality. + +![Baserow allows you to connect specific models globally or per workspace, ensuring you control the data pipe.][2] + +*Baserow allows you to connect specific models globally or per workspace, ensuring you control the data pipe.* + +### 2.2 API Key Management & Storage + +Baserow offers flexible credential management to suit your security posture. Depending on your deployment model, you can manage API keys at two distinct levels: + +- **Workspace-Level Keys (Cloud & Self-Hosted):** Users can enter keys directly into the Workspace settings to enable AI for specific teams. These keys are stored in your database to allow the application to authenticate requests on your behalf. +- **Instance-Level Keys (Self-Hosted):** For maximum security, self-hosted administrators can configure API keys globally using **Environment Variables** on the server. This method keeps keys out of the application database entirely, ensuring they are managed purely at the infrastructure level. + +### 2.3 Encryption in Transit + +Regardless of the deployment model, Baserow enforces strict standards to protect data integrity. + +All data transmission, whether between the User and the Baserow Server, or the Baserow Server and the AI Provider, is encrypted using **TLS/SSL (Transport Layer Security)**. This ensures that API keys, prompts, and generated formulas are protected against interception while traveling over the network. + +### 2.4 No Training on Customer Data + +A fundamental concern for any enterprise adopting AI is the risk of intellectual property leakage. Baserow provides a definitive stance on model training: + +- **Zero Training by Baserow:** Baserow B.V. does not use customer data (prompts, outputs, or table content) to train, fine-tune, or improve our internal models or the models of our providers. Simply using the AI features does not grant us the right to learn from your data. +- **Provider Isolation:** When using our Cloud or Self-Hosted ""Bring Your Own Key"" models, your data is processed under the API usage policies of the respective provider (e.g., OpenAI, Anthropic). These enterprise API agreements typically guarantee that data sent via the API is not used to train their foundation models. + +### 2.5 User Feedback & Model Improvement + +Baserow believes that quality improvement should never come at the cost of data privacy. + +We distinguish strictly between General Model Training and User-Initiated Feedback. + +- **Active Feedback Loop (Opt-In):** Users can voluntarily help improve the accuracy of the AI assistant by using the Thumbs Up / Thumbs Down controls on specific AI outputs. +- **Anonymization:** If you choose to provide this feedback, Baserow collects only the specific prompt and response associated with that rating. These samples are stripped of user identifiers before being used for quality analysis. +- **Purpose (Prompt Engineering):** This feedback is used exclusively for **Prompt Optimization,** refining the system instructions and logical constraints we send to the LLM to ensure better formatting and reasoning in the future. + +### 2.6 Ephemeral Processing + +Your data is sent strictly for processing and is not cached or stored by Baserow’s AI layer. + +- **Ephemeral Processing:** Inputs sent to the model provider are used solely to generate the response. +- **Stateless Interaction:** Once the response is returned to Baserow, the provider does not retain a long-term copy of your table data. + +### 2.7 User Control & Review Workflows + +Baserow is designed to ensure you remain the architect of your data. We distinguish between Interactive Workflows, where you review output, and Automated Workflows, where you verify logic. + +- **Interactive Preview:** When generating formulas or summarizing text manually, the output is presented as a preview. You must explicitly click ""Create Field"" or ""Save"" to commit the data. +- **On-Demand Execution:** Generative content in tables executes upon your request. It triggers only when a user explicitly clicks the ""Generate"" button for a specific row, runs a batch action, or asks the AI assistant to ""Build a table”. +- **Automated Workflows:** For fully automated workflows (e.g., ""When a form is submitted, summarize the request""), the human control lies in the configuration phase. You define the prompt and the trigger conditions upfront. The AI executes autonomously based on your pre-validated logic, ensuring speed without sacrificing predictability. + + Control here lies in the **Testing Phase**. We recommend testing AI prompts on sample data before activating the automation to ensure the outputs are consistent and reliable. + + +### 2.8 Improving Accuracy via Model Selection + +Unlike many SaaS competitors that lock users into a single one-size-fits-all model, Baserow empowers you to control the intelligence level of your assistant. + +- **Model Swapping:** Baserow allows you to switch between models to balance cost, speed, and intelligence. Users are not locked into a single model version. You can configure specific models for specific tasks. +- **Complex Reasoning:** If you find that a standard model is struggling with complex reasoning or specific formula syntax, users can switch the specific field or workspace to a more capable models to instantly improve accuracy and reasoning capabilities. +- **Routine Tasks:** For simple summarization or translation, users can configure lighter, faster models to optimize for speed and cost. +- **Specialized Models:** Organizations can even connect to specialized or fine-tuned models relevant to their specific industry (e.g., medical or legal data) via compatible API endpoints. +- **Temperature Control:** Users can adjust the Temperature setting for each prompt directly in the UI. For tasks requiring strict logic (like formula generation), we recommend setting the Temperature setting to `0`. For creative tasks (like brainstorming marketing copy), a higher setting (e.g., `0.7` to `1.0`) allows for more variety. + +## Section 3. Cloud Environment (SaaS) + +*This section outlines the security architecture specific to the managed Baserow Cloud environment, detailing how our secure proxy handles tenant isolation, data residency, and system monitoring.* + +For users on `baserow.io`, we provide a managed, enterprise-grade proxy that ensures security without the overhead of server management. + +### 3.1 Secure Proxy & Tenant Isolation + +Cloud requests are routed through Baserow’s secure intermediary layer before reaching the model provider. + +- **Tenant Isolation:** AI requests are authenticated at the start of every transaction. The AI service has no direct database access; it must request data via Baserow's internal APIs, which enforce strict permission checks, ensuring User A’s context is never accessible to User B. +- **Data Residency:** Both Baserow's core servers and our primary LLM processors are hosted in Europe (`eu-central-1` zone), ensuring alignment with GDPR requirements. +- **API Key Safety:** When you enter API keys into Baserow, they are stored securely in your database. For Cloud users, these keys are protected by our enterprise-grade infrastructure. + +### 3.2 Retention within Baserow (Logs & History) + +To support essential features like Undo/Redo and conversation history, Baserow temporarily stores prompt and output logs on Cloud (SaaS). + +Logs are stored securely for 6 months to enable users to view their request history and provide feedback to answers. These logs are protected by Baserow’s strict tenant isolation protocols. + +### 3.3 Usage Data & System Monitoring + +To maintain service reliability and prevent platform abuse, Baserow collects specific metadata regarding feature usage. It is critical to distinguish between Operational Metrics and Content Logging. + +**A. Operational Metrics (Collected)** + +Baserow collects aggregated, non-content telemetry to monitor system health and billing usage. This includes: + +- **Volume Metrics:** The number of AI requests made per workspace, token usage counts, and error rates (e.g., 500 Internal Server Errors). +- **Feature Adoption:** Boolean flags indicating which features are enabled (e.g., ""AI Field Enabled: True"") to help our product teams understand feature popularity. +- **Performance Data:** Latency logs (e.g., ""Request took 400ms"") to optimize API response times. + +*Note: This data is strictly numerical and structural. It does not contain the text of your prompts or the data in your rows.* + +**B. Content Logging (Restricted)** + +*Content refers to the specific text inputs (prompts), row data, and AI-generated outputs.* + +**No Passive Logging:** We do not silently log prompt content for general analytics or marketing research. + +**C. Abuse Monitoring & Exceptions** + +Automated systems may monitor usage volumes to prevent platform abuse (e.g., DDoS or spam generation). + +As a Cloud provider, we reserve the right to retain temporary logs of prompt content only if triggered by automated security systems (e.g., detection of DDoS patterns or injection attacks). Access to these specific security logs is strictly limited to authorized personnel and is retained only for the duration of the investigation before permanent deletion. + +![Visualizes cloud requests routed through Baserow's secure intermediary layer before reaching the model provider][3] + +*Visualizes cloud requests routed through Baserow's secure intermediary layer before reaching the model provider* + +## Section 4. Self-Hosted Environment + +*This section details the governance controls available exclusively to Self-Hosted Enterprise users, focusing on the Direct-to-Provider architecture, air-gapped capabilities, and infrastructure sovereignty.* + +For organizations with strict data sovereignty requirements (e.g., Healthcare, Finance, Government, Defence), Baserow offers a Bring Your Own Key (BYOK) architecture. + +### 4.1 **Direct-to-Provider Connection** + +The defining feature of Baserow’s Self-Hosted AI is the Direct-to-Provider Connection. In this configuration, Baserow removes itself from the data loop entirely. + +When a user on a self-hosted instance triggers an AI action, the request is constructed locally on your infrastructure. The data packet travels directly from your server to the AI provider’s API endpoint via an encrypted channel. + +- **No Proxying:** The data does not route through `api.baserow.io` or any Baserow-controlled cloud servers. +- **Zero Visibility:** Because the traffic moves directly from your infrastructure (e.g., your AWS VPC or on-premise server) to the AI Provider, Baserow B.V. has no technical visibility into your prompts, data, or outputs. You retain full ownership of the API keys and the data flow. +- **Firewall & Network Control:** Outbound traffic is limited strictly to the domains of the providers you configure. If you do not configure an external provider, no outbound AI traffic is possible. Local LLM deployments do not require domain or port whitelisting, while external APIs require customers to identify and whitelist necessary domains. + +### 4.2 Air-Gapped & Local AI (Ollama) + +For organizations with the strictest data classifications, such as Defence, Healthcare, or Finance, Baserow supports Ollama, allowing you to run Large Language Models (LLMs) within your own local network. + +- **Zero Egress:** When using Ollama, your data never leaves your infrastructure. The model runs on your own hardware (e.g., `llama2`, `mistral`), allowing for a completely offline AI stack. +- **Host Configuration:** You provide the hostname of your local Ollama server in the instance settings. This typically runs locally on your own device. + +### 4.3 Granular Retention Control (Logs & History) + +Baserow Self-Hosted offers absolute sovereignty over log retention. + +- **Direct Database Access:** Prompts and generated outputs are stored in your local PostgreSQL database. This gives your DevOps team the flexibility to implement custom retention policies via SQL maintenance jobs (e.g., purging logs every 30 days for strict compliance, or keeping them for 1 year for auditing). +- **No Vendor Lock-in:** Because the data resides on your infrastructure, Baserow B.V. cannot enforce arbitrary deletion schedules or retain data beyond your desired scope. + +### 4.4 Abuse Monitoring + +In a self-hosted environment, Baserow B.V. has zero access to your data. We cannot perform abuse monitoring or human review of your prompts because the traffic never touches our servers. Your internal compliance team retains full authority over auditing usage. + +### 4.5 API Key Safety (**Infrastructure Sovereignty**) + +For self-hosted instances, API keys are stored within your internal PostgreSQL database. You retain complete sovereignty over your credential storage. + +Because Baserow does not impose a proprietary encryption layer that could complicate key rotation or recovery, the security of these keys is fully governed by your infrastructure controls. We recommend securing your database volume with Disk-Level Encryption (e.g., LUKS, AWS EBS Encryption) and restricting database access to authorized internal subnets only to ensure credentials remain secure. + +![Visualizes a user's request originating in the internal network, passing through the internal Baserow Server, and connecting directly to the External AI Provider (or Local Ollama instance)][4] + +Visualizes a user's request originating in the internal network, passing through the internal Baserow Server, and connecting directly to the External AI Provider (or Local Ollama instance) + +## Section 5. Data Scope & Responsible Use + +*This section clarifies the technical limitations and specific data payloads for each AI tool, outlining how to balance the probabilistic nature of Large Language Models (LLMs) with Baserow's deterministic controls.* + +At Baserow, we design AI tools to act as a capable co-pilot, not an autopilot. We believe that while AI should accelerate your workflow, the final decision and data integrity must always remain in your hands. + +### 5.1 AI as a Probabilistic Tool + +Generative AI models operate based on probability and statistical patterns, not absolute truth. While they are powerful engines for productivity, it is critical to understand their inherent characteristics: + +- **Hallucinations:** Models may occasionally produce plausible-sounding but incorrect information. This is particularly relevant when generating complex formulas or summarizing technical data. +- **Contextual Limits:** The AI only knows what is explicitly provided in the payload. It does not know your entire business history unless that context is included in the specific input or row data. + +### 5.2 Tool-Specific Data Context + +To ensure responsible usage, it is critical to understand exactly what data is transmitted to the AI provider for each specific feature. Baserow minimizes data exposure by sending only the context required for the requested task. + +**A. Formula Generation** + +- **Purpose:** Translating natural language into technical formula syntax (e.g., converting ""calculate days between due date and today"" into a Baserow formula). +- **Data Payload:** + - **Prompt:** The user's text description of the desired logic. + - **Schema Context:** A list of column names and their field types (e.g., ""Due Date (Date field)"", ""Status (Single Select)""). + - **No Row Data:** Crucially, **no actual cell data or row content is sent** for formula generation. The AI only requires the *structure* of your table to write the syntax. + +![The Formula Generator offers a preview of the syntax before you apply it, ensuring logic is verified by a human.][5] + +The Formula Generator offers a preview of the syntax before you apply it, ensuring logic is verified by a human. + +**B. AI Field (Generative Content)** + +- **Purpose:** Generating new content (e.g., translation, summarization, or text generation) based on specific row inputs. +- **Data Payload:** + - **Prompt:** The specific instructions (e.g., ""Summarize this feedback""). + - **Targeted Row Data:** Only the data from the specific columns referenced in the prompt is sent. + - **Single Row Isolation:** Processing occurs on a row-by-row basis. The AI does not see data from Row B while processing Row A, ensuring context isolation. + +![Configuring an AI Field. Note the ability to select specific models and define the prompt context for row-level operations.][6] + +Configuring an AI Field. Note the ability to select specific models and define the prompt context for row-level operations. + +**C. Table Analysis & Summarization (Kuma AI)** + +- **Purpose:** Answering broad questions about a dataset (e.g., ""What are the top 3 recurring issues in this view?""). +- **Data Payload:** + - **Full View Context:** Unlike the row-by-row AI field, this tool analyzes the **entire visible view**. + - **Hidden Columns:** **Warning:** Data from hidden columns *is* included in the payload to ensure the AI has full context for accurate reasoning. Warning: Ensure that hidden columns do not contain sensitive PII (Personally Identifiable Information) that you do not wish to share with the AI provider. + - **Batching Limits:** To handle large datasets, the AI assistant retrieves data in batches (currently up to 100 rows per request). However, this is a batching limit, not a hard cap on total analysis. The tool can process multiple batches sequentially, provided the total dataset fits within the model's context window. For extremely large tables exceeding the context window, we recommend filtering the view first to target specific subsets of data. + +![The AI Assistant analyzes your current view to provide high-level insights, summaries, and data cleaning suggestions.][7] + +The AI Assistant analyzes your current view to provide high-level insights, summaries, and data cleaning suggestions. + +### 5.3 Data Types & Content Filtering + +- **No File Analysis for Kuma AI assistant:** Currently, file attachments (PDFs, Images) within cells are ignored and not sent to the AI for table analysis. +- There is an option in the AI field to reference a file field. If the user sets up an OpenAI model, they can select a file field to use together with the prompt. In that case, files will be sent, while in every other case they won’t be sent or analyzed. +- **Raw Data Transmission:** Baserow does not pre-process or redact data before sending it to the LLM. Data is sent exactly as it exists in the cell. Users should exercise caution and avoid including sensitive personal data (PII) in fields targeted for AI processing unless their internal compliance policies allow it. +- **Bias and Safety:** When using providers like OpenAI or Anthropic, built-in enterprise safety filters help prevent the generation of harmful, biased, or inappropriate content. We encourage users to review AI outputs for potential bias, especially when using AI to draft external communications or analyze qualitative human feedback. + +## Section 6. Use Cases, Best Practices & Limitations + +*This section provides strategic guidance on best practices for high-value AI workflows while establishing clear boundaries regarding high-risk decision-making and verification.* + +To get the most value out of Baserow AI while maintaining data integrity, we recommend adhering to these defined use cases and awareness of current limitations. + +### **6.1 Recommended Use Cases** + +Baserow AI is optimized for productivity tasks that involve transforming, summarizing, or generating structured data based on your existing records. + +- **Formula Generation:** Rapidly constructing complex formulas (e.g., `if` statements, date calculations) by describing the desired logic in plain English. This reduces the need to memorize syntax. +- **Content Summarization:** Condensing long-form text (e.g., customer feedback, meeting notes) into concise summaries for easier reporting. +- **Data Cleaning & Standardization:** Analyzing inconsistent data entries and suggesting a standardized format (e.g., formatting phone numbers or normalizing addresses). +- **Translation:** Translating cell content into different languages for localization or cross-regional collaboration. +- **Categorization/Tagging:** Automatically assigning tags or categories to rows based on text analysis (e.g., tagging support tickets as ""Urgent,"" ""Bug,"" or ""Feature Request""). +- **Generative App Builder:** Creating full database schemas from a prompt. + +### **6.2 Limitations & Exclusions** + +Baserow AI is a productivity enhancer, not a substitute for professional judgment or critical infrastructure verification. + +- **Not for High-Risk Decision Making:** Do not rely solely on AI outputs for critical decisions involving legal compliance, medical diagnosis, financial auditing, or safety-critical engineering calculations. Always verify these outputs manually. +- **Contextual Limits:** The AI operates strictly on the data provided in the specific prompt and selected row context. It does not see your entire database schema or cross-reference hidden tables unless explicitly configured to do so. +- **Mathematical Precision:** Large Language Models are text prediction engines, not calculators. While they can write formulas *for* you, asking them to perform direct arithmetic on large numbers within a text prompt can sometimes yield inaccuracies. We recommend using the AI to *write the formula* (which Baserow then executes mathematically) rather than asking the AI to *calculate the answer* directly. +- **Real-Time Data:** Unless connected to a model with web-browsing capabilities (which depends on your chosen provider), the AI does not have access to real-time external events (e.g., current stock prices or breaking news). + +## Section 7. Trust Resources & Provider Policies + +*This section provides verification resources, compliance documentation, and direct links to the commercial privacy policies of our AI partners.* + +As organizations accelerate their adoption of Generative AI, the need for robust security, transparency, and data sovereignty has never been greater. Baserow is committed to proving that you do not need to choose between powerful AI capabilities and strict data control. + +By offering a dual-architecture model, secure Cloud SaaS for agility and Self-Hosted for absolute sovereignty, we ensure that the security boundary remains where it belongs: within your control. Whether you are generating complex formulas or analyzing sensitive datasets, our platform is designed to provide the utility of modern AI with the assurance that your data remains invisible to us and fully under your command. + +We invite you to audit our security practices, review our open-source codebase, and deploy Baserow with the confidence that your AI strategy is built on a foundation of transparency. + +### 7.1 Trust Resources + +For deeper technical details on our security posture, compliance certifications, and data handling practices, please consult our official documentation: + +- **Baserow Security Portal:** A comprehensive overview of our security standards, including GDPR compliance, penetration testing results, and ISO certifications. + - [Visit the Baserow Security Hub](https://baserow.io/product/security) +- **Developer Documentation:** Technical guides on configuring Self-Hosted instances, managing environment variables for AI (BYOK), and setting up secure API connections. + - [View Developer Docs](https://baserow.io/docs/) +- **Open Source Repository:** At Baserow, we believe in building in the open. As a fully open-source platform, our community, contributors, and developers have always been central to our growth. Security teams can audit by reviewing our source code on GitHub. + - [Follow and star us on GitHub](https://github.com/baserow/baserow) + +### 7.2 Provider-Specific Privacy Commitments + +Baserow connects exclusively to the **Enterprise/Commercial** APIs of our model providers. Unlike consumer free-tier accounts, these commercial agreements explicitly prohibit the use of your data for model training. + +We encourage security teams to verify these policies directly via the providers' official trust portals: + +- **OpenAI Enterprise Privacy:** + - **Policy:** ""We do not train our models on your business data (data from ChatGPT Team, ChatGPT Enterprise, or our API Platform)."" [OpenAI Enterprise Privacy Portal](https://openai.com/enterprise-privacy/) +- **Anthropic Commercial Terms:** + - **Policy:** ""By default, we will not use your inputs or outputs from our commercial products (e.g. Claude for Work, Anthropic API) to train our models."" [Anthropic Commercial Privacy Center](https://privacy.claude.com/en/articles/7996868-is-my-data-used-for-model-training) +- **Mistral AI Commercial Terms:** + - **Policy:** Commercial API data is processed with strict retention limits and is excluded from training pipelines under standard commercial terms. [Mistral AI Legal & Privacy Hub](https://legal.mistral.ai/terms/privacy-policy) + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c9a93a84-be5c-42fb-a438-0bc215059b4a/image.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/84c9727f-65d4-4286-8984-bdd3b35cfdc3/image%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e2fd3016-20df-42f1-88a1-60e4b1983c58/image%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2a4763df-4a7a-4c18-b0ef-7358208962bb/image%203.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/62eddd4b-d47a-423c-ac51-4cf04f8ace49/image%204.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d58d7999-6fff-460e-b1d2-a0b0ab00817b/image%205.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b05ac8f6-0132-4169-a7d8-8f55b5bee689/image%206.png",getting started,baserow_user_docs,https://baserow.io/user-docs/baserow-ai-security +755,Tally integration,tally-integration,Tally and Baserow integration,"# Capture incoming Tally data in Baserow + +Integrating Baserow and Tally creates a high-performance data capture pipeline without requiring middleware or custom scripts. + +This guide focuses on using Baserow Automations to receive standardized JSON payloads directly from Tally Webhooks. + +## How it works + +Webhooks send notifications to Baserow when triggered by a new form submission. When someone submits a Tally form, a notification containing the response data gets sent to the Baserow URL in JSON format via a `POST` request. + +You can treat Baserow as a plug-and-play listener that captures incoming Tally data and maps it to your existing database schema. + +### Core Architecture + +1. **Trigger (Tally):** A form submission fires an HTTP POST request containing a JSON payload. +2. **Listener (Baserow):** A unique webhook URL generated by Baserow Automations receives this request. +3. **Action (Baserow):** Baserow parses the JSON and maps ""Field A"" from Tally to ""Column A"" in your table. + +## Part 1: Baserow Listener Setup + +This step creates the mailbox where Tally will send its data. + +1. **Create the Automation:** In your Baserow table, go to the **Automations** tab and create a new workflow. +2. **Configure the Trigger:** Select the **""Receive an HTTP request (webhook)""** trigger. + - **Label:** Give it a descriptive name (e.g., ""Incoming Tally Submissions""). + - **Allowed HTTP methods:** Select **`POST`** (exclude GET for security). +3. **Generate the URL:** Baserow will provide a unique Webhook URL. **Copy this URL** immediately; you will need it for the Tally configuration. + +![Baserow Listener Setup][1] + +With webhooks, you can instantly send a Tally form submission to Baserow after the trigger. This instant notification lets you build automated workflows to take action on form entries. + +## Part 2: Tally Webhook Configuration + +Now, tell Tally where to send its responses. + +1. **Access Integrations:** Open your published Tally form and navigate to the **Integrations** tab. +2. **Connect Webhook:** Select **Connect to Webhooks**. +3. **Paste Endpoint URL:** Paste the URL you copied from Baserow into the **Endpoint URL** field. +4. **Security (Optional):** You can add a signing secret or custom HTTP headers to verify that the request originated from Tally. + + By using a signing secret, the webhook requests will contain a **`Tally-Signature`** header. The value of this header is a SHA256 cryptographic hash of the webhook payload. + +5. **Publish:** Save the integration. Tally will now send a JSON notification every time the form is submitted. + +![Tally Webhook Configuration][2] + +You will see the active webhook URLs in your published Tally form dashboard. You can connect unlimited webhook URLs and pause them by clicking the toggle. + +## Part 3: Mapping the Data + +To make the integration functional, you must map the Tally JSON fields to your Baserow columns. + +### Step 1: Capture Sample Data + +Submit a test response through your Tally form. In the Baserow automation builder, click **""Test event""**. Baserow will capture the incoming Tally JSON, which typically follows this structure: + +```json +`{ + ""data"": { + ""formName"": ""Customer Feedback"", + ""fields"": [ + { ""label"": ""Full Name"", ""value"": ""Jane Doe"" }, + { ""label"": ""Email"", ""value"": ""jane@example.com"" } + ] + } +}` +``` + +### Step 2: Create Row Action + +Add a **""Create Row""** action to your Baserow automation. + +- **Target Table:** Select the table where data should be stored. +- **Dynamic Mapping:** Instead of typing values, use the blue **""+"" icon** to select data from the Tally payload. + - *Example:* Map `fields[0].value` from the JSON to your **Name** column. + +## Alternative: Direct API Method + +If you prefer not to use webhooks, you can connect the two using a serverless function or middleware acting as a bridge. + +- **Tally:** The [Tally API](https://developers.tally.so/api-reference/introduction) follows REST principles and is accessible only via HTTPS. For security reasons, unencrypted HTTP requests are not allowed. The Base URL for all API endpoints is: `https://api.tally.so` +- **Bridge Side:** A script (Node.js, Python, etc.) receives the Tally data and makes a **Direct API Call** to Baserow. +- **Baserow API Call:** + + ```json + `curl -X POST ""https://api.baserow.io/api/database/rows/table/{table_id}/?user_field_names=true"" \ + -H ""Authorization: Token YOUR_DATABASE_TOKEN"" \ + -H ""Content-Type: application/json"" \ + -d '{""Full Name"": ""Jane Doe"", ""Email"": ""jane@example.com""}'` + ``` + + +### Why choose one over the other? + +- **Baserow Automations:** Best for no-code stability. It handles the parsing and mapping within the UI. +- **Direct API:** Best for complex logic. Use this if you need to transform the data (e.g., calculating a score or cleaning text) before it is stored in the database. + +## Enterprise Use Case: Scalable Lead Intake + +In an enterprise environment, Tally is often used for high-volume lead capture. By connecting it directly to Baserow: + +- **Stability:** Tally employs a retry mechanism if the Baserow endpoint is temporarily unavailable (retrying after 5 min, 30 min, up to 1 day). +- **Efficiency:** Using webhooks avoids the rate limits associated with API polling (100 requests per minute). +- **Automation:** Once data is in Baserow, it can trigger secondary enterprise actions like Slack notifications or CRM updates. + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/95900598-6c1f-4366-8864-8f18714e1bb1/Baserow%20Listener%20Setup.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f48a382b-266b-4c1e-93b0-1352116a0629/Tally%20Webhook%20Configuration.png",integrations,baserow_user_docs,https://baserow.io/user-docs/tally-integration +788,Figma integration,figma-integration,Baserow and Figma integration,"# Sync Figma design and track design activity + +Design and Data usually live in silos. Designers work in [Figma](https://www.figma.com/), while product data, copy, and project statuses live in Baserow. Traditionally, teams use plugins to bridge this gap, but plugins rely on the designer manually opening them and clicking ""Sync."" + +Connecting Baserow to Figma allows teams to use a single source of truth for design content, UI copy, or asset management. Whether you are populating mockups with real data or tracking design progress in a database, this integration streamlines the Design Ops lifecycle. + +This guide covers how to sync data from your Baserow tables into Figma layers. + +### Key Use Cases + +- **Dynamic Content Mockups:** Replace ""Lorem Ipsum"" with real product names, prices, or descriptions from Baserow. +- **Design System Management:** Store design token values (colors, spacing, etc.) in Baserow and reference them in Figma. +- **Asset Tracking:** Use Baserow to manage status, assignees, and feedback for Figma frames or components. + +## The Architecture + +The Enterprise Infrastructure approach uses the Figma REST API directly. This allows you to push data from Baserow into Figma Variables programmatically, or pull design activity logs into Baserow for project management. + +We will focus on two core infrastructure patterns: + +1. **Data Sync (Baserow → Figma):** Managing ""Design Tokens"" (Colors, Copy, Numbers) in Baserow and syncing them to **Figma Variables** via the REST API. +2. **Activity Logging (Figma → Baserow):** Using **Figma Webhooks** to log comments and file updates into Baserow for a master project view. + +> **Why this is better than a plugin:** Plugins can break if the designer forgets to run them or if the plugin author stops maintaining it. This script interacts directly with the Figma server. It works even if no one has the file open. +> + +## Pattern A: Variables Sync **(Baserow → Figma)** + +Instead of designers manually typing hex codes or copy, they bind their design layers to Figma Variables. Baserow acts as the database for these variables. When Marketing updates a price or a tagline in Baserow, a script pushes that update directly to Figma. + +### Use Cases + +- **Localization:** Manage text strings for different languages in Baserow columns. +- **Theming:** Manage color tokens (Light Mode / Dark Mode) in Baserow. +- **Product Data:** Manage live pricing or inventory numbers that appear in design mocks. + +### 1. Prerequisites + +- **Figma Personal Access Token:** Personal access tokens allow you to access your own data via the API. From the Figma file browser, click the account menu in the top-left corner and select **Settings** → **Security** tab. In the **Personal access tokens** section, click **Generate new token** to open the configuration modal. +- **Baserow Database Token.** + + > Do not give out your tokens to anybody who you don't want to access your files. + > +- **Figma File Key:** Found in the URL of your design file (e.g., `figma.com/{file_type}/{file_key}/{file_name}`). The file key is the alphanumeric value that appears between the file type and the file name in the URL. + +You can now use the token to make requests to the Figma API. You can do so by passing the token to the API in the `X-Figma-Token` header of your request. + +### 2. The Bridge Script + +Since [Figma's API](https://developers.figma.com/docs/rest-api/variables-endpoints/#get-published-variables-endpoint) is passive, you need a Runner (like a GitHub Action or a simple Cron script) to move the data. + +**The Workflow:** + +1. **`GET`** data from Baserow (e.g., a ""Brand Assets"" table). +2. **`POST`** updates to Figma's `/v1/files/:file_key/variables` endpoint. + + The `POST /v1/files/:file_key/variables` endpoint lets you bulk create, update, and delete variables and variable collections. + + +```python +import requests + +# Configuration +BASEROW_API_URL = ""https://api.baserow.io/api/database/rows/table/YOUR_TABLE_ID/"" +FIGMA_API_URL = ""https://api.figma.com/v1/files/YOUR_FILE_KEY/variables"" +HEADERS_BASEROW = {""Authorization"": ""Token YOUR_BASEROW_TOKEN""} +HEADERS_FIGMA = {""X-Figma-Token"": ""YOUR_FIGMA_TOKEN"", ""Content-Type"": ""application/json""} + +def sync_design_tokens(): + # 1. Fetch ""Single Source of Truth"" from Baserow + response = requests.get(BASEROW_API_URL, headers=HEADERS_BASEROW, params={""user_field_names"": ""true""}) + data = response.json() + + # Initialize the list to hold all our value updates + value_updates = [] + + # 2. Iterate through rows and prepare Figma updates + for row in data['results']: + variable_id = row['Figma Variable ID'] # e.g., ""VariableID:123"" + mode_id = row['Figma Mode ID'] # e.g., ""1:0"" (Required by Figma) + new_value = row['Value'] # e.g., ""Welcome Home"" + + # 3. Append to our update list using Figma's required schema + value_updates.append({ + ""variableId"": variable_id, + ""modeId"": mode_id, + ""value"": new_value + }) + + # 4. Construct the final payload and push to Figma + payload = { + ""variableModeValues"": value_updates + } + + # 5. Make the atomic POST request + response = requests.post(FIGMA_API_URL, headers=HEADERS_FIGMA, json=payload) + + if response.status_code == 200: + print(f""Successfully updated {len(value_updates)} variable values!"") + else: + print(f""Failed to update variables. Error: {response.status_code}"") + print(response.json()) + +sync_design_tokens() +``` + +Figma expects specific data types (Strings, Numbers, or RGBA Objects). Your script acts as the translator between how you store data in Baserow and how Figma expects to receive it. + +## Pattern B: Project Tracking (Figma → Baserow) + +If you want to track work rather than content, use **Figma Webhooks**. This allows Baserow to act as a live activity feed for your design operations. + +Webhooks allow you to observe when specific events happen in files. For example: a collaborator comments on a file, or you add a new version to a file's history. + +> Creating webhooks is a Tier 2 operation. Ensure your Personal Access Token was generated with the `webhooks:write` scope selected. +> + +### Use Case + +- **Design QA:** When a new comment is added to a file, create a ""Task"" in Baserow. +- **Version Control:** When a file is ""Published"" (Library update), log the version history in Baserow. + +| **Event Type** | **Best Use Case** | **Key Data Sent to Baserow** | +| --- | --- | --- | +| `FILE_COMMENT` | **Design QA:** Capture feedback and turn it into actionable tasks. | Comment text, @mentions, and timestamp. | +| `DEV_MODE_STATUS_UPDATE` | **Handoff Tracking:** Know exactly when a frame is ""Ready for Dev."" | Node ID, Status (READY_FOR_DEV), and Change Message. | +| `LIBRARY_PUBLISH` | **Version Control:** Log when a design system component is updated. | List of created/modified components and variables. | + +### 1. Set up the Baserow Automation + +1. Create a **""Design Log""** table in Baserow. +2. Create an Automation: **Trigger:** ""Receive an HTTP request (webhook)"". +3. Copy the **Webhook URL**. + +### 2. Create the Figma Webhook + +You must register your listener via a `POST` request. You can run this command from your terminal or a tool like Postman. + +Use the [POST Webhook endpoint](https://developers.figma.com/docs/rest-api/webhooks-endpoints/#webhooks-v2-post-endpoint) to attach a webhook to a context. By default, this webhook will automatically send a `PING` event to the endpoint when it is created. This means your webhook is working and will receive any updates. + +**Command to track Comments:** + +Create a new webhook which will call the specified endpoint when the event triggers. This tells Figma: *""Whenever a file is updated, tell Baserow.""* + +```json +curl -X POST https://api.figma.com/v2/webhooks \ +-H ""X-Figma-Token: YOUR_PERSONAL_ACCESS_TOKEN"" \ +-H ""Content-Type: application/json"" \ +-d '{ + ""event_type"": ""FILE_COMMENT"", + ""context"": ""file"", + ""context_id"": ""YOUR_FILE_KEY"", + ""endpoint"": ""YOUR_BASEROW_WEBHOOK_URL"", + ""passcode"": ""my_secure_secret"", + ""status"": ""ACTIVE"", + ""description"": ""Sync Figma comments to Baserow Task Log"" +}' +``` + +If you want to track **all** files in a project or team, change the context to `project` or `team` and use the corresponding ID. + +> Set a `passcode`. When Figma sends data to Baserow, it will include this string. You can use it in Baserow to verify that the request actually came from Figma and not a random source. +> + +### 3. Map the Figma Payload to Baserow + +When a designer leaves a comment, Figma sends a complex JSON payload. You need to map these specific fields in your Baserow Automation: + +- **Triggering User:** `triggered_by.handle` → *Assignee* +- **The Message:** `comment[0].text` → *Task Description* +- **Direct Link:** `https://www.figma.com/file/YOUR_FILE_KEY?node-id=...` → *URL Field* + +### 4. Troubleshooting Common Issues + +- **401 Unauthorized:** Ensure your Database Token has ""Write"" permissions if you are pushing data from Figma. Check that you included the word `Token` before your Baserow database token in the header. +- **The 30-Minute Rule:** If you use the `FILE_UPDATE` event, remember it only fires after **30 minutes of inactivity**. If you want instant logging, stick to `FILE_COMMENT`. +- **Verification:** Use the `GET /v2/webhooks/:webhook_id/requests` endpoint to see a log of every time Figma tried to talk to Baserow. +- **Color Formatting:** Figma variables expect colors in RGBA decimal format (e.g., `{""r"": 1, ""g"": 0.5, ""b"": 0, ""a"": 1}`) rather than Hex codes. Ensure your Baserow values match the expected type. + +# **Resources** + +- [Figma webhooks documentation](https://www.figma.com/developers/api#webhooks-v2-endpoints) +- [**Baserow webhooks**](https://baserow.io/user-docs/webhooks) +- **Baserow [Database tokens](https://baserow.io/user-docs/personal-api-tokens)** + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",integrations,baserow_user_docs,https://baserow.io/user-docs/figma-integration +789,GitLab integration,gitlab-integration,Baserow + GitLab Integration,"# Connect Baserow with GitLab + +Engineering teams live in GitLab. GitLab handles everything from source code management to CI/CD pipelines and security scanning. + +Product and Operation teams live in Baserow. + +Integrating **Baserow** with **GitLab** is a favorite among engineering teams because both are open-source and API-first. When these tools are disconnected, stakeholders pester engineers for status updates, and engineers waste time manually updating tracking tickets. + +Using both gives velocity and visibility: + +- **GitLab** automates the technical execution (Build, Test, Deploy). Engineers handle Merge Requests and Pipelines. +- **Baserow** manages the business visibility (Sprint priorities, Client deliverables, Release Notes, Approvals, Scope, Launch Comms). Product Managers and Release Leads track releases, ensuring that what is being built matches what was promised to customers. + +This integration is typically used to automate issue tracking, manage CI/CD data, or provide a user-friendly interface for technical repository data. + +## Integration Methods + +### **Method A: Low-Code Automation** + +This is the most common method for syncing data between the two platforms. + +1. **Trigger:** An event occurs (e.g., ""New Row in Baserow"" or ""New Issue in GitLab""). +2. **Action:** The automation tool maps the data and sends it to the other app. +3. **Authentication:** You will need a **Baserow Database Token** and a **GitLab Personal Access Token (PAT)**. + +### **Method B: Native Webhooks** + +Best for lightweight, one-way notifications without an intermediary tool. + +- **From Baserow to GitLab:** Configure a Baserow Webhook to ping a GitLab ""Trigger Token"" URL to start a pipeline. +- **From GitLab to Baserow:** Use a GitLab Webhook (System or Project) to send payload data to a Baserow Webhook URL to log events. + +## Key Use Cases + +- **External Issue Tracking:** Non-technical stakeholders submit bugs to a Baserow Form, which automatically creates a GitLab Issue. +- **Release Management:** Track deployment statuses in Baserow and trigger GitLab CI/CD pipelines when a row is marked ""Ready to Deploy."" +- **Audit Logging:** Automatically log every successful GitLab pipeline run into a Baserow table for long-term reporting. +- **OAuth 2.0 SSO:** Use GitLab to log into your self-hosted Baserow instance. + +| **Area** | **In GitLab** | **In Baserow** | +| --- | --- | --- | +| **Release Management** | Pipelines deploy code to Staging/Production environments based on tags (e.g., `v2.4.0`). | Release Managers plan the content of `v2.4.0`, track ""Go/No-Go"" approvals from Legal/Marketing, and generate the changelog. | +| **Incident Response** | Developers work on ""Incidents"" to fix production outages. | The SRE team maintains an ""Incident Ledger"" in Baserow, tracking Mean Time to Resolution (MTTR), impact analysis, and generating post-mortem PDF reports. | +| **Feature Flags** | Engineers implement feature flags in code to toggle functionality. | Product teams control the rollout percentage in Baserow. A webhook syncs the Baserow ""Rollout %"" field directly to the application config. | +| **Compliance & Audit** | GitLab stores the commit history and pipeline logs. | Baserow stores the ""Change Request"" forms required by auditors, linking specific GitLab commits to business approvals for SOX/ISO compliance. | + +## Pipeline Loop + +The most robust way to connect these tools is by linking a **Baserow Row ID** to a **GitLab Pipeline**. + +1. **The Trigger:** Baserow sends a Webhook containing a `Row ID` to GitLab. +2. **The Context:** GitLab accepts this ID and stores it as a variable for the duration of the pipeline. +3. **The Feedback:** When the pipeline finishes (pass or fail), GitLab uses that ID to write the status back to the specific row in Baserow. + +This guide defines the **Infrastructure Bridge** between the two. Instead of replacing your current workflow, we will add a ""Listener"" to your GitLab pipelines and a ""Dispatcher"" to your Baserow tables. + +## Prerequisites + +- **GitLab:** A project with CI/CD enabled and Maintainer access. +- **Baserow:** A Database Token with `Write` permissions. + +## Step 1: Configure the Handshake (Authentication) + +Both tools need permission to talk to each other. + +1. **In Baserow:** Go to **Settings → Database Tokens**. Create a new token with **Write** permissions. Copy it. +2. **In GitLab:** Go to **Settings → CI/CD → Variables**. + - Add a new variable: `BASEROW_TOKEN`. + - Paste your token as the Value. + - Check ""Mask variable"" (to hide it in logs). + +## Step 2: The Listener (GitLab Configuration) + +We will add a ""Trigger Job"" to your existing `.gitlab-ci.yml` file. This job only runs when Baserow asks it to. It acts as a wrapper around your existing scripts. + +Add this block to your `.gitlab-ci.yml`: + +```python +`baserow_trigger_job: + stage: deploy + image: badouralix/curl-jq + rules: + # Only run this job if triggered by the API (e.g., via Baserow Webhook) + - if: $CI_PIPELINE_SOURCE == ""trigger"" + script: + # 1. READ: Capture the Row ID sent by Baserow + - export ROW_ID=$(cat $TRIGGER_PAYLOAD | jq -r '.items[0].id') + + # 2. WRITE: Tell Baserow ""I started working"" + # Replace [YOUR_TABLE_ID] with the ID from your URL + - | + curl -X PATCH \ + -H ""Authorization: Token ${BASEROW_TOKEN}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""In Progress"", ""GitLab Job ID"": ""'""$CI_PIPELINE_ID""'""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${ROW_ID}/?user_field_names=true"" + + # 3. EXECUTE: Run your existing deployment or test scripts here + - echo ""Running existing workflows..."" + - ./your_deploy_script.sh + + # 4. FINISH: Tell Baserow ""I am done"" + - | + curl -X PATCH \ + -H ""Authorization: Token ${BASEROW_TOKEN}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Done"", ""Deploy Link"": ""'""$CI_PIPELINE_URL""'""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${ROW_ID}/?user_field_names=true""` +``` + +> Check your webhook's 'Last Trigger' in Baserow to see the exact JSON structure. +> + +### Understanding the Logic + +- **`$TRIGGER_PAYLOAD`**: When Baserow calls GitLab, it sends the row data. GitLab saves this in a temporary file. We use `jq` to extract the `id` of the row that triggered the event. +- **`curl -X PATCH`**: This is the universal way to update Baserow. We use the `ROW_ID` we captured to ensure we update the *exact* record that requested the build. + +## Step 3: Baserow Configuration + +Now that GitLab is listening, we need to set up Baserow to shout. + +1. **Generate a Trigger Token in GitLab:** + - Go to **Settings → CI/CD → Pipeline triggers**. + - Add a trigger (e.g., ""Baserow""). + - Copy the generated **Webhook URL** (e.g., `https://gitlab.com/api/...token=TOKEN`). +2. **Create the Webhook in Baserow:** + - Go to your Baserow table. + - Click **Webhooks** in the table menu. + - **URL:** Paste the GitLab Webhook URL. + - **Method:** `POST`. + - **Trigger Event:** Choose what starts the process (e.g., ""Row Created"" or ""Row Updated""). + +## Universal Application + +This architecture works regardless of your specific columns. You just need to map the fields in the `curl` command to your actual column names. + +| **Your Use Case** | **Baserow Trigger** | **GitLab Action** | +| --- | --- | --- | +| **Release Management** | Row created in ""Releases"" table. | Run `deploy_prod.sh` and update Baserow status to ""Live"". | +| **Report Generation** | Status changed to ""Generate Report"". | Run a Python script to build a PDF and upload the link back to Baserow. | +| **User Provisioning** | ""New Employee"" row added. | Run a script to create accounts and paste the temp password back into Baserow. | + +## FAQ + +**Can I update multiple columns at once?** + +Yes. In the `curl` data (`-d`), you can include as many field:value pairs as you like, such as `{""Status"": ""Done"", ""deployed_at"": ""2024-01-01""}`. + +**How do I handle errors?** + +Add an `after_script` to your GitLab job. This runs even if the main script fails, allowing you to send a `{""Status"": ""Failed""}` update back to Baserow so your team knows something went wrong. + +```python +after_script: + - | + if [ ""$CI_JOB_STATUS"" != ""success"" ]; then + curl -X PATCH -H ""Authorization: Token ${BASEROW_TOKEN}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Failed""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${ROW_ID}/?user_field_names=true"" + fi +``` + +## Summary + +Stakeholders; Marketing, Sales, and Leadership; rarely have access to (or understanding of) the complex pipelines and merge requests inside GitLab. Baserow is the structured operational layer, handling release schedules, compliance auditing, and stakeholder reporting. + +You have successfully demonstrated the **Closed-Loop Automation** pattern: + +1. **Request:** Source sends ID + Data. +2. **Acknowledge:** Target updates Source to ""In Progress."" +3. **Process:** Target runs internal logic. +4. **Resolve:** Target updates Source to ""Done"" or ""Failed."" + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",integrations,baserow_user_docs,https://baserow.io/user-docs/gitlab-integration +790,GitHub integration,github-integration,Baserow and GitHub integration,"# Bridge Baserow data with GitHub engineering workflows + +GitHub is where technical execution happens (code, issues, deployments). Baserow is where business context lives (roadmaps, client approvals, onboarding checklists). + +GitHub is where code lives. Baserow is where the *business logic* surrounding that code lives. + +GitHub handles the code, version control, and issue tracking. However, for non-technical stakeholders; like Product, Sales, and Success teams; GitHub's ""Pull Requests"" and ""Commit Hashes"" are opaque. + +Baserow handles the structured roadmap, resource allocation, and cross-functional reporting. It translates technical progress into business status, handling roadmap prioritization, client communication, and release approvals. + +Both tools are API-first. GitHub’s REST API (and GraphQL) allows for deep manipulation of repositories, issues, and pull requests. Baserow’s API handles the structured metadata that surrounds that code; deadlines, client priorities, and sprint planning. + +Using both gives you a combination of code and context: + +- [**GitHub**](https://github.com/dashboard) handles the technical execution (commits, diffs, branches). +- [**Baserow**](http://baserow.io) handles the business logic (roadmap priorities, client reporting, resource capacity). + +This guide focuses on the **Universal Infrastructure** pattern to connect both. We will build a standard Event Gateway that allows Baserow to trigger *any* action in GitHub and receive a confirmation back. + +## Use cases + +- **Roadmap Sync:** Keep product managers and developers aligned by syncing GitHub Issues to Baserow features. +- **Bug Triage:** Allow support teams to log bugs in Baserow that instantly appear in the developer's backlog. +- **Release Logs:** Auto-generate changelogs in Baserow whenever a GitHub Release is published. + +## Architecture: Dispatch Loop + +The most robust way to connect Baserow to GitHub is via the **Repository Dispatch** API. This acts as a universal remote control. + +1. **The Signal (Baserow):** Baserow sends a generic ""Dispatch Event"" with a payload (e.g., `{""row_id"": 123, ""action"": ""provision""}`). +2. **The Engine (GitHub):** GitHub accepts the signal, authenticates it, and routes it to the correct Workflow (YAML file). +3. **The Feedback (GitHub):** The workflow executes the task and uses the API to update the specific Baserow row with the result. + +## Prerequisites + +- **GitHub:** A repository and a [Personal Access Token (PAT)](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) with `repo` scope. +- **Baserow:** A Database Token with `Write` permissions. + +## Step 1: Configure the Dispatcher (Baserow) + +We need Baserow to send a standardized signal. We will use Baserow Automations to format the data into the structure GitHub expects. + +1. **In Baserow:** Go to **Automations** → **Create Automation**. +2. **Trigger:** Choose your event (e.g., ""Row Created"" or ""Form Submitted""). +3. **Action:** Select **Send HTTP Request**. + - **Method:** `POST` + - **URL:** `https://api.github.com/repos/[OWNER]/[REPO]/dispatches` + - **Headers:** + - `Authorization`: `Bearer [YOUR_GITHUB_PAT]` + - `Accept`: `application/vnd.github.v3+json` + - `User-Agent`: `Baserow` + - **Body (JSON):** + + ```python + `{ + ""event_type"": ""baserow_trigger"", + ""client_payload"": { + ""row_id"": ""{{id}}"", + ""task_name"": ""{{Name}}"", + ""status"": ""{{Status}}"" + } + }` + ``` + + +*Why this works universally:* We are sending the `row_id` in the `client_payload`. This is the key that allows GitHub to find the exact record to update later. + +## Step 2: Configure the Receiver (GitHub) + +GitHub needs to know how to listen for this specific signal. You define this in a YAML file inside your repository. + +1. **In GitHub:** Create a file at `.github/workflows/baserow_handler.yml`. +2. **Paste the Universal Listener:** + +```yaml +`name: Baserow Dispatch Handler + +on: + repository_dispatch: + types: [baserow_trigger] + +jobs: + handle_request: + runs-on: ubuntu-latest + steps: + # 1. READ: Capture the context sent by Baserow + - name: Log Payload + run: | + echo ""Processing Row ID: ${{ github.event.client_payload.row_id }}"" + echo ""Task: ${{ github.event.client_payload.task_name }}"" + + # 2. ACKNOWLEDGE: Tell Baserow ""I received the request"" + - name: Update Baserow Status + run: | + curl -X PATCH \ + -H ""Authorization: Token ${{ secrets.BASEROW_TOKEN }}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Processing""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${{ github.event.client_payload.row_id }}/?user_field_names=true"" + + # 3. EXECUTE: Your specific logic goes here (The ""Swappable"" Part) + # Example: Create an Issue, Run a Script, or Invite a User + - name: Run Logic + run: echo ""Executing logic for ${{ github.event.client_payload.task_name }}..."" + + # 4. FINISH: Report success back to Baserow + - name: Mark Complete + if: success() + run: | + curl -X PATCH \ + -H ""Authorization: Token ${{ secrets.BASEROW_TOKEN }}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Done"", ""GitHub Run ID"": ""${{ github.run_id }}""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${{ github.event.client_payload.row_id }}/?user_field_names=true""` +``` + +*Note: Ensure you add `BASEROW_TOKEN` to your GitHub Repository Secrets.* + +## Step 3: The Success/Failure Loop + +Instead of a single ""Finish"" step, we split the reporting into two potential outcomes. This ensures that if a script crashes or a deployment fails, the Business team sees a ""Failed"" status in Baserow immediately. + +Add this to the end of your `baserow_handler.yml`: + +```yaml +# 4a. REPORT SUCCESS: Only runs if all previous steps passed + - name: Mark Complete in Baserow + if: success() + run: | + curl -X PATCH \ + -H ""Authorization: Token ${{ secrets.BASEROW_TOKEN }}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Done"", ""Result Notes"": ""Successfully executed at ${{ github.event.repository.updated_at }}""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${{ github.event.client_payload.row_id }}/?user_field_names=true"" + + # 4b. REPORT FAILURE: Only runs if any previous step failed + - name: Mark Failed in Baserow + if: failure() + run: | + curl -X PATCH \ + -H ""Authorization: Token ${{ secrets.BASEROW_TOKEN }}"" \ + -H ""Content-Type: application/json"" \ + -d '{""Status"": ""Failed"", ""Error Log"": ""Check GitHub Run ID: ${{ github.run_id }}""}' \ + ""https://api.baserow.io/api/database/rows/table/[YOUR_TABLE_ID]/${{ github.event.client_payload.row_id }}/?user_field_names=true"" +``` + +## Universal Application + +By using this single pattern (`repository_dispatch` + `row_id` payload), you can power endless workflows just by changing **Step 3** in the YAML file. + +| **Your Use Case** | **Baserow Input** | **GitHub Action (Step 3)** | +| --- | --- | --- | +| **Issue Tracking** | ""Bug Report"" row created. | Uses `actions/create-issue` to create a GitHub Issue and saves the Issue URL back to Baserow. | +| **User Onboarding** | ""New Hire"" row created. | Runs a script to invite the user to the GitHub Organization and adds them to the correct Team. | +| **Environment Provisioning** | ""Client A"" row marked Approved. | Runs Terraform to spin up a new server and saves the IP address back to Baserow. | +| **Content Publishing** | ""Blog Post"" row marked Ready. | Triggers a site rebuild (Pages/Jekyll) to publish the new content. | + +## Alternative: Passive Monitoring (GitHub Webhooks) + +While **Repository Dispatch** is the Active way to trigger GitHub from Baserow, **GitHub Webhooks** are the Passive way to update Baserow when things happen naturally in your repository (like a developer closing an issue or merging code). + +**The Pattern: GitHub → Baserow** + +1. **The Event:** A developer merges a Pull Request in GitHub. +2. **The Webhook:** GitHub sends a massive JSON payload to your Baserow Webhook URL. +3. **The Automation:** Baserow receives the payload, finds the matching row (e.g., via the Issue number), and updates the status to ""Merged."" + +### How to Connect: + +1. **In Baserow:** Create an Automation with the trigger **""Receive an HTTP request""**. Copy the unique Webhook URL provided. +2. **In GitHub:** Go to **Settings → Webhooks → Add webhook**. + - **Payload URL:** Paste your Baserow URL. + - **Content type:** `application/json`. + - **Events:** Select ""Individual events"" (e.g., Pull Requests, Issues, or Pushes). +3. **In Baserow (Mapping):** Use the Baserow automation builder to ""map"" the incoming GitHub data. For example, map `repository.name` to a text field and `sender.login` to your ""Developer"" field. + +### Comparison: Dispatch vs. Webhook + +| **Method** | **Direction** | **Rationale** | +| --- | --- | --- | +| **Repository Dispatch** | Baserow → GitHub | **Action-Driven:** Use this when a human in Baserow needs to ""start"" a technical process (Deploying, Provisioning). | +| **Native Webhooks** | GitHub → Baserow | **Status-Driven:** Use this when Baserow needs to ""listen"" to what developers are doing in their natural environment (Coding, Merging). | + +Using **Baserow Automations** + **Repository Dispatch** offers better security and control: + +1. **Authentication:** Repository Dispatch requires a secure Token, whereas standard webhooks often require complex signature verification logic on the receiving end. +2. **Custom Payloads:** You can format the JSON exactly how your script needs it, rather than parsing a massive, generic webhook payload. +3. **Rate Limits:** GitHub handles the queuing. If you trigger 100 events at once, GitHub Actions queues them up, preventing your server from crashing. + +### Universal Best Practice: Source ID + +Whether you use Dispatch or Webhooks, always store the foreign ID. + +- Store the **Baserow Row ID** in your GitHub issue descriptions. +- Store the **GitHub Issue Number** in a Baserow numerical field. + +This Anchor ensures that your automation can always find the correct record, regardless of how many thousands of rows or issues you have. + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",integrations,baserow_user_docs,https://baserow.io/user-docs/github-integration +791,Vercel integration,vercel-integration,Baserow and Vercel Integration,"# Build applications with a Headless CMS architecture + +Vercel is the industry-standard platform for frontend frameworks (Next.js). It handles hosting, edge caching, and serverless functions. Baserow acts as the structured backend, managing the content, inventory, or user data that powers the frontend. + +In an enterprise environment, separating the frontend (Vercel) from the data layer (Baserow) allows for a **Headless Architecture**. This gives you the best of both worlds: + +- **Performance:** Vercel handles global content delivery (CDN), caching, and scaling. +- **Usability:** Baserow provides an easy-to-use editing interface for non-technical team members (HR, Marketing) to manage content without touching the codebase. + +## Architecture + +We will connect Vercel to Baserow using the **REST API** to create a universal bridge. + +- **Read (`GET`):** Vercel fetches listings from Baserow to render the page (e.g., Job Board, Blog, Directory). +- **Write (`POST`):** When a user submits a form, Vercel Serverless Functions securely sanitize and forward the data to Baserow. + +## Prerequisites + +- **Baserow:** A [Database Token](https://baserow.io/user-docs/personal-api-tokens) with `Read` permissions (for content) and `Create` permissions (for submissions). +- **Vercel:** An existing Next.js project connected to a Git repository. +- **Environment Variables:** + - `BASEROW_API_TOKEN`: Your raw API key. + - `BASEROW_API_URL`: `https://api.baserow.io` (or your self-hosted URL). + - `TABLE_ID`: The ID of the specific table you are accessing. + +## Use Cases + +| **Area** | **In Vercel (The Frontend)** | **In Baserow (The Backend)** | +| --- | --- | --- | +| **Recruitment (ATS)** | Displays the Careers page. Renders job descriptions and application forms dynamically using Server-Side Rendering (SSR) or Static Site Generation (SSG). | Stores job titles, descriptions, status (Open/Closed), and receives incoming applicant data (Name, Resume link). | +| **Product Inventory** | A fast e-commerce storefront. Fetches product details and stock status at build time for maximum SEO performance. | Manages SKUs, pricing, stock levels, and product images. | +| **Programmatic SEO** | Generates thousands of landing pages (e.g., ""Best Lawyers in [City]"") based on URL patterns. | Stores the structured datasets (Cities, Professions, Metadata) that populate these pages. | +| **Internal Tools** | A custom employee dashboard for expense reporting or leave requests protected by Vercel's edge authentication. | Acts as the system of record for approved expenses and employee logs. | + +## Replace hardcoded data with live Baserow data in a Next.js app + +We will show you how to pipe map data from Baserow into your UI. These universal steps apply whether you are building a blog, a job board, or a directory. + +### 1. Set up the Baserow Database + +Start by building the data structure. + +1. Log in to Baserow and create a new database from the **Applicant Tracker** template. +2. Identify the **Table IDs** for: + - **Positions:** Contains ""Title"", ""Department (*Single Select*)"", ""Description"", and ""Is filled (*Boolean*)"". + - **Applicants:** Contains ""Name"", ""Email"", ""CV (*File*)"", and ""Applying for (*Link to Positions*)"". +3. Create a **Database Token** (Settings → Database Tokens) with: + - **Read** permissions for the *Positions* table. + - **Create** permissions for the *Applicants* table. + +> Never hardcode your API keys in your frontend code. Vercel handles secrets securely. +> + +### 2. Configure Environment Variables in Vercel + +This allows Vercel to fetch data from Baserow during the build. + +1. Go to your Vercel Project Dashboard. +2. Navigate to **Settings** → **Environment Variables**. +3. Add the following: + - `BASEROW_API_TOKEN`: Your generated database token (e.g., `eyJ...`). Just the raw key, without ""Token "" prefix, so it matches the code below. + - `BASEROW_API_URL`: `https://api.baserow.io` (or your self-hosted URL). + - `POSITIONS_TABLE_ID`: The ID of your Positions table. + - `APPLICANTS_TABLE_ID`: The ID of your Applicants table. + +Click **Save**. A redeploy is required for these to take effect. + +### 3. Create the Universal Connector + +Now we build the bridge. Instead of writing fetch requests inside every single page component (which is messy and hard to maintain), we will add a reusable function that connects your Next.js app to Baserow. + +Create (or update) a file in your library folder where data fetching happens (e.g. `lib/api.ts` or `lib/api.js`). + +In this case, we filter specifically for jobs where `Is filled` is false, and extract the `results` array from the Baserow response so the frontend receives a clean list. + +Add the following code to the bottom of the file. This allows you to keep your existing template logic while adding Baserow capabilities: + +```jsx +// --- BASEROW CONNECTORS --- + +// 1. SECURITY: Centralizes authentication so we don't repeat the API Token everywhere. +const getBaserowHeaders = () => { + return { + Authorization: `Token ${process.env.BASEROW_API_TOKEN}`, + }; +}; + +// 2. LIST FETCHER: Gets all rows from any table you specify. +export async function getBaserowData(tableId: string) { + const baseUrl = process.env.BASEROW_API_URL; + + // Baserow API filter for Boolean fields where 'Is filled' is FALSE + const query = new URLSearchParams({ + user_field_names: 'true', + filters: '{""filter_type"":""AND"",""filters"":[{""type"":""boolean"",""field"":""Is filled"",""value"":""0""}]}' + }); + + // We add 'user_field_names=true' so we get ""Title"" instead of ""field_123"" + const res = await fetch( + `${baseUrl}/api/database/rows/table/${tableId}/?${query}`, + { + headers: getBaserowHeaders(), + next: { revalidate: 60 }, // ISR: Caches data but auto-updates every 60 seconds + } + ); + + if (!res.ok) { + throw new Error(`Failed to fetch data from table ${tableId}`); + } + + const data = await res.json(); + + // OPTIONAL ROUTING: Maps the internal Baserow Row ID to a 'slug' for Next.js URLs. + return data.results.map((item: any) => ({ + ...item, + slug: item.id.toString(), + })); +} + +// Helper to get a Single Row (for Detail Pages) +export async function getBaserowRecord(recordId: string, tableId: string) { + const baseUrl = process.env.BASEROW_API_URL; + + const res = await fetch( + `${baseUrl}/api/database/rows/table/${tableId}/${recordId}/?user_field_names=true`, + { + headers: getBaserowHeaders(), + next: { revalidate: 60 }, + } + ); + + if (!res.ok) { + return null; + } + + return res.json(); +} +``` + +In Next.js 15+, ensure you await your params before passing them to the fetcher. + +It handles the authentication headers and sets up the caching strategy automatically: one to get the list and one to get a single row. + +### 4. Connect the Page to Baserow (Read Operation) + +Now open the page where you want to display your data (e.g., `app/page.tsx`). + +We are going to perform a data swap. We will locate the existing data in your template and replace it with the live function we just created. + +The concept is to find the variable holding your data and replace it with an `await` call to your new connector. + +**A. Import the Connector** + +```jsx +import { getBaserowData } from ""@/lib/api""; // ✅ Import the universal connector +``` + +**B. Swap the Data Source** + +In your main component, find where the data is defined. It may look like a static array `const items = [...]` or a local fetch. + +Replace that line with an asynchronous call to your new function to fetch live data from Baserow during the build. + +```jsx +export default async function Index() { + // ✅ Use the universal function with your specific Table ID + const jobs = await getBaserowData(process.env.POSITIONS_TABLE_ID!); + + return ( + // ... your existing JSX ... + ) +} +``` + +**C. Mapping Your Fields (Update Loop)** + +This is the most common stumbling block when moving from a JSON file to a database. When your template iterates over the data, you need to ensure the field names match your Baserow columns exactly. + +**Object Handling:** + +In a simple JSON file, `Department` might just be the text ""Engineering"". + +Baserow is a relational database, not a flat CSV. Complex field types like **Single Select** (e.g., Department) or **Files** are returned as objects, not strings, so they can carry extra metadata like color tags. + +Baserow API response for `Department` Single Select field: + +```jsx +""Department"": { + ""id"": 55, + ""value"": ""Engineering"", + ""color"": ""blue"" +} +``` + +If you try to render an object directly in your JSX (e.g., `{job.Department}`), React will throw an error because it cannot render an object. You must point to the specific `.value` property. + +> **Case Sensitivity:** If your Baserow field is named ""Title"", you must use `job.Title` in your code. `job.title` will return undefined. +> + +**Conditional Rendering** + +Here is how to safely handle this inside your map loop. We check if the data is an object (from Baserow) or just text (from your old data), so your app doesn't break during the transition. + +Update your `app/page.tsx`: + +```jsx +{jobs.map((job: any) => { + // Baserow ""Single Select"" fields return an object: { id: 1, value: ""Engineering"", color: ""blue"" } + // Standard text fields just return a string: ""Engineering"" + // We use this check to handle both cases safely. + const departmentName = + typeof job.Department === ""object"" && job.Department !== null + ? job.Department.value + : job.Department; + + return ( +
+

{job.Title}

+ + {/* Render the clean value, not the raw object */} + {departmentName} + + {/* Use the Row ID for the link */} + View Details +
+ ); +})} +``` + +Now that your application can **Read** the open positions, we want to build the input form to **Write** the candidate's application back to Baserow. + +### 5. Writing Data Back (Write Operation) + +Reading data is safe to do publicly, but writing data requires strict security. You cannot place your `BASEROW_API_TOKEN` inside a frontend button or form component. If you do, any user can right-click ""Inspect Element"" and steal your database access. + +To solve this, we use a Server-Side Proxy. Your frontend sends data to your own server (Vercel), and your server, which holds the secret keys, forwards it to Baserow. + +> In Next.js, we don't need to spin up a separate backend server for this. We can use a **Server Action**. This allows you to write a function that looks like frontend code but runs securely on the server. +> + +**A: The Universal Write Connector** + +You can drop this logic into any page where you need to save data (e.g. `src/app/posts/[slug]/page.tsx`). + +Locate the component where your form lives (e.g., your Contact page or Signup modal). Inside that component, paste this ""Server Action"" function. + +**The Infrastructure Code:** + +```jsx +// --------------------------------------------------------- + // THE SERVER ACTION (The Secure Bridge) + // --------------------------------------------------------- + async function submitToBaserow(formData: FormData) { + 'use server'; // <--- Critical: This ensures the code runs on Vercel, not the browser + + // 1. Capture data from your form + const formField1 = formData.get(""myFieldName""); + const formField2 = formData.get(""myOtherFieldName""); + + // 2. Configuration (Load from Environment Variables) + const baseUrl = process.env.BASEROW_API_URL; + const targetTable = process.env.YOUR_TARGET_TABLE_ID; + + try { + // 3. Send to Baserow + const res = await fetch(`${baseUrl}/api/database/rows/table/${targetTable}/?user_field_names=true`, { + method: ""POST"", + headers: { + ""Authorization"": `Token ${process.env.BASEROW_API_TOKEN}`, + ""Content-Type"": ""application/json"", + }, + // --------------------------------------------------------- + // CUSTOMIZATION ZONE: Map your data here + // Left Side: Exact Column Name in Baserow (Case Sensitive) + // Right Side: The variable from step 1 + // --------------------------------------------------------- + body: JSON.stringify({ + ""Name"": formField1, + ""Email"": formField2, + ""Status"": ""New Submission"" + }), + }); + + if (!res.ok) { + throw new Error(`Baserow rejected the data: ${res.statusText}`); + } + + } catch (error) { + console.error(""Submission Failed:"", error); + throw error; // This will trigger your error boundary or UI state + } + + // 4. Success Action (Redirect or Refresh) + // redirect(""/success""); + } +``` + +You need to change the `body: JSON.stringify({...})` and `YOUR_TARGET_TABLE_ID` to fit your use case. + +**B: Wiring it to your UI** + +Now that you have the infrastructure, you just need to trigger it. You don't need complex API calls or `useEffect` hooks. + +Find your existing HTML `
` tag and simply point the `action` attribute to the function you created above. + +```jsx +// Your existing UI code... +return ( +
+

Apply Now

+ + {/* Connect the form to the Server Action */} + + + {/* The 'name' attribute must match what you look for in Step 1 */} + + + + + +
+); +``` + +### 6. Creating vs. Updating (Upsert Pattern) + +The code above uses `method: 'POST'` which **creates** a new row. + +If you want to **update** an existing row (e.g., marking a task as ""Done""), you need to change your API Route: + +1. **The Method:** Change `POST` to `PATCH`. +2. **The URL:** Append the Row ID to the URL: `.../rows/table/${targetTable}/${rowId}/` + - *Create:* `.../rows/table/123/` + - *Update:* `.../rows/table/123/45/` (where 45 is the specific row to update). + +> To upload files to Baserow via API, `POST` the binary file to `api/user-files/upload-file/` to get a file token, then `POST` that token to the row creation endpoint. +> + +### Alternative: Trigger Instant Rebuilds + +By default, Next.js caches your content for speed. If you prefer your live site to update immediately whenever you change data in Baserow (instead of waiting for a cache refresh), you can use Vercel Deploy Hooks. + +**How to set it up:** + +1. **In Vercel:** Go to **Settings → Git → Deploy Hooks**. Name it ""Baserow Update"" and click **Create Hook**. Copy the URL. +2. **In Baserow:** Go to your Table → **Webhooks**. Create a new webhook, paste the Vercel URL, and check `Row Created`, `Row Updated`, and `Row Deleted`. + +Now, every edit in Baserow forces Vercel to rebuild your site instantly. + +> This is suitable for low-traffic databases. Using Vercel Deploy Hooks triggers a full site rebuild. If your Baserow database changes frequently (e.g., 50 edits an hour), you will rebuild your site 50 times an hour, potentially slowing down the deployment queue. +> + +## Best Practices for Performance + +### 1. Optimize Data Payload (Sanitization) + +Baserow's API returns the full row data by default. If your table has sensitive data, you must ensure this data never reaches the client's browser. + +Since Vercel runs server-side, you should sanitize the response in your library file before returning it to the frontend component. + +```jsx +return data.results.map(job => ({ + title: job.Title, + description: job.Description, + slug: job.id.toString() + // Salary and Notes are explicitly excluded +})); +``` + +### 2. Handle Rate Limits with Caching + +High-traffic enterprise sites should not hit the Baserow API on every single page view. + +- **Static Rendering (Default):** By default, Next.js fetches Baserow data at build time. This allows Vercel to serve your job board from a global CDN, ensuring sub-second load times and zero API load on Baserow during traffic spikes. +- **Incremental Static Regeneration (ISR):** We implemented `next: { revalidate: 60 }` in our fetch call. The site is instant for users, but Vercel checks Baserow for updates in the background every 60 seconds. + +### 3. Image Optimization + +If your Baserow table contains images, the API returns a direct URL. Do not use the standard HTML `` tag. + +Use the Next.js `` component. This automatically resizes, compresses, and converts images to modern formats (like WebP) on the fly. + +**Configuration:** + +You must add your Baserow domain to `next.config.js` to allow this optimization: + +```jsx +images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'files.baserow.io', // or your self-hosted domain + }, + ], +}, +``` + +### 4. Preview Mode + +For content editors, waiting 60 seconds for ISR can be annoying. You can configure **Vercel Preview Mode** to bypass the cache and fetch live data from Baserow only for logged-in admin users. This gives you a Staging environment without needing a separate deployment. + +### 5. Sending linked records and select fields + +Baserow is a relational database. When customizing the `body: JSON.stringify` section to send data to Baserow, keep these rules in mind: + +1. **Linked Records (Relations)** + + If you are linking this new row to an existing row (e.g., linking an *Applicant* to a *Position*), Baserow expects an **Array of IDs**, not a single number or text: `""Applying for"": [15]` + +2. **Select Fields** + + If you are writing to a ""Single Select"" field (like ""Status""), you must send the text exactly as it appears in Baserow options (Case Sensitive), OR use the Select Option ID: `""Status"": ""Active""` + +3. **Field Names:** + + Always ensure the keys on the left side of your JSON (e.g., `""Name""`, `""Email""`) match your Baserow column headers exactly. If you renamed ""Name"" to ""Full Name"" in Baserow, you must update your code to `""Full Name"": formField1`. + + +## Summary + +By connecting Vercel and Baserow via REST API, you create a separation of concerns: + +- **Baserow** becomes the user-friendly headless CMS. +- **Vercel** delivers a sub-second, globally distributed frontend. +- **The API** ensures data remains synchronized securely without manual CSV exports. + +**Files Changed:** + +1. `lib/api.ts`: Updated to include the universal fetcher and headers. +2. `src/app/page.tsx`: Updated to read and display the list of records. +3. `src/app/posts/[slug]/page.tsx`: Updated to read a single record and handle the ""Write"" operation via Server Action. + +## Troubleshooting + +| **Error** | **Likely Cause** | **The Fix** | +| --- | --- | --- | +| `401 Unauthorized` | Missing or malformed Token. | Ensure the header is `Authorization: Token [KEY]`. | +| `404 Not Found` | Wrong Table ID or Row ID. | Check the URL of your Baserow table for the number. | +| `400 Bad Request` | Field Name mismatch. | Ensure the JSON keys match your Baserow column names exactly (Case Sensitive). | + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",integrations,baserow_user_docs,https://baserow.io/user-docs/vercel-integration +792,Appsmith integration,appsmith-integration,Baserow + Appsmith Integration,"# Build internal tools with Appsmith low-code frontend + +Appsmith allows you to build custom admin panels, dashboards, and CRUD apps. Baserow acts as the relational database backend. By connecting them via API, you can build tools that follow your exact business logic without exposing the raw database to end-users. + +We configure a central **Datasource** that acts as the bridge. All queries (Read, Write, Delete) use this single secure connection. + +## Prerequisites + +- **Baserow:** A Database Token with `Create`, `Read`, `Update`, and `Delete` permissions. +- **Appsmith:** An account (Cloud or Self-Hosted). + +## Step 1: Configure the Universal Datasource + +Do not hardcode your API token into every individual query. Use Appsmith's **Authenticated Datasource** feature. This keeps your token on the server and makes it reusable across the entire application. + +1. In Appsmith, go to **Datasources** -> **New Datasource** -> **Authenticated API**. +2. **Name:** `Baserow API`. +3. **URL:** `https://api.baserow.io` (or your self-hosted URL). +4. **Authentication:** + - **Type:** API Key. + - **Key:** `Authorization` + - **Value:** `Token [YOUR_DATABASE_TOKEN]` (Ensure there is a space between ""Token"" and the key). + - **Add To:** Header. +5. Click **Save**. + +## Step 2: The ""Read"" Pattern (GET) + +To populate a Table or List widget, fetching data from Baserow. + +1. Create a new Query from the `Baserow API` datasource. +2. **Method:** `GET` +3. **Path:** `/api/database/rows/table/[TABLE_ID]/` +4. **Parameters:** + - Key: `user_field_names` | Value: `true` (Crucial for using ""Name"" instead of ""field_123""). +5. **Bind to Widget:** In your Table Widget's **Table Data** property, enter `{{ get_rows.data.results }}`. + +## Step 3: The ""Write"" Pattern (POST/PATCH) + +Baserow uses `POST` to create and `PATCH` to update. + +### Create (POST) + +- **Path:** `/api/database/rows/table/[TABLE_ID]/` +- **Parameter:** `user_field_names` = `true` +- **Body (JSON):** + + ```json + { + ""Name"": ""{{ InputName.text }}"", + ""Status"": ""{{ SelectStatus.selectedOptionValue }}"", + ""Active"": {{ CheckboxActive.isChecked }} + } + ``` + + +### Update (PATCH) + +You must target the specific Row ID. + +- **Path:** `/api/database/rows/table/[TABLE_ID]/{{ Table1.triggeredRow.id }}/` +- **Body (JSON):** Only include the fields you want to change.JSON + + ```json + { + ""Status"": ""Archived"" + } + ``` + + +## Step 4: The ""Two-Step"" File Upload Pattern + +Baserow handles files differently than many simple APIs. You cannot send a file directly to a row. You must **(1) Upload** the file to the server, then **(2) Link** it to the row. + +### Action A: Upload Binary (The Helper Query) + +Create a query named `upload_file`. + +- **Method:** `POST` +- **Path:** `/api/user-files/upload-file/` +- **Headers:** `Content-Type`: `multipart/form-data` +- **Body:** Form Data + - Key: `file` | Type: `File` | Value: `{{ FilePicker1.files[0] }}` + +*Response:* Baserow returns a `name` hash (e.g., `returns: ""abcd-1234-image.png""`). + +### Action B: Link to Row (The Main Query) + +Create a query named `link_file_to_row`. + +- **Method:** `PATCH` +- **Path:** `/api/database/rows/table/[TABLE_ID]/{{ Table1.selectedRow.id }}/` +- **Body (JSON):** + + ```json + { + ""Documents"": [ + { + ""name"": ""{{ upload_file.data.name }}"" + } + ] + } + ``` + + +### Workflow Logic + +In your **FilePicker Widget**, set the **onFilesSelected** event to run a JavaScript Object: + +```jsx +export default { + async handleUpload() { + // 1. Upload the file to Baserow storage + await upload_file.run(); + + // 2. Link the new file hash to the actual row + await link_file_to_row.run(); + + // 3. Refresh the table to show the new file + await get_rows.run(); + } +} +``` + +## Best Practices + +- **Pagination:** Enable ""Server Side Pagination"" in the Appsmith Table widget. Pass `&page={{Table1.pageNo}}` to the Baserow GET query to handle large datasets efficiently. +- **Dropdowns:** If your Baserow table has a ""Single Select"" field, creating a row via API requires the exact text value (case-sensitive) or the numeric Option ID. + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",integrations,baserow_user_docs,https://baserow.io/user-docs/appsmith-integration +821,Build Apps with Kuma AI,build-applications-with-ai,Build Baserow Applications with Kuma AI,"# Building Applications with Kuma AI + +Kuma goes beyond helping with databases and automations; it can [build complete applications][1]. Instead of starting from scratch, you can start with a working app and refine it by chatting with Kuma. + +Learn more: [Kuma, your AI assistant][2] + +![Kuma app builder][3] + +## How it works + +You can describe what you want in plain language, and Kuma will automatically: + + - Generate application pages + - Connect data sources + - Add forms and actions + - Update the theme or apply a different style + +## Generating your first app + +To get started, open Kuma and describe the application you want to build. Kuma will set up the necessary database tables and build the interfaces for your data. + +**Example prompt:** + +> *""Create an app with a task list page, a task detail page, and a form page to add tasks.""* + +## Iterating and refining + +Once Kuma generates the initial application, you don't have to make manual adjustments right away. You can continue iterating on the [design][4] and [functionality][5] by giving Kuma follow-up instructions. + +**Example follow-up prompts:** + + - *""Add a header with navigation.""* + - *""Create a contact form and store submissions.""* + - *""Change the layout to two columns.""* + +## Related content + + - [Get started with the Application Builder][1] + - [Kuma AI assistant][2] + - [Overview of Application Builder Elements][5] + - [Layout styling][4] + + +---------- + + +Still need help? If you’re looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - Ask the Baserow community + - Contact support for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/application-builder-overview + [2]: https://baserow.io/user-docs/ai-assistant + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0c2809b6-b94b-46ea-97cb-c8b98a9ab70e/App%20Builder.png + [4]: https://baserow.io/user-docs/element-style + [5]: https://baserow.io/user-docs/elements-overview",application builder,baserow_user_docs,https://baserow.io/user-docs/build-applications-with-ai +822,View permissions,view-level-permissions,View-level permissions in Baserow,"# View-level permissions (Restricted views) + +View-level permissions (also known as restricted views) allow you to give specific users access to only the exact data they should see. This feature operates within [Baserow’s role hierarchy][1] (workspace → database → table → view) to provide highly granular, row-level and column-level access control. + +This guide covers how to create restricted views, hide specific fields, lock filters, and safely share targeted subsets of your data with internal teams or external partners. + +![Baserow restricted views][2] + +## Overview + +A restricted view lets you expose only a specific part of a table to selected users. By applying filters and hiding fields, you can create customized, secure access to your data. + +Unlike standard [collaborative views][3], where any user with table access can modify filters or switch to another view, users assigned to a restricted view are securely locked in. They: + * Only see the rows that match the view's predefined filters. + * Cannot see or change the filters. + * Cannot access other views or data in the table. + +Learn more about [Collaborative and Personal views][4]. + +## How restricted views work + +> Other users might inherit access via their respective roles on the parent table, database or workspace. [Learn more about permissions][8]. + +### Interaction with the permission hierarchy + +Permissions in Baserow follow a [top-down hierarchy][1]: Workspace → Database → Table → **View**. + +With restricted views, **you can grant a user access to a specific restricted view even if they do not have access to the rest of the workspace or table.** + +If a user *has* broad [table access][5], a restricted view can limit what they see in that specific view (though they could still see the data in other views if their table role permits). + +If a user has *no* [workspace access][6], you can assign them a role directly on the restricted view, effectively making it a secure, isolated application just for them. + +### Data editing and Default Values + +When editing data inside a restricted view, permissions are strictly enforced. Users can only update rows that are currently visible to them. + +To support data entry, you can define **default values per view**. When a user creates a new row inside a restricted view, these default values are automatically applied to ensure the new row instantly matches the view's filters and remains visible to the user. + +## Set up a restricted view + + 1. Navigate to the table where you want to restrict data. + 2. [Create a new view][7] (e.g., Grid, Kanban). + 3. Select who can edit this view, and click **Restricted**. + 4. Configure the view's layout: + - **Apply filters:** Set up filters to isolate the exact rows the target users should see (e.g., `Country contains 'Germany'`). + - **Hide fields:** Hide any columns that contain sensitive information the target users shouldn't see. + 5. Click the **View options** (three-dot menu ⋮) next to the view name to **Manage members**. + 6. Assign specific roles or individual users who should have access to this view. + 7. Configure **Default values** for new rows (optional, but recommended if users will be adding data). + 8. Click **Save** to enforce the restrictions. + +Test the view by logging in as one of the assigned users to verify they cannot alter the filters, see hidden fields, or navigate to other views. + +## When to use restricted views + +### Restricted views vs. Collaborative/Personal views + +| Feature | Collaborative views | Personal views | Restricted views | +| :--- | :--- | :--- | :--- | +| **Visibility** | All members with table access | Only the creator | Only specifically assigned users | +| **Filter Control** | Editors and up can change | Creator can change | Editors and lower can see the filtered data | +| **Field Hiding** | Visual only (data still accessible) | Visual only | Strict (hidden data is completely inaccessible) | +| **Use Case** | Team dashboards, shared processes | Individual organization | Secure data sharing, vendor portals, row-level security | + +### Restricted views vs. Field/Table permissions + + * **Use [Table permissions][5]** when a user needs access to all rows and columns in a table. + * **Use [Field-level permissions][9]** when everyone can see all the rows, but only specific roles should *edit* certain columns (like locking a ""Status"" field). + * **Use Restricted views** when you need to hide specific *rows* based on conditions (row-level security), hide specific columns from certain users, or grant access to users who shouldn't see the rest of the database. + +## Advanced restricted view strategies + +### Strategy 1: Regional Sales Teams (Row-level security) + +Keep your entire company's sales data in one master table, but ensure regional reps only see their own leads. + * **Implementation:** Create a restricted view named ""EMEA Leads"". Filter by `Region is EMEA`. Hide the `Commission Rate` field. Assign the EMEA Sales Team group to this view. Define the default value for the `Region` field as ""EMEA"" so any new lead they add is automatically assigned to their region. + +### Strategy 2: External Vendor Portals + +Allow contractors to update the status of their assigned tasks without seeing your internal workspace or tasks assigned to other vendors. + + * **Implementation:** Create a restricted view for ""Vendor A"". Filter by `Assigned To is Vendor A`. Hide internal fields like `Budget` and `Internal Notes`. Grant Vendor A access to *only* this view. They will log in, see only their tasks, and be completely unaware of the rest of the database. + +### Strategy 3: Departmental HR Portals + +HR maintains a master employee table, but managers need to see the performance reviews of only their direct reports. + + * **Implementation:** Create a restricted view for ""Marketing Team"". Filter by `Department is Marketing`. The Marketing Manager is granted access to this view. They can review and update their team's data without accessing Engineering or Sales personnel records. + +## Troubleshooting restricted views + +**""Users can still see rows that don't belong to them""** + +Check the user's [Table][5] or Database-level permissions. If a user is an Editor on the entire table, restricting a view will not prevent them from simply clicking into a different, unrestricted [collaborative view][3]. Restricted views provide true security only when the user's broader table access is removed or limited. + +**""New rows disappear as soon as they are created""** + +This happens when a user creates a row that doesn't match the view's strict filters, causing it to instantly filter out. To fix this, set up **Default values** in the view settings so that new rows automatically populate with data that matches the filter (e.g., automatically setting the ""Status"" to ""New""). + +**""Users can't find the view in the sidebar""** + +Ensure you have explicitly granted the user or their role access to the restricted view in the view's permission settings. If they don't have [table-level access][5], they will only see the specific views you invite them to. + +## Frequently asked questions + +**Can users in a restricted view export the data?** + +Users can only export the data that is visible to them within the restricted view. Rows filtered out, and fields that are hidden are excluded from their exports. + +**What happens if a user changes a cell value so it no longer matches the filter?** + +If a user updates a record (e.g., changing a status from 'In Progress' to 'Done' in an ""Active Tasks"" restricted view), the row will immediately disappear from their view once saved, as it no longer matches the strict filter criteria. + +**Can I combine restricted views with field-level permissions?** + +Yes! You can give a user access to a restricted view (limiting which rows they see) and further apply [field-level permissions][9] (e.g., setting a visible ""Approval Date"" column to Read-Only so they can see it, but not edit it). + +## Related content + + * [Understanding role hierarchy][1] + * [Field-level permissions][9] + * [Assign roles at the table level][5] + * [Collaborative vs personal views][4] + +---------- + + +Still need help? If you’re looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community][10] + - [Contact support][11] for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/role-based-access-control-rbac + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/854ff8b1-eeb0-41b0-af9f-9159925ac1da/Restricted%20views.png + [3]: https://baserow.io/user-docs/collaborative-views + [4]: https://baserow.io/user-docs/overview-of-baserow-views + [5]: https://baserow.io/user-docs/assign-roles-at-table-level + [6]: https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level + [7]: https://baserow.io/user-docs/create-custom-views-of-your-data + [8]: https://baserow.io/user-docs/permissions-overview + [9]: https://baserow.io/user-docs/field-level-permissions + [10]: https://community.baserow.io/ + [11]: https://baserow.io/contact",roles and permissions,baserow_user_docs,https://baserow.io/user-docs/view-level-permissions +823,Edit row link,edit-rows-via-form,Edit existing rows via Baserow form,"# Edit row link - Edit existing rows via form + +[Baserow forms][1] are typically used to collect new data and create new rows. However, using the **Edit row link** field, you can generate unique, secure links that allow users to update *existing* records through a pre-filled form. + +This guide covers how to set up editable form links, securely share them, and collect updates from people who don't have access to your Baserow workspace. + +## Overview + +The **Edit row link** field connects a specific row in your table to a [Form view][1]. It generates a unique URL for that specific row. + +When a user clicks the link: + 1. They are taken to a Form view. + 2. The form fields are **pre-filled** with the row's current data. + 3. The user can change the values and submit the form. + 4. The existing row in your database is updated instantly; no new row is created. + +![Baserow Edit row link field][2] + +## How to set up editable form links + +To allow users to edit existing rows, you need a Form view and the **Edit row link** field that generates the unique URLs. + +**Step 1: Prepare your Form view** + + 1. Navigate to your table and create or select a **Form view**. + 2. Configure the form by adding the fields you want users to be able to edit. + 3. *(Optional)* Hide any fields you do not want external users to see or change. + +**Step 2: Add the form link field** + + 4. Switch back to a Grid view (or any view where you can add fields). + 5. Create a new field and select ****Edit row link** field as the field type. + 6. In the field settings, select the Form view you configured in Step 1. + 7. Click **Create field**. + +Baserow will automatically generate a unique, clickable URL for every row in your table. + +## Common use cases + +Editing rows via forms is perfect for collecting updates from external stakeholders without giving them database access: + + * **User Profile Updates:** Send a link to clients or members so they can update their contact information, address, or preferences. + * **Order Tracking & Status:** Allow external vendors or delivery drivers to update the status of an order or shipment by clicking a link on their mobile device. + * **Event RSVPs:** Send a pre-filled form to invited guests. If they change their mind, they can click the same link to update their RSVP status from ""Attending"" to ""Not Attending."" + * **Application Revisions:** If an applicant made a mistake on their submission, you can send them a link to correct their specific application data without requiring them to submit a duplicate form. + +## Security and sharing + +**Are the links secure?** +Yes. Every URL generated by this field contains a secure, randomized cryptographic token. These links are unique and cannot be guessed or brute-forced by malicious actors. + +**Who can use the link?** +Anyone with the link can view the pre-filled data and submit changes to that specific row. Because the link grants edit access to that row, you should treat it like a password. Only share the link directly with the person responsible for updating that record (for example, via an automated email or direct message). + +**Revoking access** +If a link is accidentally shared or you no longer want a row to be editable, you can delete the Form view, remove the field from the Form view, or regenerate the token (if applicable in settings) to invalidate old links. + +## Frequently asked questions + +**Can a user edit hidden fields?** +No. If a field is hidden in the Form view settings, it will not appear on the pre-filled form, and the user cannot view or edit that data. + +**What happens if two people edit the form at the same time?** +If multiple people open the unique link and submit changes, Baserow will save the data from the most recent submission. + +**Can I trigger an automation when a row is updated via form?** +Yes. Because submitting the form updates an existing row, it will trigger any [automations][3] set to run ""When a row is updated"" for those specific fields. + +## Related content + + - [Form view][1] + - [Adding and editing rows][4] + - [Pre-fill forms with link row data][5] - Dynamic form data + - [Public sharing][6] - Share forms externally + +---------- + + +Still need help? If you’re looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - Ask the Baserow community + - Contact support for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0d068e44-8021-4cb0-9599-73baa20ef787/Edit%20row.png + [3]: https://baserow.io/user-docs/workflow-automation + [4]: https://baserow.io/user-docs/overview-of-rows + [5]: https://baserow.io/blog/use-link-row-data-pre-fill-forms + [6]: https://baserow.io/user-docs/public-sharing",field,baserow_user_docs,https://baserow.io/user-docs/edit-rows-via-form 1,What is Baserow?,faq,What is Baserow?,"What is Baserow? Baserow is an open-source no-code database. Our database platform enables both non-technical and technical teams to capture, organize and build logical relationships between data to trigger decisions and automate processes. We focus on openness, scalability, performance, and data security.",faq,faq,https://baserow.io/faq diff --git a/heroku.Dockerfile b/heroku.Dockerfile index a26878fbda..33b40cb56d 100644 --- a/heroku.Dockerfile +++ b/heroku.Dockerfile @@ -1,4 +1,4 @@ -ARG FROM_IMAGE=baserow/baserow:2.1.6 +ARG FROM_IMAGE=baserow/baserow:2.2.0 # This is pinned as version pinning is done by the CI setting FROM_IMAGE. # hadolint ignore=DL3006 FROM $FROM_IMAGE AS image_base diff --git a/premium/backend/pyproject.toml b/premium/backend/pyproject.toml index dab12d0fb7..5e321e8602 100644 --- a/premium/backend/pyproject.toml +++ b/premium/backend/pyproject.toml @@ -12,7 +12,7 @@ description = """Baserow is an open source no-code database tool and Airtable \ # mixed license license = { file = "../LICENSE" } requires-python = "==3.14.*" -version = "2.1.6" +version = "2.2.0" classifiers = [] [project.urls] diff --git a/web-frontend/docker/docker-entrypoint.sh b/web-frontend/docker/docker-entrypoint.sh index e7672558b2..b68067face 100755 --- a/web-frontend/docker/docker-entrypoint.sh +++ b/web-frontend/docker/docker-entrypoint.sh @@ -2,7 +2,7 @@ # Bash strict mode: http://redsymbol.net/articles/unofficial-bash-strict-mode/ set -euo pipefail -export BASEROW_VERSION="2.1.6" +export BASEROW_VERSION="2.2.0" BASEROW_WEBFRONTEND_PORT="${BASEROW_WEBFRONTEND_PORT:-3000}" show_help() { diff --git a/web-frontend/package.json b/web-frontend/package.json index 89ad509cff..8675a4d1af 100644 --- a/web-frontend/package.json +++ b/web-frontend/package.json @@ -1,6 +1,6 @@ { "name": "baserow", - "version": "2.1.6", + "version": "2.2.0", "private": true, "type": "module", "scripts": { @@ -27,7 +27,8 @@ "resolutions": { "cipher-base": "^1.0.5", "unset-value": "^2.0.1", - "vuejs3-datepicker/**/minimatch": "^3.1.3" + "vuejs3-datepicker/**/minimatch": "^3.1.3", + "lodash": "^4.18.1" }, "dependencies": { "@nuxtjs/i18n": "10.2.4", diff --git a/web-frontend/yarn.lock b/web-frontend/yarn.lock index d512a63113..a1599b5fb7 100644 --- a/web-frontend/yarn.lock +++ b/web-frontend/yarn.lock @@ -8815,10 +8815,10 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@>=4.17.21, lodash@^4.17.15, lodash@~4.17.15: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== +lodash@>=4.17.21, lodash@^4.17.15, lodash@^4.18.1, lodash@~4.17.15: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== loupe@^3.1.0, loupe@^3.1.4: version "3.2.1"