Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 5 additions & 2 deletions .claude/skills/announce/scripts/lint-draft.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,10 @@ def check_blog(text, draft_path, add):
add(HARD, "frontmatter", "no --- block at the top")
return
fields = dict(re.findall(r"^(\w+):\s*(.*)$", front.group(1), re.M))
# A news post (`kind: news`) announces no release and needs no figure.
news = fields.get("kind") == "news"
for name in BLOG_FIELDS:
if not fields.get(name):
if not fields.get(name) and not (news and name == "release"):
add(HARD, "frontmatter", f"missing {name}")
stem = Path(draft_path).stem
if fields.get("slug") and fields["slug"] != stem:
Expand All @@ -186,7 +188,8 @@ def check_blog(text, draft_path, add):
if len(punchline) > OG_PUNCHLINE_MAX:
add(SOFT, "ogPunchline", f"{len(punchline)} chars, keep it under about {OG_PUNCHLINE_MAX}")

check_slots(text, add)
if not news:
check_slots(text, add)

body = ASSET_SLOT.sub("", text[front.end():])
sections = [len(s.split()) for s in re.split(r"\n## ", body)[1:]]
Expand Down
1 change: 1 addition & 0 deletions app/Services/Blog/BlogService.php
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ private function parse(string $slug, string $locale): ?Post
release: $this->text($document->matter('release')),
author: $this->text($document->matter('author')),
seoTitle: $this->text($document->matter('seoTitle')),
news: $document->matter('kind') === Post::KIND_NEWS,
);
}

Expand Down
14 changes: 12 additions & 2 deletions app/Services/Blog/Post.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
* `date` is the original publication date from the front matter, and never
* changes. `release` names what a release post announced ("TablePro 0.74"),
* for the archive note above it; null for a guide, which announces nothing.
* `news` marks a dated notice about TablePro itself, such as a price change,
* which is neither a guide nor a release (front matter `kind: news`).
* `tags` rank related posts and name the pages a post links (`PostTopics`);
* the pages do not print them. `seoTitle` replaces the title in `<title>`
* only. The body is not held here: `BlogService::html()` renders it for the
Expand All @@ -36,18 +38,26 @@ public function __construct(
public ?string $release,
public ?string $author = null,
public ?string $seoTitle = null,
public bool $news = false,
) {}

public const KIND_GUIDE = 'guide';

public const KIND_RELEASE = 'release';

public const KIND_NEWS = 'news';

/**
* `release` for a post that announced a release, `guide` for every other.
* `release` for a post that announced a release, `news` for a notice about
* TablePro itself, `guide` for every other.
*/
public function kind(): string
{
return $this->release === null ? self::KIND_GUIDE : self::KIND_RELEASE;
if ($this->release !== null) {
return self::KIND_RELEASE;
}

return $this->news ? self::KIND_NEWS : self::KIND_GUIDE;
}

/**
Expand Down
Binary file added public/og/blog/new-prices-2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/og/vi/blog/new-prices-2026.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions resources/blog/new-prices-2026.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
slug: new-prices-2026
title: "New TablePro prices: Starter is now Pro"
description: Pro now covers 3 Macs at new prices, Team starts at 2 seats, and everything already bought keeps its price and terms.
date: 2026-11-02
kind: news
author: TablePro
ogPunchline: Free stays free. What you already bought keeps its terms.
tags: []
---

TablePro is free and open source, and it stays that way. Every feature that is free today stays free, at work too, with no limit on tabs, windows or connections. The paid plans add optional features to the Mac app, and their prices changed today.

## What changed {#what-changed}

| Plan | Before | Now |
| --- | --- | --- |
| Pro (was Starter) | $2.99 a month, $24 a year or $59 once, on 2 Macs | $4.99 a month, $39 a year or $79 once, on 3 Macs |
| Team | $1.25 a seat a month, $10 a seat a year or $25 a seat once, from 5 seats | $12 a seat a month, or $10 a seat a month billed yearly, from 2 seats |
| Enterprise | Not offered | On request, at [hello@tablepro.app](mailto:hello@tablepro.app?subject=TablePro%20Enterprise) |

- **Starter is renamed Pro.** It keeps every feature it had, a one-time license is still paid once with no expiry date, and a license now covers 3 Macs instead of 2.
- **Team starts at 2 seats instead of 5.** Each seat covers one activated Mac. Team is a monthly or yearly subscription, and one-time Team seats are no longer sold.
- **Enterprise** is for a company that needs sign-in with its own accounts, enforced policies or an audit log. Write to hello@tablepro.app with the subject "TablePro Enterprise" and say what you need.

## What does not change {#what-stays}

- **Your one-time license** keeps every feature and has no expiry date, and a Pro license bought before today covers 3 Macs too.
- **Your subscription** keeps its price for as long as it renews. Switching it between monthly and yearly moves it to the new price.
- **Your team** keeps its seat price, including seats you add to its subscription. One-time seats stay, and more seats come with a Team subscription.
- **The free app** keeps every feature it has today.

## Why {#why}

Every TablePro release is paid for by licenses and sponsors. The old prices were set when TablePro did far less, and most people who buy a license say they buy it to support the project. The new prices still sit at the low end for a database client.

[See the plans](/pricing)
37 changes: 37 additions & 0 deletions resources/blog/vi/new-prices-2026.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
slug: new-prices-2026
title: "Giá mới của TablePro: Starter giờ là Pro"
description: Pro giờ dùng được trên 3 máy Mac với giá mới, Team bắt đầu từ 2 seat, và mọi thứ bạn đã mua giữ nguyên giá và điều khoản.
date: 2026-11-02
kind: news
author: TablePro
ogPunchline: Bản miễn phí vẫn miễn phí. Những gì bạn đã mua giữ nguyên điều khoản.
tags: []
---

TablePro miễn phí và mã nguồn mở, và sẽ luôn như vậy. Mọi tính năng đang miễn phí vẫn miễn phí, kể cả khi bạn dùng cho công việc, không giới hạn số tab, cửa sổ hay connection. Các gói trả phí thêm tính năng tùy chọn cho app trên Mac, và giá của các gói này đã thay đổi từ hôm nay.

## Những gì đã thay đổi {#what-changed}

| Gói | Trước đây | Hiện tại |
| --- | --- | --- |
| Pro (trước là Starter) | $2.99 mỗi tháng, $24 mỗi năm hoặc $59 trả một lần, trên 2 máy Mac | $4.99 mỗi tháng, $39 mỗi năm hoặc $79 trả một lần, trên 3 máy Mac |
| Team | $1.25 mỗi seat mỗi tháng, $10 mỗi seat mỗi năm hoặc $25 mỗi seat trả một lần, từ 5 seat | $12 mỗi seat mỗi tháng, hoặc $10 mỗi seat mỗi tháng khi trả theo năm, từ 2 seat |
| Enterprise | Chưa có | Liên hệ [hello@tablepro.app](mailto:hello@tablepro.app?subject=TablePro%20Enterprise) |

- **Starter đổi tên thành Pro.** Gói này giữ mọi tính năng đã có, license trả một lần vẫn chỉ trả một lần và không hết hạn, và một license giờ dùng được trên 3 máy Mac thay vì 2.
- **Team bắt đầu từ 2 seat thay vì 5.** Mỗi seat dùng cho một máy Mac đã kích hoạt. Team là subscription theo tháng hoặc theo năm, và không còn bán seat Team trả một lần.
- **Enterprise** dành cho công ty cần đăng nhập bằng tài khoản của công ty, policy bắt buộc hoặc audit log. Gửi email tới hello@tablepro.app với tiêu đề "TablePro Enterprise" và cho biết bạn cần gì.

## Những gì không đổi {#what-stays}

- **License trả một lần của bạn** giữ mọi tính năng và không hết hạn, và license Pro mua trước hôm nay cũng dùng được trên 3 máy Mac.
- **Subscription của bạn** giữ nguyên giá chừng nào còn gia hạn. Đổi subscription giữa theo tháng và theo năm sẽ chuyển sang giá mới.
- **Gói Team của bạn** giữ nguyên giá mỗi seat, kể cả seat bạn thêm vào subscription. Seat trả một lần vẫn giữ nguyên, và muốn thêm seat thì mua subscription Team.
- **App miễn phí** giữ mọi tính năng hiện có.

## Vì sao {#why}

Mỗi bản phát hành của TablePro được trả bằng tiền license và nhà tài trợ. Giá cũ được đặt khi TablePro còn làm được ít hơn nhiều, và phần lớn người mua license nói rằng họ mua để ủng hộ dự án. Giá mới vẫn nằm ở mức thấp so với các database client khác.

[Xem các gói](/vi/pricing)
2 changes: 1 addition & 1 deletion resources/data/content/de/about.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"funding": {
"title": "Finanzierung",
"body": "Bezahlte Lizenzen und Sponsoren finanzieren TablePro. Es hat keine Investoren und verkauft keine Daten.",
"plans": "Eine Starter- oder Team-Lizenz ergänzt die Mac-App um optionale Funktionen; die <pricing>Preisseite</pricing> listet sie auf.",
"plans": "Eine Pro- oder Team-Lizenz ergänzt die Mac-App um optionale Funktionen; die <pricing>Preisseite</pricing> listet sie auf.",
"sponsors": "Die aktuellen Sponsoren und was jede Stufe umfasst, stehen auf der <sponsors>Sponsorenseite</sponsors>."
},
"source": {
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/beekeeper-studio.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
"href": null
},
{
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Starter erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Pro erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"cite": [],
"feature": "icloud-sync",
"href": null
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/datagrip.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@
"href": "/features/ai-mcp#mcp"
},
{
"text": "<link>Compare & Sync</link> vergleicht die Struktur oder Daten zweier Datenbanken und erstellt ein Synchronisierungsskript. Die Funktion gehört zu Starter.",
"text": "<link>Compare & Sync</link> vergleicht die Struktur oder Daten zweier Datenbanken und erstellt ein Synchronisierungsskript. Die Funktion gehört zu Pro.",
"cite": [],
"feature": "compare-sync",
"href": null
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/dbeaver.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
"href": "/features/ai-mcp"
},
{
"text": "<link>Compare & Sync</link> vergleicht Struktur oder Daten zweier Datenbanken und gleicht die Unterschiede ab. Es gehört zu Starter.",
"text": "<link>Compare & Sync</link> vergleicht Struktur oder Daten zweier Datenbanken und gleicht die Unterschiede ab. Es gehört zu Pro.",
"cite": [],
"feature": "compare-sync",
"href": null
Expand Down
8 changes: 4 additions & 4 deletions resources/data/content/de/compare/dbgate.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
},
"modelCompare": {
"label": "Datenbankmodelle vergleichen",
"tablepro": "Compare & Sync vergleicht Struktur oder Daten zweier Datenbanken und schreibt das Synchronisierungsskript. Teil von Starter"
"tablepro": "Compare & Sync vergleicht Struktur oder Daten zweier Datenbanken und schreibt das Synchronisierungsskript. Teil von Pro"
},
"backup": {
"label": "Sicherung und Wiederherstellung",
Expand Down Expand Up @@ -132,7 +132,7 @@
"href": "/features/import-export#backup"
},
{
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Starter erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Pro erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"cite": [],
"feature": "icloud-sync",
"href": null
Expand Down Expand Up @@ -167,7 +167,7 @@
"href": null
},
{
"text": "Einige Funktionen sind kostenpflichtig. Starter ergänzt Funktionen wie {starterExamples}.",
"text": "Einige Funktionen sind kostenpflichtig. Pro ergänzt Funktionen wie {starterExamples}.",
"cite": [],
"feature": null,
"href": null
Expand All @@ -188,7 +188,7 @@
{
"id": "free-editions",
"question": "Was ist bei beiden kostenlos?",
"answer": "DbGate Community ist kostenlos und Open Source, und die kostenpflichtigen Editionen ergänzen Funktionen wie den Datenbank-Chat, den Abfrage-Designer und die native Sicherung. TablePro ist mit allen unterstützten Engines, dem KI-Assistenten und dem MCP-Server kostenlos nutzbar, und ein Starter- oder Team-Tarif ergänzt Funktionen wie {starterExamples}. <link>Preise ansehen</link>.",
"answer": "DbGate Community ist kostenlos und Open Source, und die kostenpflichtigen Editionen ergänzen Funktionen wie den Datenbank-Chat, den Abfrage-Designer und die native Sicherung. TablePro ist mit allen unterstützten Engines, dem KI-Assistenten und dem MCP-Server kostenlos nutzbar, und ein Pro- oder Team-Tarif ergänzt Funktionen wie {starterExamples}. <link>Preise ansehen</link>.",
"href": "/pricing"
},
{
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/heidisql.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
"href": null
},
{
"text": "Manche Funktionen kosten. Starter ergänzt etwa {starterExamples}; HeidiSQL hat keine bezahlten Tarife.",
"text": "Manche Funktionen kosten. Pro ergänzt etwa {starterExamples}; HeidiSQL hat keine bezahlten Tarife.",
"cite": [
"prices"
],
Expand Down
4 changes: 2 additions & 2 deletions resources/data/content/de/compare/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
"technology": "Swift mit nativen Datenbanktreibern",
"priceFree": "Kostenlos nutzbar. Bezahlte Tarife ergänzen die Mac-App um optionale Funktionen.",
"starter": "{monthly} monatlich, {yearly} jährlich oder {lifetime} einmalig",
"team": "{monthly} monatlich, {yearly} jährlich oder {lifetime} einmalig, pro Arbeitsplatz, mindestens {min} Arbeitsplätze",
"team": "{monthly} monatlich oder {yearly} jährlich, pro Arbeitsplatz, mindestens {min} Arbeitsplätze",
"iosPrice": "Die iPhone- und iPad-App ist kostenlos, ohne In-App-Käufe.",
"licence": "Ja: {licence}, einschließlich des Codes der Bezahlfunktionen",
"databases": "{engines} und weitere",
Expand All @@ -196,7 +196,7 @@
"link": "So wechselst du"
},
"tiers": {
"starter": "Starter",
"starter": "Pro",
"team": "Team"
},
"tierBadge": "{tier}-Tarif",
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/mysql-workbench.json
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@
"href": null
},
{
"text": "Einige Funktionen sind kostenpflichtig. Starter ergänzt Funktionen wie {starterExamples}, während MySQL Workbench kostenlos ist.",
"text": "Einige Funktionen sind kostenpflichtig. Pro ergänzt Funktionen wie {starterExamples}, während MySQL Workbench kostenlos ist.",
"cite": [
"prices"
],
Expand Down
8 changes: 4 additions & 4 deletions resources/data/content/de/compare/navicat.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"rows": {
"schemaSync": {
"label": "Struktursynchronisierung",
"tablepro": "Compare & Sync für Struktur und Daten, in Starter"
"tablepro": "Compare & Sync für Struktur und Daten, in Pro"
},
"dataModeling": {
"label": "Datenmodellierung",
Expand Down Expand Up @@ -87,7 +87,7 @@
"href": "/pricing"
},
{
"text": "TablePros <link>Compare & Sync</link> vergleicht Struktur oder Daten und erstellt ein Synchronisierungsskript. Destruktive Anweisungen bleiben ausgeschlossen, bis du sie erlaubst. Die Funktion gehört zu Starter.",
"text": "TablePros <link>Compare & Sync</link> vergleicht Struktur oder Daten und erstellt ein Synchronisierungsskript. Destruktive Anweisungen bleiben ausgeschlossen, bis du sie erlaubst. Die Funktion gehört zu Pro.",
"cite": [
"cells.schemaSync"
],
Expand Down Expand Up @@ -161,13 +161,13 @@
{
"id": "premium-lite",
"question": "Navicat Premium Lite ist ebenfalls kostenlos. Wie unterscheidet sich TablePro?",
"answer": "Beide sind für gewerbliche Arbeit kostenlos. Premium Lite enthält Navicats Grundfunktionen. TablePros kostenlose App verbindet sich mit allen unterstützten Engines und enthält KI-Assistent, MCP-Server und Safe Mode; ein Starter- oder Team-Tarif ergänzt Funktionen wie {starterExamples}.",
"answer": "Beide sind für gewerbliche Arbeit kostenlos. Premium Lite enthält Navicats Grundfunktionen. TablePros kostenlose App verbindet sich mit allen unterstützten Engines und enthält KI-Assistent, MCP-Server und Safe Mode; ein Pro- oder Team-Tarif ergänzt Funktionen wie {starterExamples}.",
"href": null
},
{
"id": "one-time",
"question": "Kann ich TablePro wie eine Navicat-Lizenz einmalig bezahlen?",
"answer": "Ja. Starter und Team können monatlich, jährlich oder einmalig bezahlt werden; ein Einmalkauf hat kein Ablaufdatum. Eine Navicat-Premium-Dauerlizenz wird einmalig bezahlt und enthält ein Jahr Wartung. <link>Preise ansehen</link>.",
"answer": "Ja. Pro kann monatlich, jährlich oder einmalig bezahlt werden; ein Einmalkauf hat kein Ablaufdatum. Team wird monatlich oder jährlich bezahlt. Eine Navicat-Premium-Dauerlizenz wird einmalig bezahlt und enthält ein Jahr Wartung. <link>Preise ansehen</link>.",
"href": "/pricing"
},
{
Expand Down
4 changes: 2 additions & 2 deletions resources/data/content/de/compare/pgadmin.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
},
"schemaDiff": {
"label": "Schemavergleich",
"tablepro": "Compare & Sync vergleicht Struktur oder Daten zweier Datenbanken und schreibt das Synchronisierungsskript. Teil von Starter"
"tablepro": "Compare & Sync vergleicht Struktur oder Daten zweier Datenbanken und schreibt das Synchronisierungsskript. Teil von Pro"
},
"diagram": {
"label": "ER-Diagramm",
Expand Down Expand Up @@ -166,7 +166,7 @@
"href": null
},
{
"text": "<link>Compare & Sync</link> gehört zu Starter, während der Schema-Diff von pgAdmin kostenlos ist.",
"text": "<link>Compare & Sync</link> gehört zu Pro, während der Schema-Diff von pgAdmin kostenlos ist.",
"cite": [
"cells.schemaDiff"
],
Expand Down
2 changes: 1 addition & 1 deletion resources/data/content/de/compare/phpmyadmin.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@
"href": null
},
{
"text": "Einige Funktionen sind kostenpflichtig. Starter ergänzt Funktionen wie {starterExamples}, während phpMyAdmin keine kostenpflichtigen Tarife hat.",
"text": "Einige Funktionen sind kostenpflichtig. Pro ergänzt Funktionen wie {starterExamples}, während phpMyAdmin keine kostenpflichtigen Tarife hat.",
"cite": [
"prices"
],
Expand Down
4 changes: 2 additions & 2 deletions resources/data/content/de/compare/postico.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
"href": "/features/querying#performance"
},
{
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Starter erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"text": "<link>iCloud Sync</link> synchronisiert Verbindungen zwischen Macs, iPhones und iPads. Auf dem Mac ist Pro erforderlich; auf iPhone und iPad ist die Funktion kostenlos.",
"cite": [],
"feature": "icloud-sync",
"href": null
Expand Down Expand Up @@ -160,7 +160,7 @@
{
"id": "icloud-sync",
"question": "Ist iCloud Sync von TablePro kostenlos?",
"answer": "In der iPhone- und iPad-App ja. Auf dem Mac gehört sie zu Starter. Postico 2 synchronisiert Servereinstellungen über iCloud oder Dropbox.",
"answer": "In der iPhone- und iPad-App ja. Auf dem Mac gehört sie zu Pro. Postico 2 synchronisiert Servereinstellungen über iCloud oder Dropbox.",
"href": null
},
{
Expand Down
Loading