R E C A S T
Change any NPC's face and body with a small text file.
A runtime NPC visual replacer for Skyrim SE, AE, and VR
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Author's NoteChange any NPC's face and body with a small text file.
A runtime NPC visual replacer for Skyrim SE, AE, and VR
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
I have shipped a lot of NPC replacers over the years, and every one of them leaned on a general-purpose patcher to do the actual face swap at runtime. Recast is what I always wanted instead: a small, focused SKSE plugin that does exactly one job, does it correctly, and stays out of the way.
Important: If you run Recast alongside SkyPatcher, make sure only one of them is replacing a given NPC's face. Recast owns face and body; leave SkyPatcher's face-copy INIs disabled for those NPCs.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OverviewRecast replaces the face and body of any NPC at runtime by reading a small TOML file.
Drop a patch in a folder, launch the game, and the target NPC renders with the new look.
No ESP overrides. No save baking. No FaceGen regeneration. Recast works entirely in memory: it never modifies your save file or the target NPC's record in any plugin, which makes it safe to install, uninstall, or change at any point in a playthrough.
The target NPC keeps everything else. Voice stays the same, dialogue conditions still match, faction memberships are untouched, and race ability spells are unchanged. The NPC's mechanical identity stays intact, so quest dialogue, follower behavior, and stronghold logic all keep working. Sex, voice, and display name change only when you explicitly opt into those fields.
Note: One unified DLL supports SE, AE, and VR via runtime detection. There is no ESP; Recast costs you zero load-order slots.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FeaturesVisual Replacement
- Face - head shape, eyes, hair, brows, and tint layers from the source NPC
- Body matches face by design - the body model (WORN armor) comes from the same source as the face, so the look the modder designed arrives as a matched pair
- Weight, height, and body tint - copied with the face so proportions stay coherent
- Sex and voice overrides - optionally flip an NPC's sex flag and voice type (great for turning a housecarl into someone new; pick a voice that supports follower dialogue if the NPC can follow you)
- Name override - optionally rename the NPC; the new display name shows everywhere the game shows names
- Cross-race friendly - any humanoid face on any humanoid NPC (a Breton can wear a Nord face); Recast logs a friendly note when races differ so you can confirm it was intentional
- Runtime only - no ESP overrides, no save-baked state, nothing written to the target NPC's record
- Save game safe - install, uninstall, or swap patches mid-playthrough; remove a patch and the NPC is back to normal on the next launch
- Compatible with everything - USSEP, AI Overhaul, and follower frameworks that share base NPCs all layer cleanly, because Recast applies on top of whatever your load order produced
- Fast loading - parses and applies a 100-NPC library in about 17 milliseconds, hidden behind the loading screen
- Steady state zero cost - a tiny digest file remembers what was applied last session; if nothing changed, save loads do zero extra work, with no flicker and no actor refresh storms
- Patch cache - unchanged patch sets skip TOML parsing entirely on later launches, while edits, additions, and removals are still detected automatically
- Simple TOML format - human readable, editable in any text editor, learnable in five minutes
- Smart selectors - use EditorIDs (readable names) or FormIDs (precise hex) interchangeably in the same file; Recast detects which is which by syntax
- Hot iterable - edit a TOML, relaunch, see the change; no FaceGen regeneration, no ESP rebuilds
- Clear logs - one structured line per stage; errors include the exact file and line number, so fixing a typo in a 100-entry patch takes seconds
- FOMOD installer ready - ship one TOML per NPC and let users include or exclude individual faces at install time
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Requirements- SKSE64
- Address Library for SKSE Plugins
- powerofthree's Tweaks - needed for EditorID selectors in patches; FormID-only patches work without it
- Install the requirements listed above.
- Install Recast with your mod manager (MO2, Vortex, etc.). There is no ESP to activate.
- Install any Recast-based face packs, or write your own patch (see below).
- Launch the game. Recast applies patches during the loading screen.
To uninstall, just remove the mod. Recast keeps nothing in your save; every NPC returns to its load-order appearance on the next launch.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
How to UseYour First Patch
Create a text file at Data/SKSE/Plugins/Recast/Patches/my_first_patch.toml (Recast loads every .toml under Patches, including subfolders):
[manifest]
name = "My First Patch"
priority = 100
api_version = 1
[[npcs]]
target = "Lydia"
face = "MyMod_NewLydia"
Relaunch the game. Lydia now wears the face and body of the source NPC. That is the whole workflow.
The Full Block
Every field except target is optional, and they can be mixed freely per NPC:
[[npcs]]
target = "HousecarlWindhelm"
face = "CS_Aela_Clone"
body = "CS_Visions_Body_Muscular"
sex = "female"
voice = "FemaleEvenToned"
name = "Destiny"
FormID selectors work anywhere an EditorID does:
[[npcs]]
target = "0x000A2C8E~Skyrim.esm"
face = "0x00000801~Foundation.esp"
The sex and voice fields are really meant for male-to-female housecarl-style makeovers. If the NPC can be a follower, pick a voice type that has follower dialogue.
Multiple NPCs in one TOML can be done like so:
[manifest]
name = "My First Patch"
priority = 100
api_version = 1
[[npcs]]
target = "Annekke"
face = "MyMod_NewAnnekke"
[[npcs]]
target = "AelaTheHuntress"
face = "MyMod_NewAela"
[[npcs]]
target = "NjadaStonearm"
face = "MyMod_NewNjada"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
How It WorksThe faceNPC pivot - instead of copying face data field by field, Recast points the target NPC's face slot at the source NPC and lets Skyrim's own rendering pipeline resolve head parts, hair color, tints, and morphs. This is the same mechanism the engine uses internally for bandit and guard preset faces, so Recast piggybacks on a path the game already exercises constantly. The result is a clean, predictable apply with no shared heap state between target and source.
Digest tracking - every applied recast is hashed and persisted across sessions. On the next launch, anything unchanged is skipped entirely: no re-apply, no actor refresh, no flicker. Only NPCs whose patch actually changed get a one-time 3D refresh.
Conflict resolution - when two patches target the same NPC, the higher priority wins (ties break deterministically by file name). Losing entries are logged so you always know which patch owns which NPC.
Template awareness - NPCs that inherit traits from template records (a classic silent-failure case for patchers) are handled correctly: Recast walks the template chains the same way the engine does, so what you patch is what renders.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Recast and SkyPatcherSkyPatcher and SPID are fantastic general-purpose patching frameworks that handle outfits, spells, perks, factions, keywords, stats, and much more. For all of those tasks they remain the right tool, and Recast is designed to coexist with them cleanly. Recast was built specifically for swapping the face and body of an NPC, and here is what that focus buys you:
- Focused scope - one job (face and body, plus opt-in sex, voice, and name) done correctly, instead of visuals as one feature among dozens
- The faceNPC pivot - Recast re-points the target's face slot at the source and lets the engine resolve head parts, tints, and morphs itself, the same mechanism vanilla uses for bandit and guard preset faces; nothing is field-copied, so there is no shared heap state between target and source
- Template chain awareness - NPCs that inherit their face or traits from template records are a classic silent-failure case for patchers that write fields directly; Recast walks the template chains the way the engine does, so what you patch is what renders
- Idempotent application - applying the same patch twice produces the same NPC, every time; nothing accumulates across re-applies
- Snapshot before mutation - every NPC's original values are captured before any field is touched, enabling clean restore and future hot-reload and undo features
- Steady state zero cost - a persisted digest means launches with unchanged patches do zero work: no re-apply every launch, no actor refresh, no flicker
- Patch caching - unchanged patch sets skip TOML parsing entirely on later launches; a 100-NPC library parses and applies in about 17 milliseconds
- Body matches face - the body model comes from the same source NPC as the face, so a designed look arrives as a matched pair
- Quiet, useful logs - one structured line per stage with exact file and line numbers on errors, instead of a line per field write that turns the log into a bottleneck on large libraries
- Human-readable TOML - one block per NPC with smart EditorID and FormID detection, and one-TOML-per-face packaging that FOMOD installers can toggle
- Thread-safe, leak-free apply path - all mutations happen under a single write lock, with no raw allocations handed to the engine and no state lost between applies
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CompatibilityCompatible:
- Skyrim SE, AE, and VR (one unified DLL, runtime detected)
- USSEP, AI Overhaul, and other mods that patch the same vanilla NPCs
- Follower frameworks and follower mods that share base NPC records
- SkyPatcher and SPID for everything non-visual: outfits, spells, perks, factions, keywords, stats (Recast owns face and body; they keep the rest)
- Any custom NPC mod as a face source (Foundation, Visions, Pantheon, third-party NPC packs)
- Beast-race or Orc swaps with humanoids - Khajiit, Argonian, and Orc heads have geometrically different topology, so a Nord face on a Khajiit will render visibly broken; Recast trusts the patch author and does not block it
- Running a SkyPatcher face-copy INI and a Recast patch on the same NPC at the same time - pick one owner per NPC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
For Mod AuthorsYour face source needs its own FaceGen - Recast points the target's face slot at the source and lets the engine resolve the rest, which means the engine builds the FaceGen path from the source record's plugin name and FormID:
meshes\actors\character\FaceGenData\FaceGeom\<SourcePlugin.esp>\<SourceFormID>.nif
textures\actors\character\FaceGenData\FaceTint\<SourcePlugin.esp>\<SourceFormID>.dds
Cloning an NPC record in xEdit does not copy, create, or rename FaceGen files, so a clone with no exported head will apply cleanly, log success, and render black. Export it by selecting the clone in the Creation Kit and pressing Ctrl+F4, or copy the original's NIF and DDS into a folder named for your plugin and rename both to the clone's FormID. If your face source is a full NPC mod that already ships FaceGen, there is nothing to do; point face straight at that record.
Ship patches inside your mod - place TOMLs at <YourMod>\SKSE\Plugins\Recast\Patches\<anything>.toml. Recast scans recursively, so organize subfolders however you like. One TOML per NPC keeps FOMOD installers simple: each face becomes an install-time checkbox with zero patch rebuilding.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TroubleshootingRecast says it applied, but the face is black or unchanged
This is almost always missing FaceGen on the face source, and it is the most common patch authoring mistake. Recast points the target's face slot at the source and lets Skyrim resolve the rest, so the game looks for the cached head and tint under the source's plugin name and FormID:
meshes\actors\character\FaceGenData\FaceGeom\<SourcePlugin.esp>\<SourceFormID>.nif
textures\actors\character\FaceGenData\FaceTint\<SourcePlugin.esp>\<SourceFormID>.dds
If you built your face source by cloning an NPC record into a new plugin, those files did not come with it. Copying a record in xEdit does not copy FaceGen. A new plugin plus a new FormID is a new path, and it starts out empty. Recast still reports success in this case, because every record field copied correctly, and comparing the records in xEdit looks clean too, because Head Parts, Face Tint, Face Morphs, Hair Color, Weight, and Height are all record fields. FaceGen paths are not stored in the record at all.
Fix: select the clone in the Creation Kit and press Ctrl+F4 to export FaceGen, or copy the original's .nif and .dds into a folder named for your plugin and rename both to the clone's FormID.
An NPC did not change
Check Recast.log in your SKSE log folder, normally Documents\My Games\Skyrim Special Edition\SKSE\. Recast logs what was applied, what was skipped, and why, and error lines include the exact patch file and line number that caused the problem.
"Target not found" for an EditorID that definitely exists
EditorID lookups at runtime require powerofthree's Tweaks. Install it, or switch that selector to the FormID form ("0x000A2C8E~Skyrim.esm").
The swapped face looks distorted or wrong
You are probably crossing a head-topology boundary (beast race or Orc paired with a humanoid). Recast applies it anyway by design; choose a source of a compatible race instead.
Two mods want to recast the same NPC
Working as intended: the patch with the higher priority wins and the loser is logged. Raise the priority in the patch you prefer, or delete the other TOML.
Worried about your save after uninstalling
Nothing to worry about. Recast never writes to the save; with the mod (or a patch) removed, the NPC simply renders from your load order again on the next launch.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Created by ColdSun
Developed by an engineer with 35 years of experience in the field
AI was used as an assistant to development
The DLL in this mod was signed by Microsoft through the Azure Signing Program
Source Code
Built with C++ | CommonLibSSE-NG | SKSE
Created by ColdSun
Developed by an engineer with 35 years of experience in the field
AI was used as an assistant to development
The DLL in this mod was signed by Microsoft through the Azure Signing Program
Source Code
Built with C++ | CommonLibSSE-NG | SKSE



































