Skip to content

feat(ios): replace the TestFlight beta with the App Store launch - #35

Merged
datlechin merged 1 commit into
mainfrom
feat/ios-app-store-launch
Sep 23, 2026
Merged

datlechin merged 1 commit into
mainfrom
feat/ios-app-store-launch

Conversation

@datlechin

Copy link
Copy Markdown
Member

TablePro for iPhone and iPad shipped on the App Store on 2026-09-22. The site still offered a TestFlight invite form posting to /beta/signup, called the app a beta in three places, and said it ran "Seven engines on device" — a figure that stopped being true on 2026-08-08 when Oracle shipped and the picker reached ten.

Every iOS fact here was read out of TableProMobile/ in the app repository rather than out of the App Store listing, which is marketing copy.

The new page

/ios carries the detail: route, controller, sitemap entry at 0.9/weekly, and its own SoftwareApplication node with an @id distinct from the homepage's, which describes the Mac app. The closing CTA keeps the #mobile anchor and an App Store badge; the header menu and mobile nav point at /ios.

What the app source said that the site didn't

Was Is
"Seven engines on device" Ten in the picker, eleven openable. Seven was the count of DatabaseDriver classes — MariaDB, TiDB and OceanBase ride the MySQL driver, Redshift rides PostgreSQL
"syncing needs a license" True on the Mac, false on the phone. The mobile target contains no licensing code at all
"Starter activates two Macs" An iPhone never takes a slot — activation is keyed on the macOS IOPlatformUUID
Nine paid features Ten, 8/2. Data Rewind had shipped and appeared nowhere on this domain, so the pricing table undersold Starter by a feature
analytics "a toggle in Settings" On by default on the Mac, off until tapped on iOS
— No visionOS. TARGETED_DEVICE_FAMILY is "1,2"; the App Store lists Vision Pro because a compatible iPad app runs there

/privacy also now discloses that iCloud Sync puts host, port, username and saved-query SQL in the reader's own iCloud. "Nothing leaves your device" was not a claim this app could make.

Screenshots

Three matched light/dark pairs at 1206×2622, driven through the real app by the TableProMobileScreenshots UI test against the bundled Chinook database, with the status bar pinned. The pair they replace disagreed on the clock and its alt text described a table it did not show.

Apple's badge is committed byte-for-byte as supplied, in both themes, and referenced through <img> so no ancestor rule can recolour it.

Four pre-existing defects

  • database-grid.tsx claimed "Twenty six tiles, twenty five drivers" against 29 and 23. It survived EngineCountTest because that guard matches a digit, and a number spelled as a word is invisible to it.
  • Compare.tsx published a /compare breadcrumb to a route that does not exist, on all eleven pages.
  • site.webmanifest declared a 512×512 icon against a 256×256 file.
  • Five database pages shipped an og:image that 404s. All 26 database and 12 blog cards now exist.

CI

The ssr job ran one file, so 43 of 222 tests skipped on every push — all of LandingStructureTest, ProductHuntBadgeTest, TopBannerTest and the rendered halves of three more were green-by-skip. It runs the whole suite under REQUIRE_SSR now, which turns a skip into a failure. Expect this job to take longer and to actually mean something.

Review

An adversarial pass over the diff raised 42 findings; 28 were refuted and 14 fixed. Four were mine and material:

  • /privacy said the iOS heartbeat sends no CPU architecture. It always sends "arm64" — architecture is non-optional in the shared payload.
  • /privacy said queries are never synced. The Mac syncs saved-query SQL text and startup commands; the pricing table advertised the sync the privacy page denied.
  • Eight of ten engine assertions could not fail — the sitewide footer renders all 26 database names, so toContain('Oracle') passed with Oracle deleted from the grid. Now an exact toBe over the grid's own cells, mutation-tested.
  • The closing CTA promised free Mac↔iPhone sync, contradicting the pricing matrix on the same page.

Verification

232 passed, 0 skipped, 2918 assertions under REQUIRE_SSR=1 with a fresh bundle and a restarted SSR service. tsc --noEmit, Pint and npm run test:js clean. /ios probed live at 320/640/1024/1440px: no overflow, one h1, no skipped heading levels, all screenshots decoding.

Before merging

  • Register the platform prop in Plausible, or the Mac/iOS download split will not be queryable.
  • Not verified, left alone: TablePlus's current iOS bundling terms, Navicat's iOS pricing, and the $899 SSMS figure in databases.json (SSMS is a free download — that looks like a SQL Server licence price).
  • Separate issue: the app docs say 36 engines, the site grid has 29.

TablePro for iPhone and iPad shipped on the App Store on 2026-09-22. The site
still offered a TestFlight invite form posting to /beta/signup, called the app a
beta in three places, and said it ran "Seven engines on device" — a figure that
stopped being true on 2026-08-08 when Oracle shipped and the picker reached ten.

Every iOS fact below was read out of TableProMobile/ in the app repository
rather than out of the App Store listing, which is marketing copy.

A new /ios page carries the detail: route, controller, sitemap entry at
0.9/weekly, and its own SoftwareApplication node with an @id distinct from the
homepage's, which describes the Mac app. The closing CTA keeps the #mobile
anchor and an App Store badge; the header menu and mobile nav point at /ios.

Corrections, each against a Swift source:

- Ten engines in the connection picker, named rather than counted. Seven was the
  count of DatabaseDriver classes; MariaDB, TiDB and OceanBase ride the MySQL
  driver and Redshift rides PostgreSQL.
- iCloud Sync is ungated on iOS (one preference, no licensing code in the mobile
  target at all) and Starter on the Mac. An iPhone never takes an activation
  slot: activation is keyed on the macOS IOPlatformUUID.
- ProFeature has ten cases, eight Starter and two Team. Data Rewind had shipped
  in the app and appeared nowhere on this domain, so the pricing table undersold
  Starter by a feature. LicenseFeaturesTest moves with it.
- Analytics are on by default on the Mac and off until tapped on iOS, so
  /privacy states them separately. It also now discloses that iCloud Sync puts
  host, port, username and saved-query SQL in the reader's own iCloud — "nothing
  leaves your device" was not a claim this app could make.
- No visionOS. TARGETED_DEVICE_FAMILY is "1,2"; the App Store lists Vision Pro
  because a compatible iPad app runs there.

Screenshots are three matched light/dark pairs at 1206x2622, driven through the
real app by the TableProMobileScreenshots UI test against the bundled Chinook
database, with the status bar pinned. The pair they replace disagreed on the
clock and its alt text described a table it did not show.

Apple's badge is committed byte-for-byte as supplied, in both themes, and
referenced through <img> so no ancestor rule can recolour it.

Four pre-existing defects, unrelated to iOS:

- database-grid.tsx claimed "Twenty six tiles, twenty five drivers" against 29
  and 23. It survived EngineCountTest because that guard matches a digit, and a
  number spelled as a word is invisible to it.
- Compare.tsx published a /compare breadcrumb to a route that does not exist, on
  all eleven pages.
- site.webmanifest declared a 512x512 icon against a 256x256 file.
- Five database pages shipped an og:image that 404s. All 26 database and 12 blog
  cards now exist.

The ssr CI job ran one file, so 43 of 222 tests skipped on every push. It runs
the whole suite under REQUIRE_SSR now, which turns a skip into a failure.

Verified: 232 passed, 0 skipped, 2918 assertions with a fresh bundle and a
restarted SSR service; tsc, Pint and the node tests clean.
@datlechin
datlechin merged commit 6b27031 into main Sep 23, 2026
5 checks passed
@datlechin
datlechin deleted the feat/ios-app-store-launch branch September 23, 2026 01:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant