An effort to improve map packages and the services around them
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


An effort to improve map packages and the services around them.


Companion project, xonotic-map-manager, is a command-line interface package manager.


There are approximately 12,500 map packages currently in distribution amongst Xonotic servers. Some of these are ported from other games that support the bsp format, (Nexuiz, quake3, WoP, etc). Many of these packages could use some love, they are missing information that could help them integrate better with Xonotic, and help players identify them.


These files are written in Python 3 using the standard libraries, with the exception of "".

See the requirements below.

# requires imagemagick
extract_mapshots = True

# requires matplotlib and imagemagick
extract_radars = False

# Requires nothing
parse_entities = True

What do these files do? - identifies map packages within a directory of pk3s, extrapolates data about the package and puts it into a JSON document. - consolidates data into another JSON document that's readable by a reusable chart library, c3.

index.html - the web front-end for the generated JSON documents.


  1. Copy a whole bunch of pk3s into the ./resources/packages folder
  2. run ./bin/ -A
  3. run ./bin/
  4. run python -m SimpleHTTPServer
  5. Goto
  6. (optional) check error.log for any pk3s that were found without bsps and corrupt packs


The JSON structure for a map package is as follows:

  "data": [
      "filesize": 7856907,
      "date": 1453749340,
      "bsp": {
        "vapor_alpha_2": {
          "title": "Vapor",
          "license": true,
          "map": "maps/",
          "gametypes": [
          "radar": "gfx/vapor_alpha_2_mini.tga",
          "waypoints": "",
          "description": "Such CTF. Many Vehicles. Wow.",
          "mapinfo": "maps/vapor_alpha_2.mapinfo",
          "entities": {
            "info_player_deathmatch": 4,
            "info_player_team1": 11,
            "info_player_team2": 11,
            "item_armor_big": 10,
            "item_armor_large": 4,
            "item_armor_medium": 16,
            "item_armor_small": 124,
            "item_bullets": 10,
            "item_cells": 14,
            "item_flag_team1": 1,
            "item_flag_team2": 1,
            "item_health_large": 6,
            "item_health_medium": 30,
            "item_health_mega": 2,
            "item_health_small": 100,
            "item_invincible": 1,
            "item_rockets": 20,
            "item_strength": 1,
            "weapon_crylink": 4,
            "weapon_devastator": 6,
            "weapon_electro": 2,
            "weapon_grenadelauncher": 6,
            "weapon_hagar": 4,
            "weapon_machinegun": 6,
            "weapon_vortex": 4
          "mapshot": "maps/vapor_alpha_2.jpg",
          "author": "-z-"
      "pk3": "map-vapor_alpha_2.pk3",
      "shasum": "3df0143516f72269f465070373f165c8787964d5"

Entities that are currently parsed can be found in ./bin/


Find me in #xonotic on, I'm open to any ideas to improve upon this effort.