New condition: "plugin" - allows for filtering by .esp. The filter activates on all plugins that change the actor in any direct way. Example use case: exclude all NPCs changed by an appearance overhaul.
New color option: "color": "random" - chooses a random color for the overlay.
New color option "color": "random-saturated" - works like the random option, but only assigns saturated colors.
It is now possible to specify default color options for each overlay in the mod config json files.
Added support for the following overlay packs: Sunstarved Tanlines, Lyru's Tattoo pack collection, Lyru's Tattoo pack collection 2, Lewd Marks.
1.2:
Support for older game versions. If you experience any problems on older versions please let me know.
1.3
Added support for the following overlay packs: Flawn's Argonian Overlays, TitKit by Monsto SSE, Imperfect Skin Overlays, Niohoggr Warpaints, Obi's Tattoos 3BA 4K, Breast Veins.
Hi thanks for the great mod! Any chance you have the source code posted somewhere? I am trying to make a mod that conditionally distributes racemenu overlays to the player and would greatly appreciate it.
I got the overlay to work once, but decided to change it, but now the NPCs are stuck with the previous overlay and I can't get the new one to work no matter what I try.
Since the distribution rules target a certain group of our choice and distribute a set of overlays to them, should I make multiple individual files if I am targeting select NPCs via EditorID and applying a specific preset (each different)?
Or is there a way I can group these npc-related configs in a single file, but have control over which overlay is applied to whichever npc I want?
Sorry for troubling people here, but I can't figure out why this distribution rule will not work. Everything seems right, I even followed the example of glowing mages { "distributionRules": [ { "conditions": [ { "editorId": [ "Gabriella" ] } ], "baseChance": 1.0, "overlays": [ { "id": "community-overlays-3:co2_64", "weight":1, "color": "0x00FFFF", "glow": true, "glowIntensity": 20.0, "glowColor": "0x520052" } ] } ] }
Do the file names have to be something specific? Is it not recognizing my rule at all if I name it ODF_customNPCs.json?
So there's one way I have managed to make this work, which is by not using the EditorID but rather the faction and gender. I should have mentioned that the NPC is affected by an appearance overhaul using EasyNPC. Even so, the overlay distribution works if I do not use the EditorID. I even tried the plugin method by using my merged esp, but no affect. Here's my rule for now: { "distributionRules": [ { "conditions": [ { "faction": [ "DarkBrotherhoodFaction" ], "gender": [ "female" ] } ], "baseChance": 1.0, "distributionMode": "one", "overlays": [ { "id": "community-overlays-3:co3_62_body_f", "weight": 1, "color": "0x00FFFF", "glow": true, "glowIntensity": 20.0, "glowColor": "0x520052" } ] } ] }
If I add in the EditorID of Gabriella, it stops working. Do I have to write all the plugins that are affecting the NPC, or only appearance plugins? Like, should it be plugins : ["Skyrim.esm", "unofficial skyrim special edition patch.esp", "NPC Appearances Merged.esp"] or should it be plugins : ["NPC Appearances Merged.esp"]
Thank you - this is wonderful, and it worked out-of-the-box quite smoothly.
One question: for the NPCs who were assigned overlays by this, where is the information stored (SKSE co-save?) and is it possible to tweak/re-roll in any ways?
Also, this is more hypothetical, but if we were to uninstall the mod and/or overlay after they are applied to the NPCs, would that cause problems?
All information is stored by RaceMenu. This mod makes no direct modification to your save, and uninstalling would leave no trace of the mod, other than the overlays and a tag which are stored by RaceMenu. Mass re-rolling is not possible, as the mod does not keep track of specific overlays it applied, but you can tweak any NPC directly by editing them in RaceMenu with a tool like this: https://www.nexusmods.com/skyrimspecialedition/mods/19353
Thank you for making this. I've got a couple of technical questions and I apologize if I missed these when scouring the Description page and the how-to article.
I've noticed that some JSON files have UNIX-style paths and others have double-slash Windows paths. If you use UNIX-style paths does the path to the asset need to include the full path from the root of the Skyrim directory or can they start in "textures?"
Where are the logs written? I looked in the skee log and it didn't seem to be logging anything related to ODF.
Logs should be in Documents/MyGames and then either Skyrim.INI or Skyrim Special Edition, then SKSE/OverlayDistributionFramework.log.
Different filepaths are needed due to some skyrim jank where .bsa packed files only work with a certain format. Look at the mod config article I just released for more information.
Awesome thank you! I'm not seeing a log being written for some reason but I'll test with another install on another machine and test to see if I can reproduce it reliably.
Also I'm not surprised at all about Skyrim jank. :)
Sending your code online can expose it to theft by middlemen, regardless of what the code does or its perceived importance, some may like the option to use an offline JSON syntax checking tool, such as the one contained within the JSON plugin in Notepad++
[2025-07-26 19:05:25.677] [log] [info] [plugin.cpp:763] MOD 'natural-pubic-hairstyles': 65/65 files found (65 corrected) [2025-07-26 19:05:25.684] [log] [info] [plugin.cpp:763] MOD 'skin-feature-overlays': 16/16 files found (16 corrected) [2025-07-26 19:05:25.730] [log] [info] [plugin.cpp:763] MOD 'sunstarved-tanlines': 125/125 files found (125 corrected) [2025-07-26 19:05:25.730] [log] [info] [plugin.cpp:798] Loaded 3 mod configs [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:1398] Loading distribution rules from directory: Data/SKSE/Plugins/ODF_distribution_rules [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:1401] ODF_distribution_rules directory not found: Data/SKSE/Plugins/ODF_distribution_rules [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3309] SUCCESS! Registered actor initialization event sink [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3323] SUCCESS! Initialized SKEE Body Morph Interface for ODF tracking [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3333] Performing initial scan for target NPCs in currently loaded actors... [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3337] Scanning all loaded actors for target NPCs... [2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3355] Initial scan complete - processed 0 actors
hi , In the logs I can see it scanned and found 0 actors to apply and then it stops, does it not run again? previously I had set the gender to be both and yet no overlay was applied. Is there something that I am not following ?
yeah I validated the Json found an extra comma corrected it and it applied. Thanks
Followup Q:
How to match the color and transparency code visible in Racemenu with the color and Alpha attributes in the config ? Example 2DFFC1AA shows in Racemenu (A:45, R:255 G:193 B:170) ?
The format is hexadecimal where 2 letters correspond to one attribute eg 2D is hexadecimal for 45, which is your alpha value. You can just use ChatGPT or an online converter to convert RGB to hexadecimal. In the config you use 0xFFC1AA, so the color code without the alpha and with a 0x prepended.
Thankyou for the info, but I think there might be issue with type strechmarks because the mod works fine with pubic hairs. Is there something wrong with the below config? Thanks
FOUND POTENTIAL NPC: [] (Name: Bandit Beastmaster, FormID: 0x000B6256, Class: Bandit Beastmaster, Race: Breton [BretonRace], Plugins: None) - Evaluating against 1 rules [2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3069] RULE MATCH: matches rule with 1 conditions (baseChance: 1 >= 0.98852503) - Selected 1 overlays [2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3189] ApplyOverlaysToActor() called for with 1 overlays: [2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3190] [skin-feature-overlays:sfo_stretch_toosh color=0xFF0000 [rule:color=0x00FFFF] [rule:glow=true] [rule:glowColor=0x520052] [rule:glowIntensity=20.0]] [2025-07-27 16:46:03.309] [log] [info] [plugin.cpp:2493] overlay using distribution rule color: 0x00FFFF
121 comments
1.2:
1.3
Any chance you have the source code posted somewhere? I am trying to make a mod that conditionally distributes racemenu overlays to the player and would greatly appreciate it.
Here are my rules:
{
"distributionRules": [
{
"conditions": [
{
"gender": [
"female"
]
}
],
"distributionMode": "one",
"baseChance": 1.0,
"overlays": [
{
"id": "private-body-tattoos:bs_thehag_vamp1_full",
"slot": "body",
"type": "bodypaint",
"gender": "female",
"theme": "artistic",
"set": "bs_thehag_vamp1_full",
"color": "0xE00B0B",
"glow": true,
"glowColor": "0xE00B0B"
}
]
}
]
}
Or is there a way I can group these npc-related configs in a single file, but have control over which overlay is applied to whichever npc I want?
{
"distributionRules": [
{
"conditions": [
{
"editorId": [
"Gabriella"
]
}
],
"baseChance": 1.0,
"overlays": [
{
"id": "community-overlays-3:co2_64",
"weight":1,
"color": "0x00FFFF",
"glow": true,
"glowIntensity": 20.0,
"glowColor": "0x520052"
}
]
}
]
}
Do the file names have to be something specific? Is it not recognizing my rule at all if I name it ODF_customNPCs.json?
Here's my rule for now:
{
"distributionRules": [
{
"conditions": [
{
"faction": [
"DarkBrotherhoodFaction"
],
"gender": [
"female"
]
}
],
"baseChance": 1.0,
"distributionMode": "one",
"overlays": [
{
"id": "community-overlays-3:co3_62_body_f",
"weight": 1,
"color": "0x00FFFF",
"glow": true,
"glowIntensity": 20.0,
"glowColor": "0x520052"
}
]
}
]
}
If I add in the EditorID of Gabriella, it stops working. Do I have to write all the plugins that are affecting the NPC, or only appearance plugins? Like, should it be plugins : ["Skyrim.esm", "unofficial skyrim special edition patch.esp", "NPC Appearances Merged.esp"] or should it be plugins : ["NPC Appearances Merged.esp"]
FAILED! Could not get SKEE interface map - tracking will be disabled
on game version (1.5.97)
One question: for the NPCs who were assigned overlays by this, where is the information stored (SKSE co-save?) and is it possible to tweak/re-roll in any ways?
Also, this is more hypothetical, but if we were to uninstall the mod and/or overlay after they are applied to the NPCs, would that cause problems?
Different filepaths are needed due to some skyrim jank where .bsa packed files only work with a certain format. Look at the mod config article I just released for more information.
I'm not seeing a log being written for some reason but I'll test with another install on another machine and test to see if I can reproduce it reliably.
Also I'm not surprised at all about Skyrim jank. :)
I 100% agree with you on the Notepad++ option. I usually use python json-lint in WSL myself.
[2025-07-26 19:05:25.684] [log] [info] [plugin.cpp:763] MOD 'skin-feature-overlays': 16/16 files found (16 corrected)
[2025-07-26 19:05:25.730] [log] [info] [plugin.cpp:763] MOD 'sunstarved-tanlines': 125/125 files found (125 corrected)
[2025-07-26 19:05:25.730] [log] [info] [plugin.cpp:798] Loaded 3 mod configs
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:1398] Loading distribution rules from directory: Data/SKSE/Plugins/ODF_distribution_rules
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:1401] ODF_distribution_rules directory not found: Data/SKSE/Plugins/ODF_distribution_rules
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3309] SUCCESS! Registered actor initialization event sink
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3323] SUCCESS! Initialized SKEE Body Morph Interface for ODF tracking
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3333] Performing initial scan for target NPCs in currently loaded actors...
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3337] Scanning all loaded actors for target NPCs...
[2025-07-26 19:05:25.731] [log] [info] [plugin.cpp:3355] Initial scan complete - processed 0 actors
hi , In the logs I can see it scanned and found 0 actors to apply and then it stops, does it not run again? previously I had set the gender to be both and yet no overlay was applied. Is there something that I am not following ?
Followup Q:
How to match the color and transparency code visible in Racemenu with the color and Alpha attributes in the config ?
Example 2DFFC1AA shows in Racemenu (A:45, R:255 G:193 B:170) ?
FOUND POTENTIAL NPC: [] (Name: Bandit Beastmaster, FormID: 0x000B6256, Class: Bandit Beastmaster, Race: Breton [BretonRace], Plugins: None) - Evaluating against 1 rules
[2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3069] RULE MATCH: matches rule with 1 conditions (baseChance: 1 >= 0.98852503) - Selected 1 overlays
[2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3189] ApplyOverlaysToActor() called for with 1 overlays:
[2025-07-27 16:46:03.308] [log] [info] [plugin.cpp:3190] [skin-feature-overlays:sfo_stretch_toosh color=0xFF0000 [rule:color=0x00FFFF] [rule:glow=true] [rule:glowColor=0x520052] [rule:glowIntensity=20.0]]
[2025-07-27 16:46:03.309] [log] [info] [plugin.cpp:2493] overlay using distribution rule color: 0x00FFFF
{
"distributionRules":[
{
"conditions":[
{
"gender":["female"],
"race":["NordRace","ImperialRace","BretonRace"],
"class":["-EncClassVampire"]
}
],
"baseChance":1.0,
"overlays":[
{
"type": "stretchmark",
"color": "0xFF0000",
"glow": true,
"glowIntensity": 20.0,
"glowColor": "0x520052"
}
]
}
]
}
]
}
{
"id": "sfo_stretch_toosh",
"filepath": "Textures\\Actors\\Character\\Overlays\\SFO\\Stretch Toosh.dds",
"slot": "body",
"type": "stretchmark",
"theme": "default",
"gender": "female",
"bodyType": "all"
}
{
"distributionRules":[
{
"conditions":[
{
"gender":["female"],
"race":["NordRace","ImperialRace","BretonRace"],
"class":["-EncClassVampire"]
}
],
"baseChance":1.0,
"overlays":[
{
"type": "stretchmark",
"color": "0xFF0000",
"glow": true,
"glowIntensity": 20.0,
"glowColor": "0x520052"
}
]
}
]
}