The mod metadata: edgemods.json
Every mod on EDGEmods has an edgemods.json at the top of its repository. The EDGEmods publishing form writes it; modders do not need to edit it by hand. The website, the extension and the merge checks all read it.
Status: proposed, format version 1 (2026-10-17). Built in R1 for the owner to review. Fields may still change before the first mod is published. The code is in packages/format and the example in examples/example-mod.
A mod’s repository
| Path | What it is |
|---|---|
edgemods.json |
The metadata, described below |
README.md |
The mod page, in GitHub-flavored markdown. Another file can be named in page |
images/ |
The card image and the gallery |
CHANGELOG.md |
Optional, named in changelog |
| The project | Proposed: the mod’s source, the REDcode project (.cpmodproj, source/). Publishing turns the modder’s project folder into this repository; see the design |
.github/workflows/ |
Proposed: a few lines that call EDGEmods’ shared build workflow |
.gitignore |
Proposed: leaves out packed/ and REDcode’s local state |
| Releases | One per version, tagged v plus the version (v1.2.0), with the files listed in files attached. Downloads never go in the repository: git refuses files over 100 MB, while release files can be up to 2 GiB each. Proposed: the files are built from the tag’s commit by the shared build workflow |
Each release’s tag points at a commit whose edgemods.json describes that release, so older versions keep their own files, notes and requirements.
Fields
| Field | Required | What it is | Rules |
|---|---|---|---|
$schema |
no | The schema link, for editors | https://edgemods.ai/schema/edgemods-1.json |
schemaVersion |
yes | The format version | 1 |
id |
yes | The mod’s id on EDGEmods; never changed after publishing | 3 to 64 lowercase letters, digits and single dashes: better-car-radio. Unique on EDGEmods (checked by the merge checks) |
name |
yes | The name on the card and the page | Up to 80 characters |
summary |
yes | The card’s short description | 10 to 200 characters |
version |
yes | This release’s version | MAJOR.MINOR.PATCH, with an optional pre-release (2.0.0-beta.1). No v |
author.name |
yes | The name shown | Up to 80 characters |
author.github |
yes | The GitHub login that owns the repository | Must match the repository’s owner (checked by the merge checks) |
credits |
no | Others who helped | Up to 20 of { "name", "for" } |
license |
yes | The mod’s license | An SPDX identifier (MIT, CC-BY-4.0) or the terms in a few words, up to 64 characters |
type |
yes | What the mod mainly is | One of gameplay, visual, characters, clothing, weapons, vehicles, audio, ui, world, quests, utility, modding-resource, other |
tags |
no | Words players search for | Up to 10, lowercase with dashes, 2 to 24 characters each |
gameVersion |
no (a warning) | The game version it was tested with | Like 2.31 or 2.12a |
adult |
no | The author says it has adult content | true or false. EDGEmods’ own review can add the tag too |
images.card |
yes | The card image | A .png, .jpg or .webp under images/; 2:1, at least 640 × 320, 1280 × 640 best; up to 5 MB |
images.gallery |
no (a warning) | Screenshots | Up to 30 of { "path", "caption" }, same file rules as the card, any shape |
page |
no | The mod page | A .md file; default README.md, up to 512 KB |
changelog |
no | The changelog | A .md file |
files |
yes | The release’s files | 1 to 50; see below |
requirements |
no | What the mod needs | Up to 30; see below |
links |
no | Other places | homepage, nexus, discord, donate; https only |
Release files
| Field | What it is |
|---|---|
name |
The file’s name on the release, exactly, capitals included. A .zip or .7z, with letters, digits, dots, dashes, underscores and + only, because GitHub renames anything else. Proposed: laid out as the game folder (archive/pc/mod/…, r6/…, bin/x64/…), as mod managers expect |
role |
required: always installed. optional: the player may add it. choose-one: one file of its group is installed |
group |
For choose-one files only: the group’s name, such as “Body”. Files in a group override the same thing, so the player picks one. A group has at least two files |
title |
A short label, up to 80 characters |
note |
Free-form explanation, up to 500 characters |
requirements |
What this file needs on top of the whole mod’s requirements, in the same form as below. They count only when the file is installed, such as a framework that one choose-one variant needs |
At least one file is required, or there is a choose-one group: a mod made only of optional files cannot be installed.
Requirements
Requirements sit on the whole mod (requirements at the top) or on one file (files[].requirements). A mod listed for the whole mod is not listed again on a file.
| Form | Fields | Meaning |
|---|---|---|
| A mod on EDGEmods | mod (its id), version, exact, note |
Picked in the publishing form: type to search EDGEmods, pick the mod, then pick one of its releases. version is that release (1.2.0 means the tag v1.2.0); newer releases are fine too, unless exact is true, which pins it. The merge checks confirm the mod is on EDGEmods and the release exists |
| Anything else | name, url (https), note |
Another mod site, a file host, a framework’s page. Not scanned, and no version: the modder keeps the link right |
Installing resolves the chain: the EDGEmods server reads each required mod’s edgemods.json at the chosen release, and its requirements in turn, and gives the extension a plan; see the design.
The checks
| Check | Where | What |
|---|---|---|
validateManifest, parseManifest |
Anywhere: no disk, no network | The fields above, with each problem explained in plain words and a “did you mean” for typos |
checkModFolder |
The extension before publishing; npm run check:example |
The manifest, then: the page and images exist with exactly the same capitals (Windows ignores capitals, GitHub does not), images are real PNG, JPEG or WebP files matching their extension, the card is 2:1, and no file is too big for git |
checkRelease |
The merge checks, the extension | The tag is v<version>; every listed file is attached, with the same name, not empty and under 2 GiB; files on the release that are not listed are a warning |
| The JSON schema | Editors | schema/edgemods.schema.json, generated from the validator’s own rules, so the two agree. The validator is the authority |
Problems are errors or warnings. Errors stop a mod; warnings are advice, such as a missing gallery.
Example
The complete example is examples/example-mod/edgemods.json. In short:
{
"$schema": "https://edgemods.ai/schema/edgemods-1.json",
"schemaVersion": 1,
"id": "edgemods-example",
"name": "EDGEmods Example",
"summary": "An example of a mod's metadata for EDGEmods.",
"version": "1.0.0",
"author": { "name": "Edgemodders", "github": "Edgemodders" },
"license": "MIT",
"type": "modding-resource",
"tags": ["example"],
"gameVersion": "2.31",
"images": { "card": "images/card.png" },
"files": [
{ "name": "edgemods-example-1.0.0.zip", "role": "required", "title": "Main file" },
{ "name": "edgemods-example-body-a-1.0.0.zip", "role": "choose-one", "group": "Body", "title": "Body A" },
{
"name": "edgemods-example-body-b-1.0.0.zip", "role": "choose-one", "group": "Body", "title": "Body B",
"requirements": [{ "mod": "edgemods-example-body-kit", "version": "2.0.0", "exact": true }]
}
],
"requirements": [
{ "name": "ArchiveXL", "url": "https://www.nexusmods.com/cyberpunk2077/mods/4198" },
{ "mod": "edgemods-example-core", "version": "1.2.0" }
]
}
Open points
| Point | Notes |
|---|---|
| The type list | Proposed above; the owner may want different types |
| The card size | 2:1 like GitHub’s social preview (1280 × 640). Another shape is a one-line change |
| Archive formats | .zip and .7z only. .rar is left out because the merge checks must list an archive’s contents |
| Several authors | One owner (the GitHub login) plus credits for now |