# ramjet plugin development: complete documentation Generated at build time from the site sources (42 pages plus the generated API reference). Paths like /concepts/events/ refer to pages of the documentation site. The same content as structured data is in /api.json. ## Contents - Write a plugin in an hour (/getting-started/) - Install .NET and the server (/getting-started/install/) - Create a plugin from the template (/getting-started/create-a-plugin/) - Project layout and plugin.json (/getting-started/project-layout/) - Build, run and hot reload (/getting-started/build-and-hot-reload/) - Plugin lifecycle (/concepts/lifecycle/) - The threading model (/concepts/threading/) - Entities, handles and the ECS (/concepts/entities-and-ecs/) - Events (/concepts/events/) - Commands (/concepts/commands/) - Permissions (/concepts/permissions/) - Config and data (/concepts/config-and-data/) - The scheduler (/concepts/scheduler/) - Systems and tick phases (/concepts/systems/) - Hot reload (/concepts/hot-reload/) - Performance rules (/concepts/performance/) - Your first plugin (/guides/first-plugin/) - Commands with arguments and suggestions (/guides/commands-with-arguments/) - A homes plugin with config and permissions (/guides/homes-plugin/) - A scoreboard sidebar (/guides/scoreboard-sidebar/) - Boss bars, titles and action bars (/guides/boss-bars-and-titles/) - Custom GUIs (menus) (/guides/custom-guis/) - Inter-plugin services (/guides/inter-plugin-services/) - Migrating from Paper / Bukkit (/guides/migrating-from-paper/) - plugin.json reference (/reference/plugin-json/) - API status (/reference/status/) - Event catalogue (/reference/events/) - Command argument types (/reference/command-arguments/) - Native systems (/reference/native-systems/) - BossBarTimer (/examples/bossbartimer/) - DiscordWebhook (/examples/discordwebhook/) - Greeter (/examples/greeter/) - HelloPlugin (/examples/helloplugin/) - Homes (/examples/homes/) - Kits (/examples/kits/) - PermissionAdmin (/examples/permissionadmin/) - RubyOre (/examples/rubyore/) - RubyWand (/examples/rubywand/) - ShopGui (/examples/shopgui/) - SidebarStats (/examples/sidebarstats/) - SpawnProtect (/examples/spawnprotect/) - WorldTools (/examples/worldtools/) - API reference (generated) --- # Write a plugin in an hour Page: /getting-started/ From zero to a hot-reloading C# plugin on a Ramjet, and what to read next. Written for people who know Paper/Bukkit. Ramjet plugins are plain C# class libraries (.NET 10) loaded into the running server. They compile against the **`Ramjet.Api`** NuGet package, subscribe to events, register commands, components and per-tick systems, and are **hot reloaded every time you rebuild**: no server restart, no lost state in the ECS. If you have written Paper plugins you already know the shapes: a plugin class with enable/disable hooks, event listeners with priorities and cancellation, commands, permissions, a scheduler. The differences that matter are in how you write them, and they are explained in [Concepts](/concepts/lifecycle/) and in the [migration table](/guides/migrating-from-paper/). ## The one-hour path | Step | Time | Page | |---|---|---| | 1. Install the .NET 10 SDK and build the server | 15 min | [Install](/getting-started/install/) | | 2. Create a project from the template | 5 min | [Create a plugin](/getting-started/create-a-plugin/) | | 3. Understand the layout and `plugin.json` | 5 min | [Project layout](/getting-started/project-layout/) | | 4. Build, drop into `plugins/`, edit, watch it reload | 10 min | [Build and hot reload](/getting-started/build-and-hot-reload/) | | 5. Write something real | 25 min | [Your first plugin](/guides/first-plugin/) | Then read the five concept pages that carry the most weight: [threading](/concepts/threading/), [entities and the ECS](/concepts/entities-and-ecs/), [events](/concepts/events/), [hot reload](/concepts/hot-reload/) and [performance](/concepts/performance/). > **Check what is wired** > > The API is still growing. The [API status page](/reference/status/) lists which events the server fires and which host services are wired to the game, and is generated from the repository on every build. Read it before you build a feature on a call that may only log. ## Where things are - [Concepts](/concepts/lifecycle/): how plugins work. - [Guides](/guides/first-plugin/): full, working code. - [Examples](/examples/): the sample plugins of the repository, with their source read at build time. - [API reference](/reference/api/): generated from the C# XML documentation. - [For AI agents](/ai-agents/): `llms.txt`, `llms-full.txt`, `api.json`, a Claude Code skill and an `AGENTS.md` in the template. --- # Install .NET and the server Page: /getting-started/install/ Install the .NET 10 SDK, build Ramjet with scripting enabled and start it with a plugins folder. ## 1. The .NET 10 SDK Plugins target `net10.0`, and the server embeds the .NET 10 runtime (CoreCLR through `hostfxr`), so you need the **.NET 10 SDK** on the machine that builds the plugin and the same major runtime on the machine that runs the server. ```bash dotnet --list-sdks # must list a 10.x entry ``` If it does not, install it from [dotnet.microsoft.com](https://dotnet.microsoft.com/download/dotnet/10.0) (Windows installer, `winget install Microsoft.DotNet.SDK.10`, or your Linux package manager). The server finds the runtime itself (`DOTNET_ROOT`, the Windows registry, `/etc/dotnet/install_location`, the default install paths); you do not need to configure anything. ## 2. The server There is no binary release yet: you build Ramjet from the repository. You need CMake, Ninja and GCC (MinGW-w64 on Windows), see Install and run for the full toolchain. ```bash cmake -S . -B build -G Ninja -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ cmake --build build ``` When the configure step finds a .NET 10 SDK it turns `MC_BUILD_SCRIPTING` on and also builds the managed side next to the server: ``` build/bin/ramjet(.exe) build/bin/dotnet/Mc.Scripting.Api.dll <- the plugin API the server loads (plugins compile against the Ramjet.Api package) build/bin/dotnet/Mc.Scripting.Runtime.dll <- plugin host, loaded by the server build/bin/dotnet/samples/HelloPlugin/ <- the sample plugin ``` If the configure step printed `scripting: no .NET 10+ SDK found`, install the SDK and configure again. You do not need this build to write a plugin. Plugin projects compile against the `Ramjet.Api` NuGet package (see [create a plugin](/getting-started/create-a-plugin/)); the server needs its own build to run them. ## 3. Run it with plugins Create a folder to run in (it holds `server.properties`, the world and the plugins) and start the server with `--plugins`: ```bash mkdir run && cd run ../build/bin/ramjet --data-dir ../data --plugins plugins ``` - `--plugins
/// /perm user <player> set|unset|check <node> [true|false]
/// /perm user <player> group add|remove <group>
/// /perm group <group> create [weight] | delete | set <node> [true|false] | unset <node> | parent <group> | list
/// /perm list | /perm reload
///