Compatibility
1. It loads
If Paper 26.3 loads it, MeowMC loads it. The compatible surface is
byte-identical, the api-version gate is a ceiling rather than a floor, and the
paper-plugin.yml rewriting gap described in
plugin descriptors is closed. There is no
folia-supported gate in this build — the flag is not parsed, so it neither
helps nor blocks anything.
2. It runs serially
The Folia scheduler API — RegionScheduler, GlobalRegionScheduler,
AsyncScheduler, EntityScheduler, ScheduledTask, RegionizedServerInitEvent
— is present in the API module and callable. In this build every region task
executes on the global region, which is the main tick loop.
meowmc.exec.mode defaults to COMPAT, defined by the configuration itself as
the mode where every behaviour is byte-identical to Paper. So a
Folia-scheduler-shaped plugin runs unchanged and correctly, and nothing is
parallel: a plugin written to the Paper-documented scheduler contract behaves
exactly as on Paper; a plugin that assumed parallel regions does not get them.
The other declared values (REGIONIZED, REGIONIZED_AGGRESSIVE, VERTICAL,
DIAGNOSTIC) exist in the config surface but are inert — the machinery behind
them is future work.
See scheduling for code samples of what that means in practice.
3. It is detectable
The brand check is a superset — detect MeowMC or Paper with the same call:
import io.papermc.paper.util.ServerBuildInfo;
import net.kyori.adventure.key.Key;
ServerBuildInfo build = ServerBuildInfo.buildInfo();
boolean onMeow = build.isBrandCompatible(Key.key("meowmc", "meowmc")); // true here
boolean onPaper = build.isBrandCompatible(Key.key("papermc", "paper")); // true here — Paper paths work unchanged
boolean onFolia = build.isBrandCompatible(Key.key("papermc", "folia")); // false here
Plus one additive reader, Player#getClientProtocolVersion()
(the MeowMC API).
Use the capability shape, never Bukkit.getVersion() string matching. The fork
keeps Paper's version strings, and string matchers that expect 1.21.x
mis-parse 26.3 — the single most common breakage class in the wild.
4. It is not measured
No compatibility matrix exists. No plugin population has been measured — the compatibility question has not been run as a test, only read as source. Future work is listed in the MeowMC API.
The surface you can act on today
config/meowmc-plugin-policies.yml is the one surface an author or an admin can
use today — default: auto|pinned|regionized|agnostic, per-plugin tier and
reason overrides, enforcement, packet-listener-dispatch. It is a file
contract (YAML); the loader's own javadoc (MeowPolicies) states the file may
be written by plugins at runtime. In this build the tiers read as classification
intent — the auto resolution and the enforcement machinery behind them are
future work — and reason is expected on every assignment, because a reason is
what makes a tier assignment auditable. There is no Java accessor for the
policies file. See Plugin policies.