From c354db2657b4f937e7394572842f6a38b38762b2 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Tue, 23 Jun 2026 02:25:24 -0700 Subject: [PATCH] docs(plugins): add guide for testing a custom driver plugin locally --- docs/development/testing-plugins.mdx | 37 ++++++++++++++++++++++++++++ docs/docs.json | 3 ++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 docs/development/testing-plugins.mdx diff --git a/docs/development/testing-plugins.mdx b/docs/development/testing-plugins.mdx new file mode 100644 index 000000000..16821cac3 --- /dev/null +++ b/docs/development/testing-plugins.mdx @@ -0,0 +1,37 @@ +--- +title: Testing a Custom Plugin +description: Run and test a third-party driver plugin in a local debug build without a code signing error +--- + +# Testing a Custom Plugin + +When you write your own driver plugin, you can run it inside a local debug build of TablePro before publishing it to the registry. Packaging the plugin and installing it like a registry plugin fails with a code signing error ("Unable to install plug-in"), because the registry install path verifies the bundle's signature. A locally-built plugin is unsigned, so that path rejects it. + +The fix is to copy the plugin into the app at build time. A plugin bundled into the **Copy Plug-Ins** build phase runs under the debug build's own signature, so the signature check passes and the plugin loads. + +## Steps + + + + In Xcode, select the **TablePro** target, open the **Build Phases** tab, and add your `.tableplugin` bundle to the **Copy Plug-Ins** phase. + + + Press `Cmd+R` to build and run. See [Building](/development/building) for the `-skipPackagePluginValidation` requirement on command-line builds. + + + The plugin loads with the app. Create a connection for your database type and confirm the driver works. + + + Once the plugin works, remove it from the **Copy Plug-Ins** phase so it does not ride into a release build. + + + + +Keep the plugin in **Copy Plug-Ins** only while you are testing. Release builds distribute plugins through the [Plugin Registry](/development/plugin-registry), where every binary is signed. + + +## Why the signing error happens + +Plugins installed from the registry are signed, and TablePro verifies that signature before loading them. A plugin you just built locally has no such signature, so the registry install path reports "Unable to install plug-in." Copying the plugin into the **Copy Plug-Ins** build phase sidesteps that path: the plugin ships inside the debug app bundle and runs under the build's signature, which is enough to load and test it. + +When the plugin is ready to ship, publish it through the registry so users receive a signed binary. See [Plugin Registry](/development/plugin-registry) for the manifest format and publishing flow. diff --git a/docs/docs.json b/docs/docs.json index e969a7348..b9b72a030 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -187,7 +187,8 @@ "development/architecture", "development/building", "development/code-style", - "development/plugin-registry" + "development/plugin-registry", + "development/testing-plugins" ] } ]