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:
| Template | Best For |
|---|---|
| Go Starter | Small self-contained binaries |
| C# Starter | Windows and .NET integrations |
| Python Starter | Fast 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:
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
{
"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 build -o MyPlugin.exe
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
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.
| Variable | Purpose |
|---|---|
HYPERHQ_PLUGIN_ID | Plugin ID from the manifest |
HYPERHQ_AUTH_CHALLENGE | One-time challenge used to authenticate |
HYPERHQ_SOCKET_PORT | Local Socket.IO port |
HYPERHQ_PLUGIN_NAME | Display name from the manifest |
HYPERHQ_PLUGIN_VERSION | Version from the manifest |
PLUGIN_SETTINGS | Serialized 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.
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
- Restart HyperHQ.
- Open Settings -> Plugins.
- Find your plugin.
- Run the test action.
- Check plugin logs if authentication or launch fails.
Common Issues
Plugin doesn't appear
- Check
plugin.jsonis valid JSON. - Make sure the folder is under the correct
plugins/directory. - Confirm
id,name,version,type, andexecutableare present.
Authentication fails
- Read
HYPERHQ_AUTH_CHALLENGEfrom the environment. - Connect to the port in
HYPERHQ_SOCKET_PORT. - Use the default namespace:
http://localhost:${port}. - Emit
authenticateimmediately after the Socket.IO connection opens.
Plugin starts but does nothing
- Confirm it listens for
request. - Respond with
response, notplugin:response. - Include the original request
idin every response. - Send
statusUpdateduring long operations.
Next Steps
- Read the Socket.IO Guide for the full event contract.
- Use the API Reference when you need request payloads.
- Start from a template if you want complete working code.