diff --git a/customization/appearance.mdx b/customization/appearance.mdx index 70d4cae0..70158f83 100644 --- a/customization/appearance.mdx +++ b/customization/appearance.mdx @@ -22,9 +22,9 @@ The editor on the right edits the theme selected in the slot named by **Editing* |--------|--------| | **+** menu | **Duplicate Selected** copies the selected theme; **Import…** reads a theme JSON file | | **-** button | Deletes the selected theme. Custom themes only | -| **Gear** menu | **Duplicate** and **Export…** act on the selected theme; **Uninstall** removes the selected registry theme | +| **Gear** menu | **Duplicate** and **Export…** act on the selected theme | -A built-in or registry theme is read-only and shows a **Duplicate Theme** button, which makes "Name (Copy)" for you to edit. +A built-in theme is read-only and shows a **Duplicate Theme** button, which makes "Name (Copy)" for you to edit. Fonts are not part of a theme. Editor Font lives in [Editor settings](/customization/editor-settings) and Data Grid Font in [Data settings](/customization/data-settings), and both stay on the Mac you set them on. @@ -32,7 +32,7 @@ A theme file the app cannot read is listed under **Not Loaded** with the reason, ## Colors -Custom themes get color wells here. A built-in or registry theme shows a lock and a **Duplicate Theme** button instead. +Custom themes get color wells here. A built-in theme shows a lock and a **Duplicate Theme** button instead. | Group | Controls | |-------|----------| @@ -48,12 +48,12 @@ A theme colors the panes that show database content. The sidebar, the toolbar, t ## Theme files -A theme is one JSON file. **Export…** in the gear menu writes every color the selected theme sets, which is the shortest way to start a new one; **Import…** in the **+** menu reads one back into `~/Library/Application Support/TablePro/Themes/`. Themes published to the [plugin registry](/features/plugins#themes) install from **Settings > Plugins > Browse**, Themes category. +A theme is one JSON file. **Export…** in the gear menu writes every color the selected theme sets, which is the shortest way to start a new one; **Import…** in the **+** menu reads one back into `~/Library/Application Support/TablePro/Themes/`. | Key | Holds | |-----|-------| | `schema` | Format version. `2` is the version this release reads | -| `id`, `name`, `author` | Identity. An `id` that collides with a built-in, a registry theme, or one you already have is replaced on import | +| `id`, `name`, `author` | Identity. An `id` that collides with a built-in or with one you already have is replaced on import | | `appearance` | `light` or `dark`. Decides which slot lists the theme | | `content.editor` | Editor colors, with syntax colors nested under `syntax` | | `content.dataGrid` | Grid colors | diff --git a/databases/index.mdx b/databases/index.mdx index 98491091..3e87e524 100644 --- a/databases/index.mdx +++ b/databases/index.mdx @@ -67,7 +67,7 @@ The split is about size, not capability. Bundling every client library would put megabytes of Oracle and MongoDB code in an app most people use for one database. Plugins update on their own schedule, so a driver fix can reach you without waiting for an app -release. [Plugins & Themes](/features/plugins) covers installing, updating and removing them. +release. [Plugins](/features/plugins) covers installing, updating and removing them. ## When yours is not here diff --git a/databases/kafka.mdx b/databases/kafka.mdx index cf2a795f..39ab1b4d 100644 --- a/databases/kafka.mdx +++ b/databases/kafka.mdx @@ -200,4 +200,4 @@ Addresses** to only use the bootstrap address. - [SSH Tunneling](/connections/ssh-tunneling) - [SSL/TLS](/connections/ssl) -- [Plugins & Themes](/features/plugins) +- [Plugins](/features/plugins) diff --git a/databases/sap-hana.mdx b/databases/sap-hana.mdx index a4f1e525..dc9162fc 100644 --- a/databases/sap-hana.mdx +++ b/databases/sap-hana.mdx @@ -165,4 +165,4 @@ The `SYS` catalog views show only the objects your user holds a privilege on. `C - [SSL/TLS](/connections/ssl) - [EXPLAIN Visualization](/features/explain-visualization) - [Query Parameters](/features/query-parameters) -- [Plugins & Themes](/features/plugins) +- [Plugins](/features/plugins) diff --git a/development/plugin-development.mdx b/development/plugin-development.mdx index 5380b843..f2aa4887 100644 --- a/development/plugin-development.mdx +++ b/development/plugin-development.mdx @@ -133,4 +133,4 @@ Two steps put a plugin in TablePro's own registry, and both happen in this repos -CI signs with TablePro's certificate, so a plugin published there arrives through a pull request, not a tag of your own. The other route stays outside this repository: sign the bundle with your own Developer ID and serve it from a registry URL you host, and the app installs it once the user agrees to trust your team by name. [Plugin Registry](/development/plugin-registry) has the manifest format, the `metadata` block that renders your connection form before the download finishes, and how to point the app at a private registry. +CI signs with TablePro's certificate, so a plugin published there arrives through a pull request, not a tag of your own. The app loads only bundles TablePro signed. [Plugin Registry](/development/plugin-registry) has the manifest format, the `metadata` block that renders your connection form before the download finishes, and how to point the app at a private registry. diff --git a/development/plugin-registry.mdx b/development/plugin-registry.mdx index ebc3ef71..3b5f6dee 100644 --- a/development/plugin-registry.mdx +++ b/development/plugin-registry.mdx @@ -3,9 +3,9 @@ title: Plugin Registry description: Registry manifest format, binary selection, publishing, and PluginKit compatibility --- -The official manifest is `plugins.json` in [TableProApp/plugins](https://github.com/TableProApp/plugins), and TablePro's release workflow writes it: a plugin gets there by being contributed to TablePro's own repository and tagged there. A plugin of yours ships the other way: signed with your own Developer ID, it installs from a file or from a manifest you host in the same format. For what install and update look like to a user, see [Plugins & Themes](/features/plugins); to build the plugin in the first place, [Plugin Development](/development/plugin-development). +The official manifest is `plugins.json` in [TableProApp/plugins](https://github.com/TableProApp/plugins), and TablePro's release workflow writes it: a plugin gets there by being contributed to TablePro's own repository and tagged there. The app loads only bundles TablePro signed, so there is no other route. For what install and update look like to a user, see [Plugins](/features/plugins); to build the plugin in the first place, [Plugin Development](/development/plugin-development). -The app fetches the manifest to fill **Settings > Plugins > Browse** and to auto-install a driver when someone picks a database type with no plugin loaded. +The app fetches the manifest to install a driver when someone picks a database type with no plugin loaded, to install Parquet from the Export dialog, and to offer updates. ## Manifest format @@ -26,7 +26,7 @@ Schema version 2 is current. A manifest declaring a higher version is rejected a | `summary` | string | Yes | One-line description | | `author` | object | Yes | `{ "name": "…", "url": "…" }`, `url` optional | | `homepage` | string | No | Project URL | -| `category` | string | Yes | `database-driver`, `export-format`, `import-format`, `theme`, `other` | +| `category` | string | Yes | `database-driver`, `export-format`, `import-format`, `other`. An unknown value reads as `other` | | `databaseTypeIds` | [string] | No | `DatabaseType.pluginTypeId` values, which is what drives auto-install | | `binaries` | [object] | Yes | Per-architecture binaries | | `minAppVersion` | string | No | Below this the install fails before any download | @@ -49,9 +49,7 @@ v1 manifests carried top-level `downloadURL`, `sha256`, and `minPluginKitVersion ## Binary selection -For a driver, the app filters `binaries` to the running architecture, keeps those whose `pluginKitVersion` falls inside `[minimumCompatiblePluginKitVersion, currentPluginKitVersion]`, and installs the highest. Both bounds are declared in `PluginManager.swift`. A driver binary with no `pluginKitVersion` never resolves, and the install fails with `noCompatibleBinary`. - -Themes carry no native code, so they match on architecture alone. +The app filters `binaries` to the running architecture, keeps those whose `pluginKitVersion` falls inside `[minimumCompatiblePluginKitVersion, currentPluginKitVersion]`, and installs the highest. Both bounds are declared in `PluginManager.swift`. A driver binary with no `pluginKitVersion` never resolves, and the install fails with `noCompatibleBinary`. ## Example entry @@ -121,7 +119,7 @@ Either way CI builds both architectures, signs and notarizes the bundles, checks A published release is immutable, and a rebuild never matches its bytes. A run for a tag whose release is already published with other zips fails, so a new binary ships under the next patch version. -Bundled plugins ride with the app release. Ten of them also have an entry in `.github/plugin-registry.json` (SQLite, ClickHouse, Redis, XLSX export, XLSX import, MQL export, SQL import, HTML export, Markdown export, XML export), so a fix to one can be tagged and published to the registry. The app never installs or offers a registry update over a bundled plugin, so that build reaches only users who download its zip and install it from a file. Everyone else gets the fix with the next app release. A bulk ABI re-release skips them. The other seven have no entry and never reach `plugins.json`. +Bundled plugins ride with the app release. Eight of them also have an entry in `.github/plugin-registry.json` (SQLite, ClickHouse, Redis, XLSX export, XLSX import, MQL export, SQL import, Markdown export), so a fix to one can be tagged and published to the registry. The app never installs or offers a registry update over a bundled plugin, so that build reaches only users who download its zip and install it from a file. Everyone else gets the fix with the next app release. A bulk ABI re-release skips them. The other seven have no entry and never reach `plugins.json`. ## PluginKit compatibility @@ -144,34 +142,11 @@ The app's own release workflow runs `scripts/check-registry-readiness.py --floor ## Caching -The app fetches the manifest from `raw.githubusercontent.com/TableProApp/plugins/main/plugins.json`, which caches at the edge for about five minutes. Every fetch revalidates conditionally, the list refreshes at launch and when the plugin browser opens (throttled to one check per five minutes), and an install prompt forces a fresh fetch before it reports a plugin missing. CI also purges the jsDelivr cache after each registry push, for older app versions that still fetch from there. A newly published plugin shows up in the app within minutes. - -## Theme distribution - -Themes use the same manifest with `category: "theme"`. Four things differ from a driver: - -- Pure JSON data. No executable code, no code signing, no `.tableplugin` bundle -- The ZIP holds `.json` files, each a theme file in format `schema: 2`. Packs with several themes work -- They install to `~/Library/Application Support/TablePro/Themes/Registry/` -- No `pluginKitVersion` is needed. Set `minAppVersion` to the release that reads the format the theme is written in, because that is the only check an older TablePro runs before installing it - -```json -{ - "id": "com.example.monokai-theme", - "name": "Monokai Theme", - "version": "1.0.0", - "summary": "Classic Monokai color scheme for TablePro", - "author": { "name": "Theme Author" }, - "category": "theme", - "downloadURL": "https://example.com/monokai-theme.zip", - "sha256": "", - "iconName": "paintpalette" -} -``` +The app fetches the manifest from `raw.githubusercontent.com/TableProApp/plugins/main/plugins.json`, which caches at the edge for about five minutes. Every fetch revalidates conditionally, the list refreshes at launch and when **Settings > Plugins** opens (throttled to one check per five minutes), and an install prompt forces a fresh fetch before it reports a plugin missing. CI also purges the jsDelivr cache after each registry push, for older app versions that still fetch from there. A newly published plugin shows up in the app within minutes. ## Custom registry URL -Point the app at a private or enterprise manifest, which is also how a plugin signed with your own Developer ID reaches your users: +Point the app at a private or enterprise mirror of the manifest: ```bash defaults write com.TablePro com.TablePro.customRegistryURL "https://your-registry.example.com/plugins.json" @@ -179,4 +154,4 @@ defaults write com.TablePro com.TablePro.customRegistryURL "https://your-registr defaults delete com.TablePro com.TablePro.customRegistryURL ``` -The custom manifest replaces the official one rather than adding to it. HTTP caching keys on the full URL, so a changed registry URL takes effect on the next fetch. A plugin served this way installs once the user agrees to trust its signing team by name. Both commands are also listed in [Settings](/customization/settings). +The custom manifest replaces the official one rather than adding to it. HTTP caching keys on the full URL, so a changed registry URL takes effect on the next fetch. A mirror can serve only bundles TablePro signed, since the app refuses every other signature. Both commands are also listed in [Settings](/customization/settings). diff --git a/development/testing-plugins.mdx b/development/testing-plugins.mdx index 598e6286..04f0c79e 100644 --- a/development/testing-plugins.mdx +++ b/development/testing-plugins.mdx @@ -16,7 +16,7 @@ A plugin's signature is checked only outside the app's own `PlugIns` directory. The version keys go first either way: a plugin whose `TableProPluginKitVersion` falls outside the app's compatible range, or whose `TableProMinAppVersion` is newer than the running app, is rejected before anything looks at its signature. -The signature check has two passes. A bundle signed by the same Apple team as the running app loads with no further question, which is why your own debug build accepts what your own Xcode signed. A bundle carrying any other Developer ID loads only if the user has trusted that team by name, and that consent is collected during an install through a registry, nowhere else ([Plugins & Themes](/features/plugins#plugins-from-other-developers)). Hand-copy such a bundle into the user plugins directory and it fails to load, because nothing on that path asks. +The signature check accepts one signer: the Apple team that signed the running app, which for a release is TablePro. Your own debug build accepts what your own Xcode signed for the same reason. Every other signature, ad-hoc signing and an unsigned bundle are refused, and nothing asks. Do not reuse a built-in plugin's bundle ID. Installing over one fails outright, and at discovery the higher version wins, with the built-in taking a tie and the losing user copy deleted from disk. @@ -56,16 +56,16 @@ Then run `scripts/generate-project.sh` and build. XcodeGen puts the bundle in an A Debug build skips signature verification altogether when `TABLEPRO_ALLOW_UNSIGNED_PLUGINS` is set to `1`. Set it under **Product > Scheme > Edit Scheme > Run > Arguments**, in the environment variables list. -This is the route for a bundle built on another machine, or for testing your own Developer ID signing before there is any registry entry to install from, since it also bypasses the developer-trust prompt. The bundle still has to be validly signed for dyld to load it at all. The escape hatch is compiled out of Release builds, so it cannot mask a signing problem that would reach a user. +This is the route for a bundle built on another machine or signed by another team. The bundle still has to be validly signed for dyld to load it at all. The escape hatch is compiled out of Release builds, so it cannot mask a signing problem that would reach a user. ## When it does not load -The reason lands in a **Plugin Installation Failed** alert when installing, and in the plugin's row under **Settings > Plugins > Installed** otherwise. +The reason lands in a **Plugin Installation Failed** alert when installing, and in the banner in **Settings > Plugins** otherwise. | Message | What it means | What to do | |---------|---------------|------------| -| **Plugin code signature verification failed: …** | Unsigned, ad-hoc signed, modified after signing, or signed by a certificate that is neither your app's team nor a Developer ID | Rebuild rather than patch. Any edit to a signed bundle breaks the seal | -| **This plugin is signed by …, a developer you have not trusted yet.** | A valid Developer ID that this Mac has not consented to | Install it through a registry so the trust prompt runs, or set `TABLEPRO_ALLOW_UNSIGNED_PLUGINS=1` in a Debug build | +| **Plugin code signature verification failed: bundle is not signed by TablePro** | A valid signature from a team other than the running app's | Sign with the app's team, or set `TABLEPRO_ALLOW_UNSIGNED_PLUGINS=1` in a Debug build | +| **Plugin code signature verification failed: …** | Unsigned, ad-hoc signed, modified after signing, or a symbolic link that points outside the bundle | Rebuild rather than patch. Any edit to a signed bundle breaks the seal | | **Plugin was built for PluginKit version …; this release of TablePro needs version …** | The bundle predates a breaking ABI bump | Rebuild the plugin against the current TableProPluginKit | | **Plugin requires app version … or later, but current version is …** | `TableProMinAppVersion` is ahead of the app | Raise `MARKETING_VERSION` in `Configs/Version.xcconfig` and rebuild | | **A built-in plugin "…" already provides this bundle ID** | The bundle ID collides with a bundled plugin | Give your plugin its own bundle ID | diff --git a/faq.mdx b/faq.mdx index 9a769613..bdd64242 100644 --- a/faq.mdx +++ b/faq.mdx @@ -60,7 +60,7 @@ Drag the app to the Trash, then delete the Application Support folder and the pr -Its driver is probably not installed yet. The database type chooser badges registry drivers **Not Installed**; pick one anyway and the download runs before the connection opens, with no restart. **Settings > Plugins > Browse** holds the full catalog. See [Plugins & Themes](/features/plugins). +Its driver is probably not installed yet. The database type chooser badges registry drivers **Not Installed**; pick one anyway and the download runs before the connection opens, with no restart. See [Plugins](/features/plugins). @@ -70,7 +70,7 @@ Each one must match the SHA-256 checksum in the registry manifest and carry a va -An app update can raise the plugin interface version, and a plugin built against the old one is rejected at load rather than crashing. TablePro repairs it at the next launch by reinstalling a compatible build from the registry. Until then the plugin sits in a banner in **Settings > Plugins > Installed** with the reason and an action. +An app update can raise the plugin interface version, and a plugin built against the old one is rejected at load rather than crashing. TablePro repairs it at the next launch by reinstalling a compatible build from the registry. Until then the plugin sits in a banner in **Settings > Plugins** with the reason and an action. diff --git a/features/data-files.mdx b/features/data-files.mdx index 260f15a0..507c3be4 100644 --- a/features/data-files.mdx +++ b/features/data-files.mdx @@ -133,7 +133,7 @@ A workbook is read-only. To keep a sheet, choose **File > Save As** and pick CSV **File > Save As** (`Cmd+Shift+S`) writes a delimited file as CSV, TSV or pipe-separated text, and a JSON file as JSON, JSON Lines, CSV or TSV. -To write another format, choose **File > Export > Export Results…**, or right-click the grid and choose **Export Results…**. The export dialog offers every installed export format that works without a database, including CSV, JSON, SQL, XLSX, Markdown and HTML, and exports all rows, the rows passing the current filter, or the selected rows. +To write another format, choose **File > Export > Export Results…**, or right-click the grid and choose **Export Results…**. The export dialog offers every installed export format that works without a database, including CSV, JSON, SQL, XLSX and Markdown, and exports all rows, the rows passing the current filter, or the selected rows. ### Import into a table diff --git a/features/import-export.mdx b/features/import-export.mdx index b8d2fefb..7037d118 100644 --- a/features/import-export.mdx +++ b/features/import-export.mdx @@ -199,28 +199,8 @@ As SQL, a results export writes `INSERT` statements only. A result set is the ou Column widths come from the header and the first 200 rows, so a wide value later in a long table is written whole rather than widening every row before it. A pipe or a line break inside a value is neutralised: both would end the cell early. - - | Option | Default | - |--------|---------| - | Write a full HTML document | Yes | - | Write each table's name as a heading | Yes | - | Mark NULL cells | Yes | - - A full document carries its own stylesheet and follows the reader's light or dark setting. Turn it off to paste bare `` elements into a page that has its own styling. - - - One element per row, one child element per column. - - | Option | Default | - |--------|---------| - | Pretty print | Yes | - | Mark NULL with `xsi:nil` | Yes | - | Row element | `row` | - - A column name that is not a legal XML element name is rewritten: a leading digit gains an underscore, an illegal character becomes one, and a name starting `xml` is prefixed. Control characters XML 1.0 forbids are dropped, so a binary column cannot make the document unparseable. - - Install the Parquet plugin from **Settings > Plugins** first. It carries its own copy of DuckDB, which does the encoding, and is too large to ship in the app. + Choose **Install Parquet…** at the end of the format menu the first time. The plugin downloads, then Parquet is selected. It carries its own copy of DuckDB, which does the encoding, and is too large to ship in the app. | Option | Default | |--------|---------| diff --git a/features/overview.mdx b/features/overview.mdx index d8fa8814..d00bcd97 100644 --- a/features/overview.mdx +++ b/features/overview.mdx @@ -57,8 +57,8 @@ First time here: [Quick Start](/quickstart) gets you from install to a query wit Every engine, and where its driver comes from. - - Drivers, import and export formats, and themes from the registry. + + Database drivers and Parquet export from the registry. diff --git a/features/plugins.mdx b/features/plugins.mdx index 1fe4ce54..f57bfc0d 100644 --- a/features/plugins.mdx +++ b/features/plugins.mdx @@ -1,11 +1,11 @@ --- -title: Plugins & Themes -description: Install database drivers, import and export formats, and themes from the plugin registry, and keep them updated +title: Plugins +description: Install database drivers and Parquet export from the plugin registry, and keep them updated --- import DriverCounts from "/snippets/driver-counts.mdx"; -Pick a database type badged **Not Installed** in the chooser and the download runs before the connection opens, with no restart. +Pick a database type badged **Not Installed** in the chooser and the download runs before the connection opens, with no restart. Parquet export installs the same way from the Export dialog. @@ -20,7 +20,7 @@ These ship with the app, update with app releases, and cannot be uninstalled: | SQLite | SQLite | | ClickHouse | ClickHouse | | Redis | Redis | -| Export formats | CSV, JSON, SQL, XLSX, MQL | +| Export formats | CSV, JSON, SQL, XLSX, Markdown, MQL | | Import formats | SQL, JSON, CSV, XLSX | ## Registry plugins @@ -50,33 +50,23 @@ These install from the registry when you need them: | Trino | Trino | | Typesense | Typesense | | Beancount | Beancount ledger files | +| Parquet | Parquet export | ## Installing plugins -To browse the catalog instead of waiting for a connection to need something, open **Settings > Plugins > Browse** and filter by category: Database Drivers, Export Formats, Import Formats, Themes, Other. +A registry plugin installs where you need it: - - Plugin registry browser in Settings - Plugin registry browser in Settings - +- A database type badged **Not Installed** in the connection chooser. +- A `.duckdb` file opened from Finder, which asks for the DuckDB driver. +- **Install Parquet…** at the end of the format menu in the Export dialog. Parquet is selected once the download finishes. -On a Mac with no network, install from a file: drag a `.tableplugin` or `.zip` onto **Installed**, or click the **+** button there. User-installed plugins live in `~/Library/Application Support/TablePro/Plugins`. +On a Mac with no network, install from a file: drag a `.tableplugin` or `.zip` onto **Settings > Plugins**, or click the **+** button there. User-installed plugins live in `~/Library/Application Support/TablePro/Plugins`. -Every plugin is verified before it loads. A registry download must match the SHA-256 checksum in the registry manifest, and the bundle must carry a valid code signature. - -### Plugins from other developers - -A plugin TablePro signed itself installs with no extra step. A plugin signed by someone else installs only after you agree to trust that developer: TablePro asks once, naming the developer and their Apple Team ID, and discards the plugin if you decline. Unsigned and ad-hoc signed bundles are refused outright, with no override. - -Say yes only if you would give that developer your database credentials, because that is what you are granting. A driver plugin runs as part of TablePro and can read the credentials of every connection you open. - -Trust is per developer, not per plugin, so later plugins and updates from the same developer install without asking again. Withdraw it in **Settings > Plugins** to stop every plugin signed by that developer from loading. - -Themes are different: they are JSON with no executable code, so they need no signature and never ask. They are still checked against their SHA-256 checksum. +Every plugin is verified before it loads. A registry download must match the SHA-256 checksum in the registry manifest, and the bundle must be signed by TablePro. A bundle signed by anyone else, ad-hoc signed or unsigned is refused, with no override. ## Updates -The Plugins settings tab carries a badge counting pending updates and plugins that failed to load. Select a plugin under **Installed** to see its installed version, then click **Update**. +The Plugins settings tab carries a badge counting pending updates and plugins that failed to load. Select a plugin in **Settings > Plugins** to see its installed version, then click **Update**. If a driver has open connections, the update is staged instead of applied. The staged version activates when the last connection using the driver closes, or click **Activate Now** after closing them. Quit before it activates and the update is offered again on next launch. @@ -84,7 +74,7 @@ If a driver has open connections, the update is staged instead of applied. The s An app update can raise the plugin interface version. Plugins built against the old version are rejected at load instead of crashing, and TablePro repairs them itself: at launch it reinstalls a compatible build of each outdated plugin, retrying in the background if the registry is unreachable. Connecting to a database whose plugin is outdated updates that plugin first. -Until a plugin is repaired, it appears in a banner in **Settings > Plugins > Installed** with the reason and an action: +Until a plugin is repaired, it appears in a banner in **Settings > Plugins** with the reason and an action: | Action | Meaning | |--------|---------| @@ -95,29 +85,25 @@ Until a plugin is repaired, it appears in a banner in **Settings > Plugins > Ins ## Managing plugins -In **Settings > Plugins > Installed**: +In **Settings > Plugins**: -- The switch beside a plugin's name unloads its drivers and formats without deleting it. Switch it back on to reload. - **Uninstall** removes a user-installed plugin from disk. Bundled plugins cannot be uninstalled. - The detail pane shows version, bundle ID, capabilities, database type, and default port. Plugins with their own settings show them here. macOS cannot fully unload a plugin's code until relaunch, so a banner offers **Quit & Reopen** after you remove one. -Saved connections survive either way. A connection whose driver cannot load stays in the list, and opening it lands on "Could not connect" with the button for the cause: +Saved connections survive a removal. A connection whose driver cannot load stays in the list, and opening it lands on "Could not connect" with the button for the cause: | Cause | Button | |-------|--------| | The driver is not installed | **Install Plugin…** downloads it and connects | -| The plugin is switched off | **Enable Plugin** switches it on and connects | -| The plugin failed to load or needs an update | **Open Plugin Settings** selects it under **Installed**. Click **Try Again** once it is fixed | +| The plugin failed to load or needs an update | **Open Plugin Settings** selects it in **Settings > Plugins**. Click **Try Again** once it is fixed | | The connection names a database type no plugin provides, which a connection imported from another app can | **Edit Connection…** opens the form to choose the type | -A plugin switched off stays off: connecting never switches it back on. - ## Themes -Themes are plugins too: install registry themes from **Settings > Plugins > Browse** under the Themes category. Choose, create, duplicate, import, and export themes in **Settings > Appearance**. See [Appearance](/customization/appearance). +Themes are not plugins. Choose, create, import and export them in **Settings > Appearance**. See [Appearance](/customization/appearance). ## Writing plugins -To build your own driver, format, or theme, see [Plugin Development](/development/plugin-development). +To build a driver or a format, see [Plugin Development](/development/plugin-development). diff --git a/features/safe-mode.mdx b/features/safe-mode.mdx index a1dcfce9..37be761e 100644 --- a/features/safe-mode.mdx +++ b/features/safe-mode.mdx @@ -52,7 +52,7 @@ It does not sit in front of reading metadata. Loading the sidebar, opening a tab A statement runs as a read only when TablePro can tell for certain that it reads. Anything it cannot tell counts as a write: confirmed at the Alert and Safe Mode levels, blocked at Read-Only. -On MongoDB, a read is one call on a collection or database with literal arguments, such as `db.orders.find({status: "open"}).sort({at: -1}).limit(50)`, an `aggregate` pipeline without `$out` or `$merge`, `countDocuments`, `distinct`, `explain`, `show collections` and `use`. Any other JavaScript counts as a write: a variable, a function, `forEach`, `runCommand`. Run several reads at once and each one is checked. Shell state lasts as long as the connection, so a function you redefine in one statement runs redefined in every later one. A read still cannot write through it: the MongoDB driver refuses any write while it runs a statement as a read, once the plugin in **Settings > Plugins > Installed** is updated for this release. +On MongoDB, a read is one call on a collection or database with literal arguments, such as `db.orders.find({status: "open"}).sort({at: -1}).limit(50)`, an `aggregate` pipeline without `$out` or `$merge`, `countDocuments`, `distinct`, `explain`, `show collections` and `use`. Any other JavaScript counts as a write: a variable, a function, `forEach`, `runCommand`. Run several reads at once and each one is checked. Shell state lasts as long as the connection, so a function you redefine in one statement runs redefined in every later one. A read still cannot write through it: the MongoDB driver refuses any write while it runs a statement as a read, once the plugin in **Settings > Plugins** is updated for this release. Redis reads come from a fixed list of read commands. etcd reads are `get`, `watch`, and the commands that only list or report, such as `member list` and `endpoint health`. SAP HANA is read like any other SQL database. diff --git a/images/settings-plugins-browse-dark.png b/images/settings-plugins-browse-dark.png deleted file mode 100644 index f02bbbb9..00000000 Binary files a/images/settings-plugins-browse-dark.png and /dev/null differ diff --git a/images/settings-plugins-browse.png b/images/settings-plugins-browse.png deleted file mode 100644 index fc471aea..00000000 Binary files a/images/settings-plugins-browse.png and /dev/null differ diff --git a/security/privacy.mdx b/security/privacy.mdx index bcf47493..236dc015 100644 --- a/security/privacy.mdx +++ b/security/privacy.mdx @@ -120,7 +120,7 @@ Updates download from the GitHub release named in the feed, and Sparkle checks e At launch the app fetches `https://raw.githubusercontent.com/TableProApp/plugins/main/plugins.json` when its cached copy is more than five minutes old, and again when it reconciles a plugin that a newer app version rejected. The request adds no header of its own; GitHub sees the IP address and the user agent URLSession sends. The response is cached on disk. -Installing a plugin or a theme downloads its ZIP over HTTPS from the URL in that catalog and checks it against the SHA-256 the catalog declares. The plugin browser also calls `https://api.github.com/repos/TableProApp/TablePro/releases?per_page=100` for download counts, at most once every five minutes, and only while that pane is open. +Installing a plugin downloads its ZIP over HTTPS from the URL in that catalog and checks it against the SHA-256 the catalog declares. There is no setting that turns the catalog fetch off. diff --git a/snippets/driver-counts.mdx b/snippets/driver-counts.mdx index 052a7bb4..c7a6c8bf 100644 --- a/snippets/driver-counts.mdx +++ b/snippets/driver-counts.mdx @@ -1,3 +1,3 @@ Five drivers ship inside the app and cover twelve databases. Twenty-three registry plugins cover the other twenty-five and install on the first connection that needs one. See -[Plugins & Themes](/features/plugins). +[Plugins](/features/plugins). diff --git a/snippets/registry-plugin.mdx b/snippets/registry-plugin.mdx index edb93ada..f7a519cc 100644 --- a/snippets/registry-plugin.mdx +++ b/snippets/registry-plugin.mdx @@ -1,3 +1,3 @@ The {name} driver is not in the app. Picking {name} in the **Choose a Database** sheet offers the download before the form opens, and opening a saved {name} connection installs it without asking. -**Settings > Plugins > Browse > {plugin}** installs it up front. See [Plugins](/features/plugins). +See [Plugins](/features/plugins). diff --git a/switching.mdx b/switching.mdx index 54b678f7..c12b96ee 100644 --- a/switching.mdx +++ b/switching.mdx @@ -109,11 +109,6 @@ Two other routes exist. -A database missing from the connection form may still be one click away in **Settings > Plugins > Browse**. - - - Plugin registry browser - Plugin registry browser - +A database missing from the connection form may still be a registry driver: the type chooser lists every one, badged **Not Installed** until you pick it. If it is genuinely not there, open a request on [GitHub](https://github.com/TableProApp/TablePro/issues). Driver coverage is tracked in the open, and the [supported database list](/connections) is the current answer. diff --git a/troubleshooting.mdx b/troubleshooting.mdx index 98217eac..09e27fb8 100644 --- a/troubleshooting.mdx +++ b/troubleshooting.mdx @@ -41,11 +41,11 @@ A handshake failure names the cause and the SSL Mode to switch to, with the driv ## A plugin will not install or load -A plugin that fails any of its checks appears as a banner in **Settings > Plugins > Installed** with the reason. +A plugin that fails any of its checks appears as a banner in **Settings > Plugins** with the reason. ### "Plugin code signature verification failed: …" -The bundle is unsigned, ad-hoc signed, or altered after signing, and there is no override. Download it again from the registry or from its developer. +The bundle is not signed by TablePro, is unsigned or ad-hoc signed, or was altered after signing, and there is no override. Download it again from the registry. ### "Plugin checksum does not match expected value" @@ -63,7 +63,7 @@ A network problem, not a bad plugin. Retry once you are online. A saved connection's driver is missing. The failure screen offers **Install Plugin…**. -Removing a plugin needs a relaunch, offered as **Quit & Reopen**. Plugins you installed live in `~/Library/Application Support/TablePro/Plugins`. See [Plugins & Themes](/features/plugins). +Removing a plugin needs a relaunch, offered as **Quit & Reopen**. Plugins you installed live in `~/Library/Application Support/TablePro/Plugins`. See [Plugins](/features/plugins). ## SSH tunnel failures @@ -114,6 +114,6 @@ Neither copy button includes a password. **Copy Details** carries the host, the **Help > Report an Issue** opens the [issue tracker](https://github.com/TableProApp/TablePro/issues). A report that gets fixed quickly carries: - The version from **TablePro > About TablePro**, your macOS version, and whether the Mac is Apple Silicon or Intel -- The engine and server version, plus the plugin version from **Settings > Plugins > Installed** +- The engine and server version, plus the plugin version from **Settings > Plugins** - The error pasted from **Copy Details** or **Copy Diagnostic Info**, not retyped - What you ran, what happened, and what you expected. Add the log lines when the failure left no dialog