The marketing site for TablePro, a native macOS database client.
This repository is the whole of what tablepro.app serves: the homepage, the
comparison pages, the per-database landing pages, the blog, and the legal pages.
It is a Laravel + Inertia + React app with no database and no credentials.
Every page it renders is built from markdown and JSON that live in this repo,
plus the public GitHub API for the release download links.
That is deliberate. It means you can clone this and have the real site running in about a minute, with nothing to provision.
git clone https://github.com/TableProApp/web.git tablepro-web
cd tablepro-web
composer install
npm install
cp .env.example .env
php artisan key:generate
composer dev # serves on http://localhost:8000 with ViteThere is no database step, no migration, no seeding, and no API key to obtain. If any instruction ever tells you otherwise, that is a bug in this README.
| Path | What it holds |
|---|---|
resources/blog/*.md |
Blog posts. Markdown with YAML front matter. |
resources/data/*.json |
Comparison and database-page content. |
resources/js/pages/ |
One React component per route. |
resources/js/components/landing/ |
Homepage sections. |
resources/js/components/ui/ |
Shared primitives. |
app/Http/Controllers/Landing/ |
The two controllers that render everything. |
public/og/ |
Pre-rendered Open Graph cards, committed. |
Add a markdown file to resources/blog/. The filename becomes the URL slug.
---
title: Your title
description: One sentence, used for search results and social cards.
date: 2026-08-13
tags: [postgres, macos]
---
Your post.It appears at /blog/your-filename immediately. Reading time is computed for
you. To generate the social card, see below.
Both are data-driven. Add an entry to resources/data/comparisons.json or
resources/data/databases.json, then add the slug to the matching route
constraint in routes/web.php. The page builds itself from there.
Cards are committed under public/og/ so that neither contributors nor the
production host need a browser engine. Regenerating them needs Chromium:
npm install -g puppeteer
npx puppeteer browsers install chrome
php artisan og:generate --type=blog --slug=your-postIf you would rather not install that, open the pull request without the card — a maintainer will generate it.
php artisan testThe suite covers routing, page props, SEO metadata, and the blog pipeline. Some tests skip unless the SSR bundle is built; that is expected locally.
Buying a licence, signing in to an account, subscribing to the newsletter and
joining the beta are handled by the TablePro backend, which is a separate
application. Forms on these pages POST to those endpoints and get JSON back.
If you are working on one of those forms, stub the response or proxy it — see docs/architecture.md for the contract and the options.
See CONTRIBUTING.md. Content contributions — a blog post, a comparison page, a typo fix, better copy — are as welcome as code.
Two licences, because code and writing want different terms:
- Code — MIT. Use it however you like.
- Content — CC BY-NC 4.0. Covers the prose in
resources/blog, the page copy inresources/dataandresources/js, and the images underpublic/imagesandpublic/og. Share and adapt it with attribution, but not commercially.
Neither licence covers the third-party logos under public/images/sponsors,
which belong to their owners, or the TablePro name and logo, which are
trademarks. See CONTRIBUTING.md.