
A prerequisite mod for Drag'n Wash (BepInEx 5). It's a small core that keeps the code that hooks into the game in one place, and gives other mods, and the libraries built on top of it, a stable API to work with:
- a Mods screen you open from the game's Options screen (like Minecraft Forge's mod list, with on/off switches)
- settings in the game's Options screen
- text and dialogue events
- asset loading that's safe on Direct3D 12
- and more
So when the game updates, only the framework has to catch up.
Note
1.6.0 is the latest release. Releases below says what changed in each version, and CHANGELOG.md has every detail. What's coming next is in docs/ROADMAP.md.
| To... | Read |
|---|---|
| Play with mods, get started, or look up a library | The wiki, with a page for players, a getting-started walkthrough and a reference page for each library |
| Build a mod on it | Playing well with others (wiki) |
| Know the goals and the order of work | docs/DESIGN.md |
| See which game builds it was checked on | docs/GAME_BUILDS.md |
| Plugin | GUID | What mods get |
|---|---|---|
| Drag'n Wash ModFramework (core) | com.tomxv.dragnwash.modframework |
The Mods screen with on/off switches, settings pages and icons (ModFramework.Register), rows in the game's Options screen (GameOptions), a service registry (Services), health checks (GameHooks), GameInfo |
| Text | com.tomxv.dragnwash.modframework.text |
See and replace every text before the game shows it (GameText) |
| Dialogue | com.tomxv.dragnwash.modframework.dialogue |
The line of dialogue or option about to be shown, with line ID, speaker and node (GameDialogue) |
| Tool window | com.tomxv.dragnwash.modframework.toolwindow |
One shared F1 window for developer tools, off until Developer tools is turned on in Options → Mods, where each mod adds tabs (ToolWindow) |
| Assets | com.tomxv.dragnwash.modframework.assets |
Fonts for any language and texture and asset bundle loading, without the Direct3D 12 crash (GameFonts, GameAssets) |
| Flags and saves | com.tomxv.dragnwash.modframework.saves |
Save slots, flags and a history of every save (GameSaves, GameFlags) |
| Inspector (experimental) | com.tomxv.dragnwash.modframework.inspector |
An Inspector tab in the F1 window: every loaded scene and object, their components and values, the game's code, and every loaded object by kind (Inspector) |
| Overrides (experimental) | com.tomxv.dragnwash.modframework.overrides |
Runs mods that have no code: a folder of values to change in the game, made with the Inspector (Overrides) |
| Bridge (experimental) | com.tomxv.dragnwash.modframework.bridge |
Offers the read operations to AI clients on this computer over MCP, and serves the code graph's page. Off by default (Bridge) |
| Graphs (experimental) | com.tomxv.dragnwash.modframework.graphs |
Runs mods with no code that do things: when this happens, do these things, made on the Bridge's page (Graphs) |
Each library is a plugin of its own with its own version, so install the ones your mods need. The versions are in CHANGELOG.md.
From core 1.1.0, the framework lets you know on the Mods screen and the title screen when a mod you've installed has a newer release.
It only checks mods that name their GitHub repository, and each of them at most once a day. It asks GitHub's public API (api.github.com) for the repository's latest release and sends nothing about you, your game or your other mods. GitHub does see your IP address, the same as with any web page.
Nothing gets downloaded or installed. The Mods screen just opens the release page for you.
To switch it off, open Options → Mods → Drag'n Wash ModFramework → Settings and set Check for updates to Off, or set Check for updates = false in BepInEx/config/com.tomxv.dragnwash.modframework.cfg.
From 1.0.0 on, a change that breaks the public API only ever comes with a new major version. Every change is in CHANGELOG.md.
-
1.6.0: a launcher before the game.
Launcher.exeruns from Steam's launch options and brings mods up to date before you play; Update now on the Mods screen does it from inside the game. The installer's window is rebuilt to match, and the F1 window draws its text on macOS. -
1.5.0: a whole new look. The Mods screen is rebuilt on frosted glass, every tab of the F1 window got a going-over, starts are faster, and the installer fetches ModFramework from its own release. From 1.5.0 on, the core and every library share one version number.
-
1.4.3: the Bridge tab gets Open page and Graphs buttons, so the editor is one press away.
-
1.4.2: a graph that answers a key now tells you which other mods answer it too (
ModFramework.WhoElseUses). -
1.4.1: Graphs 0.1.0, mods with no code that do things (when this happens, do these things). It comes with:
- the first write operations
- an editor of blocks and nodes on the Bridge's page
- what a graph changes listed on the Mods screen, put back when it stops and named when two mods change one value
The core and the preloader patcher go to 1.4.1; Overrides to 0.1.1, the Bridge to 0.1.1 and the Inspector to 1.1.1. The Inspector's History now lists what other mods change too.
-
1.4.0:
- mods with no code (Overrides, a folder of values to change, made with the Inspector)
- an operations registry where every library registers what it can do
- the Bridge, which offers the read operations to AI clients on this computer over MCP
- the code graph
- in the Inspector: an object explorer, Animators, Rigidbodies, and scenes and levels
The core and the preloader patcher go to 1.4.0; the Tool window and Dialogue to 1.2.0; Text, Flags and saves and the Inspector to 1.1.0; Assets to 1.2.0. Everything new is experimental.
-
1.3.0:
- crash reports, with a window outside the game that says what happened
- the fix for the Direct3D 12 crash they found (font atlas uploads batched to once per frame)
GameOptions.AddSlider
The Tool window and Assets go to 1.1.1.
-
1.2.1: the Saves tab finds saves made after the game update of September 14, 2026 again.
-
1.2.0 (core):
- the developer-tools switch (off by default)
- text and key-binding fields on the settings pages
GameEventsandSettingMeta- reloading a mod while the game runs
- mods that go online say so
Along with it, the Tool window, Assets and Dialogue libraries go to 1.1.0 (Console, texture replacements and reloading, stable line keys), and there's a new Inspector library (1.0.0). The new features are marked experimental, and the Inspector is staying experimental.
-
1.1.2: the framework's icon is now the "Dg" monogram from the hand-made logo.
-
1.1.1: the framework gets its icon.
-
1.1.0: update notices, the shared installer, and uninstalling from the Mods screen.
-
1.0.0: released alongside Drag'n Wash Localization v1.0.0, the first mod built on it.
Reference DragNWash.ModFramework.dll (plus the library DLLs you use) and declare each one as a dependency so BepInEx loads them first.
- What to use for what, and the rules that keep mods working together, are in Playing well with others (wiki).
- To give players a one-click install, ship the shared installer with a
mod-install.json. Installer (wiki) explains how.
[BepInPlugin("com.example.mymod", "MyMod", "1.0.0")]
[BepInDependency(ModFramework.Guid, BepInDependency.DependencyFlags.HardDependency)]
public class MyMod : BaseUnityPlugin
{
private void Awake()
{
ModFramework.Ready += () =>
{
if (GameInfo.IsDirect3D12)
{
// Load fonts and textures now, not later.
}
};
}
}-
Install the .NET SDK and have BepInEx 5.4.23.5 installed in the game.
-
Copy the reference assemblies from your own game install (they never get committed):
pwsh tools/copy-libs.ps1
Pass
-GamePathif the game isn't in the default Steam library. -
Build the core, the preloader patcher and the libraries:
dotnet build src/DragNWash.ModFramework/DragNWash.ModFramework.csproj -c Release
and the same for each
src/DragNWash.ModFramework.*project.
Tip
If you have Docker, docker compose run --rm checks runs every check CI runs and docker compose run --rm build builds the core and the libraries, both in the image CI uses (docs/DOCKER.md). Nothing gets installed on your machine.
Each DLL ends up in its project's bin/Release/. To try them out:
- copy each plugin DLL to its own folder,
<Game>/BepInEx/plugins/<assembly name>/ - copy
DragNWash.ModFramework.Preloader.dllto<Game>/BepInEx/patchers/
The Build workflow (Actions) builds the release zip on GitHub. It runs on every push to main, on a v* tag, or when you start it by hand. It never runs for pull requests, so a fork can't get at the token.
It fetches the reference assemblies from a private repository (TomXV/dragnwash-libs, which is never made public) using the LIBS_TOKEN secret, runs tools/pack.ps1 on a Windows runner and uploads release/DragNWash.ModFramework-<version>.zip as a workflow artifact. On a tag it also creates a draft release with the zip attached, and a person writes the notes and publishes it.
After a game update, refresh the private repository from a game install with tools/copy-libs.ps1.
- Never commit the game's files, BepInEx binaries or anything from
libs/. A check on every push and pull request makes sure of it. - Material from the game follows docs/CONTENT_POLICY.md. Something made by hand or changed into something new is fine, but the game's data unchanged isn't.
- Code that touches game classes stays
internal; mods only see the framework's own types.
- If you'd like to contribute, CONTRIBUTING.md covers how to set up, what the rules above mean in practice, and what to put in a pull request.
- The code of conduct is in CODE_OF_CONDUCT.md.
- Please report a security vulnerability privately instead of in an issue. SECURITY.md says how.
- If you want to and can, you can sponsor the project on GitHub Sponsors. The framework is free and stays free either way.
This is an unofficial fan project and isn't affiliated with Gator Dragon Games. It doesn't contain any of the game's assets or code as they are (see docs/CONTENT_POLICY.md), and it doesn't modify the game's files, since BepInEx loads it at runtime.
If the development team has any concerns, please open an issue or contact the maintainer, and it'll be changed or taken down.
- The logo above and the framework's icon on the Mods screen were drawn by NotaGames (@NotaGames) based on the game's own logo, and the game's developers said that's fine (#15). They're used with permission and aren't covered by the MIT license below.
- The Mods button in the Options screen (
ModsButton0.png,ModsButton1.png) was drawn for the framework by Mister ERIO (@mistererio) and is used with permission. It's their own artwork and doesn't come from the game, so it isn't covered by the MIT license below.