Your first Python plugin for Endstone — from Endstone's template to a running plugin
Last updated October 16, 2026
Start from Endstone's official template, EndstoneMC/python-example-plugin on GitHub. Create your own repository from it, rename the package, entry point and plugin class to your plugin's name, set the api_version to the Endstone version you target, then build the wheel with `uv build`. The `.whl` lands in the `dist` folder. Upload it in Content, then Plugins on your Endstone server and restart; the console should then show your plugin loading. Python skills are all you need — no Bedrock or C++ knowledge — but the server updates Endstone automatically, so keep an eye on the API version when a new release arrives.
- Create your own repository from the template
- Rename the package and set the API version
- Build the wheel
- Upload the wheel in Content, Plugins
- Restart and look for your plugin in the console
On this page · 4 sections
This is the shortest path from "I know a bit of Python" to a plugin running on your Endstone server. It uses Endstone's official template so you start from something that already loads. If you have not yet seen how plugin files are uploaded, read Installing plugins on an Endstone server first; this page assumes an Endstone server exists.
What you need on your own computer
- Python, and a place to keep a Git repository (GitHub is fine).
uv, the build tool the template's README uses. Without it, Endstone's docs build a wheel withpipx run build --wheel; either way, the result is the same kind of file.- A text editor.
You do not need anything installed on the server.
Building it
Create your own repository from the template
Go to EndstoneMC/python-example-plugin on GitHub and make your own repository from it. You can also fork or clone it. The template is MIT-licensed.
Rename the package and set the API version
The template says what to rename so that the plugin is yours. In short:
| What | In the template | Renamed, for a plugin called greeter |
|---|---|---|
Distribution name, in pyproject.toml | endstone-example | endstone-greeter |
| Package folder | src/endstone_example/ | src/endstone_greeter/ |
| Entry point | example = "endstone_example:ExamplePlugin" | greeter = "endstone_greeter:GreeterPlugin" |
Plugin class and its prefix | ExamplePlugin | GreeterPlugin |
The two names are tied together: the distribution name must be endstone- followed by the entry-point name. Endstone's loader checks this at every start and refuses the plugin with an "Invalid name" message in the console if they differ. Underscores and hyphens count as the same. Rename the permission prefix in the plugin class the same way, as the README says.
Set api_version to the Endstone version you want to target. The template's example uses "0.11". The dashboard shows which Endstone version your server runs. Then delete the example command and listener, or read them first — they show how a command, a player-join event and a config file are written.
The project has four files that matter: __init__.py re-exports the plugin class, plugin.py holds the lifecycle, commands and config, listener.py holds an event listener, and config.toml is the default config that is copied on first run.
Build the wheel
From the project folder run:
uv build
The finished .whl file is written to the dist folder. If you add libraries to the dependencies list in pyproject.toml, the server downloads them from PyPI when it starts, so it needs the internet the first time.
Putting it on the server
Upload the wheel in Content, Plugins
Open your Endstone server on the dashboard, go to the Content tab, then the Plugins section, and upload the .whl from dist. This works while the server is stopped. Uploads need the server's owner to have topped up at least ฿20 with a real payment; until then the dashboard refuses the file. Coupon and referral credit do not count. Your plugin appears in the list next to uniz-link, the platform's own plugin.
Restart and look for your plugin in the console
Start or restart the server and open the Console tab. Endstone's docs say that after a restart "you should see your plugin has been successfully loaded". If you do not, go through the checks in the FAQ above. To change the plugin, build a new wheel, delete the old one in the Plugins section of the Content tab, upload the new one and restart again — two wheels of the same plugin side by side would clash.
Read next
- Installing plugins on an Endstone server — file types, finding other people's plugins, and what to do when one breaks the server
- Endstone on a Bedrock server — what Endstone is and how updates work
- The Files tab — see the plugin folder on the server
Frequently asked questions
Do I need to know C++ or how Bedrock works inside?
No. A Python plugin is ordinary Python that uses Endstone's API — commands, events such as a player joining, configuration and permissions. The template already contains a small example of each, so you change it rather than start from a blank file.
Do I have to write the plugin on the server?
No. You build the plugin on your own computer and upload the finished `.whl` file. The server does not compile anything for you; it installs the wheel you give it when it starts.
Can I test changes without restarting each time?
Locally, yes — Endstone's docs describe a development mode that installs your plugin into a local Endstone setup and reloads it on a command. On the platform a restart is how a new file takes effect, so do the quick loop on your own computer and upload a build when it works.
Where do I find Endstone's own documentation?
Endstone's docs are in its GitHub repository, including the page on installing plugins that this article follows. The template's README explains the layout of the example project and what to rename.
My plugin did not appear in the console. What should I check first?
Check that the file you uploaded ends in `.whl`, that you built it from the renamed template (the distribution name must be `endstone-` plus the entry-point name — for an entry point called `greeter`, the name `endstone-greeter` — otherwise the console logs "Invalid name" and the plugin is refused), and that the Plugins section of the Content tab lists it. Then restart again and read the console from the top of the start.
What happens to my plugin when Endstone updates?
Your server moves to the new Endstone at its next restart. A plugin states the API version it was written for, so after an update, check that your plugin still loads and bump the version in the template's settings if Endstone's API changed. Keep the source in your own repository so you can rebuild.
Sources
- EndstoneMC python-example-plugin (README) (link checked October 15, 2026)
- Endstone docs — Install your plugin (v0.11.14) (link checked October 15, 2026)
- Endstone plugin_loader.py (v0.11.14) (link checked October 15, 2026)
Related guides
Would you rather skip all of this?
A server on uniz.host is up in minutes. You pay by the hour only while it is online, and the smallest top-up is ฿20.