From 6430e373b6d923c4563b418bb94d57e7d15fbdf4 Mon Sep 17 00:00:00 2001
From: Ngo Quoc Dat
+
{aiSafetyFaq.answer}
+
Native macOS database clients come in three shapes today. Single database and open source, like
Sequel Ace and Postico. Multi database and closed source, like TablePlus. Multi database but not
native, like DBeaver on the JVM or Beekeeper Studio and DBGate on Electron.{' '}
@@ -95,7 +95,7 @@ export default function Architecture() {
+
{material.body}
+
{behaviour.body}
{aiSafetyFaq.question}
- {aiSafetyFaq.question}
+
{material.label}
- {behaviour.title}
-
{item.body}
+{item.body}
))} diff --git a/resources/js/components/landing/footer-cta.tsx b/resources/js/components/landing/footer-cta.tsx index 791e88e..1948ccd 100644 --- a/resources/js/components/landing/footer-cta.tsx +++ b/resources/js/components/landing/footer-cta.tsx @@ -4,7 +4,7 @@ import { toast } from 'sonner'; import { buttonClasses } from '@/components/ui/button'; import Container from '@/components/ui/container'; import { FullLine } from '@/components/ui/full-line'; -import { cellBorders, GridCell, type ColumnMap } from '@/components/ui/grid-cell'; +import { PANEL_TITLE, cellBorders, GridCell, type ColumnMap } from '@/components/ui/grid-cell'; import SectionShell from '@/components/ui/section-shell'; import Button from '@/components/ui/button'; import { AppleGlyph } from '@/components/ui/glyph'; @@ -209,8 +209,8 @@ export default function FooterCTA() {+
macOS 14 or later. Apple Silicon and Intel. About 20 MB.
@@ -251,7 +251,7 @@ export default function FooterCTA() {+
With no connection to hand,{' '}
File > Try Sample Database opens a bundled
Chinook SQLite.
@@ -297,8 +297,8 @@ export default function FooterCTA() {
+
Release notes and database notes. About one email a month, unsubscribe any time.
{faq.answer} {faq.answer}
TablePro is AGPLv3. All 25 databases, the SQL editor, the data grid, the AI assistant,
the MCP server, Safe Mode with Touch ID, SSH tunnels, ER diagrams, the server dashboard,
diff --git a/resources/js/components/landing/pricing.tsx b/resources/js/components/landing/pricing.tsx
index e1019fd..4ab3f4e 100644
--- a/resources/js/components/landing/pricing.tsx
+++ b/resources/js/components/landing/pricing.tsx
@@ -7,6 +7,7 @@ import { Ledger, LedgerRow } from '@/components/ui/ledger';
import SectionShell from '@/components/ui/section-shell';
import { Availability, CheckGlyph } from '@/components/ui/glyph';
import { PROSE_LINK } from '@/components/ui/prose-link';
+import { PANEL_TITLE } from '@/components/ui/grid-cell';
type BillingCycle = 'monthly' | 'yearly' | 'lifetime';
@@ -153,7 +154,7 @@ function PricingCard({ tier, cycle, discountCode, discount, paymentProvider, tea
return (
{tier.description}
+
{tier.summary}
{cell.body} {cell.body}
+
{post.description}
+
{rp.description}
{step.description} {step.description} {comp.chooseTablePro} {comp.chooseTablePro} {comp.chooseCompetitor} {comp.chooseCompetitor}
+
{comp.verdict}
{feature.description} {feature.description} {db.supportedVersions} {step.text} {step.text}
+
Need a previous release? All versions are available on GitHub.
+
TablePro collects minimal data, never touches your database contents, and lets you opt out of analytics. The codebase is{' '}
open source on GitHub under the AGPLv3, so you can verify exactly what is collected and how it is handled.
+
This policy covers the desktop and mobile Application, the Website at tablepro.app, and the account portal at tablepro.app/account.
+
TablePro is the data controller for personal information described in this policy. For privacy questions, email{' '}
hello@tablepro.app.
+
The Application can send anonymous usage analytics. It is{' '}
enabled by default and can be turned off in{' '}
Settings > General > "Share anonymous usage data".
+
When enabled, a 24-hour heartbeat sends three things to{' '}
+
That's it. No connection details, no hosts, no credentials, no queries, no database contents. All payloads are signed with HMAC-SHA256.
+
The Application uses{' '}
Sparkle to check for updates. This sends your{' '}
app version, macOS version, and CPU architecture to our update server. Update checks cannot be disabled separately.
+
If you have entered a paid License Key, the Application sends the License Key to our server when it starts and periodically afterward to confirm it is valid. No other data is sent in that request.
+
When you purchase a License Key, our payment processor (LemonSqueezy or Polar, depending on your region) collects the data needed to complete the transaction: your email address, billing address, and payment information. We receive your email, License Key, and order metadata; we do not see your full payment details.
+
The account portal at{' '}
tablepro.app/account{' '}
uses magic-link authentication. We store your email and an authentication token for that purpose.
+
If you subscribe to the newsletter or apply for beta access, we store your email address for that purpose only. You can unsubscribe at any time from any email we send.
+
Our servers record standard request logs (IP address, user agent, timestamp, URL) for security and abuse prevention. These logs are retained for up to 90 days.
For users in the European Economic Area or the United Kingdom, the legal bases under GDPR / UK GDPR are: For users in the European Economic Area or the United Kingdom, the legal bases under GDPR / UK GDPR are: We share personal data only with the providers needed to operate the Services: We share personal data only with the providers needed to operate the Services:
+
We do not sell, rent, or share personal data with advertisers.
+
Our servers operate in multiple regions. When you interact with TablePro, your data may be transferred to or processed in countries outside your own. Where required, transfers from the EEA / UK rely on Standard Contractual Clauses or other approved mechanisms.
+
Subject to local law, you have the right to:
+
To exercise any of these rights, email{' '}
hello@tablepro.app. We respond within 30 days.
+
If you are a California resident, the California Consumer Privacy Act gives you the right to know what personal information we collect, to request deletion, to opt out of "sale" of personal information, and to non-discrimination for exercising these rights. We do not sell personal information.
+
TablePro is not directed at children under 16. We do not knowingly collect personal data from children. If you believe a child has provided us data, contact us and we will delete it.
+
We use industry-standard measures to protect data: HTTPS for all network traffic, password hashing with modern algorithms, scoped API tokens, and least-privilege access for our team. No system is perfectly secure; if you suspect a vulnerability, email{' '}
hello@tablepro.app.
+
The marketing site uses two functional cookies. No tracking, no advertising, no third-party SDKs.
Sensitive data stays on your Mac: Sensitive data stays on your Mac:
+
The Application source is on{' '}
GitHub under the AGPLv3. The analytics code is in{' '}
+
We may update this policy. Material changes will be posted on this page with a new "Last updated" date and, where required by law, notified to users.
+
For privacy questions, security reports, or anything else, email{' '}
hello@tablepro.app.
7-day money-back guarantee on all paid plans. The window starts on the date of purchase, or on the most recent renewal for yearly subscriptions.
+
These Terms of Service govern your use of TablePro, the website at{' '}
tablepro.app,
the desktop application, the iOS application, and any related services. By downloading, installing, accessing, or using
@@ -45,7 +45,7 @@ export default function Terms({ downloadUrls }: Props) {
+
The Application source code is licensed under the{' '}
GNU Affero General Public License v3 (AGPLv3).
You may use, modify, and distribute it under those terms. The full license text is at{' '}
github.com/TableProApp/TablePro/LICENSE.
+
The free tier covers core functionality and is enough for most personal and commercial use. No registration is required to use the free tier.
+
Some advanced features require a paid License Key. When you purchase a License Key, you receive a non-exclusive, non-transferable right to enable those features for the number of devices and the duration covered by your plan.
+
License Keys are personal. You may not share, sublicense, sell, rent, or otherwise transfer a License Key to any third party. Sharing a License Key may result in immediate termination without refund.
+
Refund eligibility is described in the{' '}
Refund Policy.
+
License Keys are managed through an account portal accessed by magic link sent to the email address you used at purchase. You are responsible for keeping that email account secure. We are not responsible for unauthorized access to your account caused by a compromised email account.
You agree not to: You agree not to: You are solely responsible for: You are solely responsible for:
+
You acknowledge and agree that your use of the Application can affect your databases, and you accept{' '}
sole responsibility for any errors, malfunctions, or corruption of any database caused by your use of the Application, including queries you run, scripts you execute, and changes you commit.
+
THE APPLICATION AND SERVICES ARE PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ACCURACY, OR UNINTERRUPTED OPERATION.
+
We do not warrant that the Application will meet your requirements, be compatible with any specific database version, operate without error, or that any errors will be corrected.
+
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL TABLEPRO OR ITS CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, INCLUDING BUT NOT LIMITED TO: LOSS OF DATA, LOSS OF DATABASE CONTENTS, DATA CORRUPTION, LOSS OF PROFITS, LOSS OF BUSINESS, BUSINESS INTERRUPTION, LOSS OF GOODWILL, OR THE COST OF SUBSTITUTE GOODS OR SERVICES, ARISING OUT OF OR RELATED TO YOUR USE OF THE APPLICATION OR SERVICES, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
Where liability cannot be disclaimed under applicable law, our total cumulative liability for all claims arising from or related to the Application and Services is limited to the greater of (a) ten US dollars ($10) or (b) the total amount you paid us during the twelve (12) months preceding the event giving rise to the claim.
+
Some jurisdictions do not allow the exclusion or limitation of certain damages. In such jurisdictions, our liability is limited to the minimum extent permitted by law.
+
You agree to indemnify and hold harmless TablePro and its contributors from any claim, demand, loss, or damage (including reasonable legal fees) arising out of your use of the Application or Services in violation of these Terms or any third-party right.
+
We may release updates, fixes, and new features at our discretion. We have no obligation to maintain, update, or provide support for any version of the Application. Older versions may stop receiving security updates.
+
Some Services (license validation, update checks) require network access to function. We do not guarantee continuous availability of these Services and may discontinue them with reasonable notice.
+
You may stop using the Application and Services at any time. We may suspend or terminate your access to paid features without refund if you breach these Terms, including the Acceptable Use clause.
+
Sections that by their nature survive termination (Disclaimer, Limitation of Liability, Indemnification, Governing Law) will continue to apply after termination.
+
Our handling of personal data is described in the{' '}
Privacy Policy. By using the Application or Services, you agree to that policy.
+
We may update these Terms from time to time. Material changes will be announced on this page with a new "Last updated" date. Continuing to use the Application or Services after the update means you accept the new Terms.
+
These Terms are governed by the laws of the Socialist Republic of Vietnam, without regard to conflict of law principles. Any dispute arising out of or relating to these Terms or your use of the Application or Services shall be resolved in the competent courts of Vietnam.
+
If you reside in a jurisdiction with mandatory consumer protection laws, those laws apply to the extent they cannot be waived.
+
If any provision of these Terms is held invalid or unenforceable by a court of competent jurisdiction, the remaining provisions remain in full force and effect.
+
These Terms, together with the AGPLv3 license, the Privacy Policy, and the Refund Policy, constitute the entire agreement between you and TablePro regarding the Application and Services and supersede any prior agreements.
+
For questions about these Terms, email{' '}
hello@tablepro.app{' '}
or open an issue at{' '}
From ab51d34b3ebbe97af1c380e28e6148c7c4bde662 Mon Sep 17 00:00:00 2001
From: Ngo Quoc Dat
+ Free and open source. macOS 14+, Apple Silicon and Intel. No account.
+
diff --git a/resources/js/components/ui/copy-button.tsx b/resources/js/components/ui/copy-button.tsx
new file mode 100644
index 0000000..649a789
--- /dev/null
+++ b/resources/js/components/ui/copy-button.tsx
@@ -0,0 +1,71 @@
+import { useEffect, useRef, useState } from 'react';
+import { Check, Copy } from 'lucide-react';
+import { toast } from 'sonner';
+import { cn } from '@/lib/utils';
+
+interface CopyButtonProps {
+ /** What lands on the clipboard. */
+ value: string;
+ /** Names the thing being copied, for the button's accessible name. */
+ label: string;
+ className?: string;
+}
+
+/**
+ * Copy to clipboard, with the tick that confirms it.
+ *
+ * The identical logic existed twice — the MCP config block and the Homebrew
+ * command — down to the same 1200ms timeout, the same toast strings and the
+ * same cleanup effect, but with forked chrome: one had a visible boundary and
+ * one did not.
+ *
+ * The timeout is cleared on unmount and before each restart, because a copy
+ * button that unmounts mid-timer otherwise sets state on a gone component.
+ */
+export default function CopyButton({ value, label, className }: CopyButtonProps) {
+ const [copied, setCopied] = useState(false);
+ const timeoutRef = useRef {labels[metric]}
- Free and open-source. No account required.
-
- Free and open-source. macOS 14+. Apple Silicon and Intel.
- Stay updated
- Stay updated
+ {faq.question}
- {tier.name}
+ {tier.name}
{cell.label}
-
+
{post.title}
-
+
{rp.title}
- {comp.name}
+ {comp.name}
{comp.prosCompetitor.map((pro) => (
{step.title}
- {step.title}
+ Choose TablePro if...
- Choose {comp.name} if...
- Choose {comp.name} if...
+ {feature.title}
- {feature.title}
+
+
{db.snippet}
Supported versions
+ Supported versions
Connection types
@@ -293,8 +294,8 @@ export default function DatabaseClient({ slug, downloadUrls, githubStars }: Prop
{idx + 1}
{step.name}
- {step.name}
+ Older versions
- Anonymous usage analytics (desktop app)
- Anonymous usage analytics (desktop app)
+ https://api.tablepro.app/v1/analytics:
+
- Update checks
- License validation
- License purchase and account portal
- Newsletter and beta signup
- Server logs
-
+
+
+
+
-
+
+
-
+
+
TablePro/Core/Services/AnalyticsService.swift. You can verify what is sent.
@@ -233,13 +234,13 @@ export default function Privacy({ downloadUrls }: Props) {
+
+
+
- Try TablePro for free.
+
{BREW_COMMAND}
-
+
- Try TablePro for free.
-
-
- Try TablePro for free.
-
-