MeowMC

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.