PlateUp modding is code-first, built on Unity's DOTS ECS framework. This page gets your dev environment running and helps you figure out which style of mod fits what you're building.
Rather than wiring up a project by hand, use the PlateUp Template Builder, pick a mod type, fill in your mod's metadata (author, name, namespace, version), and download a ready-to-open project. It handles referencing the game, pulls in build dependencies via the Yariazen.PlateUp.ModBuildUtilities NuGet package, and copies your build output straight into your game's Mods folder automatically.
The builder covers all three mod types below, plus a "KitchenLib with Example" option that comes with a working example dish already wired up — a good starting point if you're not sure where to begin.
If that's all you need, skip to Choosing a Mod Type to confirm which template fits, then Testing Locally once it's generated. Prefer to set things up by hand, or want to understand what the template is actually doing under the hood? Read on.
Create a class library project, then add references to the game's own DLLs, found in your PlateUp install directory under PlateUp_Data\Managed. Most of what you'll need starts with Kitchen, plus a handful of Unity DOTS assemblies:
Unity.Entities.dllUnity.Collections.dllUnity.Collections.LowLevel.ILSupport.dllUnityEngine.CoreModule.dllIf you'd rather not wire these up by hand, the community-made Yariazen.PlateUp.ModBuildUtilities NuGet package handles it for you.
A lot of what you'll want to do isn't documented anywhere, it's discovered by reading how the base game implements something similar. Decompiling the game's assemblies with a tool like ILSpy or DNSpyEX and keeping a local reference copy is a normal, expected part of the workflow.
Most PlateUp mods fall into one of three shapes. Picking the right one up front saves you restructuring a project halfway through.
Pure code, no dependencies beyond the game itself. You write systems and components that hook directly into PlateUp's ECS using IModSystem and IModComponent, typically inheriting from GenericSystemBase.
Good for: gameplay tweaks, balance changes, behavior modifications — anything that changes how existing things work rather than adding new things.
public class SetEverythingOnFire : GenericSystemBase, IModSystem {
// your system logic here
}
Alongside your systems and components, you can implement IModInitializer on a class to hook into your mod's own lifecycle, separate from the ECS update loop:
public interface IModInitializer
{
void PostActivate(Mod mod);
void PreInject();
void PostInject();
}
PostActivate(Mod mod) — runs as soon as your mod's DLL is loaded. This is the earliest hook you have, and it hands you a reference to your own Mod object. Good for early setup that doesn't depend on the ECS world existing yet — logging setup, resolving your own asset bundle, that kind of thing.PreInject() — runs before your systems and components are added to the ECS world. Use this for anything your systems will need already in place once they start running.PostInject() — runs after your systems and components have been added to the ECS world. Use this once you need everything from your own mod to already exist — cross-system wiring, or confirming your registration went the way you expected.public class Main : IModInitializer
{
public void PostActivate(Mod mod)
{
// Your mod's DLL just loaded.
}
public void PreInject()
{
// About to register your systems/components into the ECS world.
}
public void PostInject()
{
// Your systems/components now exist in the ECS world.
}
}
Only one class in your mod should implement
IModInitializer. This isn't enforced by the game, but it's strongly recommended for standalone ECS mods, having a single, predictable entry point avoids ordering confusion as your mod grows. (KitchenLib follows this same pattern internally, for what it's worth.)
Built on top of KitchenLib, a community library that wraps a lot of the boilerplate around adding new content such as: appliances, items, and similar, into simpler, higher-level APIs instead of hand-rolling raw ECS registration. It's not just a content framework, either, it also bundles a range of developer utilities (logging, preference menus, and other common needs) that are useful even in mods that aren't primarily about adding new content.
Good for: adding new appliances, items, or other game-data-driven content without reverse-engineering the registration process from scratch, and as a general utility toolkit even when content isn't the main goal.
KitchenLib is only supported via its Steam Workshop build. Take it as a Workshop dependency on your mod rather than bundling an older standalone version.
The same as above, paired with a Unity-built AssetBundle for custom models, textures, or sounds. This is the setup for cosmetics, reskins, or new appliances that need to look distinct rather than reuse existing art.
Good for: cosmetics, custom-looking appliances, anything visual or audible that doesn't already exist in the base game.
This is the heaviest of the three to set up, since it needs a C# project and a Unity project (for building the asset bundle) working together.
While developing, drop your built .dll (and .assets file, if applicable) into a named folder inside your PlateUp install's Mods folder. The game loads anything here automatically on launch. No Workshop upload needed while testing.
When in your mods folder, the structure should look like
PlateUp\
Mods\
MyFirstMod\
content\
MyFirstMod.dll
MyFirstMod.assets
If you opted to install Yariazen.PlateUp.ModBuildUtilities, if that was setup correctly, as soon as you build your mod, it should automaticaly get put into your Mods folder!
This is the one place the
Modsfolder is the right tool. For players, we point people at Steam Workshop instead, see Install & Play Mods — but for your own active development, the local folder is faster to test than re-uploading to Workshop on every change.
Once your project references the game correctly, head to the guide that matches the mod type you picked — the core concepts carry over between them, but the setup and examples differ enough to warrant their own walkthrough:
Stuck on setup? Ask in the Unofficial Modding Discord — dev environment issues are usually a five-minute fix once someone who's hit the same one takes a look.