Modern Advancements Screen
Improved Advancements screen with a more modern feel and modern features
Quick challenge
How far can you run before the mobs catch you?
Rotate your phone
Dino Mine is ready when your screen is landscape.
Minecraft check
Confirm your run
Complete the quick check to get your code.
Your code
Expires in 5 hours
Modern Advancements Screen
An overhaul to advancements screen by removing the normal GUI ant-box and filling the entire screen with a more modern user-friendly menu.
## Features
- Full-screen advancements screen replacing the small vanilla GUI
- Scrollable tab management for easier navigation
- Zoom in and out on the advancements
- Clickable advancement icons to show detailed info
- Search function that compiles results into a single tab or filters within current tabs
- Search modifiers for combining terms and filtering by completion status
- Toast Overhaul with customisable options including postion, style, size and visibility
- Per-world Tracking with a configurable HUD element
- Includes a pathway tracking and automatic untracking of completed advancements
- Sync Advancments with client when installed on server
- Since Advancements are server-sided. Clients only get their unlocked advancements. The mod sends them all to the client when installed on server to enable the ability to view them all.
- HTTP API for Server Admins (See below for instructions and information)
### Upcoming Features
- Better layouts
- Compact
- Colour/design controls
- Stat Tracking / Goals
Modern Advancement API (Contains techy stuff)
ModernAdvancements exposes a read-only JSON API that lets you build external websites or dashboards displaying your server's advancement data. This guide covers everything from first-time configuration to making the API accessible from the internet. --- If you reading this, I'll assume you know what you are doing in the first place. I won't take any responsability for issues outside of my control. This mod simply does "hard" part of collecting the in-game information for you. --- ## Requirements - A running **Fabric** Minecraft server running **Minecraft 26.1 or newer** - **Java 25** or newer (required by Minecraft 26.1+) - Access to your server's control panel or console --- ## Mod Installation 1. Download the latest mod jar from the releases page. The file will be named something like `ModernAdvancementsScreen-1.3.0-1.26.1.jar`. 2. Place the `.jar` file into your server's `mods/` folder. 3. Also install the matching **Fabric API** version into `mods/` if it is not already present. 4. Start or restart your server. The mod generates its config file on first launch. --- ## Configuration After the first server start, a config file is created at: ``` config/modern-advancements/modern-advancements_config.json ``` Open it with any text editor. The relevant fields are: ```json { "httpApiEnabled": true, "httpApiHost": "0.0.0.0", "httpApiPort": 25580, "httpApiKey": "" } ``` ### Field Descriptions | Field | Description | |---|---| | `httpApiEnabled` | Set to `false` to disable the HTTP server entirely. | | `httpApiHost` | The network interface to bind to. Use `0.0.0.0` to accept connections on any interface (required for hosting panels). Use `127.0.0.1` if you only need local access on a VPS. | | `httpApiPort` | The port the API listens on. **This must match the port your hosting provider allocates to you** - see the section below. | | `httpApiKey` | An optional API key. Strongly recommended if the API is accessible from the internet - see [Authentication](#authentication). | --- ## Starting the API The API starts automatically alongside the Minecraft server as long as `httpApiEnabled` is `true`. Look for this line in your server console to confirm it started successfully: ``` [ModernAdvancements] Advancement API listening on 0.0.0.0:25580 ``` If you see an error instead, check the [Troubleshooting](#troubleshooting) section. --- ## Verifying It Works If you have console or SSH access to the server machine, run: ```bash curl http://127.0.0.1:25580/api/advancements ``` With an API key configured: ```bash curl -H "Authorization: Bearer your-api-key-here" http://127.0.0.1:25580/api/advancements ``` You should get back a JSON response listing all advancements the server knows about. If you get `connection refused`, the API has not started or the port is wrong. --- ## Making the API Public ### Using a Minecraft Hosting Provider (Recommended) Most Minecraft hosting providers run your server in an isolated environment where only ports they explicitly open are reachable from the internet. To expose the API, you need to allocate an additional port through your provider's control panel, then set that port in the mod config. **The process is the same across most providers:** 1. Log into your hosting panel. 2. Find the **Ports** or **Network** section. 3. Allocate a new port. The panel will assign you a number - take note of it. 4. Open `config/modern-advancements/modern-advancements_config.json` and set `httpApiPort` to that number. 5. Set `httpApiHost` to `0.0.0.0`. 6. Restart your Minecraft server. The API will then be accessible at `http://your-server-ip:that-port/api/advancements`. --- Below are the exact steps for supported providers. --- #### Kinetic Hosting Log into the [Kinetic Panel](https://kineticpanel.net) and navigate to your server. On the left-hand side, click the **Network** tab and select **Network & Ports**. Click the **Open Port** button - a new port will be generated and listed. You can add a note to it (such as "ModernAdvancements API") so you remember what it is for. Set `httpApiPort` in the config to that port number and restart the server. **Kinetic also has a built-in reverse proxy** that lets you map a domain to your API port without exposing the raw IP. See [Using a Domain Instead of an IP](#using-a-domain-instead-of-an-ip) for details. > If you need a specific port number rather than a randomly assigned one, you will need a dedicated IP. Open a support ticket with Kinetic and they can set this up. --- #### Shockbyte Navigate to your server in the Shockbyte Panel, then go to the **Ports** tab in the left-hand menu and click **Add Additional Port**. Give it a name and description (these are just for your own reference), then click the button. The new port number will appear and is immediately ready to use. Set `httpApiPort` in the config to that port number and restart the server. --- #### Bearded Hosting Bearded Host uses a custom panel with reverse proxy and protocol selector support built in. Log into the [Bearded Panel](https://panel.bearded.host) and navigate to your server's **Network** settings to allocate an additional port. If you cannot find the port allocation option or need help getting the API exposed via their reverse proxy, reach out to the Bearded Host team directly via their [Discord](https://bearded.host/) - their support team typically responds within 10–30 minutes. --- #### Other Providers If your provider is not listed here, look for any of the following in their panel or knowledge base: - "Additional Ports" - "Port Allocation" - "Network" settings - "Port Manager" If none of those exist, contact their support team and ask: *"I need an additional TCP port opened for an HTTP API running on my Minecraft server. How do I set this up?"* All major providers support this in some form - it is a common requirement for plugins like Dynmap. --- ### Self-Hosted / VPS If you run the server yourself on a VPS or dedicated machine, the API port just needs to be open in your firewall. ```bash # Ubuntu / Debian (ufw) sudo ufw allow 25580/tcp # CentOS / RHEL (firewalld) sudo firewall-cmd --add-port=25580/tcp --permanent && sudo firewall-cmd --reload ``` Also check your VPS provider's network firewall (sometimes called "Security Groups" or "Inbound Rules" in their web dashboard) and make sure port 25580 TCP is allowed there too. Set `httpApiHost` to `0.0.0.0` in the config, and the API will be accessible at `http://your-server-ip:25580`. --- ## Using a Domain Instead of an IP Pointing a domain or subdomain at the API is the cleanest way to share it - it hides the raw IP address and makes the URL easier to remember and use. For example, instead of `http://123.45.67.89:25580/api/players`, your website can call `https://api.yourserver.com/api/players`. There are two approaches depending on your setup. --- ### Kinetic Hosting Built-in Reverse Proxy If you use Kinetic Hosting, they have a reverse proxy tool built directly into the panel that handles this for you. 1. Make sure the API port is already allocated and working (see the Kinetic section above). 2. In the Kinetic Panel, go to **Advanced** -> **Reverse Proxy**. 3. Click **Add Proxy**. 4. Set the **Domain** field to the subdomain you want, for example `api.yourserver.com`. 5. Set **IP** to your server's IP address (found on the Overview page). 6. Set **Port** to the port you allocated for the API. 7. Press **Create**. 8. In your DNS provider (e.g. Cloudflare), add an **A record** pointing `api.yourserver.com` to your server IP. Once DNS propagates (up to 24 hours, usually much faster), the API will be available at `http://api.yourserver.com/api/advancements` with no port number in the URL. You can also add an SSL certificate in the same panel screen by pasting in a cert and key - Cloudflare's free SSL is the easiest way to generate one. --- ### Cloudflare DNS + Proxy (Any Provider) This works with any hosting provider and also gives you Cloudflare's free DDoS protection and HTTPS. Your server IP remains hidden behind Cloudflare's network. **Prerequisites:** A domain name registered anywhere, and a free [Cloudflare](https://cloudflare.com) account with your domain added to it. **Steps:** 1. Log into Cloudflare and select your domain. 2. Go to the **DNS** tab and click **Add record**. 3. Set the following: - **Type:** `A` - **Name:** the subdomain you want, e.g. `api` (this creates `api.yourserver.com`) - **IPv4 address:** your server's IP address - **Proxy status:** set to **Proxied** (orange cloud icon) - this hides your real IP 4. Click **Save**. 5. Go to the **Rules** tab -> **Page Rules** (or **Rules** -> **Origin Rules** in newer Cloudflare) and create a rule that rewrites the port, or alternatively use a **Cloudflare Worker** if your API port is non-standard. > **Simpler alternative without Workers:** If you have a VPS (not a shared hosting panel), set `httpApiHost` to `127.0.0.1` and put Caddy in front of it. Point `api.yourserver.com` to your server IP in Cloudflare (Proxied), and use this two-line Caddyfile: > ``` > api.yourserver.com { > reverse_proxy /api/* 127.0.0.1:25580 > } > ``` > Caddy handles HTTPS automatically. Your API is then at `https://api.yourserver.com` with no port. --- ### DNS CNAME Without Hiding the Port If you do not need to hide the port and just want a cleaner URL than a raw IP address, you can point a subdomain at your server with a CNAME or A record and still include the port in the URL. For example `http://api.yourserver.com:25580/api/advancements`. This requires no proxy setup - just the DNS record pointing at your server IP. --- ## Authentication If your API is reachable from the internet, set an API key so that only your website can query it. **Generate a strong random key, you can use the command below or just go ask an AI:** ```bash # Windows (PowerShell) [System.Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 })) ``` Paste the result into `httpApiKey` in `config/modern-advancements/modern-advancements_config.json` and restart the server. **Using the key in requests:** Every request must include the key as a Bearer token in the `Authorization` header: ``` Authorization: Bearer your-api-key-here ``` Example with `curl`: ```bash curl -H "Authorization: Bearer your-api-key-here" http://your-server-ip:25580/api/advancements ``` Example in JavaScript: ```javascript const response = await fetch('http://your-server-ip:25580/api/advancements', { headers: { 'Authorization': 'Bearer your-api-key-here' } }); ``` If no key is configured, the API is open to anyone who can reach it. --- ## API Reference All endpoints are **read-only GET requests**. All responses are `application/json`. --- ### `GET /api/players` Returns all players the server has seen, ordered by advancement completion. **Example response:** ```json { "players": [ { "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5", "name": "ThighHugger", "completed": 42, "total": 95, "percentage": 44.2, "tabs": [ { "id": "minecraft:story/root", "title": "Minecraft", "completed": 10, "total": 16, "completedIds": ["minecraft:story/mine_stone", "..."] } ] } ] } ``` --- ### `GET /api/player?name=PlayerName` Returns detailed advancement data for a single player. | Parameter | Required | Description | |---|---|---| | `name` | Yes | The player's in-game username. | **Error responses:** `400` if `name` is missing, `404` if the player was not found. --- ### `GET /api/advancements` Returns every advancement the server knows about with its metadata. **Example response:** ```json { "advancements": [ { "id": "minecraft:story/mine_stone", "tab": "minecraft:story/root", "parent": "minecraft:story/root", "title": "Stone Age", "description": "Mine Stone, Granite, Diorite or Andesite", "type": "TASK" } ] } ``` `type` is one of `TASK`, `GOAL`, or `CHALLENGE`. --- ### `GET /api/stats` Returns server-wide statistics including most and least completed advancements. **Example response:** ```json { "totalPlayers": 12, "totalAdvancements": 95, "averageCompletion": 38.4, "mostCompleted": [ { "id": "minecraft:story/mine_stone", "title": "Stone Age", "count": 11, "percentage": 91.7 } ], "leastCompleted": [...] } ``` --- ### `GET /api/feed` Returns a chronological list of recent advancement completions. | Parameter | Required | Default | Description | |---|---|---|---| | `limit` | No | All events | Maximum number of events to return. | | `player` | No | - | Filter to a specific player (partial match, case-insensitive). | **Example response:** ```json { "events": [ { "playerName": "ThighHugger", "advancementId": "minecraft:nether/find_fortress", "advancementTitle": "A Terrible Fortress", "tabTitle": "Nether", "timestamp": 1714000000000 } ], "total": 243 } ``` `total` is the full event count before any `limit` is applied. `timestamp` is Unix time in milliseconds. --- ## Connecting a Website Here is a minimal working example that fetches and displays the advancement list: ```html Server AdvancementsServer Advancements
- Loading...
*Feel free to use this mod in modpacks but keep the download within the Modrinth Ecosystem and do not reupload*
## Other Mods
[
](https://modrinth.com/mod/totem-party-popper)
[
](https://modrinth.com/mod/modern-advancement-screen)
[
](https://modrinth.com/mod/area-sign-alerts)
[
](https://modrinth.com/mod/yeeterite)
[
](https://modrinth.com/mod/yeeterite-extras)
[
](https://modrinth.com/mod/adventure-bags)
[
](https://modrinth.com/mod/hopper-the-hedgehog)
[
](https://modrinth.com/mod/smelter-the-hedgehog)
[
](https://modrinth.com/mod/note-block-tuner)
[
](https://modrinth.com/mod/stonecutter-gui-remastered)
[
](https://modrinth.com/mod/loom-gui-remastered)
[
](https://modrinth.com/mod/glass-carpet)
[
](https://modrinth.com/mod/explosive-party)
[
](https://modrinth.com/mod/stacks-are-stacks)
[
](https://modrinth.com/mod/fov-toggle)
[
](https://modrinth.com/mod/spongesucc)
[
](https://modrinth.com/mod/wwg)
[
](https://modrinth.com/mod/party-spores)
[
](https://modrinth.com/mod/party-cacti)
[
](https://modrinth.com/mod/party-flames)
[
](https://modrinth.com/mod/superflat-plus)
[
](https://modrinth.com/mod/cottagecraft-mod)
[
](https://modrinth.com/mod/cottagecraft-axolotls)
[
](https://modrinth.com/mod/cottagecraft-festive-eggs)
](https://modrinth.com/mod/totem-party-popper)
[
](https://modrinth.com/mod/modern-advancement-screen)
[
](https://modrinth.com/mod/area-sign-alerts)
[
](https://modrinth.com/mod/yeeterite)
[
](https://modrinth.com/mod/yeeterite-extras)
[
](https://modrinth.com/mod/adventure-bags)
[
](https://modrinth.com/mod/hopper-the-hedgehog)
[
](https://modrinth.com/mod/smelter-the-hedgehog)
[
](https://modrinth.com/mod/note-block-tuner)
[
](https://modrinth.com/mod/stonecutter-gui-remastered)
[
](https://modrinth.com/mod/loom-gui-remastered)
[
](https://modrinth.com/mod/glass-carpet)
[
](https://modrinth.com/mod/explosive-party)
[
](https://modrinth.com/mod/stacks-are-stacks)
[
](https://modrinth.com/mod/fov-toggle)
[
](https://modrinth.com/mod/spongesucc)
[
](https://modrinth.com/mod/wwg)
[
](https://modrinth.com/mod/party-spores)
[
](https://modrinth.com/mod/party-cacti)
[
](https://modrinth.com/mod/party-flames)
[
](https://modrinth.com/mod/superflat-plus)
[
](https://modrinth.com/mod/cottagecraft-mod)
[
](https://modrinth.com/mod/cottagecraft-axolotls)
[
](https://modrinth.com/mod/cottagecraft-festive-eggs)