From b515b0f307055702142bb6464f0f651210d58e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Nam=20Long?= <26674308+J2TeamNNL@users.noreply.github.com> Date: Sun, 1 Nov 2026 04:28:54 +0700 Subject: [PATCH 1/4] docs(viewer): igbinary and Avro in Display As --- databases/kafka.mdx | 4 ++-- features/json-viewer.mdx | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/databases/kafka.mdx b/databases/kafka.mdx index d035a7a..b088d65 100644 --- a/databases/kafka.mdx +++ b/databases/kafka.mdx @@ -150,8 +150,8 @@ where retention has removed messages from the middle of a compacted topic. Schema Registry is not read. A binary `value` column of Protobuf messages decodes field by field with **Display As > Protobuf**, which reads the five-byte Confluent wire-format prefix and shows the -schema ID; see [Binary value viewer](/features/json-viewer#binary-value-viewer). Avro values show -as raw bytes. +schema ID; see [Binary value viewer](/features/json-viewer#binary-value-viewer). Avro values decode +with **Display As > Avro Schema…** and the topic's `.avsc` file, past the same prefix. Creating a topic, editing topic configuration, and resetting consumer group offsets are not available. Deleting a topic is, as the paragraph above describes. diff --git a/features/json-viewer.mdx b/features/json-viewer.mdx index 518f43f..4014c50 100644 --- a/features/json-viewer.mdx +++ b/features/json-viewer.mdx @@ -1,6 +1,6 @@ --- title: Cell and Row Viewers -description: View and edit JSON, PHP serialized, image and binary cell values, decode MessagePack and Protobuf, set per-column display formats, and inspect whole rows in the sidebar +description: View and edit JSON, PHP serialized, image and binary cell values, decode MessagePack, Protobuf, igbinary and Avro, set per-column display formats, and inspect whole rows in the sidebar --- Click the chevron on a JSON or blob cell to open its value in a popover anchored to that cell. Which viewer opens follows the column: its declared type, or the **Display As** choice on its header, and that choice changes rendering only, never what is stored. @@ -21,7 +21,8 @@ Right-click a column header and pick **Display As**. The submenu lists the forma | Unix Timestamp (milliseconds) | integer | Same, treating the number as milliseconds | | JSON | text | Opens the cell in the JSON viewer | | PHP Serialized | text | Opens the cell in the PHP serialized viewer | -| MessagePack, Protobuf | binary | Decodes the bytes and opens the cell in the [binary value viewer](#binary-value-viewer) | +| MessagePack, Protobuf, igbinary | binary | Decodes the bytes and opens the cell in the [binary value viewer](#binary-value-viewer) | +| Avro Schema… | binary | Asks for the `.avsc` file the values were written with, then decodes like the formats above | An override persists per column, scoped to the connection and table. A column with a format set copies in that format when you copy the single cell; a block of cells or a whole row always copies the stored value. @@ -101,16 +102,18 @@ An array or object row copies as its summary, such as `[2 items]`, not as its co ## Binary value viewer -Set **Display As > MessagePack** or **Protobuf** on a binary column. The grid shows each value decoded on one line, and double-click or `Enter` opens the viewer. It is read-only. On an editable table the chevron still opens the hex editor, and so does double-clicking a NULL cell. +Set **Display As > MessagePack**, **Protobuf** or **igbinary** on a binary column, or pick **Avro Schema…** and choose the column's schema file. The grid shows each value decoded on one line, and double-click or `Enter` opens the viewer. It is read-only. On an editable table the chevron still opens the hex editor, and so does double-clicking a NULL cell. -| Mode | MessagePack | Protobuf | -| --- | --- | --- | -| **Tree** | The [JSON tree](#selecting-and-copying-in-a-tree), with `bin`, `ext` and `time` badges for the types JSON lacks | Field numbers, badged with the wire type: `varint`, `i32`, `i64`, `len` or `group` | -| **Text** | JSON. Bytes as `0x` hex, an extension as `ext(5) 0x…`, a timestamp in UTC | Text format, as `protoc --decode_raw` prints it | -| **Hex** | The stored bytes | The stored bytes | +| Mode | MessagePack, Avro | Protobuf | igbinary | +| --- | --- | --- | --- | +| **Tree** | The [JSON tree](#selecting-and-copying-in-a-tree), with `bin`, `ext` and `time` badges for the types JSON lacks | Field numbers, badged with the wire type: `varint`, `i32`, `i64`, `len` or `group` | The [PHP serialized tree](#php-serialized-viewer) | +| **Text** | JSON. Bytes as `0x` hex, an extension as `ext(5) 0x…`, a timestamp in UTC | Text format, as `protoc --decode_raw` prints it | The value as PHP's `serialize()` writes it | +| **Hex** | The stored bytes | The stored bytes | The stored bytes | Protobuf without its schema has no field names or types. A length-delimited field reads as a nested message when its bytes parse as one, else as text when they are UTF-8, else as escaped bytes, so a short string can read as a message. A value that starts with a Schema Registry frame, as Kafka producers write it, shows its schema ID and message index above the tree. +Avro reads each value as one datum written with the chosen schema. A record shows its fields in schema order, a union shows the branch it holds, and logical types read as what they stand for: `decimal` as a number, `uuid`, `date` and `time` as text, `timestamp` in UTC. The schema is kept with the column, so moving or deleting the file later changes nothing; pick **Avro Schema…** again to replace it. A value with the Kafka wire-format prefix decodes past it, and the viewer shows its schema ID. + A value that does not decode stays hex in the grid, and the viewer says where it broke above its hex dump. Copying a single cell copies the decoded text, cut at 40,000 characters. **Find** searches the decoded text. ## Blob and hex @@ -144,7 +147,7 @@ A value that refuses to open in one mode still opens in another. | JSON tree | 100,000 characters, indentation not counted | "JSON Too Large". Read it in Text mode | | JSON and PHP trees | 5,000 nodes | The first 5,000 load, and a `…` row marks the cut | | PHP serialized | 5,000,000 characters, 256 levels deep | Tree shows a placeholder, Raw still works | -| MessagePack, Protobuf | 5,000,000 bytes; 256 levels deep, 100 for Protobuf | The cell stays hex, and the viewer says why | +| MessagePack, Protobuf, igbinary, Avro | 5,000,000 bytes; 256 levels deep, 100 for Protobuf | The cell stays hex, and the viewer says why | | Decoded binary in the grid | 40,000 characters | The text ends in `…` | | Decoded binary in **Text** mode | 500,000 characters | The text ends in `…` | | Hex dump and hex editor | 10 KB | The dump is truncated, and the editor opens read-only | @@ -162,7 +165,7 @@ A value that refuses to open in one mode still opens in another. | A spatial column whose value the map reads, or GeoJSON in a JSON column | [Map](#geometry-fields), stored value behind **Text** | | A JSON column, or text that parses as JSON | JSON editor | | A PHP serialized value | Read-only [PHP viewer](#php-serialized-viewer) | -| A binary column set to MessagePack or Protobuf | Read-only [binary value viewer](#binary-value-viewer) | +| A binary column set to MessagePack, Protobuf, igbinary or Avro | Read-only [binary value viewer](#binary-value-viewer) | | An image, in any column | [Image viewer](#image-viewer), source behind the second segment | | An enum, set, or boolean column | Picker | | A blob column, or other bytes in a spatial column | Hex editor | From 7e88db6de71fb48e8b61b1dfe09540d17e25af19 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Sun, 1 Nov 2026 07:26:59 +0700 Subject: [PATCH 2/4] docs(viewer): Avro duration, local timestamps, single-object encoding and the schema name --- features/json-viewer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/json-viewer.mdx b/features/json-viewer.mdx index 4014c50..dad7374 100644 --- a/features/json-viewer.mdx +++ b/features/json-viewer.mdx @@ -112,7 +112,7 @@ Set **Display As > MessagePack**, **Protobuf** or **igbinary** on a binary colum Protobuf without its schema has no field names or types. A length-delimited field reads as a nested message when its bytes parse as one, else as text when they are UTF-8, else as escaped bytes, so a short string can read as a message. A value that starts with a Schema Registry frame, as Kafka producers write it, shows its schema ID and message index above the tree. -Avro reads each value as one datum written with the chosen schema. A record shows its fields in schema order, a union shows the branch it holds, and logical types read as what they stand for: `decimal` as a number, `uuid`, `date` and `time` as text, `timestamp` in UTC. The schema is kept with the column, so moving or deleting the file later changes nothing; pick **Avro Schema…** again to replace it. A value with the Kafka wire-format prefix decodes past it, and the viewer shows its schema ID. +Avro reads each value as one datum written with the chosen schema. A record shows its fields in schema order, a union shows the branch it holds, and logical types read as what they stand for: `decimal` as a number, `uuid`, `date`, `time` and `duration` as text, `timestamp` in UTC, `local-timestamp` without a zone. The menu names the column's format after the schema's root type, as in **Avro (Order)**. TablePro keeps a copy of the schema, so moving or deleting the file later changes nothing; pick **Avro Schema…** again to replace it. A value with the Kafka wire-format prefix decodes past it, and the viewer shows its schema ID. A value in Avro's single-object encoding, as Java's `toByteBuffer()` writes it, decodes when its schema fingerprint matches the chosen schema, and the viewer shows the fingerprint. A value that does not decode stays hex in the grid, and the viewer says where it broke above its hex dump. Copying a single cell copies the decoded text, cut at 40,000 characters. **Find** searches the decoded text. From 4bbc102b6eb16c8a5a9389f8d55a0ffe7b5a166b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Nam=20Long?= <26674308+J2TeamNNL@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:36:42 +0700 Subject: [PATCH 3/4] docs(viewer): Protobuf schemas and the Kafka Schema Registry in Display As --- databases/kafka.mdx | 17 +++++++++++++---- features/json-viewer.mdx | 10 ++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/databases/kafka.mdx b/databases/kafka.mdx index b088d65..aabbe7c 100644 --- a/databases/kafka.mdx +++ b/databases/kafka.mdx @@ -28,6 +28,8 @@ record format every message has used since. | **SASL Mechanism** | `PLAIN`, `SCRAM-SHA-256`, or `SCRAM-SHA-512`, for the two SASL protocols | | **Username** / **Password** | The SASL credentials | | **Broker Addresses** | Whether to dial the addresses the cluster advertises, or stay on the bootstrap. Leave this on **Use the addresses the cluster advertises** unless those addresses are unreachable from this Mac | +| **Schema Registry URL** | Optional. The Confluent Schema Registry that **Display As > Schema Registry** fetches schemas from, such as `http://localhost:8081` | +| **Schema Registry User** / **Schema Registry Password** | Optional. Basic authentication for the registry, such as a Confluent Cloud API key and secret | There is no Database field. A connection is one cluster, and the sidebar shows its topics directly. Set the whole attempt's **Connect timeout** under **Options**; an empty field uses 30 seconds. @@ -148,10 +150,17 @@ through the log, one page older each time. Row counts are approximate. The count is the end offset minus the start offset, which overcounts where retention has removed messages from the middle of a compacted topic. -Schema Registry is not read. A binary `value` column of Protobuf messages decodes field by field -with **Display As > Protobuf**, which reads the five-byte Confluent wire-format prefix and shows the -schema ID; see [Binary value viewer](/features/json-viewer#binary-value-viewer). Avro values decode -with **Display As > Avro Schema…** and the topic's `.avsc` file, past the same prefix. +With a **Schema Registry URL** on the connection, set **Display As > Schema Registry** on the +`value` or `key` column. Each value names its schema by the ID in its five-byte Confluent wire-format +prefix. TablePro fetches that Avro, Protobuf or JSON schema, with any files a Protobuf schema imports, +and keeps it until you quit. A cell shows the stored bytes until its schema arrives, then redraws. A +schema that cannot be fetched leaves the cell as hex, and the viewer shows the registry's reason. The +registry is reached directly from this Mac, not through the connection's SSH tunnel. + +Without a registry, a `value` column of Protobuf messages decodes field by field with **Display As > +Protobuf**, or with field names through **Display As > Protobuf Schema…** and the topic's `.proto` +file. Avro values decode with **Display As > Avro Schema…** and the topic's `.avsc` file. Each reads +past the same prefix; see [Binary value viewer](/features/json-viewer#binary-value-viewer). Creating a topic, editing topic configuration, and resetting consumer group offsets are not available. Deleting a topic is, as the paragraph above describes. diff --git a/features/json-viewer.mdx b/features/json-viewer.mdx index dad7374..e10c99b 100644 --- a/features/json-viewer.mdx +++ b/features/json-viewer.mdx @@ -1,6 +1,6 @@ --- title: Cell and Row Viewers -description: View and edit JSON, PHP serialized, image and binary cell values, decode MessagePack, Protobuf, igbinary and Avro, set per-column display formats, and inspect whole rows in the sidebar +description: View and edit JSON, PHP serialized, image and binary cell values, decode MessagePack, Protobuf, igbinary and Avro, with schemas from a file or a Schema Registry, set per-column display formats, and inspect whole rows in the sidebar --- Click the chevron on a JSON or blob cell to open its value in a popover anchored to that cell. Which viewer opens follows the column: its declared type, or the **Display As** choice on its header, and that choice changes rendering only, never what is stored. @@ -23,6 +23,8 @@ Right-click a column header and pick **Display As**. The submenu lists the forma | PHP Serialized | text | Opens the cell in the PHP serialized viewer | | MessagePack, Protobuf, igbinary | binary | Decodes the bytes and opens the cell in the [binary value viewer](#binary-value-viewer) | | Avro Schema… | binary | Asks for the `.avsc` file the values were written with, then decodes like the formats above | +| Protobuf Schema… | binary | Asks for the `.proto` file or descriptor set the values were written with, and the message type, then shows field names | +| Schema Registry | binary, text | Fetches each value's schema from the connection's Schema Registry. Offered when the connection names one | An override persists per column, scoped to the connection and table. A column with a format set copies in that format when you copy the single cell; a block of cells or a whole row always copies the stored value. @@ -102,7 +104,7 @@ An array or object row copies as its summary, such as `[2 items]`, not as its co ## Binary value viewer -Set **Display As > MessagePack**, **Protobuf** or **igbinary** on a binary column, or pick **Avro Schema…** and choose the column's schema file. The grid shows each value decoded on one line, and double-click or `Enter` opens the viewer. It is read-only. On an editable table the chevron still opens the hex editor, and so does double-clicking a NULL cell. +Set **Display As > MessagePack**, **Protobuf** or **igbinary** on a binary column, pick **Avro Schema…** or **Protobuf Schema…** and choose the column's schema file, or pick **Schema Registry** on a connection that names one. The grid shows each value decoded on one line, and double-click or `Enter` opens the viewer. It is read-only. On an editable table the chevron still opens the hex editor, and so does double-clicking a NULL cell. | Mode | MessagePack, Avro | Protobuf | igbinary | | --- | --- | --- | --- | @@ -112,8 +114,12 @@ Set **Display As > MessagePack**, **Protobuf** or **igbinary** on a binary colum Protobuf without its schema has no field names or types. A length-delimited field reads as a nested message when its bytes parse as one, else as text when they are UTF-8, else as escaped bytes, so a short string can read as a message. A value that starts with a Schema Registry frame, as Kafka producers write it, shows its schema ID and message index above the tree. +**Protobuf Schema…** takes a `.proto` file or a descriptor set from `protoc --descriptor_set_out`. Use a descriptor set built with `--include_imports` when the message uses types from other files: a `.proto` file is read alone, so a field of an imported type shows by number. When the file defines more than one message, TablePro asks which one the column holds, and the menu names the format after it, as in **Protobuf (Order)**. The tree shows each field by name, badged with its declared type, enums by value name, and maps as `key` and `value` entries. **Text** mode prints the value as `protoc --decode` does, except that UTF-8 text keeps its characters. A field the schema does not declare, or declares with another wire type, shows by number as it would without a schema. TablePro keeps a copy of the file, as it does for Avro. + Avro reads each value as one datum written with the chosen schema. A record shows its fields in schema order, a union shows the branch it holds, and logical types read as what they stand for: `decimal` as a number, `uuid`, `date`, `time` and `duration` as text, `timestamp` in UTC, `local-timestamp` without a zone. The menu names the column's format after the schema's root type, as in **Avro (Order)**. TablePro keeps a copy of the schema, so moving or deleting the file later changes nothing; pick **Avro Schema…** again to replace it. A value with the Kafka wire-format prefix decodes past it, and the viewer shows its schema ID. A value in Avro's single-object encoding, as Java's `toByteBuffer()` writes it, decodes when its schema fingerprint matches the chosen schema, and the viewer shows the fingerprint. +**Schema Registry** reads the schema ID from each value's wire-format prefix and fetches the schema from the registry named in the connection's settings, see [Kafka](/databases/kafka). Avro and Protobuf values decode as above, a Protobuf message picked by the message index in the prefix, and JSON Schema values open in the JSON tree. A cell shows the stored bytes while its schema is being fetched. A value with no prefix, or whose schema the registry does not return, stays hex, and the viewer says why. + A value that does not decode stays hex in the grid, and the viewer says where it broke above its hex dump. Copying a single cell copies the decoded text, cut at 40,000 characters. **Find** searches the decoded text. ## Blob and hex From 419627b8cc2c8e3fbc4ac6d22a16767d530e8e66 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Sun, 1 Nov 2026 21:33:49 +0700 Subject: [PATCH 4/4] docs(kafka): when a failed registry fetch is retried and settings apply --- databases/kafka.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/databases/kafka.mdx b/databases/kafka.mdx index aabbe7c..bcd56c1 100644 --- a/databases/kafka.mdx +++ b/databases/kafka.mdx @@ -154,8 +154,9 @@ With a **Schema Registry URL** on the connection, set **Display As > Schema Regi `value` or `key` column. Each value names its schema by the ID in its five-byte Confluent wire-format prefix. TablePro fetches that Avro, Protobuf or JSON schema, with any files a Protobuf schema imports, and keeps it until you quit. A cell shows the stored bytes until its schema arrives, then redraws. A -schema that cannot be fetched leaves the cell as hex, and the viewer shows the registry's reason. The -registry is reached directly from this Mac, not through the connection's SSH tunnel. +schema that cannot be fetched leaves the cell as hex, and the viewer shows the registry's reason; +**Refresh** or opening the value asks again. A change to the registry settings applies from the next +connect. The registry is reached directly from this Mac, not through the connection's SSH tunnel. Without a registry, a `value` column of Protobuf messages decodes field by field with **Display As > Protobuf**, or with field names through **Display As > Protobuf Schema…** and the topic's `.proto`