Modwright Studios

Ports, backports and compatibility for modded Minecraft

Open for work

That mod missing from your version can come back.

I'm danisansietev, founder of Modwright.

I port and adapt mods between Forge, Fabric and NeoForge, mostly around Forge 1.20.1.

Send me the mod and tell me where you want to run it. Not sure the port is doable? That's fine, checking that is my job.

Quotes are free · Everything in writing

danisansietev
Criss
Nightwhitey
Kema

The rest of the art around the page is from the same world. Criss plays the ports and shows them around; Nightwhitey codes and draws with me.

Pixel-art banner of the Modwright community: the guinea pig in work overalls holding a wrench, a flying moth, a grass block shaped like the Discord logo, and the hedgehog in a lab coat holding a book.

Modded Minecraft community

Join the Discord

Same mod, your version

Your pack keeps the mod instead of losing it to a version jump.

Moving a mod between loaders Fabric, NeoForge and Forge, each joined to the other two, with arrows pointing both ways. Fabric NeoForge Forge

Between Forge, Fabric and NeoForge.

Fabric to Forge is the longest road, and it's the one I take most.

Real work

Some of the mods I've already ported. When the work is public, I always link to the original project.

LGPL-2.1 NeoForge 1.21.1
Live on CurseForge

Mindful Eating

Open on CurseForge →

camcam_burger's food-variety mod, taken from Forge 1.20.1 to NeoForge 1.21.1. I handed it to its creator, and it's live on the mod's official page.

Jump
1.20.1 → 1.21.1
Loader
Forge → NeoForge
Library mods
Cut from 2 to 1
Tested
In-game, survival
Technical detail

Rebuilt the per-player data system on native data attachments, dropping the Blueprint dependency at the creator's suggestion, and moved the food-stat tweaks to the 1.21 component system. Boot-tested in-game, in survival.

All rights reserved Forge 1.20.1 NeoForge 1.21.1
Reviewed by its creator

Puppy Paws

Open on CurseForge →

Shaunt and Café's companion-dog mod, moved from Fabric to Forge. Its code wasn't public, so I rebuilt it from the released jar. Later I made the NeoForge 1.21.1 version the same way.

Loader
Fabric → Forge
Version
1.20.1, unchanged
Source
Rebuilt from the jar
Tested
Dedicated server
Open the poster celebrating 1,000 Forge downloads of Puppy Paws

1,000+ downloads on ForgeCounted on CurseForge →

Technical detail

Five breeds, twelve coat variants, the golden retriever's digging behaviour and the Melody disc, all rebuilt on Forge registries and events, with spawns moved to data-driven biome modifiers. I diffed the rebuild back against the original jar, boot-tested it on a dedicated server, and its creators reviewed the result.

Later, a NeoForge 1.21.1 port on GeckoLib 4.8.3: same models, textures and behaviour, rebuilt on NeoForge's registries instead of Forge's. Boot-tested, and every class and asset checked byte-for-byte against the tested build.

Your mod could be next
Get a quote

It compiles. That proves nothing. Before I deliver, I test the mod in-game and check the parts that could actually break during the port. One of those checks, in detail.

Everything else I’ve worked on

Ports, fixes and compatibility work, most of it for my own 600+ mod pack. Where the original is public, the tile takes you to it.

Ports

Not published yet. To publish a port I need a licence that allows it, or the author’s permission.

Fixes

Other people’s mods that I patched so they run in my pack: crashes, lag and conflicts. The patch stays in my pack; the mod is still theirs.

Compatibility

Small mods of mine whose only job is to make other mods work together.

Built for my pack

Code I wrote for the pack. The ones split off from someone else’s mod say where they come from.

  • Worldgen Deadlock FixFixes MC-246262, a world load that hangs forever
  • SpawnCapModerate mob caps and a thread-safe world random
  • Pack FixesFixes that span the whole pack
  • Biome PigeonCreature Corner pigeons coloured by biome
  • Primal Wild WolfPyrologer's wild wolf wearing Primal's model
  • Hunter VillagerFrom Pyrologer & Friends 1.19.2
  • PumpkineerFrom Pyrologer & Friends 1.19.2
  • RancherFrom Pyrologer & Friends 1.19.2
  • Ambush MobsFrom Pyrologer & Friends 1.19.2
  • Pyrologer Bosses AddonAn addon for Pyrologer & Friends
  • TortoiseSplit off from No Man's Land, by FarCr

Every mod and every logo here belongs to whoever wrote it, shown to identify their work.

Ports, backports and loader changes

If you want to know how I price a port, I explain it in what a port costs, and why.

Ports and backports

Moving a mod to another Minecraft version, forward or back, keeping it as close as possible to how the original behaves.

Loader changes

Adapting a mod between Forge, Fabric and NeoForge when a pack needs a different platform.

Compatibility and crashes

Finding why two mods clash, why something stopped loading, or what is breaking one specific feature.

Maintenance and performance

Fixing existing ports, dependency changes and performance problems when the cause is in the mod or in how it fits into the pack.

Your case doesn't fit any of these? Send it anyway and I'll tell you if it can be done.

Set up your ticket

Fill in what you know and paste the summary into #pedidos on Discord. Leave blank anything you don't know.

Are you the author, or do you have permission?
Ready to send
Copy & open Discord
Once you're in, go to #pedidos: that's where tickets start.

How a job works

All in writing. No calls and no meetings.

01

Send me the mod

Send me the link or the file and tell me what you need. That's enough for me to start looking at it.

02

I review it and give you a price

I check whether the job is doable and which permission or licence applies. Then I tell you what's included, what it costs and roughly how long it should take.

03

We agree and I start

We put the scope, the price and the payment terms in writing. Bigger jobs can be split into stages.

04

I port it and test it

I do the work on the version and setup we agreed. I don't stop at it compiling: I launch it and test the parts that matter.

05

You try it

You see the build running in your own pack or server. If something within what we agreed isn't right, I fix it before we close the job.

06

If something of mine breaks, I fix it

For 30 days I fix, at no cost, any bug I introduced within the agreed scope and setup. If you need something new after that, we handle it separately.

Two pixel-art mascots on wooden nameplates: a guinea pig with a moustache holding crackling electricity, labelled Nikola Tesla, and a hedgehog in a lab coat holding a galaxy, labelled Einstein.

Who's behind Modwright

I'm danisansietev. Right now, if you open a ticket with me, the person talking to you is also the one who reviews and works on the mod.

Close view of my character in a red and gold armour set with glowing green trim, standing in a field of purple flowers.

I started porting mods for my own modpacks, because I was tired of losing them every time I changed version. Over time I ended up doing the same for other people.

I work mostly with Forge 1.20.1, and I keep a big pack where I test compatibility. That's where I run into a lot of the odd problems you'll see in the lab below.

Modwright brand illustration in pixel art: a guinea pig in work overalls holding a wrench, and a hedgehog in a lab coat holding a book labelled mappings, APIs and logs, next to a checklist reading analyze, adapt, test, fix, repeat. Below them, the Modwright wordmark and the line: build it, port it, keep it alive.

Thank you

Modwright is growing. Nightwhitey helps me with development and technical decisions, Criss with content and getting the word out, and there are more people who test what I make and tell me when something isn't right. And before any of them, the authors who wrote these mods and let me near their work.

Things that break in a 600+ mod pack

I keep a huge test pack on my own. It's where I test compatibility, and where I keep running into bugs that almost never show up while a mod lives on its own.

Seven mods with no spawns

Seven mods loaded fine. Their mobs never showed up. All seven had the same misspelled folder: biome_modifier instead of biome_modifiers. Forge skipped it without a useful error. One letter was keeping seven mods from spawning anything.

Technical detail

Forge reads biome modifiers from a folder called biome_modifiers. Seven mods in my pack had the singular, biome_modifier, so Forge quietly skipped the whole folder: no warning, no error. It looks exactly like a broken mod. It's one missing letter.

Mutant More, written off as a rewrite

It had been out of my pack for weeks because it crashed on load, and the working theory was that it needed rewriting. It didn't. Its mixin config said JAVA_16 while its 577 classes were compiled for Java 17, so the mixin loader rejected every one of them. I changed that one word in my own copy, after checking in the Mixin library itself that JAVA_17 was a value it would accept.

Technical detail

Mutant More had been sitting out of my pack for weeks, crashing on load. The previous read was that its bytecode would have to be rewritten. It did not. Its mixin config declared compatibilityLevel: "JAVA_16" while all 577 of its classes were compiled as Java 17, so the mixin loader refused every one of them. Java 16 caps at class version 60; the classes were 61.

JAVA_16 became JAVA_17. Before touching it I opened mixin-0.8.5.jar, the version Forge 1.20.1 loads, and read its CompatibilityLevel enum to confirm JAVA_17 was a value it would actually accept, rather than assuming. Original jar backed up first, then repacked.

Mutant More is by AlexandersFunAndGames. That config line was the only thing I touched, and only in my own copy.

Fresh Animations on the mobs, Epic Fight on the player

Everything was set up right and Epic Fight kept winning anyway. Half the fix was a datapack that never loaded: it was missing its pack.mcmeta, and the log said nothing. The other half I found by reading how Epic Fight handles its renderers.

Technical detail

Fresh Animations on almost every creature, Epic Fight on my character alone. Taking a mob off Epic Fight takes two changes: a datapack entry stops its combat patch, but the mob still draws through its own renderer, so Fresh Animations never gets a look in. The other half is a script that pulls the mob out of that renderer map on world load. I found the split by decompiling the render engine.

The half that hid the longest. It was missing its pack.mcmeta, so the loader skipped the whole folder without a word. Both halves now name the same 24 mobs, and they still match today.

Fresh Animations is by FreshLX, Epic Fight by its own team. All I did was make them share a world.

More from the lab

I checked which mods animate themselves

48% of their creatures were already animated. They never needed Fresh Animations at all. I checked 645 jars instead of guessing.

The numbers

Fresh Animations does nothing for a mod that already animates its own creatures. Between GeckoLib, AzureLib and Citadel: 305 mods, 3,951 creatures. The scan turned an open-ended job into a short list.

I read 414 jars before letting one of them into my pack

Sixty-seven contradicted my own notes. Eight could never have loaded at all. I only found out by opening every single one.

What was actually inside them

I keep a store of mods I might want one day. Nothing goes from there into the pack until it has been read: the metadata, the loader it was built for, the version it targets, and whether anything already installed collides with it. 414 candidates went through that and came out sorted into 103 ready to go in, 192 in due course, 44 that needed a decision, and 75 on hold behind a missing dependency or ruled out on purpose.

Eight of them were never going to load. Three had no mods.toml, which means they were not mods at all. Three carried malformed JSON. One was a NeoForge build and one was compiled for a different Minecraft version. Every one of them sat in that folder looking exactly like a working mod, and my own spreadsheet said they were fine.

Six mods whose only job was making other mods get along

I wrote all six. Then I deleted all six. Five of their names still live inside the mod that absorbed them, on purpose.

Why the names stayed

Making a pack behave means writing glue: spawn entries, tags, recipes and loot that teach one mod about another. Mine had grown into six separate add-on jars that did nothing on their own. Six more entries in the mod list, six things to keep in step, and two of them shipped the same file path, so which one won was decided fresh on every launch. I folded all six into the two mods I already owned and deleted the jars.

I did not rename a single file. Data loads from the jar that carries it, not from the mod whose name is on the folder, so paths like omega_ssg_compat and omega_toasty_compat still sit inside a mod none of them belongs to any more. Renaming them would have meant touching every reference for no gain. It reads wrong and the game does not care.

Did you write the mod?

Sometimes I port mods for free for their original authors.

You get
  • The port, at no cost.
  • The project stays yours: your page, your licence and your downloads.
I ask for
  • Permission to show the work in the Modwright portfolio, and to be credited for the port.

It has to be your mod, or your team's with everyone's yes. I can't take every mod: it depends on its size and on the time I have free. Mindful Eating and Puppy Paws started this way.

My character standing on open grassland beside a large pale horned cow, with slimes in the distance.

Got a mod in mind?

Send me the link, the version you have and where you want to take it. Not sure it's doable? Doesn't matter. That's what I check.

My character hanging in the air above an open sea, with the sun going down behind him.