category-menu.yml
The paged category view - entry slots, discovered and undiscovered entry formats, dates, filters, buttons and tokens.
guis/category-menu.yml is the layout every category opens in. It is shared by all categories; only
the title comes from each category file. After editing, run
/indexadmin reload.
Pressing Esc in a category menu returns to the main menu it was opened from.
Layout
Section titled “Layout”Size: 54Entry-Slots: [10-16, 19-25, 28-34, 37-43]| Key | Default | Description |
|---|---|---|
Size |
54 |
Menu size, a multiple of 9. |
Entry-Slots |
[10-16, 19-25, 28-34, 37-43] |
The slots entries are placed in, in order. Each page holds as many entries as there are slots here (28 by default). Numbers or a-b ranges. |
There is no Title key here; leave it out so each category’s own Title is used.
Like the main menu, this file is read without filling in defaults, so a key you delete stays deleted. Every required section below is checked on load.
Entry-Format
Section titled “Entry-Format”How each entry looks. The icon’s material is always the entry’s own item; this section sets the text and look for the two states.
Entry-Format: Undiscovered: Name: "&c&l{item}" Item-Flags: [HIDE_ADDITIONAL_TOOLTIP, HIDE_ATTRIBUTES] Lore: - "&7Pick up this item anywhere" - "&7in the world to discover it." - "" - "&cInformation:" - "&4 - &7Found by: &f{found} &7players" - "" - "&c&lUNDISCOVERED" Discovered: Name: "&a&l{item}" Glow: true Item-Flags: [HIDE_ADDITIONAL_TOOLTIP, HIDE_ATTRIBUTES] Lore: - "&7You have already discovered" - "&7this item for your index." - "" - "&aInformation:" - "&2 - &7Discovered: &f{time-ago}" - "&2 - &7Date: &f{date}" - "&2 - &7Found by: &f{found} &7players" - "" - "&a&lDISCOVERED"| Key | Required | Description |
|---|---|---|
Name |
yes | The icon name. |
Lore |
no | Lore lines. |
Glow |
no | Enchant glint. Default false. |
Item-Flags |
no | Bukkit item flags to hide tooltip parts. An unknown flag fails the load. |
Both Undiscovered and Discovered are required. Clicking an entry does nothing.
Date-Format
Section titled “Date-Format”Date-Format: "{day} MMM yyyy '@' h:mma"The {date} token on discovered entries. A Java date pattern (dd, MM, MMM, yyyy, HH, mm,
h, a, …, with literal text in single quotes), plus {day} for the day of the month as an
ordinal (1st, 2nd, 23rd). The default prints 2nd Mar 2026 @ 4:05PM. Dates use the server’s
timezone and English month names.
Time-Ago
Section titled “Time-Ago”Time-Ago: Seconds: "{amount}s ago" Minutes: "{amount}m ago" Hours: "{amount}h ago" Days: "{amount}d ago" Month: "{amount} month ago" Months: "{amount} months ago" Year: "{amount} year ago" Years: "{amount} years ago"The {time-ago} token on discovered entries. The largest unit that fits is used, with {amount} as
the count. Month and Year are the singular forms, used when the amount is 1. A month is 30 days
and a year 365. All eight keys are required.
Filters
Section titled “Filters”Filters: Selected: "&5 - &f&l{filter}" Unselected: "&5 - &7{filter}" Names: ALL: "All" FOUND: "Found" NOT-FOUND: "Not Found"The filter decides which entries the menu shows: ALL, only FOUND (discovered) or only
NOT-FOUND. Every category opens on ALL.
| Key | Description |
|---|---|
Selected |
The {filters} line for the active filter. {filter} is its name. |
Unselected |
The {filters} line for every other filter. |
Names.ALL, Names.FOUND, Names.NOT-FOUND |
The filter names, used in {filter}. All three are required. |
{filters} is a list token: put it alone on a lore line and it expands to one line per filter, in
the order All, Found, Not Found.
Buttons and background, in the same format as the main menu:
Slot/Slots, the standard item fields, an optional Head-Owner (TARGET or VIEWER) and an
Actions list. When items overlap, the item with the fewest slots wins, and entries are drawn on top
of the entry slots.
| Key | Slot | Does |
|---|---|---|
Filler-Item |
0-53 |
Black glass background. |
Barrier-Item |
10-16, 19-25, 28-34, 37-43 |
Glass panes under the entry slots, visible on a page that is not full. |
Progress-Item |
4 |
The category name, target and progress. |
Back-Item |
45 |
[main] - back to the main menu. |
Previous-Item |
48 |
[previous]. |
Page-Indicator |
49 |
Shows {page} of {pages}. |
Next-Item |
50 |
[next]. |
Filter-Item |
53 |
[filter], with the {filters} list in its lore. |
Actions
Section titled “Actions”| Action | Does |
|---|---|
[main] |
Open the main menu of the same index (yours, or the player you are viewing). |
[previous] / [next] |
Turn the page ([previous-page] / [next-page] also work). On the first or last page, the button flashes its temporary icon and plays NO-PAGE-FOUND. |
[filter] |
Left-click cycles the filter forward, right-click backwards. Goes back to page 1 and plays FILTER-CHANGED. |
[close] |
Close the menu for good (no return to the main menu). |
[back] |
Go back to the main menu it was opened from. |
The generic actions from the main menu ([console], [player], [message], [broadcast],
[actionbar], [title], [sound]) work here too. See
main menu actions.
Page buttons are always drawn, even when there is only one page.
Temporary-Icons
Section titled “Temporary-Icons”Temporary-Icons: No-Previous-Page: Material: BARRIER Name: "&c&lError!" Lore: - "&7You are already on the first page!" No-Next-Page: Material: BARRIER Name: "&c&lError!" Lore: - "&7You are already on the last page!"| Key | Flashed when |
|---|---|
No-Previous-Page |
[previous] is clicked on the first page. |
No-Next-Page |
[next] is clicked on the last page. |
The icon replaces the clicked button for about two seconds, then the button comes back. Clicks on a flashing slot are ignored.
Tokens
Section titled “Tokens”The category menu does not get the index-wide tokens of the main menu ({discovered}, {rank},
{leaderboard}, …). Every item gets:
| Token | Value |
|---|---|
{player}, {viewer} |
The player looking at the menu. |
{target} |
The player whose index is shown. |
{category} |
The category’s Display-Name. |
{collected} |
Entries of this category the target has discovered. |
{category-total} |
Entries in this category. |
{category-percentage} |
The target’s completion of this category, rounded down. |
{filter} |
The active filter’s name. |
{filters} |
List token: every filter, formatted with Filters.Selected / Unselected. |
{page}, {pages} |
The current page and the page count ({max-page} is the same as {pages}). |
{results} |
How many entries the active filter shows. |
Entry icons get all of the above, plus:
| Token | Value | State |
|---|---|---|
{item} |
The entry’s name. | Both |
{found} |
How many players have discovered this entry. Updated with the leaderboard, so it can lag by up to Leaderboard.Refresh-Interval. |
Both |
{date} |
When the target discovered it, in Date-Format. |
Discovered |
{time-ago} |
How long ago, in Time-Ago. |
Discovered |
The menu title comes from the category file and is fixed when the menu opens, so it cannot show
{page}. Use the Page-Indicator item for that.
