Describe the plugin and Codella writes it against the Paper API — Adventure components, async chat, the modern scheduler, Folia-safe region threading — then compiles it to a .jar your server can load. The parts most hand-written plugins get wrong are the parts this targets first.
[18:07:12 INFO]: This server is running Paper version 1.21.4-128[18:07:15 INFO]: Loading plugins...[18:07:16 INFO]: [RegionGuard] Loading RegionGuard v2.1.0[18:07:17 INFO]: [RegionGuard] Adventure components enabled[18:07:17 INFO]: [RegionGuard] Folia detected — using region schedulers[18:07:18 INFO]: [RegionGuard] Hooked into Vault (EssentialsX)[18:07:19 INFO]: Done (7.221s)! For help, type "help"> Text built with the Adventure API — hover events, click actions, gradients and translatable keys — instead of legacy section-sign strings that cannot express any of that and get mangled the moment a message passes through another plugin.
Paper's asynchronous chat events handled properly, so chat formatting, filtering and Discord relays do not stall the main thread while they wait on something slow.
Database and network work off the main thread, world and entity access back on it. On Folia, region and entity schedulers are used so a task runs on the thread that actually owns the chunk it is touching.
Paper exposes as real API much of what a Spigot plugin would reach for reflection to do. The generated code uses those APIs, which is the difference between a plugin that survives a Minecraft update and one that has to be rewritten after it.
plugin.yml or paper-plugin.yml depending on the target, with dependencies, load order, permission defaults and api-version filled in — including soft dependencies so the plugin still loads when an optional integration is absent.
Chunk-safe lookups, cached configuration reads, bounded task frequencies and no per-tick allocation storms. A plugin that works but drops the server to 12 TPS has not solved the problem.
# paper-plugin.yml — written for youname: RegionGuardversion: 2.1.0main: ai.codella.regionguard.RegionGuardapi-version: 1.21folia-supported: truedependencies: server: Vault: load: BEFORE required: falseThe manifest declares Folia support, the API version, and dependency load order — including optional dependencies marked required: false so the plugin still loads on a server that does not run Vault.
None of this is something you have to know to ask for a plugin. It is something you should be able to read afterwards, which is why the full source comes with every build.
A Paper 1.21 plugin that logs every player death to a MySQL table asynchronously, shows a /deaths GUI with the last 45 deaths paginated, and broadcasts a clickable Adventure component linking to the death location for staff only.
Asynchronous chat events, the Adventure component API for text and formatting instead of legacy colour codes, richer scheduler access, entity and world APIs that avoid NMS, and a long list of events Spigot never added. In practice it means a plugin can do more without reflection, and reflection is what breaks on every Minecraft update.
Not if it uses Paper-only APIs — the server will fail to load the class and log a NoClassDefFoundError. If you need one .jar that runs on both, generate against Spigot instead: Paper loads Spigot plugins without any changes, so targeting Spigot is the portable option.
Yes. Folia replaces the single main thread with per-region threads, which means the usual assumption that a scheduled task can touch any entity anywhere is no longer true. Generating for Folia uses the region, entity and global schedulers appropriately and keeps world access on the thread that owns that region.
It is Paper's own plugin manifest, which supports features the Bukkit plugin.yml cannot express, such as the modern bootstrapper and dependency model. Codella writes whichever manifest matches the target you chose, so you do not have to decide — but you can read and edit it in the generated source.
That is one of the main reasons to target Paper. Long work — database queries, HTTP calls, file writes — is moved off the main thread, and anything that touches the world, entities or inventories is handed back to the correct thread before it runs. Getting this wrong is the single most common cause of a plugin freezing a server.
Paper builds from the older 1.16-era releases through the current 1.21 line. The version you pick sets the API surface the code is written against and the manifest's api-version, which matters because Paper's own APIs have moved considerably across those releases.
Codella targets every major Bukkit fork from one workflow. Start from the overview, or from an idea if you know you want a plugin but not yet which one.