Plugin configuration

Configure HeadDB menus, catalog refreshes, economy, storage, and custom categories.

Edit files under plugins/HeadDB/. /hdb reload safely applies messages, sounds, menus, prices, website links, and categories. Database endpoints, player-storage backends, worker counts, and task intervals require a restart; Bukkit /reload is not a safe substitute.

Common settings

SettingDefaultEffect
updatertruePeriodically applies catalog additions, edits, and removals.
preloadHeadsfalseCreates all head items during startup; leave disabled for the full catalog.
trackPagetrueReopens a category on the player's previous page.
showInfoItemtrueShows the contribution information control.
website.searchHint.enabledtrueShows a clickable headdb.net link after an in-game search.
maxBuyAmount2304Maximum amount accepted by give and purchase flows.
headsMenu.rows4Number of content rows; valid values are 1–5.
storage.player.saveInterval1800Player-data save interval in seconds.
storage.player.backendSQLITELocal SQLite or shared MYSQL player preferences.

head.name and head.lore accept the documented placeholders {id}, {name}, {category}, {tags}, and {cost}. Modern messages use MiniMessage formatting. The head.omit list removes selected lore lines from heads given to players.

HeadDB directs browsing and submissions to the same public site used by the managed API:

website:
  url: "https://headdb.net"
  searchHint:
    enabled: true

/hdb submit links to /submit, and the contribution controls in modern menus use the same destination. After /hdb search, the plugin carries compatible name, category, tag, or single-ID filters into /heads so players can continue in the browser and copy a command. Multi-ID and all/any filters are also preserved. Set website.searchHint.enabled to false to suppress only the post-search chat message.

Managed catalog

The recommended 6.1.0 configuration is:

updater: true

database:
  sourceUrl: "https://headdb.net/api/v1/catalog/snapshot"
  syncUrl: "https://headdb.net/api/v1/catalog/changes"
  syncIntervalMinutes: 15
  fallbackSourceUrls:
    - "https://headdb.net/api/v1/legacy/heads.json"
    - "https://raw.githubusercontent.com/BitworksMC/HeadDB/refs/heads/master/heads.json"
  threads: 1
  apiThreads: 1

Existing configurations use the managed defaults when these keys are absent. Set database.syncUrl to an empty string only if the server should download a complete source on every refresh instead of using revision changes.

HeadDB indexes IDs, textures, categories, and tags by default. Disabling an index reduces its memory use but makes the corresponding lookup scan the full catalog.

Economy support

HeadDB works without an economy. To charge for heads, install Vault plus a compatible economy provider and change:

economy:
  provider: "VAULT"
  cost:
    category:
      alphabet: 1
      decoration: 2.5
    head:
      103838: 100

A head-specific price overrides its category price. Category keys are lowercase category names. If Vault or an economy provider cannot be found, HeadDB logs the problem and disables economy features.

Custom categories

categories.yml creates server-local collections from heads already known to HeadDB. The category ID must use letters, numbers, periods, underscores, or hyphens and cannot replace a built-in category.

server-icons:
  enabled: true
  icon:
    name: "<aqua>Server icons"
    head: "a0825e771a1c66f08708003d57a04a147e2774469459d9fb3041f549865f1fd3"
  heads:
    - "a0825e771a1c66f08708003d57a04a147e2774469459d9fb3041f549865f1fd3"
    - "7605917c9389a79c20c3e207ae7dab5089d36685e070a3d020baa2049c35327"

The head and heads values are texture hashes from published catalog entries. Players need headdb.category.custom to open the custom-category menu and headdb.category.server-icons to open this example category.

Updates and player data

The updateChecker section controls GitHub release checks separately from catalog synchronization. Player favorites and sound preferences are saved to data/data.db; back up that file with the rest of the server. The catalog cache can be rebuilt from the API, but retaining it allows faster and more resilient startup during a network outage.

For a proxy network, point each server at the same MySQL database:

storage:
  player:
    backend: "MYSQL"
    mysql:
      url: "jdbc:mysql://db.internal:3306/headdb"
      username: "headdb"
      password: "use-a-secret"
    saveInterval: 1800

This shares favorites, selected language, and interface-sound preferences. Keep credentials out of publicly distributed configuration archives. When the MySQL table is empty, HeadDB imports an existing local SQLite player database once; keep the SQLite file until the first successful shared-storage startup.