Folia support

Backend

Folia runs the same Paper loader and connector. Every read of the world happens on the thread that owns it.

The clip shows, in order:

  1. Folia runs the same Paper loader.
  2. Each read on the thread that owns it.
  3. No single TPS on Folia.

Folia splits the world into regions and ticks each one on its own thread. There is no main thread, and a plugin may only touch a player or a chunk from the thread that owns it. The connector checks for Folia when it starts and follows those rules. Folia support is on every plan.

#How it works

There is no separate Folia jar. The Paper loader and the Paper connector both look for Folia's region server class at startup. When it is there, all scheduled work goes to Folia's own schedulers instead of the Bukkit scheduler, which Folia does not have.

The startup line in the console names Folia, so you can see which path is in use.

#Setup

Install the Paper loader and pair it, exactly as on Paper. The config file and deployment modes are the same.

#What runs where

WorkThread on Folia
Heatmap look and region visitsThe region thread that owns each player
Spawn distanceThe region thread that owns each player
The chunk a player quits fromThe player's thread, inside the quit event
WorldGuard region outlines and the world listThe global region thread
Votes from NuVotifierThe thread NuVotifier fires on. Only the name is looked up; no world is read
Heartbeats, sending, the spoolFolia's async scheduler, never a region thread

#Limits

  • A Folia server has no single TPS or MSPT. Health shows Not available for those numbers instead of a made up value.
  • Lag profiling needs one tick to measure, so it stays off on Folia.
  • Folia sends no quit events when it shuts down. The connector closes every open session itself at shutdown.