Automated validation for Icarus EXMOD/EXMODZ mod files. Catches errors before they reach players.
Built for JimK72's Mod Manager format.
Schema & Fields — All required fields present (name, author, version, description, fileName) with correct types. Valid JSON syntax and UTF-8 encoding (BOM stripped automatically).
Version Format — Supports semver (1.0, 1.0.0, v1.2.3), week-based (w132, W125), and metadata variants (1.0.0-beta).
Data Table Structure — CurrentFile naming follows Category-D_TableName.json convention (including multi-segment categories like Items-Types-D_BuildingTypes.json). Every File_Items entry has a Name identifier. NSLOCTEXT() strings validated. Icon paths verified (/Game/Assets/). Workshop costs checked for valid Amount values. Talent grid entries checked for Position and Size. Duplicate table references flagged. Recognizes all 78 game categories and 292 data tables sourced directly from Icarus game exports.
Packaging — EXMODZ zip structure validated: EXMOD must be inside Extracted Mods/ folder (Mod Manager requirement).
Blueprint (BP) Assets — Validates .uasset/.uexp pairs inside ModName/BP/ folders. Detects orphaned assets (missing pair), BP files incorrectly placed inside Extracted Mods/, and BP folders on disk that weren't included in the EXMODZ package. Cross-references mod assets against all 71,037 known game assets from game_assets.json.gz (26 categories: ASS, Assets, BP, Data, Maps, UI, and more) to identify valid overrides vs custom assets.
PAK Files — Validates .pak files follow the _P.pak naming convention required by Icarus. Checks PAK files aren't inside Extracted Mods/. Detects PAK files on disk missing from the EXMODZ package. Reminds that PAK mods require all players and the server to install.
Documentation & Support Files — Checks EXMODZ packages include README.md, Banner.png, and Readme .txt in the ModName/ folder. The Readme .txt is the main info body displayed in Icarus Mod Manager. Missing README or banner are flagged. Disk cross-check catches doc files left out of the package. Also checks README content quality, installation instructions, compatibility notes, and changelog sections. Placeholder detection for author and description fields.
Catalog (modinfo.json) — Validates the master mod catalog: required fields per mod, duplicate detection, download URL format, and cross-referencing against actual mod folders.
Add automated validation to your Icarus mod repo in one command:
mkdir -p .github/workflows && \
curl -sL https://raw.githubusercontent.com/AgentKush/icarus-modinfo-validator/main/.github/workflows/validate-mod.yml \
-o .github/workflows/validate-mod.yml && \
git add .github/workflows/validate-mod.yml && \
git commit -m "Add Icarus mod validation workflow"Or manually copy .github/workflows/validate-mod.yml into your repo.
- On push — Validates any changed
.EXMOD,.EXMODZ, ormodinfo.jsonfiles - On PR — Validates and posts a comment with pass/fail results
- Manual — Run from the Actions tab with an optional subdirectory path
══════════════════════════════════════════════════════════════ Validating: MyMod.EXMOD ══════════════════════════════════════════════════════════════ ℹ️ INFO: README doesn't include a changelog section. ✅ PASSED — 0 error(s), 0 warning(s)
Run the validator directly from the command line:
# Validate a single EXMOD file
python validate_modinfo.py MyMod/MyMod.EXMOD
# Validate an EXMODZ package (checks zip structure too)
python validate_modinfo.py MyMod/MyMod.EXMODZ
# Scan an entire directory for all mod files
python validate_modinfo.py ./mods/
# GitHub Actions annotation mode (auto-detected in CI)
python validate_modinfo.py --github MyMod/MyMod.EXMOD| Code | Meaning |
|---|---|
0 |
All checks passed |
1 |
Errors found — mod will likely fail to load |
2 |
Warnings only — mod may work but has issues |
Real output from AgentKush's Icarus Mods:
EXMODZ with BP + PAK — caught missing Blueprint assets:
══════════════════════════════════════════════════════════════
Validating: Deployable_Deep_Ore_Nodes.EXMODZ
══════════════════════════════════════════════════════════════
ℹ️ INFO: BP folder found: 21 .uasset, 21 .uexp files
ℹ️ INFO: PAK file(s) found: Deployable_Deep_Ore_Nodes/DeepOreNodes_P.pak
ℹ️ INFO: PAK mod detected (DeepOreNodes_P.pak). Remember: all players and
the server must install .pak files to Icarus/Content/Paks/mods/
❌ ERROR: BP file "BP_DeepOreNode_Frozen_Wood.uasset" exists on disk but is
NOT in the EXMODZ package. Missing assets cause Unreal Engine load failures.
❌ ERROR: BP file "BP_DeepOreNode_Frozen_Wood.uexp" exists on disk but is
NOT in the EXMODZ package. Missing assets cause Unreal Engine load failures.
❌ ERROR: BP file "BP_DeepOreNode_Super_Cooled_Ice.uasset" exists on disk but
is NOT in the EXMODZ package. Missing assets cause Unreal Engine load failures.
❌ ERROR: BP file "BP_DeepOreNode_Super_Cooled_Ice.uexp" exists on disk but
is NOT in the EXMODZ package. Missing assets cause Unreal Engine load failures.
ℹ️ INFO: No Banner.png found in "Deployable_Deep_Ore_Nodes/" folder.
A banner image makes the mod look polished in Mod Manager.
⚠️ WARNING: No Readme .txt found in "Deployable_Deep_Ore_Nodes/" folder.
This file provides the main info body displayed in Icarus Mod Manager.
❌ FAILED — 4 error(s), 1 warning(s)
Clean EXMOD pass:
══════════════════════════════════════════════════════════════
Validating: Extended_Spoil_Timers.EXMOD
══════════════════════════════════════════════════════════════
✅ PASSED — 0 error(s), 0 warning(s)
| Field | Type | Description |
|---|---|---|
name |
string | Display name of the mod |
author |
string | Mod author (not a placeholder) |
version |
string | Version in supported format |
description |
string | What the mod does (min 10 chars) |
fileName |
string | Base filename without extension |
The validator recognizes all 78 table categories and 292 table names from the Icarus game exports, covering every moddable data table in the game — from core items (D_ItemTemplate, D_ItemsStatic) to crafting (D_ProcessorRecipes, D_RecipeSets), talents (D_Talents, D_TalentTrees), AI (D_AICreatureType, D_GOAPSetup), weather (D_WeatherEvents, D_Biomes), combat (D_FirearmData, D_CriticalHitSetup), vehicles (D_VehicleSetups, D_Mounts), and more.
ModName.EXMODZ (zip)
├── Extracted Mods/
│ └── ModName.EXMOD ← Required location
└── ModName/
├── Readme (ModName_P.pak).txt ← Main info body in Mod Manager
├── README.md ← GitHub documentation
├── Banner.png ← 768×256 PNG (Mod Manager display)
├── BP/ ← Blueprint assets (optional)
│ ├── Asset.uasset ← Must have matching .uexp
│ └── Asset.uexp
└── ModName_P.pak ← PAK file (optional)
| Rule | Severity |
|---|---|
Every .uasset must have a matching .uexp (and vice versa) |
Error |
BP files must be in ModName/BP/, never in Extracted Mods/ |
Error |
| BP folder on disk but missing from EXMODZ | Error |
| BP asset not found in known game assets | Info |
| BP asset matches known game asset (valid override) | Info |
PAK files must follow _P.pak naming convention |
Warning |
PAK files must not be in Extracted Mods/ |
Error |
| PAK file on disk but missing from EXMODZ | Warning |
| File | Format | Description |
|---|---|---|
Banner.png |
PNG, 768×256 pixels | Display image shown in Mod Manager's mod list |
Readme (ModName_P.pak).txt |
Plain text | Main info body displayed in Mod Manager when the mod is selected |
README.md |
Markdown | Documentation shown on GitHub |
| Rule | Severity |
|---|---|
README.md missing from ModName/ folder |
Warning |
Banner.png missing from ModName/ folder |
Info |
Readme .txt missing from ModName/ (Mod Manager info body) |
Warning |
| Doc file on disk but missing from EXMODZ | Warning |
Python 3.8+ with no external dependencies. Uses only standard library modules: gzip, json, os, re, sys, zipfile, pathlib.
PRs welcome, especially for new validation rules, additional data table names as Icarus updates, and improved error messages.
MIT — use it however you want.
Part of AgentKush's Icarus Mods — 38 mods, 37,500+ data entries, 18,800+ recipes