Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Tags
Creators
Details
๐ฟ HeadVault
A server-side custom-heads shop for Minecraft Fabric SMPs. Browse 90,000+ decorative player heads in a clean chest GUI โ open it with a command, a shopkeeper NPC, or a named villager. No client mods. No resource packs. Vanilla players just play.
Fabric ยท Server-side only
โจ Why HeadVault?
Custom heads make builds come alive โ but handing them out one command at a time is painful. HeadVault turns the entire minecraft-heads.com catalog into an in-game shop your players can browse and buy from, however you want to run it: a command, a placed-down NPC, or a villager you name. Itโs server-side only, so nobody needs to install anything to use it.
๐ฏ Features at a glance
- ๐ A real shop GUI โ categories โ paginated head grid โ click to buy. Renders natively on vanilla clients.
- ๐ The whole catalog โ ~90k heads across 10 categories, fetched live and cached to disk. Refreshes in the background; never lags the server.
- ๐ Always works offline โ unreachable API? It serves the last cache, then a snapshot baked into the jar.
- ๐ Search โ find heads by name or tag across the entire catalog.
- ๐ Player heads โ type any username and get that playerโs head as a clickable result.
- ๐ช Three ways in โ
/headscommand, persistent shopkeeper NPCs, and named villagers. Mix and match. - ๐ง Any mob can be a trader (since 1.1.0) โ not just villagers. Name-tag a zombie, a cow, anything, and make it a shop. Choose which mob types qualify via an allow-all, whitelist, or blacklist mode.
- ๐ง Freeze named traders (since 1.1.0) โ opt-in: when a name tag turns a mob into a trader, lock it in place (disables AI) so it can't wander off, just like a spawned NPC. Reverts the moment you rename it back.
- ๐ฐ Flexible economy โ free, item cost, or experience (levels/points), with per-category pricing. Purchases are atomic.
- ๐ฆ Heads stack โ identical heads stack to 64.
- โป๏ธ Hot reload โ tweak the config and run
/headvault reload. No restart. - ๐ Permissions โ LuckPerms-compatible, with sane vanilla-OP fallbacks when no permission mod is present.
- ๐ช Extensible โ a
PurchaseEventother mods can listen to.
๐ Getting started
- Requirements: a Fabric 26.1.2 server on Java 25, with Fabric API installed.
- Drop
head-vault-<version>.jarinto your serverโsmods/folder. (sgui and fabric-permissions-api are bundled inside โ nothing else to install.) - Start the server. HeadVault writes its config to
config/headvault/config.jsonand begins downloading the head catalog in the background. - Run
/headsโ and youโre shopping. ๐
First launch shows a small built-in sample until the full catalog finishes downloading (a few seconds).
๐ช Access modes
Enable any combination in the config.
| Mode | How it works |
|---|---|
| Command | /heads opens the shop (permission-gated). |
| NPC | /headvault npc spawn <name> places an invulnerable, AI-less shopkeeper villager. It persists across restarts; right-click opens the shop. Manage with npc list / npc remove. |
| Named villager | Name any villager your configured name (default โHead Traderโ) and right-clicking it opens the shop for everyone โ no permission needed. Hold a name tag to rename it back to normal. Since 1.1.0: via access.villager.mode you can let any mob be a named trader โ not just villagers (all / whitelist / blacklist); and access.villager.freeze can lock a fresh trader in place. |
๐ฐ Economy
Pick one global mode (with optional per-category overrides):
| Mode | Players payโฆ |
|---|---|
FREE |
nothing |
ITEM |
a configurable item ร amount (e.g. 1 diamond) |
XP_LEVELS |
experience levels |
XP_POINTS |
total experience points |
Every purchase re-checks the cost at click time and deducts atomically โ players can never be charged without receiving their head. Player-name heads use the global price. Grant headvault.free-bypass to let someone shop for free.
โจ๏ธ Commands
| Command | Description | Permission (default) |
|---|---|---|
/heads |
Open the shop | headvault.command.use (OP 2) |
/heads search <query> |
Search heads by name/tag | headvault.command.search |
/heads player <name> |
Get a specific playerโs head | headvault.command.use |
/heads give <player> <head-id> |
Give a head for free (head-id = its UUID) | headvault.command.give / headvault.admin |
/headvault reload |
Reload the config | headvault.admin |
/headvault npc spawn <name> |
Spawn a shop NPC where you stand | headvault.npc.manage |
/headvault npc remove |
Remove the NPC youโre looking at | headvault.npc.manage |
/headvault npc list |
List loaded shop NPCs | headvault.npc.manage |
๐ Permissions
| Node | Grants |
|---|---|
headvault.command.use |
Open the shop, /heads player |
headvault.command.search |
/heads search |
headvault.command.give |
/heads give |
headvault.admin |
/headvault reload, /heads give |
headvault.npc.manage |
Spawn / remove / list NPCs |
headvault.free-bypass |
Always pay nothing |
No permission mod? Command nodes fall back to the vanilla OP level, and NPC / named-villager modes work for everyone without any permission. With LuckPerms (or any provider) grant nodes normally:
/lp group default permission set headvault.command.use true
โ๏ธ Configuration
The config lives at config/headvault/config.json and hot-reloads with /headvault reload. (Itโs JSON, not YAML โ Gson under the hood.) Hereโs the full file with every option:
{
"_schemaVersion": 1,
"catalog": {
"source": "v1", // where heads come from: "v1" | "v2" | "bundled"
"refreshIntervalHours": 24, // how often to re-download the catalog
"requestTimeoutSeconds": 15, // per-request network timeout
"maxRetries": 2, // retries per category before giving up
"v2AppUuid": "", // v2 only: your registered App UUID
"v2UrlTemplate": "", // v2 only: custom endpoint; placeholders {category}, {appUuid}
"userAgent": "Mozilla/5.0 ... Chrome/126.0.0.0 Safari/537.36" // sent with requests (see note)
},
"economy": {
"mode": "FREE", // "FREE" | "ITEM" | "XP_LEVELS" | "XP_POINTS"
"item": { "id": "minecraft:diamond", "amountPerHead": 1 },
"xp": { "amountPerHead": 1 },
"categoryOverrides": {
// override price per category (key = category slug):
// "monsters": { "mode": "ITEM", "item": { "id": "minecraft:netherite_ingot", "amountPerHead": 1 } }
}
},
"access": {
"command": { "enabled": true, "permissionLevel": 2 },
"npc": { "enabled": true },
"villager": {
"enabled": true,
"name": "Head Trader",
"caseInsensitive": true,
// โโ since 1.1.0 โโ
"mode": "ONLY_VILLAGER", // which mobs may be a named trader: "ONLY_VILLAGER" | "ALL" | "MOB_WHITELIST" | "MOB_BLACKLIST"
"entityWhitelist": [], // entity type ids allowed when mode = "MOB_WHITELIST", e.g. ["minecraft:zombie"]
"entityBlacklist": [], // entity type ids blocked when mode = "MOB_BLACKLIST"
"freeze": false // freeze a name-tagged trader in place (disables AI)
}
},
"ui": {
"title": "HeadVault", // shop window title
"showPriceInLore": true, // show the price on each head
"headsPerPage": 45 // 9โ45 heads per page
},
"logging": { "purchaseVerbosity": "INFO" } // "OFF" | "INFO" | "DEBUG"
}
Field reference
| Key | Default | What it does |
|---|---|---|
catalog.source |
"v1" |
v1 = the no-token endpoint serving the full catalog (recommended). v2 = the licensed REST API (needs an App UUID). bundled = the offline snapshot only. |
catalog.refreshIntervalHours |
24 |
Background refresh interval. The catalog is only re-downloaded when older than this. |
catalog.requestTimeoutSeconds / maxRetries |
15 / 2 |
Network resilience knobs. |
catalog.v2AppUuid / v2UrlTemplate |
"" |
Only used when source is v2. Register at minecraft-heads.com, then set the UUID; adjust the template to match the official v2 docs if needed. |
catalog.userAgent |
browser string | minecraft-heads.com rejects non-browser agents (HTTP 403), so the default mimics a browser. Leave it unless you know the API accepts yours. |
economy.mode |
"FREE" |
Global payment mode. |
economy.item / economy.xp |
diamondร1 / 1 | Global price for ITEM / XP_* modes. |
economy.categoryOverrides |
{} |
Per-category price overrides, keyed by slug (alphabet, animals, blocks, decoration, food-drinks, humanoid, humans, miscellaneous, monsters, plants). |
access.command.enabled / permissionLevel |
true / 2 |
Toggle the /heads shop and its default OP level. |
access.npc.enabled |
true |
Toggle NPC shopkeepers. |
access.villager.enabled / name / caseInsensitive |
true / Head Trader / true |
Toggle named-trader mode, the trigger name, and case-sensitivity of the name match. |
access.villager.mode (since 1.1.0) |
"ONLY_VILLAGER" |
Which entity types may be a named trader: ONLY_VILLAGER (villagers only โ default, unchanged behavior), ALL (any mob), MOB_WHITELIST (only ids in entityWhitelist), MOB_BLACKLIST (any mob except ids in entityBlacklist). |
access.villager.entityWhitelist / entityBlacklist (since 1.1.0) |
[] / [] |
Entity type ids (e.g. "minecraft:zombie"; a bare "zombie" assumes the minecraft namespace, and matching is case-insensitive) used by the MOB_WHITELIST / MOB_BLACKLIST modes. |
access.villager.freeze (since 1.1.0) |
false |
When a name tag turns a mob into a trader, freeze it in place โ disables AI so it stops wandering, like a spawned NPC. Reverts automatically when the mob is renamed so it no longer qualifies. Off (default) = unchanged behavior. |
ui.title / showPriceInLore / headsPerPage |
HeadVault / true / 45 |
Cosmetic shop options. |
logging.purchaseVerbosity |
"INFO" |
How loudly purchases are logged to console. |
About the catalog source
minecraft-heads.com offers two APIs:
v1(default) โ thescripts/api.phpendpoint. No token, serves the entire catalog. Officially โdeprecatedโ but live as of 2026; the site blocks non-browser User-Agents, which is why the defaultuserAgentlooks like a browser.v2โ the current licensed REST API. Requires a free registered App UUID and a visible Minecraft-Heads.com attribution; commercial redistribution isnโt allowed without approval. Switch to this if v1 is ever retired.bundledโ never touches the network; serves the small snapshot baked into the jar.
If the live source is unreachable, HeadVault automatically falls back to the last cache, then the bundled snapshot โ the shop never goes dark.
๐ Credits
- Head data from minecraft-heads.com.
- sgui & fabric-permissions-api for GUIs and permissions.
- Inspired by HeadIndex.
๐ License
Released under MIT License.


