HoloPanels

Interactive in-world panels for Paper servers. Text displays you can click, driven by config and extended by other plugins.

Minecraft
1.19.4+
Server
Paper
Java
17+
Needs
packetevents
Licence
LGPL-3.0

What you place is a view made of panels, rendered per viewer, with its own conditions, pagination, selection state and click regions. Two players looking at the same board can see different things.

Choose your path

GoalStart here
Put a supplied example on a wallGetting started
Build a board and lay out its panelsBoards then Views and panels
Add protected or conditional controlsConditions and Click actions
Tune refreshes, distances or rendering limitsServer configuration
Supply content from another pluginThe API
Diagnose a board that is missing or unclickableTroubleshooting

The two halves

Configuration is split along the line between where a panel is and what it says.

FileHolds
boards.ymlwhere a panel is, how far it is visible, who may see it
views/*.ymlwhat it shows: panels, lines, buttons, click actions

A board is a position in the world. A view is what it shows. Views are global by id, so several boards can point at one view and you have the same panel in several places, each with its own per-viewer session.

Inside a view are panels, of type list, text or buttons, each with its own offset, style and visibility condition. Lines are MiniMessage and support PlaceholderAPI.

Nothing is stored as a real display entity. PacketEvents sends each viewer the display and click metadata appropriate to that viewer, and leaving visibility range removes it from that client.

Ideas worth knowing up front

Everything is per viewer

Selection, page, session state and which view a board is currently showing all live on a (player, board) session. Two players at one board can be on different pages of different views. Nothing is global, so nothing has to be locked.

Conditions gate rendering, not appearance

A panel or button that fails its visible-if is not drawn and has no click region. Hiding a staff button is a real restriction rather than a cosmetic one. Per-action permission: is the complement, for when a control should be visible but refuse.

Content can come from another plugin

A panel's rows or lines can be supplied by a provider registered by another plugin. That is what makes a leaderboard, a shop or a queue display possible without HoloPanels knowing what any of those are. See the API.

A reload is all-or-nothing

Reload builds the whole configuration first and swaps it in only if it parsed. A bad edit costs you a log message rather than the plugin: the running boards keep working with the previous configuration until a valid one replaces it.

Where to go next