# ramjet > ramjet is a C++23 Minecraft Java Edition 26.3 (protocol 777) server with vanilla-compatible behaviour, an ECS core (flecs) and a hot-reloading C# (.NET 10) plugin layer (namespace `Mc.Scripting`, assembly `Mc.Scripting.Api`). Plugins are class libraries that compile against the server's own API dll, run on the single tick thread, and react to events passed by `ref`. Read these first when writing or reviewing a plugin: - All plugin code runs on the tick thread; from other threads use `Scheduler.Post` / `RunSync` (the game API throws `WrongThreadException` off the tick thread; /concepts/threading/ lists the thread-safe members). - Event handlers take the event by `ref`, must not allocate on hot paths, and must not keep borrowed strings (`Utf8String`) or the event itself. - `Entity` is a handle (a flecs id), never an object; never keep the `ref` from `Get()` across structural changes. - Check the API status page (/reference/status/) to see which events the engine fires and which host services are wired in this release. ## Machine-readable - [api.json](/api.json): every public type and member with signatures and docs, the event catalogue (fields, mutability, cancellability, whether the engine fires it), phases, priorities, command argument types, engine status, native systems. - [llms-full.txt](/llms-full.txt): the complete plugin-development documentation as one markdown file. ## Plugin development: getting started - [Write a plugin in an hour](/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. - [Install .NET and the server](/getting-started/install/): Install the .NET 10 SDK, build Ramjet with scripting enabled and start it with a plugins folder. - [Create a plugin from the template](/getting-started/create-a-plugin/): Install the ramjet-plugin dotnet template, create a project, point it at your server and build it. - [Project layout and plugin.json](/getting-started/project-layout/): What the template creates, how plugins are discovered, where a plugin keeps its files and what plugin.json is for. - [Build, run and hot reload](/getting-started/build-and-hot-reload/): The edit-build-reload loop of a Ramjet plugin, plugins added while the server runs, and how to test against a scratch server. ## Plugin development: concepts - [Plugin lifecycle](/concepts/lifecycle/): How the server finds, loads, enables, disables and unloads a plugin, and what the context owns. - [The threading model](/concepts/threading/): The tick thread owns the world. What runs where, what is thread-safe, and how to do async work. - [Entities, handles and the ECS](/concepts/entities-and-ecs/): Why an Entity is a handle and not an object, how components, queries and systems work, and the reference-invalidation rule. - [Events](/concepts/events/): Subscribing, priorities, cancellation, mutable fields, borrowed strings and custom events. - [Commands](/concepts/commands/): Command trees on the server's real dispatcher: typed arguments, suggestions, permissions, failures, and what a plugin cannot do with commands yet. - [Permissions](/concepts/permissions/): Permission nodes, wildcards, defaults, groups, the provider interface, and how vanilla ops map onto them. - [Config and data](/concepts/config-and-data/): Typed JSON config with defaults, the plugin data folder, atomic writes and live reload. - [The scheduler](/concepts/scheduler/): Tick-based delayed and repeating tasks, posting work back to the tick thread, and how tasks are owned and ordered. - [Systems and tick phases](/concepts/systems/): Per-tick systems in the engine's pipeline, ordering against native systems, replacing and disabling vanilla behaviour. - [Hot reload](/concepts/hot-reload/): How plugins are reloaded without a restart, what survives, what does not, and the rules that keep reload leak-free. - [Performance rules](/concepts/performance/): Allocation-free hot paths, what each call costs, and why the rules exist. ## Plugin development: guides - [Your first plugin](/guides/first-plugin/): A complete plugin with a component, three events, a system, a scheduled task and a command, built, run and hot-reloaded on a scratch server. - [Commands with arguments and suggestions](/guides/commands-with-arguments/): A /calc command written twice. First by parsing the command line from PlayerCommandEvent, then as a typed Brigadier tree with suggestions and a permission. - [A homes plugin with config and permissions](/guides/homes-plugin/): A complete /home /sethome /delhome /homes plugin with typed config, permissions, a data file, tab completion and a cooldown. - [A scoreboard sidebar](/guides/scoreboard-sidebar/): Show live lines in the sidebar with Sidebars and Sidebar, shared by everyone or one per player. - [Boss bars, titles and action bars](/guides/boss-bars-and-titles/): Show a countdown boss bar, a welcome title and an action bar message. - [Custom GUIs (menus)](/guides/custom-guis/): Chest-style menus with clickable icons: a warp selector with click and close handlers, and the rules that keep a menu locked. - [Inter-plugin services](/guides/inter-plugin-services/): Let one plugin offer an API to another with the ServiceManager: an economy provider, a shop that buys from it, and hot reload. - [Migrating from Paper / Bukkit](/guides/migrating-from-paper/): A concept-by-concept mapping from the Bukkit API to the Ramjet C# plugin API, with side-by-side code and the surprises to expect. ## Reference - [API reference](/reference/api/): generated from the C# XML documentation, one page per type. - [plugin.json reference](/reference/plugin-json/): Every field of the plugin manifest, where it lives, how dependencies and versions are resolved. - [API status](/reference/status/): What the plugin API can actually do in this release: wired events and host services, generated from the sources. - [Event catalogue](/reference/events/): Every event of the ramjet plugin API with its fields, mutability and cancellability. - [Command argument types](/reference/command-arguments/): The Brigadier argument types available to commands. - [Native systems](/reference/native-systems/): Engine systems a plugin can order against, replace or disable, generated from the sources. ## Examples - [BossBarTimer](/examples/bossbartimer/): Countdown timers on a boss bar - [DiscordWebhook](/examples/discordwebhook/): Join and quit messages to a Discord webhook - [Greeter](/examples/greeter/): Join/quit messages and a server list MOTD - [HelloPlugin](/examples/helloplugin/): Sample plugin: events (cancellation and mutation), a component, a per-tick system, a command and the scheduler. - [Homes](/examples/homes/): Set homes and teleport back to them - [Kits](/examples/kits/): Claimable kits with cooldowns - [PermissionAdmin](/examples/permissionadmin/): /perm: manage groups and player permissions of the built-in backend - [RubyOre](/examples/rubyore/): A custom block and the item it drops - [RubyWand](/examples/rubywand/): A custom item with a right-click ability - [ShopGui](/examples/shopgui/): A shop in a custom GUI - [SidebarStats](/examples/sidebarstats/): Live personal sidebar scoreboard - [SpawnProtect](/examples/spawnprotect/): Blocks building near the world spawn - [WorldTools](/examples/worldtools/): World API sample: blocks, signs, mobs, explosions, time, weather, chunk tickets ## Server administration - [server.properties](/admin/server-properties/): Every server.properties key Ramjet reads, with defaults, ranges and notes. Generated from the sources. - [Ramjet.toml](/admin/ramjet-toml/): Every setting of Ramjet itself (memory, world generation, chunks, network, plugins, debugging): how the file is created and completed, precedence, and a reference of all keys. - [Performance tuning](/admin/performance-tuning/): Memory profiles, view versus simulation distance, worker threads, and the measured numbers from the project's own benchmark and memory docs. - [Commands supported vs vanilla](/admin/commands/): The vanilla 26.3 command tree, which executable paths this server implements, and what is still missing. Explorer generated from the sources. - [World format](/admin/world-format/): Ramjet reads and writes vanilla Anvil worlds in the 26.x layout, both ways. The layout, compatibility notes and gaps.