---
title: Manifest Schema
type: docs
weight: 1
---

The `manifest.json` file defines your plugin's metadata and configuration.

## Basic Structure

```json
{
  "name": "MyPlugin",
  "version": "1.0.0",
  "main": "com.example.MyPlugin",
  "dependencies": []
}
```

## Required Fields

### name
**Type:** `string`

The unique identifier for your plugin. Used for logging and dependency resolution.

```json
{
  "name": "MyAwesomePlugin"
}
```

### version
**Type:** `string`

The plugin version following semantic versioning (recommended).

```json
{
  "version": "1.0.0"
}
```

### main
**Type:** `string`

The fully qualified class name of your main plugin class. This class must extend `JavaPlugin`.

```json
{
  "main": "com.example.myplugin.MyPlugin"
}
```

## Optional Fields

### dependencies
**Type:** `string[]`

List of plugin names this plugin depends on. Dependent plugins will be loaded first.

```json
{
  "dependencies": ["CoreLib", "DatabasePlugin"]
}
```

### description
**Type:** `string`

A brief description of your plugin.

```json
{
  "description": "Adds awesome features to the server"
}
```

### author
**Type:** `string`

The plugin author or team name.

```json
{
  "author": "YourName"
}
```

### authors
**Type:** `string[]`

List of plugin authors for team projects.

```json
{
  "authors": ["Developer1", "Developer2"]
}
```

### website
**Type:** `string`

Plugin homepage or documentation URL.

```json
{
  "website": "https://example.com/myplugin"
}
```

## Complete Example

```json
{
  "name": "EconomyPlugin",
  "version": "2.1.0",
  "main": "com.example.economy.EconomyPlugin",
  "description": "A comprehensive economy system for Hytale servers",
  "author": "GameDev",
  "authors": ["GameDev", "Contributor1"],
  "website": "https://github.com/example/economy",
  "dependencies": ["DatabaseLib"]
}
```

## File Location

The `manifest.json` must be placed in the root of your plugin JAR file:

```
MyPlugin.jar
├── manifest.json
├── com/
│   └── example/
│       └── myplugin/
│           └── MyPlugin.class
└── resources/
    └── config.yml
```

## Validation

{{< callout type="warning" >}}
The server validates manifest.json on startup. Invalid manifests will prevent your plugin from loading.

Common issues:
- Missing required fields (name, version, main)
- Invalid JSON syntax
- Main class not found in JAR
- Circular dependencies
{{< /callout >}}

## Main Class Requirements

Your main class specified in `main` must:

1. Extend `JavaPlugin`
2. Have a public no-argument constructor
3. Be accessible in the JAR classpath

```java
package com.example.myplugin;

import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class MyPlugin extends JavaPlugin {
    @Override
    public void start() {
        // Plugin enabled - register events, commands, etc.
        getLogger().at(Level.INFO).log("Plugin started!");
    }

    @Override
    public void shutdown() {
        // Plugin disabled - cleanup resources
    }
}
```

## Dependency Resolution

Dependencies are loaded in order:

1. All dependencies must be present and valid
2. Circular dependencies cause load failure
3. Missing dependencies cause load failure

```
LoadOrder:
1. DatabaseLib (no dependencies)
2. CoreLib (depends on DatabaseLib)
3. MyPlugin (depends on CoreLib)
```

## Version Compatibility

{{< callout type="info" >}}
Consider versioning your plugin API if other plugins depend on you:
- Major: Breaking changes
- Minor: New features, backward compatible
- Patch: Bug fixes
{{< /callout >}}

```json
{
  "name": "MyAPI",
  "version": "2.0.0"
}
```

Dependent plugins can then specify minimum versions in their documentation.
