PatchKit is excited to announce the official release of Launcher SDK 1.0.0! This milestone brings a host of new features and improvements aimed at making game launcher development more streamlined and accessible. Below, we highlight the key updates in this release.
Comprehensive and user-friendly documentation has been a top priority. The updated Launcher SDK Documentation now covers a wide range of concepts to support developers in utilizing the SDK effectively. Explore the documentation here, and feel free to provide feedback.
The 1.0.0 release introduces robust Command Line Interface (CLI) tools designed to simplify the development, building, and deployment of custom launchers.
> cd runtime && yarn run dev -h
Usage: dev-patchkit-basic-launcher-runtime --presetFileName <presetFileName> --overrideThemeUrl <overrideThemeUrl> [-- <runtimeProcessExtraArgs>]
Description: Starts runtime in dev mode.
Arguments:
--presetFileName: Preset file name. [alias: -p]
--overrideThemeUrl: Overrides the theme url. [alias: -t]
--customLibpkappsVersion: Custom libpkapps version (use it only when you know what you're doing!).
--customLibpkappsDirPath: Custom libpkapps directory path (use it only when you know what you're doing!).
--help: Show this help message.
--verbose: Enables verbose mode.
> cd runtime && yarn run build -h
Usage: build-patchkit-basic-launcher-runtime --presetFileName <presetFileName> [--uploadRuntime] [--publishRuntime]
Description: Builds runtime (ensure APPLE_ID and APPLE_ID_PASSWORD environment variables are set for macOS code signing).
Arguments:
--presetFileName: Preset file name. [alias: -p]
--uploadRuntime: Uploads runtime post-build (requires PATCHKIT_API_KEY).
--publishRuntime: Publishes runtime after upload (--uploadRuntime must be set).
--overrideThemeUrl: Overrides the theme URL.
--customLibpkappsVersion: Custom libpkapps version.
--help: Show help message.
--verbose: Enables verbose mode.
Simplify CI/CD integration with the new theme publishing CLI:
> cd theme && yarn run publish -h
Usage: publish-patchkit-launcher-theme --themePresetFileName <themePresetFileName>
Description: Publishes launcher themes (requires PATCHKIT_API_KEY).
Arguments:
--themePresetFileName: Theme preset file name. [alias: -p]
--help: Show help message.
--verbose: Enables verbose mode.
Complete API documentation for the Launcher SDK is now available, offering detailed insights into the SDK’s capabilities. Access it here.
The Demo Launcher has been rebuilt using modern frontend technologies to offer a better starting point for projects:
To get started quickly, you can bootstrap a new launcher project based on our Demo Launcher template. This will create a new project with all the necessary dependencies and a working example that you can customize:
yarn create @upsoft/patchkit-launcher-sdk-project
This command will set up a new project using the Demo Launcher as a foundation, giving you a fully functional launcher that you can modify to meet your specific needs. The source code for the Demo Launcher is also available on GitHub if you want to explore the implementation details or contribute.
You can check out the PatchKit Demo Launcher in action by downloading it for:
The React theme client package (@upsoft/patchkit-launcher-runtime-api-react-theme-client
) has been enhanced with hooks leveraging React Suspense for better async handling:
function AppCard({ appId }: { appId: string }) {
return (
<Suspense fallback={<div>Loading...</div>}>
<AppCardSuspense appId={appId} />
</Suspense>
);
}
function AppCardSuspense({ appId }: { appId: string }) {
const appInfo = useAppInfo({ appId });
return (
<div style={{ background: `url(${appInfo.bannerUrl})` }}>
<h1>{appInfo.name}</h1>
<p>{appInfo.shortDescription}</p>
</div>
);
}
Additionally, the @upsoft/patchkit-launcher-runtime-api-react-theme-extras
package introduces AppBranchController
for managing app states and updates:
function AppBranchView({ appId, appBranchId }: { appId: string; appBranchId: string }) {
const appBranchController = useAppBranchSuspenseController({ appId, appBranchId });
if (appBranchController.isRegistered) {
return <button onClick={() => appBranchController.registerAndStartUpdateTaskMutation.mutate({})}>Install</button>;
}
switch (appBranchController.status) {
case AppBranchStatus.NotInstalled:
return <button onClick={() => appBranchController.startUpdateTaskMutation.mutate({})}>Update</button>;
case AppBranchStatus.Installed:
return <button onClick={() => appBranchController.startProcessMutation.mutate({})}>Start</button>;
}
}
Dive into the Launcher SDK Docs to start building your custom launcher today. Feedback and questions are always welcome!