Skip to main content

HyperHQ Plugin Developer Onboarding

This page is the short path into HyperHQ plugin development. If you already know your way around a terminal and one programming language, you have enough to start.

Plugins are standalone programs that HyperHQ launches when it needs them. They authenticate over Socket.IO, receive request messages, and send response messages back. Your plugin.json manifest tells HyperHQ what the plugin is, how to launch it, and what access it needs.

What You Can Build

Plugin TypeExamplesGood First Project?
UtilitiesFile organizers, backup tools, ROM scannersYes
Media toolsImage processors, video helpers, artwork cleanupYes, if the scope is small
Arcade hardwareLED controllers, marquee displays, cabinet devicesBetter after one basic plugin
Game integrationsMAME setup, Steam import, GOG importMore moving parts
Custom interfacesWeb dashboards, mobile controllers, companion toolsAdvanced

Pick a Starting Point

Python

Good for the first pass, quick scripts, and plugins that lean on existing libraries.

wget https://docs.hyperai.io/downloads/templates/python-starter.zip
unzip python-starter.zip
cd python-starter

./build.sh
./test.sh

JavaScript / Node.js

Good if you are already comfortable with async code and package tooling.

wget https://docs.hyperai.io/downloads/templates/nodejs-starter.zip
unzip nodejs-starter.zip
cd nodejs-starter

npm install
npm run build
npm test

C#

Good for Windows integrations, hardware tools, and teams already using .NET.

wget https://docs.hyperai.io/downloads/templates/csharp-starter.zip
unzip csharp-starter.zip
cd csharp-starter

dotnet build
dotnet test
dotnet publish -c Release

The Basic Contract

1. Your Plugin Handles a Few Methods

HyperHQ sends method calls over Socket.IO. Most plugins start with these:

class MyPlugin:
def initialize(self, settings):
return "initialized"

def execute(self, action_data):
return {"success": True}

def test(self, _):
return True

def shutdown(self, _):
return "ok"

2. Socket.IO Uses Request and Response

HyperHQ sends:

{"id":"123","method":"execute","data":{"action":"scan_files","path":"/roms"}}

Your plugin responds:

{"id":"123","type":"response","data":{"files_found":1337}}

For longer work, send short status updates while the request is still running:

{"status":"scanning","message":"Scanned 400 of 1200 files"}

That maps to the statusUpdate Socket.IO event.

3. Settings Come from the Manifest

Define settings in plugin.json; HyperHQ renders the settings UI.

{
"settings": [
{"key": "apiKey", "label": "API Key", "type": "string"},
{"key": "enabled", "label": "Enable", "type": "boolean"},
{"key": "romPath", "label": "ROM Path", "type": "directory"}
]
}

The field is label, not name. Keep keys stable once users might have saved settings.

Developer Resources

ResourceUse It For
Plugin Developer GuideA full tutorial and examples
Socket.IO GuideConnection, authentication, events, and data requests
API ReferenceMethod and payload lookup
Architecture OverviewThe deeper design notes

Templates

LanguageDownloadBest For
Pythonpython-starter.zipFirst plugin, quick automation
Node.jsnodejs-starter.zipAsync integrations
C#csharp-starter.zipWindows and .NET tooling
Gogo-starter.zipSmall native executables

Each starter gives you a working plugin, build instructions, example settings, and enough structure to start changing behavior without rebuilding the whole project.

Common Questions

Do I need to know HyperHQ internals?

No. The plugin boundary is Socket.IO plus plugin.json. You can build useful plugins without touching the HyperHQ app code.

What if my plugin crashes?

Plugins run in separate processes, so a crash should not take HyperHQ down. Make sure you log enough context to debug the failure afterward.

Can I access HyperHQ data?

Yes. Use requestData for supported methods such as getSystems, getGamesForSystem, addGames, and launchGame.

How do I handle long-running operations?

Send statusUpdate messages with a concise status and message. HyperHQ uses those updates to keep active plugin requests alive and show useful progress.

How do I distribute a plugin?

Package the manifest, executable, and any supporting files as a ZIP. Keep the folder layout simple and test the ZIP before sharing it.

Next Steps

  1. Pick a template in a language you already know.
  2. Build and run the sample plugin unchanged.
  3. Open the Socket.IO guide and compare the sample code to the real event names.
  4. Change one action or setting.
  5. Package the plugin and test the ZIP.

Small first plugin, boring test loop, fewer surprises. That is usually the quickest route.