Modwright Studios

Ports, backports and compatibility for modded Minecraft

Open for work

Port, backport & revive Minecraft mods, any version, any loader

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 moth flying over a grass block shaped like the Discord logo.

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 →
Port notes →

Forge 1.20.1 → NeoForge 1.21.1

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. I wrote down what broke quietly going to NeoForge 1.21.1.

All rights reserved Forge 1.20.1 NeoForge 1.21.1
Reviewed by its creator

Puppy Paws

Open on CurseForge →

Fabric 1.20.1 → Forge 1.20.1

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.

CC BY-NC-SA 4.0 Forge 1.20.1
Free, code on GitHub

Gipples Galore

Open on CurseForge →
Port notes →

Fabric 1.20.1 → Forge 1.20.1

Team Jelly's cave creature mod, moved from Fabric to Forge 1.20.1. I published it free and credited, and anyone can read the code of the port.

Loader
Fabric → Forge
Version
1.20.1, unchanged
Tested
Server and client
Technical detail

48 classes moved onto Forge registry events, with spawns as biome modifiers and the extra loot through LootTableLoadEvent. I also fixed a block model that pointed at a missing texture, a bug the Fabric original has too. On a dedicated server, natural colonies generate in new chunks and the gelatin shows up in ancient city loot. In the client I checked all 17 jellies and their effects. Version 1.0.1 fixes a crash when Galosphere is installed too. I wrote down what usually breaks going from Fabric to Forge.

MIT Forge 1.20.1
Free, code on GitHub

Quartz Elevator

Open on CurseForge →
Port notes →

Fabric 1.20.4 → Forge 1.20.1

Aton-Kish's quartz elevators, taken from Fabric 1.20.4 back to Forge 1.20.1. Free, credited, and the code is on GitHub.

Loader
Fabric → Forge
Version
1.20.4 → 1.20.1
Tested
Server and client
Technical detail

The settings moved from Auto Config to a Forge config file, with the same five options. Slimes don't fire Forge's jump event, so I kept the original mixins instead of switching to it. On a dedicated server and in the client I tested going up and down, both elevator types, the four recipes and reopening a saved world.

MIT Forge 1.20.1
Free on CurseForge

Expanded Delight

Open on CurseForge →
Port notes →

Fabric 1.20.1 → Forge 1.20.1

ianm1647's addon for Farmer's Delight, moved from Fabric to Forge 1.20.1. The original never had a Forge version there, and people kept asking for one in its comments.

Loader
Fabric → Forge
Version
1.20.1, unchanged
Bugs fixed
3 from the original
Tested
Server and client
Technical detail

I fixed three bugs the original 0.3.2 also has. The cinnamon sapling had no model, neither did the cinnamon log placed sideways, and the sapling never grew. Recipe and loot tags now use the Forge ones. In the client I used the mortar and the juicer, grew and harvested asparagus and reopened the world. I still haven't found a cinnamon tree in the jungles I checked.

Your mod could be next
Get a quote

Everything I've published is on my CurseForge profile, and part of the code is on GitHub.

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.

Private commissions

Most paid work stays private: the files and the client’s name are theirs. What I can tell you is that since September I’ve done three jobs for the owner of a Forge 1.20.1 pack with almost 600 mods.

  • A spell addon taken from NeoForge 1.21.1 to Forge 1.20.1. It started at 724 compile errors. Once it built, the dedicated server turned up six more problems that reading the code hadn’t, and I fixed them before delivery. One bug that showed up after delivery I fixed for free.
  • A compatibility resource pack between two mods in his pack, keeping the GPLv3 licence and credit of the pack it builds on.
  • An addon so a movement and combat mod gets along with his stamina and animation mods, with a switch for each move.
Part of that third job, delivered this week: with the addon, Recrafted Moves keeps its own poses in third person when you climb, throw, guard or glide, while Serious Player Animations and Better Combat handle the rest. Recrafted Moves is by DudGames, and the addon only works alongside it.

Private work for my own pack

Ports, fixes and compatibility I made for my own 600+ mod pack. Most of those licences don’t let me publish a port, so they stay private and you won’t find me on the mods’ pages. Each tile links to the original mod and its author. If you want to see one working, ask me on Discord and I’ll show you a screenshot from my pack.

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, copy the summary, then open a private ticket from #pedidos on Discord. Paste it inside your ticket. Leave blank anything you don't know.

Are you the author, or do you have permission?
Ready to send

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.

Step 1

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.

Step 2

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.

Step 3

We agree and I start

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

Step 4

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. On longer jobs I send you screenshots or a short video as it comes along.

Step 5

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. The final payment comes after that, once you've seen it working.

Step 6

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.

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.

Sheet danisansietev

Main loader
Forge 1.20.1
Test pack
600+ mods
On the shelf
74 jobs
Languages
Spanish, English

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.

Workshop log

LOG // danisansietev

  • <danisansietev>

    Gave the site a pass. The shelf has a search box now, and if the mod you want isn’t there, ask me for it.

  • <danisansietev>

    Gipples Galore is on Forge 1.20.1 now, free and with the code on GitHub.

  • <danisansietev>

    The Discord hit 66 members and there’s a channel to request ports. At 100 I port the winning one for free.

  • <danisansietev>

    Mindful Eating is on NeoForge 1.21.1. I ported it with camcam_burger’s permission and it’s on the official page.

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.

The Modwright Discord server icon: a grass block cut in the shape of the Discord logo, over a Minecraft sunset.Join the server
My character hanging in the air above an open sea, with the sun going down behind him.