A Votifier implementation for NeoForge: vote listener, clickable vote menu and instant rewards in one server-side jar.
Server-list voting is one of the best free ways to bring players to a server, but the classic Votifier ecosystem never properly made it to modern NeoForge. NeoVotifier covers the whole pipeline: the site sends the vote, the server receives it, the player gets paid — immediately.
More versions are planned — the new 26.x releases and the rest of what NeoForge supports (1.20.2 - 1.20.6). See TODO.md for the roadmap.
Five jars cover all of 1.21.x. Grab the one that matches your server:
| File | Minecraft | NeoForge |
|---|---|---|
neovotifier-1.0_v1.21.1.jar |
1.21.1 | 21.1 |
neovotifier-1.0_v1.21.2-4.jar |
1.21.2 - 1.21.4 | 21.2 - 21.4 |
neovotifier-1.0_v1.21.5-8.jar |
1.21.5 - 1.21.8 | 21.5 - 21.8 |
neovotifier-1.0_v1.21.9-10.jar |
1.21.9 - 1.21.10 | 21.9 - 21.10 |
neovotifier-1.0_v1.21.11.jar |
1.21.11 | 21.11 |
The mod only splits where a Minecraft API it uses actually changed: the
registry lookup and player message APIs in 1.21.2, the chat click-event API
in 1.21.5, the player-profile API in 1.21.9, and the ResourceLocation to
Identifier rename in 1.21.11. Each jar declares its range, so a server on
the wrong version refuses it with a clear message instead of breaking
mid-game.
In the repo, each window is a branch: mc-1.21.1, mc-1.21.2, mc-1.21.5,
mc-1.21.9 and mc-1.21.11. Same mod, same features, same configs on all
of them.
- Full Votifier protocol support: v1 (RSA) and v2 (token/HMAC), so both old and new vote sites work
/voteopens a clickable menu of your vote sites (fromvoting_sites.json); players click an entry and the site opens from chat- Instant rewards the moment a vote lands: any commands you configure (economy payouts, crate keys, items, broadcasts)
- Survives datapack
/reload— the listener and/votekeep working - Server-side only; vanilla clients see everything, no client mod needed
- Put the jar in the server's
mods/folder - Start the server once — configs and keys generate on first boot
- Register your server on the vote sites you want (see below)
- Configure your reward commands in
votifier.json
After the first server start you'll have these files:
config/votifier/
votifier.json <- port, token, reward commands
voting_sites.json <- the /vote menu layout
mods/votifier/rsa/
public.key <- give THIS to v1 vote sites
private.key <- keep this secret, never share it
Every vote site authenticates one of two ways. You can tell which kind a site is by what its server-owner panel asks you for: a public key means v1, a token means v2. Both kinds connect to the same IP and port, at the same time — mix them freely.
Your server generated an RSA key pair on first boot; the site gets the public half so it can send votes only your server accepts:
- Open
mods/votifier/rsa/public.key— it's one long line of base64 text. Copy all of it - Paste it into the public key field in the vote site's Votifier settings
- Enter your server's public IP and the votifier port (see
votifier.json, default8192— this is NOT the game port)
Note the file has no -----BEGIN PUBLIC KEY----- wrapper lines and doesn't
need them — the bare text is the standard Votifier key format.
If you ever need to regenerate the pair, stop the server, delete both files
in mods/votifier/rsa/ and start again — new keys generate on boot.
Remember to give the new public key to every site.
Some newer sites don't ask for a public key at all — their panel has a token field instead (the NuVotifier v2 style). A token is just a shared password between your server and the site, and one was already generated for you on first boot:
- Open
votifier.jsonand copy the"token"value - Paste it into the token field on the vote site, along with the same IP and port as v1 sites get
To use your own token instead, change the value and restart the server (the
config is read at startup). Blanking it turns v2 off — v1 sites work either
way. If you upgraded from an older version and your token is empty, set one
yourself or delete votifier.json and restart to regenerate it.
The votifier port must be reachable from the internet (vote sites connect TO your server). Open or forward it just like the game port. A quick test from outside your network:
nc -vz your.server.ip 8192
Both config files live in config/votifier/ and are plain JSON. Ground
rules for editing either one:
- Edit with any text editor, keep it valid JSON: double quotes around strings, commas between entries, no trailing comma after the last one. If the file has a syntax error the mod logs an error on startup and falls back to defaults — check the log if your changes seem ignored
- Changes apply on server restart
- Color codes use
&(e.g.&6gold,&agreen,&lbold) in names, lore and the GUI title
| Key | What it does |
|---|---|
host |
Bind address, keep 0.0.0.0 unless you know why not |
port |
The votifier listener port (this is NOT the game port) |
debug |
Verbose logging of incoming votes, handy while setting up |
command-after-voting |
List of commands run the moment a vote lands; %player% is replaced with the voter's name. Run as the server console, so they can be anything you could type there |
gui-title |
Title of the /vote menu |
token |
Shared secret for v2 sites, generated on first boot; empty disables v2 |
Example rewards — mix vanilla and modded commands freely:
"command-after-voting": [
"give %player% minecraft:diamond 1",
"eco addmoney %player% 500",
"say %player% just voted for the server!"
]The menu is a 3-row chest: 27 slots, numbered 0 (top-left) through 26
(bottom-right), 9 per row. The file is a JSON list of entries; each entry
fills one slot. Anything with a link is a clickable vote site — clicking
it closes the menu and puts the link in chat. Entries without a link are
decoration (filler panes and such).
{
"slot": 12,
"item": "minecraft:diamond_block",
"name": "&6My Vote Site",
"lore": ["Click to open the vote page"],
"link": "https://example-vote-site.com/server/12345",
"enchanted": true
}Fields per entry — only slot is required:
| Field | What it does |
|---|---|
slot |
Which chest slot this entry fills, 0-26 |
item |
The item shown, e.g. minecraft:diamond_block |
head |
Instead of item: a base64 skin texture for a custom player head |
name |
Display name, & color codes work |
lore |
List of hover-text lines |
link |
The vote page URL; makes the entry clickable. %player% in the URL is replaced with the clicking player's name |
enchanted |
true for the enchanted glint |
count |
Stack size shown |
rarity |
Name color tint: COMMON, UNCOMMON, RARE or EPIC |
show-attributes |
false (default) hides item attribute clutter in the tooltip |
Tip for head textures: sites like minecraft-heads.com list heads with a
"Value" string — that whole base64 blob is what goes in head.
- Most vote sites have a "test vote" button in the owner panel. Watch the
server log — with
debugon you'll see the vote arrive and the commands run - Note that some test buttons send a placeholder username, so player-targeted rewards can look broken when it's really just a fake name. The reliable test is a real vote with a real in-game name
- If nothing arrives at all: it's almost always the port (firewall/forwarding) or the wrong key/token on the site
You need a JDK 21 (Temurin, Oracle, whatever) and an internet connection — nothing else. The Gradle wrapper is committed, so there is no Gradle to install.
-
Clone the repo and check out the branch for the version window you want:
mc-1.21.1(1.21.1),mc-1.21.2(1.21.2-1.21.4),mc-1.21.5(1.21.5-1.21.8),mc-1.21.9(1.21.9-1.21.10) ormc-1.21.11(1.21.11)git clone https://github.com/XEXModz/NeoVotifier.git cd NeoVotifier git checkout mc-1.21.5 -
Build:
./gradlew build (Linux/macOS) gradlew.bat build (Windows) -
The jar lands in
build/libs/asneovotifier-<version>_<mc-label>.jar.
The first build downloads and decompiles Minecraft through NeoForge's
toolchain — expect several minutes and a few GB in ~/.gradle. Later builds
take seconds.
Sources live under src/main/java/com/xexmodz/neovotifier/. Each branch
differs from the previous one by exactly one commit — the API adaptation
for its version window — so diffing two branches shows precisely what
changed between Minecraft versions.
Based on the kryeit votifier port, extended with NeoForge 1.21.x support, the
vote menu, dual v1+v2 protocol handling, instant economy payouts and reload
safety. The code lives under the com.xexmodz.neovotifier package;
the mod id stays votifier so existing config/votifier/ setups keep
working across updates.
GPL-3.0, same as the upstream votifier-for-neoforge project. See LICENSE.
Every release jar is tested on a live server of its target Minecraft version before it ships, and the vote pipeline has been verified end-to-end with real votes from live vote sites.