diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif
new file mode 100644
index 00000000..97520d5c
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp
new file mode 100644
index 00000000..b9698f7e
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif
new file mode 100644
index 00000000..efdda906
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp
new file mode 100644
index 00000000..ce612b75
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif
new file mode 100644
index 00000000..31328a6a
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp
new file mode 100644
index 00000000..6aa312fc
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif
new file mode 100644
index 00000000..82812d97
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif differ
diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp
new file mode 100644
index 00000000..1c930010
Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp differ
diff --git a/public/images/blog/generate-rows-sheet.png b/public/images/blog/generate-rows-sheet.png
new file mode 100644
index 00000000..7957753c
Binary files /dev/null and b/public/images/blog/generate-rows-sheet.png differ
diff --git a/public/images/blog/search-database-results.png b/public/images/blog/search-database-results.png
new file mode 100644
index 00000000..64fe7d8d
Binary files /dev/null and b/public/images/blog/search-database-results.png differ
diff --git a/public/og/blog/tablepro-0-83-beta.png b/public/og/blog/tablepro-0-83-beta.png
new file mode 100644
index 00000000..b2c9615b
Binary files /dev/null and b/public/og/blog/tablepro-0-83-beta.png differ
diff --git a/resources/blog/tablepro-0-83-beta.md b/resources/blog/tablepro-0-83-beta.md
new file mode 100644
index 00000000..21bfc903
--- /dev/null
+++ b/resources/blog/tablepro-0-83-beta.md
@@ -0,0 +1,69 @@
+---
+slug: tablepro-0-83-beta
+title: "TablePro 0.83 Beta: Search Database and Generate Rows"
+description: The 0.83 beta adds Search Database, Generate Rows and a tablepro query command for Terminal. Turn on Get beta updates to try it before 0.83.0.
+date: 2026-10-23
+release: "TablePro 0.83 beta"
+author: TablePro Team
+tags: [release, mcp, ssh, import]
+ogPunchline: Find a value in every table, fill one with test rows, and run SQL from Terminal.
+---
+
+TablePro 0.83.0-beta.2 is out for testing. Only Macs with **Get beta updates** on are offered it, and the stable 0.83.0 comes after the betas.
+
+Search Database finds a value in every table, Generate Rows fills a table with test data, and `tablepro query` runs SQL from Terminal. Grid saves refuse an `UPDATE` or `DELETE` without a `WHERE`, and SSH tunnels drop SHA-1 and other old algorithms.
+
+
+
+## Search Database
+
+Choose **Database > Search Database…**, or right-click a database or schema in the sidebar, and type a value: an email address, an order number, a UUID. TablePro runs one `SELECT` per table and lists the tables that hold it, with the matching columns and a row count. Open one and it comes up in a new tab, filtered to those rows.
+
+Text columns are always searched, and number, date and UUID columns when the value reads as one. Counting stops at 1,000 rows per table, and **Stop** keeps what was found so far.
+
+## Generate Rows
+
+Right-click a table and choose **Generate Rows…** to fill it with 1 to 1,000,000 made-up rows. Each column gets a generator from its type and name: example-domain addresses for an `email` column, an enum's own labels, an existing key for a foreign key. The preview shows the first 10 rows before anything runs.
+
+
+
+Keys and unique columns never repeat, and the same seed and settings give the same rows. **Generate** inserts in one transaction, so **Cancel** rolls the run back on any engine with transactions. Safe Mode treats it like any other write.
+
+## Queries from Terminal
+
+`tablepro query` runs one statement through the app and prints the rows as CSV, TSV, JSON, JSON Lines or a table:
+
+```bash
+tablepro query -c Staging --format csv "SELECT id, email FROM users LIMIT 5" > users.csv
+```
+
+It talks to the app's MCP server, so turn on **Enable MCP Server** in **Settings > MCP** first. The first run asks you to pair it, starting at **Read Only**. **Settings > General > Command Line** shows how to link `tablepro` into your `PATH`, and [the docs](https://docs.tablepro.app/integrations/terminal) cover the options and exit codes.
+
+## Also in the beta
+
+- **View > Compare Result With…** matches two query results row by row, on key columns or whole rows
+- Import a CSV, JSON or XLSX file into an existing table as **Update**, **Insert or Update** or **Insert, Skip Existing**, or import a folder of files in one run
+- **Pin Tab** keeps a tab open through **Close Other Tabs**, **Close All Tabs** and a relaunch
+- **Freeze Up to This Column** in the grid's header menu keeps leading columns in view
+- Edit the schema from the ER diagram, and export the diagram as SVG, PDF, Mermaid or Graphviz DOT
+- Inline suggestions and Review, Explain, Optimize and Fix can run on Apple Intelligence, on macOS 26 and later
+- Emacs key bindings, under **Settings > Editor > Key bindings**, which replaces the Vim mode switch
+- Kerberos sign-in for PostgreSQL and MariaDB, and Presto connections through the Trino plugin
+
+## Changes to check
+
+**SSH tunnels no longer offer SHA-1 key exchange, `ssh-rsa` signatures, SHA-1 and MD5 MACs, or 3DES, Blowfish and RC4 ciphers.** A server that offers only those fails with an error naming them.
+
+A grid save stops before it sends an `UPDATE` or `DELETE` with no `WHERE` clause. A delete's confirmation lists the rows that foreign keys delete, rewrite or protect in other tables.
+
+## What it will not do
+
+- `tablepro query` returns the whole result at once, up to the MCP row limit, and refuses `DROP` and `TRUNCATE`
+- Search Database needs SQL, and skips Cassandra, ScyllaDB and DynamoDB
+- The iOS app isn't in this beta, though the release notes list its changes
+
+## Getting the beta
+
+Select **Get beta updates** in **Settings > General**, then choose **TablePro > Check for Updates…**. The DMG and the full notes are on the [GitHub release](https://github.com/TableProApp/TablePro/releases/tag/v0.83.0-beta.2).
+
+To go back, deselect **Get beta updates**. The beta stays until 0.83.0 replaces it, and [Beta updates](https://docs.tablepro.app/beta-updates) covers installing the stable release over it sooner. Report a problem in a [GitHub issue](https://github.com/TableProApp/TablePro/issues), with the version from **TablePro > About TablePro**.
diff --git a/resources/data/assets.json b/resources/data/assets.json
index 11c508ab..a534607c 100644
--- a/resources/data/assets.json
+++ b/resources/data/assets.json
@@ -11227,6 +11227,112 @@
"/images/blog/set-value-generate-uuid.png"
]
},
+ "blog-tablepro-0-83-beta-1": {
+ "kind": "figure",
+ "type": "screenshot",
+ "family": "blog",
+ "ownerRepo": "web",
+ "slot": true,
+ "handoffPriority": "P3",
+ "usedOn": [
+ {
+ "path": "/blog/tablepro-0-83-beta",
+ "section": "figure-1"
+ }
+ ],
+ "aspect": "722:521",
+ "priority": false,
+ "theme": "single",
+ "locale": "shared",
+ "mobile": null,
+ "description": {
+ "en": "The Search Database sheet after a search for the letter e in a sample SQLite database, listing six tables with their matching columns and row counts.",
+ "vi": null
+ },
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom",
+ "vi": null
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match.",
+ "vi": null
+ },
+ "replacement": {
+ "dir": "public/images/blog",
+ "base": "blog-tablepro-0-83-beta-1"
+ },
+ "status": "supplied",
+ "src": {
+ "light": {
+ "widths": [
+ 704,
+ 722
+ ],
+ "formats": [
+ "avif",
+ "webp"
+ ],
+ "width": 722,
+ "height": 521
+ }
+ },
+ "legacySource": [
+ "/images/blog/search-database-results.png"
+ ]
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "kind": "figure",
+ "type": "screenshot",
+ "family": "blog",
+ "ownerRepo": "web",
+ "slot": true,
+ "handoffPriority": "P3",
+ "usedOn": [
+ {
+ "path": "/blog/tablepro-0-83-beta",
+ "section": "figure-2"
+ }
+ ],
+ "aspect": "1640:1122",
+ "priority": false,
+ "theme": "single",
+ "locale": "shared",
+ "mobile": null,
+ "description": {
+ "en": "The Generate Rows sheet set to 100,000 rows with seed 4271, the total column’s Decimal Range generator selected, and a preview of six generated rows.",
+ "vi": null
+ },
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps",
+ "vi": null
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written.",
+ "vi": null
+ },
+ "replacement": {
+ "dir": "public/images/blog",
+ "base": "blog-tablepro-0-83-beta-2"
+ },
+ "status": "supplied",
+ "src": {
+ "light": {
+ "widths": [
+ 704,
+ 1408
+ ],
+ "formats": [
+ "avif",
+ "webp"
+ ],
+ "width": 1408,
+ "height": 963
+ }
+ },
+ "legacySource": [
+ "/images/blog/generate-rows-sheet.png"
+ ]
+ },
"blog-tablepro-for-iphone-1": {
"kind": "phone",
"type": "screenshot-phone",
diff --git a/resources/js/lib/data/asset-locales/de.json b/resources/js/lib/data/asset-locales/de.json
index 567019a8..e8fc85a0 100644
--- a/resources/js/lib/data/asset-locales/de.json
+++ b/resources/js/lib/data/asset-locales/de.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/en.json b/resources/js/lib/data/asset-locales/en.json
index ebc635ab..b5165b00 100644
--- a/resources/js/lib/data/asset-locales/en.json
+++ b/resources/js/lib/data/asset-locales/en.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/es.json b/resources/js/lib/data/asset-locales/es.json
index e13552a9..07771e65 100644
--- a/resources/js/lib/data/asset-locales/es.json
+++ b/resources/js/lib/data/asset-locales/es.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/fr.json b/resources/js/lib/data/asset-locales/fr.json
index 547796fa..7623be44 100644
--- a/resources/js/lib/data/asset-locales/fr.json
+++ b/resources/js/lib/data/asset-locales/fr.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/id.json b/resources/js/lib/data/asset-locales/id.json
index f2778b82..86d4dd0b 100644
--- a/resources/js/lib/data/asset-locales/id.json
+++ b/resources/js/lib/data/asset-locales/id.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/it.json b/resources/js/lib/data/asset-locales/it.json
index 9f43733e..dbd0cf52 100644
--- a/resources/js/lib/data/asset-locales/it.json
+++ b/resources/js/lib/data/asset-locales/it.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/ja.json b/resources/js/lib/data/asset-locales/ja.json
index 60d39b4a..bb1e6992 100644
--- a/resources/js/lib/data/asset-locales/ja.json
+++ b/resources/js/lib/data/asset-locales/ja.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/ko.json b/resources/js/lib/data/asset-locales/ko.json
index cc693904..cb0e9789 100644
--- a/resources/js/lib/data/asset-locales/ko.json
+++ b/resources/js/lib/data/asset-locales/ko.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/pt-BR.json b/resources/js/lib/data/asset-locales/pt-BR.json
index 48f42b65..28751476 100644
--- a/resources/js/lib/data/asset-locales/pt-BR.json
+++ b/resources/js/lib/data/asset-locales/pt-BR.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/vi.json b/resources/js/lib/data/asset-locales/vi.json
index 805faa2f..4c35627f 100644
--- a/resources/js/lib/data/asset-locales/vi.json
+++ b/resources/js/lib/data/asset-locales/vi.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/zh-Hans.json b/resources/js/lib/data/asset-locales/zh-Hans.json
index 40a08b5e..b4bfce2e 100644
--- a/resources/js/lib/data/asset-locales/zh-Hans.json
+++ b/resources/js/lib/data/asset-locales/zh-Hans.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-locales/zh-Hant.json b/resources/js/lib/data/asset-locales/zh-Hant.json
index c9ffdbb4..49643d44 100644
--- a/resources/js/lib/data/asset-locales/zh-Hant.json
+++ b/resources/js/lib/data/asset-locales/zh-Hant.json
@@ -1000,6 +1000,22 @@
"en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7."
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "alt": {
+ "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom"
+ },
+ "caption": {
+ "en": "Each table that holds the value names the columns that matched and how many rows match."
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "alt": {
+ "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps"
+ },
+ "caption": {
+ "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written."
+ }
+ },
"blog-tablepro-for-iphone-1": {
"alt": {
"en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom"
diff --git a/resources/js/lib/data/asset-slots.json b/resources/js/lib/data/asset-slots.json
index 990349a1..c80acce6 100644
--- a/resources/js/lib/data/asset-slots.json
+++ b/resources/js/lib/data/asset-slots.json
@@ -5423,6 +5423,64 @@
"base": "blog-tablepro-0-82-3"
}
},
+ "blog-tablepro-0-83-beta-1": {
+ "kind": "figure",
+ "type": "screenshot",
+ "slot": true,
+ "aspect": "722:521",
+ "priority": false,
+ "theme": "single",
+ "locale": "shared",
+ "mobile": null,
+ "status": "supplied",
+ "src": {
+ "light": {
+ "widths": [
+ 704,
+ 722
+ ],
+ "formats": [
+ "avif",
+ "webp"
+ ],
+ "width": 722,
+ "height": 521
+ }
+ },
+ "replacement": {
+ "dir": "public/images/blog",
+ "base": "blog-tablepro-0-83-beta-1"
+ }
+ },
+ "blog-tablepro-0-83-beta-2": {
+ "kind": "figure",
+ "type": "screenshot",
+ "slot": true,
+ "aspect": "1640:1122",
+ "priority": false,
+ "theme": "single",
+ "locale": "shared",
+ "mobile": null,
+ "status": "supplied",
+ "src": {
+ "light": {
+ "widths": [
+ 704,
+ 1408
+ ],
+ "formats": [
+ "avif",
+ "webp"
+ ],
+ "width": 1408,
+ "height": 963
+ }
+ },
+ "replacement": {
+ "dir": "public/images/blog",
+ "base": "blog-tablepro-0-83-beta-2"
+ }
+ },
"blog-tablepro-for-iphone-1": {
"kind": "phone",
"type": "screenshot-phone",
diff --git a/tests/Feature/Landing/BlogTest.php b/tests/Feature/Landing/BlogTest.php
index 239bac42..f8e7b4c5 100644
--- a/tests/Feature/Landing/BlogTest.php
+++ b/tests/Feature/Landing/BlogTest.php
@@ -25,6 +25,7 @@
// A post keeps the date it was published; an edit never re-dates it.
const BLOG_PUBLISHED = [
+ 'tablepro-0-83-beta' => '2026-10-23',
'tablepro-0-82' => '2026-10-20',
'tablepro-0-81' => '2026-10-16',
'tablepro-0-80' => '2026-10-11',
@@ -131,7 +132,7 @@ function blogSlotIds(string $html): array
->where('posts.0.url', '/blog/' . $expected[0])
->where('posts.0.locale', 'en')
->where('posts.0.date', BLOG_PUBLISHED[$expected[0]])
- ->where('posts.0.dateFormatted', 'October 20, 2026')
+ ->where('posts.0.dateFormatted', 'October 23, 2026')
->where('posts', fn($posts): bool => collect($posts)->every(
fn(array $post): bool => $post['kind'] === (array_key_exists($post['slug'], BLOG_GUIDES) ? 'guide' : 'release'),
)));
@@ -426,7 +427,7 @@ function blogSlotIds(string $html): array
$this->get('/blog/tablepro-0-76')
->assertOk()
->assertInertia(fn(AssertableInertia $page) => $page
- ->where('related.0.slug', 'tablepro-0-77')
+ ->where('related.0.slug', 'tablepro-0-83-beta')
->where('related.1.slug', 'tablepro-0-70')
->where('related.2.slug', 'tablepro-0-67'));
});
@@ -445,14 +446,14 @@ function blogSlotIds(string $html): array
->where('seo.alternates', fn($alternates): bool => collect($alternates)->pluck('hreflang')->all() === ['en', 'vi'])
->missing('content.seo.indexable')
->has('posts', count(BLOG_GUIDES) + count(BLOG_PUBLISHED))
- ->where('posts', fn($posts): bool => collect($posts)->slice(3, $guides)->every(
+ ->where('posts', fn($posts): bool => collect($posts)->slice(4, $guides)->every(
fn(array $post): bool => $post['kind'] === 'guide' && $post['locale'] === 'vi' && $post['url'] === "/vi/blog/{$post['slug']}",
))
- ->where('posts.0.slug', 'tablepro-0-82')
+ ->where('posts.0.slug', 'tablepro-0-83-beta')
->where('posts.0.locale', 'en')
- ->where('posts.0.url', '/blog/tablepro-0-82')
- ->where('posts.0.title', blogMatter('tablepro-0-82')['title'])
- ->where('posts.0.dateFormatted', '20 tháng 10 năm 2026')
+ ->where('posts.0.url', '/blog/tablepro-0-83-beta')
+ ->where('posts.0.title', blogMatter('tablepro-0-83-beta')['title'])
+ ->where('posts.0.dateFormatted', '23 tháng 10 năm 2026')
->where('localization.switcher.0.href', '/blog'));
expect($response->getContent())->toContain('