CupidBot Hub contains the local plugin source and build system for CupidBot. It imports the legacy hub plugins into the net.runelite.client.plugins.cupidbot namespace, builds each plugin as a local jar, and writes a local plugins.json manifest for the CupidBot client.
The hub does not publish runtime download URLs. plugins.json uses local jar names such as PestControlPlugin.jar, and the CupidBot client reads those jars from ~/.runelite/cupidbot-plugins.
Local plugins may use networking for their own features. Examples include Discord webhook delivery, OpenAI chatbot calls, third-party shooting-star providers, and third-party Tears of Guthix world lookup. The local-only boundary applies to the CupidBot core client and loader, not to plugin feature code.
CupidBot Hub is still a work in progress. The goal is to make the imported local plugins build, install, and run from local jars, but not every plugin is expected to work perfectly yet. Some plugins may stop themselves when requirements are missing, depend on account/location setup, or still need CupidBot compatibility fixes.
If you find a broken plugin, open an issue with the plugin name, the action you tried, your config/setup, steps to reproduce, and any relevant lines from /tmp/cupidbot.log, build/reports/cupidbot-plugin-audit.json, or the launcher log.
- Java 11 for hub plugin compilation
- A local CupidBot client jar built from
../cupidbot
JAVA_HOME=/usr/lib/jvm/java-11-openjdk ./gradlew clean build generatePluginsJson copyPluginDocs \
-PcupidbotClientPath=/home/frank/micro-client-custom/cupidbot/runelite-client/build/libs/cupidbot-2.6.10.jarOutputs:
build/libs/<InternalName>-<version>.jarpublic/docs/plugins.json- copied docs under
public/docs/plugins/where plugin docs exist
scripts/install-cupidbot-local-plugins.shThe helper installs:
~/.runelite/cupidbot-plugins/plugins.json~/.runelite/cupidbot-plugins/<InternalName>.jar- optional plugin docs copied from
public/docs/plugins
Run the plugin harness for static lifecycle-risk checks:
scripts/test-cupidbot-plugins.sh static --allow-findingsWhen CupidBot is running with the Agent Server enabled, smoke-test plugin start/stop behavior and parse the client log:
scripts/test-cupidbot-plugins.sh lifecycle \
--plugin AutoCookingPlugin \
--run-seconds 2 \
--log-file /tmp/cupidbot.log \
--allow-findingsSee docs/PLUGIN_TEST_HARNESS.md for full usage, reports, exit codes, and limitations.
To audit every enabled plugin, use the guarded all-plugin mode:
scripts/test-cupidbot-plugins.sh audit-all \
--live-account-ok \
--run-seconds 2 \
--log-file /tmp/cupidbot.log \
--report build/reports/cupidbot-plugin-audit.json \
--allow-findingsJAVA_HOME=/usr/lib/jvm/java-11-openjdk ./gradlew build generatePluginsJson \
-PpluginList=PestControlPlugin \
-PcupidbotClientPath=/home/frank/micro-client-custom/cupidbot/runelite-client/build/libs/cupidbot-2.6.10.jarSource:
src/main/java/net/runelite/client/plugins/cupidbot/<pluginname>/
Resources:
src/main/resources/net/runelite/client/plugins/cupidbot/<pluginname>/
Common files:
<PluginName>Plugin.java<PluginName>Script.java<PluginName>Config.java<PluginName>Overlay.javadependencies.txtfor extra Maven dependenciesdocs/README.mdanddocs/assets/for local hub documentation
Every plugin needs a @PluginDescriptor with:
nameversionminClientVersionenabledByDefaultisExternal
Use relative resource paths for local icons/cards:
iconUrl = "PestControlPlugin/assets/icon.png",
cardUrl = "PestControlPlugin/assets/card.png"Do not add remote jar download URLs for CupidBot local plugins. Plugin feature networking is allowed when it lives in the plugin source and is visible to users through plugin configuration or docs.