1. Extract and openExtract the starter ZIP, open its folder in IntelliJ, and import it as a Gradle project using JDK 11.
SuspenseDeveloper Documentation
Suspense developer documentation
Download a standalone IntelliJ and Gradle starter, compile only against the approved public SDK, and hot reload the resulting plugin JAR in the installed Suspense client.
Standalone development kit
The starter produces the same external-plugin JAR format used by the Marketplace, so local testing and review use the same artifact structure.
1. Extract and openExtract the starter ZIP, open its folder in IntelliJ, and import it as a Gradle project using JDK 11.
2. Rename the starterSet the plugin ID, display name, version, author, Java package, entry class, and descriptor metadata.
3. Enable local pluginsIn Suspense Core settings, enable Plugin development → Enable development plugins.
4. Build and reloadRun installDevPlugin. Suspense watches %USERPROFILE%\.runelite\suspense-dev-plugins and reloads the newest JAR automatically.
libs/Suspense-Plugin-SDK.jar
.\gradlew.bat installDevPlugin
~/.runelite/suspense-dev-plugins
Choose the correct API
Most plugins begin with the Client API. Add the automation runtime for multi-step work and the walker when the player must travel.
CompletableFuture<T>The operation completes asynchronously. Chain work with thenApply, thenCompose, or thenAccept rather than blocking the client thread.
Optional<T>The requested object may not currently exist. Handle the empty case instead of calling get() without checking.
*SnapshotA read-only point-in-time view. Request a new snapshot before making a decision that depends on current state.
SuspenseInteractionResultThe outcome of a requested action. Check it before assuming a click, withdrawal, selection, or interaction succeeded.
List<T>A collection of current matches. An empty list is valid and simply means nothing matched at that moment.
WorldPointA world coordinate with X, Y, and plane. The correct plane matters for objects, ground items, and walking destinations.
Minimal example
Check for coins and continue only after the asynchronous result is available.
SuspenseClientApi api = /* injected API */;
api.inventoryContains(995)
.thenAccept(hasCoins -> {
if (hasCoins) {
// Continue the workflow.
}
});
Searchable Java reference
The default view shows callable Client API types. Select another area or disable the callable-method filter to inspect snapshots, requests, results, and enums.