diff --git a/public/og/compare/tableplus.png b/public/og/compare/tableplus.png
new file mode 100644
index 0000000..e1f5d8b
Binary files /dev/null and b/public/og/compare/tableplus.png differ
diff --git a/resources/data/comparisons.json b/resources/data/comparisons.json
index 0796955..e974a6f 100644
--- a/resources/data/comparisons.json
+++ b/resources/data/comparisons.json
@@ -1,4 +1,155 @@
[
+ {
+ "slug": "tableplus",
+ "name": "TablePlus",
+ "tagline": "Free, open source TablePlus alternative for Mac.",
+ "description": "TablePlus is $99 a device and closed source. TablePro is free, open source under AGPLv3, and covers 25 databases. Both are native Mac apps — that part is a tie.",
+ "longDescription": "TablePlus is the closest thing to TablePro on the Mac: a genuinely native AppKit app, fast, well made, and shipping since 2019. It also has an LLM chat panel and, since June 2026, an MCP server — so the usual \"native versus Electron\" and \"we have AI\" arguments do not apply here. What separates them is the licence. TablePlus costs $99 for one device or $129 for two, includes one year of updates, and asks $59 per device to keep receiving them. TablePro is free, AGPLv3, and the source is public.",
+ "rows": [
+ {
+ "label": "Price",
+ "tablePro": "Free",
+ "competitor": "$99 one device, $129 two"
+ },
+ {
+ "label": "Updates",
+ "tablePro": "Always free",
+ "competitor": "1 year, then $59 per device"
+ },
+ {
+ "label": "Open Source",
+ "tablePro": true,
+ "competitor": false
+ },
+ {
+ "label": "Technology",
+ "tablePro": "Native (SwiftUI)",
+ "competitor": "Native (AppKit)"
+ },
+ {
+ "label": "Databases",
+ "tablePro": "25 drivers",
+ "competitor": "16"
+ },
+ {
+ "label": "AI Assistant",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "MCP Server",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "Safe Mode",
+ "tablePro": "6 levels, per connection",
+ "competitor": "5 levels"
+ },
+ {
+ "label": "Touch ID",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "SSH Tunneling",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "Inline Editing",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "Export Formats",
+ "tablePro": "CSV, JSON, XLSX, Markdown",
+ "competitor": "CSV, JSON, SQL"
+ },
+ {
+ "label": "ER Diagrams",
+ "tablePro": true,
+ "competitor": "Via plugin"
+ },
+ {
+ "label": "iOS App",
+ "tablePro": true,
+ "competitor": true
+ },
+ {
+ "label": "Windows and Linux",
+ "tablePro": false,
+ "competitor": true
+ }
+ ],
+ "prosTablePro": [
+ "Free forever, against $99 a device",
+ "Updates never expire",
+ "Open source under AGPLv3",
+ "25 database drivers, against 16",
+ "Six Safe Mode levels, set per connection",
+ "XLSX export"
+ ],
+ "prosCompetitor": [
+ "Windows and Linux builds",
+ "Available on Setapp",
+ "Perpetual licence — your last covered build keeps working",
+ "Shipping and refined since 2019",
+ "One seat covers any OS"
+ ],
+ "chooseTablePro": "you want the same native Mac experience without a per-device licence, or you want to read the source.",
+ "chooseCompetitor": "you need Windows or Linux, you already own a licence, or you prefer paying once for a build you can freeze.",
+ "verdict": "TablePlus is a good native Mac client and the closest match to TablePro in design and speed. The difference is not performance and it is no longer AI — both ship an MCP server. It is the licence: $99 a device and closed, against free and AGPLv3.",
+ "keywords": [
+ "tableplus alternative",
+ "tablepro vs tableplus",
+ "tableplus vs tablepro",
+ "free tableplus alternative",
+ "open source tableplus alternative",
+ "tableplus alternative mac"
+ ],
+ "ogTableProMetaHtml": "FREE · AGPLv3
25 databases
Native (SwiftUI)",
+ "ogCompetitorMetaHtml": "$99 per device
+$59 to keep updates
Closed source",
+ "ogPunchline": "Both native. One is free and open source.",
+ "ogStatValue": "$0",
+ "ogStatLabel": "PER DEVICE",
+ "migrationSteps": [
+ {
+ "title": "Open the importer",
+ "description": "File > Import Connections, then pick TablePlus. The Setapp edition is detected as well, and TablePlus does not need to be running."
+ },
+ {
+ "title": "Passwords come across",
+ "description": "Connections, groups, SSH tunnels and SSL settings are read directly, and passwords are copied from the macOS Keychain into your own Keychain."
+ },
+ {
+ "title": "Check the tunnels",
+ "description": "Open one connection that uses an SSH tunnel and connect once. Everything else carries over untouched, so nothing needs retyping."
+ }
+ ],
+ "faqs": [
+ {
+ "question": "Is TablePro slower than TablePlus?",
+ "answer": "No, and neither is meaningfully slower than the other. Both are native Mac apps — TablePro in SwiftUI and AppKit, TablePlus in AppKit — so neither pays the startup or memory cost of Electron or a JVM. Anyone claiming a large speed gap between two native clients is guessing."
+ },
+ {
+ "question": "Does TablePlus have AI and MCP?",
+ "answer": "Yes to both. TablePlus ships an LLM chat panel that you point at OpenAI, Anthropic, GitHub Copilot or a local model, and it added an MCP server in version 7.1.8 on 10 June 2026. TablePro has the same two capabilities. This is not a difference between them."
+ },
+ {
+ "question": "Why do you say 16 databases when TablePlus documents 13?",
+ "answer": "Their documentation lists 13 engines and their homepage shows 14 logos, and the two lists do not match — BigQuery, ClickHouse and Turso appear only on the homepage, Snowflake and Vertica only in the docs. Sixteen is the union of both, which is the most generous reading. TablePro ships 25 drivers."
+ },
+ {
+ "question": "What does the TablePlus licence actually cost over time?",
+ "answer": "A licence is $99 for one device or $129 for two, one time, and includes a year of updates. After that the app keeps working forever on the last build your term covered, with no feature lockout. To carry on receiving updates it is $59 per device. The bundled iOS unlock, however, stops when the term lapses."
+ },
+ {
+ "question": "Can I import my TablePlus connections?",
+ "answer": "Yes. TablePro reads TablePlus connections directly, including the Setapp edition, and takes passwords from the macOS Keychain along with SSH tunnels and SSL settings. TablePlus does not need to be running, and groups and folders carry over."
+ }
+ ]
+ },
{
"slug": "dbeaver",
"name": "DBeaver",
diff --git a/resources/js/components/landing/compare-table.tsx b/resources/js/components/landing/compare-table.tsx
index 9a0bd9c..2188abc 100644
--- a/resources/js/components/landing/compare-table.tsx
+++ b/resources/js/components/landing/compare-table.tsx
@@ -5,16 +5,26 @@ import SectionShell from '@/components/ui/section-shell';
import { getComparisonBySlug, type ComparisonInfo } from '@/data/comparisons';
/**
- * Three competitors, one per runtime: a JVM desktop app, a JVM IDE, and an
- * Electron app. The point of the table is the category, not the vendor, which
- * is also the shape least likely to compete with the ten /compare/* pages that
- * each own their competitor's name.
+ * Four competitors: a JVM desktop app, a JVM IDE, an Electron app, and the one
+ * other native Mac client. The first three lose the runtime argument on the
+ * Technology row; TablePlus does not, and that is the honest reason it is here.
+ * Against TablePlus the row that separates the two is Price.
*
- * TablePlus is deliberately absent. /compare/tableplus returns 410, and
- * StaleClaimsTest fails the build on any landing component that links it. It
- * appears in SwitchFrom as an import source only.
+ * Ordered so the runtime contrast reads first and the like-for-like comparison
+ * closes it.
*/
-const SLUGS = ['dbeaver', 'datagrip', 'beekeeper-studio'] as const;
+const SLUGS = ['dbeaver', 'datagrip', 'beekeeper-studio', 'tableplus'] as const;
+
+/**
+ * Rendered where a competitor has no measurement for a metric.
+ *
+ * TablePlus ships without a `benchmarks` block, because it is native like
+ * TablePro and nothing published about either app's cold start survives
+ * scrutiny — the tidy figures in circulation trace back to competitor
+ * comparison pages, this site's included. An em-dash and a footnote say "not
+ * measured", which is true; a number here would not be.
+ */
+const UNMEASURED = '—';
interface Metric {
label: string;
@@ -39,7 +49,7 @@ const METRICS: Metric[] = [
*/
function valueFor(comparison: ComparisonInfo, metric: Metric, side: 'tablePro' | 'competitor'): string {
if (metric.benchmark) {
- return comparison.benchmarks?.[side][metric.benchmark] ?? '';
+ return comparison.benchmarks?.[side][metric.benchmark] ?? UNMEASURED;
}
const row = comparison.rows.find((candidate) => candidate.label === metric.row);
@@ -66,7 +76,7 @@ export default function CompareTable() {
tone="raised"
id="compare"
label="Comparison"
- headline="TablePro, DBeaver, DataGrip and Beekeeper Studio."
+ headline="TablePro, DBeaver, DataGrip, Beekeeper Studio and TablePlus."
headlineMuted="Startup, memory, runtime and price."
>
Every competitor figure comes from its own comparison page, which is where the version tested is - written down. + written down. TablePlus is native like TablePro, and its cold start and idle memory are not + measured here rather than estimated.