Skip to content
LobbyLinkDocsPlugin

LobbyLink Plugin

v2.0.0 · Spigot / Paper / Purpur · 1.8.8 – 1.21.x · Java 8+

Overview

The LobbyLink plugin connects your Spigot/Paper/Purpur server to your LobbyLink listing. It handles vote delivery and rewards, streak tracking, vote parties, and keeps your listing's player count accurate via heartbeat.

  • Vote rewards — tiered permission rewards, per-service bonuses, and a default fallback
  • Vote streaks — consecutive day tracking with configurable milestones
  • Vote parties — community counter that rewards every online player when the goal is hit
  • PlaceholderAPI — 7 placeholders for scoreboards, holograms, and TAB
  • Player count sync — heartbeat keeps your listing accurate every 5 minutes
Versionv2.0.0
MC versions1.8.8 – 1.21.x
Java versionJava 8+
PlatformsSpigot, Paper, Purpur

Installation

1
Download the plugin
Download LobbyLink-2.0.0.jar and drop it into your server's plugins/ folder.
2
Restart your server
Do a full restart (not /reload). The plugin creates plugins/LobbyLink/config.yml and generates an RSA keypair in plugins/LobbyLink/rsa/.
3
Get your Plugin Token
In the LobbyLink dashboard, open your server's Settings → Plugin & Votifier and generate a token.
4
Edit config.yml
Open plugins/LobbyLink/config.yml and set your token:
plugin-token: "ll_live_yourTokenHere"
5
Run /ll reload
Run /ll reload in-game or from console. The heartbeat starts, the Votifier listener starts, and your server is live.
No Votifier/NuVotifier plugin needed. LobbyLink includes its own Votifier listener on port 8192. If you already have Votifier or NuVotifier installed, set votifier.enabled: false in LobbyLink's config and keep using your existing setup.

Server Verification

Setting plugin-token and running the plugin is all you need. The plugin sends a heartbeat every 5 minutes — the first heartbeat automatically marks your listing as verified.

If you reset your plugin token in the dashboard, paste the new token into config.yml and run /ll reload. The old token becomes invalid immediately.

Votifier Setup

External vote sites (Planet Minecraft, TopG, Minecraft-Server-List.com, etc.) can send votes directly to your server via the Votifier protocol. The plugin listens on port 8192 and supports both Votifier v1 (RSA) and NuVotifier v2 (HMAC-SHA256).

Step 1 — Open port 8192

Make sure TCP port 8192 is open in your firewall. You can change it via votifier.port in config.yml.

Step 2 — Get your RSA public key (v1 sites)

Run /ll pubkey in console or in-game. Copy the full PEM block and paste it into vote sites that require a Votifier v1 public key.

Step 3 — Set your Votifier token (v2 sites)

Copy the Votifier Token from Dashboard → Settings → Plugin & Votifier and set it in config.yml:

votifier:
  token: "your-votifier-token-here"
The token is used for NuVotifier v2 sites only. For v1 (RSA) sites, leave it blank — they authenticate via the RSA encrypted payload.
What to enter on each vote site
FieldValue
Votifier hostYour server IP or hostname
Votifier port8192 (or your custom port)
ProtocolNuVotifier v2 if available, otherwise v1
Token / Secret (v2)Votifier Token from the dashboard
Public key (v1)PEM output of /ll pubkey

Reward Commands

Rewards resolve in priority order — the first match wins. Commands run as console with {player} replaced by the voter's username.

1. Permission tiers

Players with a matching permission get these rewards. Highest priority tier wins. Sorted by priority descending, so ties in config order are predictable.

rewards:
  tiers:
    mvp:
      priority: 100
      permission: "lobbylink.tier.mvp"
      commands:
        - "give {player} diamond 5"
        - "eco give {player} 500"
    vip:
      priority: 50
      permission: "lobbylink.tier.vip"
      commands:
        - "give {player} diamond 2"
2. Per-service rewards

If no tier matches, the plugin checks whether the vote came from a specific site. The service name is case-insensitive.

rewards:
  services:
    "Planet Minecraft":
      commands:
        - "give {player} emerald 1"
3. Default fallback

Runs for every voter that didn't match a tier or service — always fires.

rewards:
  commands:
    - "give {player} diamond 1"
    - "say Thanks {player} for voting!"
Offline player votes are stored in plugins/LobbyLink/pending-votes.yml and delivered automatically when the player next logs in.

Vote Streaks

The plugin tracks how many consecutive days each player has voted. When a player hits a milestone, bonus commands fire and a special broadcast goes out to the server.

streaks:
  enabled: true
  streak-timezone: "UTC"   # Use your server's local timezone, e.g. "America/New_York"
  milestones: [3, 7, 30, 100]
  milestone-commands:
    - "give {player} diamond {streak}"

{streak} is replaced with the player's current streak count. Day boundaries follow streak-timezone — set this to your community's timezone so midnight resets feel natural.

A streak resets if the player misses a day. Streaks are stored per-player in plugins/LobbyLink/vote-data.yml.

Vote Parties

A shared community counter climbs toward a configurable goal. When it hits, every online player receives the party reward commands and a broadcast fires in chat. The counter then resets.

vote-party:
  enabled: true
  goal: 50
  announce-every: 10   # Announce progress every 10 votes
  commands:
    - "give {player} firework_rocket 3"
    - "say {player} helped trigger a vote party!"

Progress announcements fire at every multiple of announce-every, e.g. at 10, 20, 30, 40 votes. The announcement at the goal triggers the party.

The current vote party counter is accessible via the %lobbylink_party_progress% placeholder and is shown in /ll status.

PlaceholderAPI

Install PlaceholderAPI to use LobbyLink data in scoreboards, holograms, TAB, chat, and any other PAPI-compatible plugin.

PlaceholderReturns
%lobbylink_votes_today%This player's votes today
%lobbylink_votes_total%This player's all-time vote count
%lobbylink_streak_current%Current streak in days
%lobbylink_streak_best%Best streak ever
%lobbylink_top_player%Server's #1 all-time voter
%lobbylink_party_progress%Current vote party counter
%lobbylink_party_goal%Vote party goal

Placeholders can be combined — e.g. %lobbylink_party_progress% / %lobbylink_party_goal% for a progress display.

Leaderboard

/ll top shows the top 10 voters all-time and the top 10 for the current month, directly in chat.

/ll top           → All-time + this month
/ll top alltime   → All-time only
/ll top monthly   → This month only

By default this command requires lobbylink.admin. To let regular players use it, give them the lobbylink.top permission — no admin access needed.

# In LuckPerms or similar:
lp group default permission set lobbylink.top true

HTTP Webhook

An alternative to Votifier — LobbyLink can POST vote notifications directly to your server over HTTP. Useful if you can't expose port 8192 or prefer HTTP.

1
Enable the webhook listener
Ensure webhook.enabled: true in config.yml (on by default, port 7878).
2
Set a webhook secret
Change webhook.secret to a strong random string. Copy this value — you'll need it in the dashboard.
3
Configure in the dashboard
In Settings → Webhooks, set the Vote Webhook URL to:
http://<your-server-ip>:7878/vote
Paste the same secret value.
Make sure port 7878 is open in your firewall. The Votifier listener (8192) and webhook (7878) can run simultaneously.

Offline Player Votes

When a vote arrives for a player who is offline, the reward is stored in plugins/LobbyLink/pending-votes.yml. The next time that player joins, all pending rewards are delivered automatically.

Pending votes expire after pending-vote-expiry-days days (default: 7). Set to 0 to never expire.

Pending votes survive server restarts. The file is written immediately when the offline vote arrives.

Commands

CommandPermissionDescription
/ll statuslobbylink.adminPlugin status, vote party progress, pending vote count
/ll reloadlobbylink.adminHot-reload config.yml without restarting
/ll top [alltime|monthly]lobbylink.topIn-game leaderboard — top 10 all-time and this month
/ll pubkeylobbylink.adminPrint the Votifier RSA public key (needed for vote sites)

All commands support tab completion. lobbylink.admin is granted to ops by default.

Full Config Reference

Complete annotated config.yml:

# LobbyLink Plugin Configuration
# Docs: https://lobbylink.net/docs/plugin

# Plugin token from Dashboard → Settings → Plugin & Votifier
plugin-token: ""

# LobbyLink API base URL — do not change unless self-hosting
api-url: "https://api.lobbylink.net"

# ── Votifier Listener ─────────────────────────────
# Built-in listener — no separate Votifier plugin needed.
# Supports Votifier v1 (RSA) and NuVotifier v2 (HMAC-SHA256).
votifier:
  enabled: true
  port: 8192
  token: ""              # NuVotifier v2 token (optional)
  require-v2-token: false  # Set true to reject v2 votes without a valid token

# ── HTTP Webhook (alternative to Votifier) ────────
webhook:
  enabled: true
  port: 7878
  secret: "change-me-to-a-strong-secret"

# ── Vote Rewards ──────────────────────────────────
# Commands run as console. {player} = voter's username.
rewards:
  tiers:
    mvp:
      priority: 100
      permission: "lobbylink.tier.mvp"
      commands:
        - "give {player} diamond 5"
        - "eco give {player} 500"
    vip:
      priority: 50
      permission: "lobbylink.tier.vip"
      commands:
        - "give {player} diamond 2"
  services:
    "Planet Minecraft":
      commands:
        - "give {player} emerald 1"
  commands:
    - "give {player} diamond 1"
    - "say Thanks {player} for voting!"

# ── Vote Streaks ──────────────────────────────────
streaks:
  enabled: true
  streak-timezone: "UTC"
  milestones: [3, 7, 30, 100]
  milestone-commands:
    - "give {player} diamond {streak}"

# ── Vote Party ────────────────────────────────────
vote-party:
  enabled: true
  goal: 50
  announce-every: 10
  commands:
    - "give {player} firework_rocket 3"

# ── Visual Effects ────────────────────────────────
effects:
  firework:
    enabled: true
    type: BALL_LARGE
    colors: ["RED", "ORANGE"]
    flicker: true
    trail: false
  sound:
    enabled: true
    name: "ENTITY_PLAYER_LEVELUP"
    volume: 1.0
    pitch: 1.2
  title:
    enabled: false
    title: "&6Thanks for voting!"
    subtitle: "&eYour rewards have been delivered."
  actionbar:
    enabled: true
    message: "&aThanks for voting on LobbyLink!"

# ── Messages ──────────────────────────────────────
messages:
  vote-received: "&aThank you for voting! Enjoy your reward."
  reminder: "&7You haven't voted today — &avote now&7 and claim your reward."

# ── Reminders ─────────────────────────────────────
reminders:
  enabled: true
  check-interval-minutes: 60
  cooldown-hours: 20

# ── Data Retention ────────────────────────────────
pending-vote-expiry-days: 7
data:
  keep-months: 3

Troubleshooting

Heartbeat error: Unknown token
The plugin-token in config.yml doesn't match. Go to Dashboard → Settings → Plugin & Votifier, generate a new token, paste it in config.yml, and run /ll reload.
Votifier listener failed to start on port 8192
Another process (Votifier, NuVotifier, or another plugin) is already using port 8192. Either remove the conflicting plugin, change votifier.port in config.yml, or set votifier.enabled: false.
v2 vote rejected: invalid signature
The votifier.token in config.yml doesn't match the token on the vote site. Copy the exact Votifier Token from the dashboard into both config.yml and the vote site.
v1 vote failed to decrypt
The vote site has the wrong public key. Run /ll pubkey and update the public key on the vote site.
Votes arriving but no rewards given
Check that rewards.commands is configured in config.yml. For offline players, the reward queues — check pending-votes.yml to confirm it's there.
Streak not incrementing
Streaks increment once per day per player. If the player already voted today their streak won't increase again until the next day boundary. Check streak-timezone matches your expected timezone.
Server shows as unverified after installing
The first heartbeat fires 2 seconds after enable, then every 5 minutes. If still unverified after 5 minutes, check the console for "Heartbeat error" messages and confirm plugin-token is set.

Still stuck? Join our Discord for support.