Skip to main content

Quick Start Guide

Build a small executable plugin, install it locally, and confirm HyperHQ can talk to it.

Prerequisites

  • HyperHQ installed and running
  • A language/runtime that can build a Windows executable
  • A Socket.IO client library for your language
  • Basic JSON knowledge

Official starter docs are available for:

TemplateBest For
Go StarterSmall self-contained binaries
C# StarterWindows and .NET integrations
Python StarterFast prototypes and scripts

Step 1: Create the Plugin Folder

HyperHQ loads one plugin per folder. For a local install, that folder goes under your HyperSpin install directory:

Folder layout
HyperSpin/
└── plugins/
└── my-plugin/
├── plugin.json
├── MyPlugin.exe
├── icon.png # optional
└── README.md # optional

The folder name should be stable. The plugin ID inside plugin.json must be unique. If you ship multiple platform builds, list them with executableProviders so HyperHQ can launch the right file.

Step 2: Add a Manifest

plugin.json
{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"author": "Your Name",
"type": "executable",
"description": "Adds a focused workflow to HyperHQ.",
"executable": "MyPlugin.exe",
"executableProviders": {
"windows": "MyPlugin.exe",
"linux": "MyPlugin"
},
"communication": {
"preferred": "socketio",
"fallback": "stdio",
"socketio": {
"enabled": true
}
},
"capabilities": [
{
"name": "game-import",
"description": "Import games from an external source",
"required": false
}
],
"permissions": [
{
"type": "network",
"scope": "external-api",
"description": "Connect to the configured service"
}
],
"settings": [
{
"key": "enabled",
"label": "Enabled",
"type": "boolean",
"defaultValue": true
}
],
"actions": [
{
"id": "sync_games",
"label": "Sync Games",
"description": "Run the import workflow"
}
]
}

Keep the manifest honest. If a plugin needs network access, filesystem access, credentials, or process launching, say so clearly.

Step 3: Build the Executable

Use the command that matches your template or language:

Go
go build -o MyPlugin.exe
C#
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
Python
pip install pyinstaller
pyinstaller --onefile --name MyPlugin plugin.py

Step 4: Connect and Authenticate

When HyperHQ launches an executable plugin, it provides the connection details through environment variables.

VariablePurpose
HYPERHQ_PLUGIN_IDPlugin ID from the manifest
HYPERHQ_AUTH_CHALLENGEOne-time challenge used to authenticate
HYPERHQ_SOCKET_PORTLocal Socket.IO port
HYPERHQ_PLUGIN_NAMEDisplay name from the manifest
HYPERHQ_PLUGIN_VERSIONVersion from the manifest
PLUGIN_SETTINGSSerialized plugin settings for the current launch

For stdio-mode plugins, HyperHQ sends JSON requests over stdin/stdout instead. Socket.IO is the better default for real-time progress and longer workflows.

Generic Socket.IO flow
import { io } from 'socket.io-client';

const pluginId = process.env.HYPERHQ_PLUGIN_ID || 'my-plugin';
const challenge = process.env.HYPERHQ_AUTH_CHALLENGE;
const port = process.env.HYPERHQ_SOCKET_PORT || '52789';
const socket = io(`http://localhost:${port}`, { reconnection: true });

socket.on('connect', () => {
socket.emit('authenticate', { pluginId, challenge });
});

socket.on('authenticated', (response) => {
if (!response.success) {
console.error('Authentication failed:', response.error);
return;
}

sessionToken = response.sessionToken;
});

socket.on('request', async (message) => {
const result = await handleRequest(message);

socket.emit('response', {
id: message.id,
type: 'response',
data: result
});
});

Notice the URL uses the default Socket.IO namespace. Do not append /plugin.

Step 5: Test in HyperHQ

  1. Restart HyperHQ.
  2. Open Settings -> Plugins.
  3. Find your plugin.
  4. Run the test action.
  5. Check plugin logs if authentication or launch fails.

Common Issues

Plugin doesn't appear

  • Check plugin.json is valid JSON.
  • Make sure the folder is under the correct plugins/ directory.
  • Confirm id, name, version, type, and executable are present.

Authentication fails

  • Read HYPERHQ_AUTH_CHALLENGE from the environment.
  • Connect to the port in HYPERHQ_SOCKET_PORT.
  • Use the default namespace: http://localhost:${port}.
  • Emit authenticate immediately after the Socket.IO connection opens.

Plugin starts but does nothing

  • Confirm it listens for request.
  • Respond with response, not plugin:response.
  • Include the original request id in every response.
  • Send statusUpdate during long operations.

Next Steps