Learn how AllayHub indexes plugins from GitHub repositories
This document describes how AllayHub indexes plugins from GitHub repositories. Follow these guidelines to ensure your plugin is properly discovered and displayed.
For your repository to be indexed as an Allay plugin, it must meet all of the following criteria:
noindex topic - Repositories with the noindex topic are excluded (see Plugin Removal)org.allaymc in build.gradle or build.gradle.ktsallaymc-plugin topic on the repositoryAllayHub uses two complementary methods to discover plugins:
Searches for repositories containing org.allaymc in Gradle build files. This is the primary discovery method.
Note: GitHub's code search index may have delays or gaps, especially for:
- Newly created repositories
- Repositories with low activity
- Repositories generated from templates
Searches for repositories with the allaymc-plugin topic. This method is more reliable because:
To add the topic: Go to your repository → About (gear icon) → Topics → Add allaymc-plugin
Note: Forked repositories are indexed only when discovered via the topic search method. If your plugin is a fork, add the
allaymc-plugintopic to ensure it is discovered.
Each plugin is assigned an ID in the owner/name format (all lowercase), where:
owner is the GitHub repository owner (user or organization)name is the plugin name (from AllayGradle DSL, plugin.json, or repository name as fallback)For example, a plugin named "MyPlugin" in a repository owned by "CoolLoong" would have the ID coolloong/myplugin.
Plugin data files are stored in a nested directory structure: AllayHubIndex/{owner}/{name}.json.
Frontend URLs follow the same pattern: /plugin/{owner}/{name}.
Define plugin metadata directly in build.gradle.kts using AllayGradle:
allay {
api = "0.23.0"
plugin {
entrance = "com.example.MyPlugin"
name = "My Plugin"
version = "1.0.0"
description = "A short description of my plugin"
authors += "AuthorName"
website = "https://example.com"
apiVersion = ">=0.23.0"
dependencies += dependency("OtherPlugin", "1.0.0")
dependencies += dependency("OptionalPlugin", optional = true)
}
}
Alternatively, the indexer reads metadata from plugin.json or extension.json in the resources directory:
src/main/resources/plugin.json<module>/src/main/resources/plugin.json{
"entrance": "com.example.MyPlugin",
"name": "My Plugin",
"version": "1.0.0",
"authors": ["AuthorName"],
"description": "A short description of my plugin",
"website": "https://example.com",
"api_version": ">=0.14.0",
"dependencies": [
{
"name": "OtherPlugin",
"version": "1.0.0",
"optional": false
}
]
}
You can use template variables in plugin.json:
| Variable | Description |
|---|---|
${project.version} |
Replaced with version from build.gradle.kts |
${description} |
Replaced with description from build.gradle.kts |
${project.description} |
Same as ${description} |
@DESCRIPTION@ |
Same as ${description} |
| Field | Fallback Source |
|---|---|
name |
Repository name |
description |
Repository description |
icon_url |
Repository owner's avatar |
Place a logo file anywhere in the repository to use as your plugin icon. The indexer searches for these filenames in order (matches **/filename):
logo.pngicon.pnglogo.jpgicon.jpglogo.svgicon.svglogo.webpicon.webpIf no logo is found, the repository owner's GitHub avatar is used.
Place numbered gallery images anywhere in the repository (matches **/galleryN.ext):
gallery1.png
gallery2.jpg
gallery3.webp
...
gallery10.png
Supported extensions: png, jpg, jpeg, svg, webp, gif
The indexer reads gallery images sequentially (gallery1, gallery2, ...) and stops at the first missing number.
Images in your README are automatically extracted and added to the gallery after the numbered gallery images.
Gallery images are ordered as follows (first image is used as the cover on discover page):
gallery1, gallery2, ...)Categories are derived from your repository's GitHub Topics. Add topics that match the following category IDs:
| Category ID | Description |
|---|---|
adventure |
Adventure and exploration plugins |
cursed |
Cursed and challenge plugins |
decoration |
Decoration and building plugins |
economy |
Economy and trading plugins |
equipment |
Equipment and gear plugins |
food |
Food and farming plugins |
game-mechanics |
Game mechanics modification plugins |
library |
API libraries for developers |
magic |
Magic and spells plugins |
management |
Server management plugins |
minigame |
Minigame plugins |
mobs |
Mob related plugins |
optimization |
Performance optimization plugins |
social |
Social and communication plugins |
storage |
Storage and inventory plugins |
technology |
Technology and automation plugins |
transportation |
Transportation plugins |
utility |
General utility plugins |
world-generation |
World generation plugins |
Topics not matching these IDs are ignored. If no matching topics are found, the plugin defaults to utility.
Versions are read from GitHub Releases:
v is stripped).jar or .zip extensions are listed as downloadable filesAmong release assets, the indexer selects a primary file:
.jar or .zip fileAuthors are populated from:
plugin.json, matched against repository contributorsLicense information is read from GitHub's detected license:
The API version requirement is extracted from:
apiVersion in AllayGradle DSL or api_version in plugin.jsonapi in AllayGradle DSLlibs.versions.toml)my-allay-plugin/
├── .github/
│ └── img/
│ ├── logo.png # Plugin icon
│ ├── gallery1.png # Gallery image 1
│ └── gallery2.png # Gallery image 2
├── build.gradle.kts # Plugin metadata (AllayGradle DSL)
├── settings.gradle.kts
├── README.md # Description (images extracted to gallery)
└── src/
└── main/
├── java/ # Plugin source code
└── resources/
Plugins are automatically removed from the index when any of the following conditions are met during the update cycle (runs hourly):
| Condition | Description |
|---|---|
| Repository deleted | The repository no longer exists (404) |
| Repository archived | The repository has been archived |
| Plugin removed | The plugin.json or AllayGradle DSL no longer defines the plugin |
| Opted out | The repository has the noindex topic |
To manually remove your plugin from AllayHub, add the noindex topic to your repository (About → Topics → add noindex).
allaymc-plugin topic - Ensures your plugin is discovered even if code search hasn't indexed it yet