Modwright Services and pricing
Field notes

What a Minecraft mod port costs, and why

Almost every quote you will get for a mod port is a number with no reasoning attached, which makes it impossible to tell a fair one from a guess. Four things actually set the price, and only one of them has anything to do with how big the mod is.

This is the model I quote from, written out in full. You can use it to sanity check my price, or anyone else's.

The thing that does not drive the price: file count

Moving registrations, item classes and recipes across is the bulk of the changed lines in most ports. It is also the safest part of the job, because the compiler refuses to build until you have finished it. Work the compiler catches is cheap work.

What costs money is the work the compiler cannot see: behaviour that silently changed between versions, a mixin that still applies but now targets the wrong thing, a registry that moved phase. So a quote built by counting files is measuring the safe sixty per cent and ignoring the risky forty.

1. Version walls, the dominant factor

Version distance is not linear. Two versions apart can be a recompile, or it can be a rewrite, depending entirely on whether the gap contains one of four structural breaks. If a port crosses one of these, the wall sets the floor no matter how small the mod is.

WallWhereWhat it does to the code
The Flattening1.12 to 1.13Numeric IDs and metadata are gone, so every block variant becomes its own block. LWJGL 2 to 3, assets restructured into data. Effectively a rewrite.
Worldgen to datapackcrossing 1.18Biomes, dimensions and structures move to JSON and codecs. Brutal for a worldgen mod, barely noticeable for a content mod.
Networking and config phasecrossing 1.20.2SimpleChannel becomes CustomPacketPayload, plus a new connection phase. This is also the line where Forge and NeoForge diverge.
Data componentscrossing 1.20.5 and 1.21Item NBT becomes DataComponentMap, with StreamCodec and Java 21. Anything that touches ItemStack data gets rewritten.

Why 1.20.1 is the cheap destination. It is the last Forge long term support version, it sits underneath every recent wall, and it still carries an enormous modpack base. A port to 1.20.1 from a neighbouring version crosses nothing, which is why it is the cheapest work on the list and the version I specialise in.

Some jumps that look large are trivial: 1.19.2 to 1.20.1, 1.20 to 1.20.1, and 1.20.2 to 1.20.4 are mostly recompiles. Some jumps that look small are not: 1.20.4 to 1.21 crosses data components.

2. Loader direction, which is not symmetric

People tend to price a loader change as one flat surcharge in either direction. That is wrong by an order of magnitude, because the six possible directions are nothing like each other.

DirectionDifficultyWhy
Fabric to ForgeHardestDifferent events and registries, different mappings, and a weaker mixin surface, so mixins get re-derived and Fabric API calls get reimplemented. Close to a rewrite.
NeoForge to FabricVery hardSame cross family wall, and nothing on the Fabric side smooths it over.
Forge to FabricHardCross family rewrite, but onto a lighter target.
Fabric to NeoForgeHardSame shape as the first row, with better tooling.
Forge to NeoForgeEasySame forked codebase. Mostly a rename.
NeoForge to ForgeEasiestThe reverse of that rename.

If you have been quoted the same premium for Forge to NeoForge as for Fabric to Forge, one of those two numbers is wrong. I wrote a separate piece on what actually breaks in a Fabric to Forge port if you want to see where the hours go.

3. What the mod touches

Effort scales by subsystem crossed with wall. Raw size barely matters. The same wall lands very differently depending on what the mod does:

This is why I ask what the mod does before I quote, rather than just how many files it has.

4. Licence, which decides whether the job exists at all

Before any of the above matters, the mod has to be legally portable. I check the LICENSE file in the source repository, not the licence field on the mod page, because the two disagree more often than you would expect and only one of them is the actual grant.

I would rather lose a job at this step than hand you something that gets taken down later.

The actual numbers

These are the base figures I price from, so this table and any quote I give agree. Everything stacks additively rather than as a chain of percentages, which is what makes it checkable.

ComponentSmallMediumLarge
Forge 1.20.1 port, base$35$65$120
Compatibility patch between two mods$25$60$130
Maintenance on an existing port$25$50$95
Performance work$45$85$150
Added on topAmount
No wall crossed$0
Moderate wall, crossing 1.20.2 networking+$25
Hard wall, crossing 1.21 data components+$60
Brutal wall, the Flattening or worldgen across 1.18+$110
Forge to NeoForge in either direction+$20
Fabric to Forge+$250
Private delivery, all rights reserved source×1.35
Priority in the queue×1.25
Top of the queue×1.5

Minimum of $20 on any job, including the one line fixes, because every job carries the same intake, licence check, build and boot test regardless of how small the change is.

The estimate is a range, and the range is honest about what it is. It is built from the mod as you describe it. The fixed price comes in writing after I have actually opened the source, and it is the number you pay. If what I find makes the job bigger than described, you get told before any work starts.

A real job, added up

Mindful Eating by camcam_burger, a food variety mod. It ran on Forge 1.20.1 and had to end up on NeoForge 1.21.1. What that actually involved:

Priced off the tables above, nothing hidden:

ComponentWhyAmount
Base, medium modmechanics plus a GUI, not just items$65
Hard wallcrosses 1.21 data components+$60
Loader changeForge to NeoForge+$20
Licence multiplierLGPL, publishable, so none applies×1
Totalthe arithmetic is additive on purpose, so you can check it$145

Being straight about this one. This job landed on my own table, with no invoice attached. I did this port for the mod's creator and handed it back to him for his official page, so nobody paid me for it. I am using it because it is a job I can describe end to end with his name on it, and a worked example you cannot verify is worth nothing.

What is not in the price

When you should not pay me at all

Three cases where this costs you nothing, and you should know them before you open a ticket.

When you do pay, what you are buying is somebody who has already hit the failures that build clean and break silently, and who checks for them before the jar leaves.

How to get a number you can trust

Whoever you hire, ask them three questions. They are cheap to ask and the answers separate people who have done this from people who are about to find out.

  1. Which walls does this port cross? If the answer is not one of the four above, they have not looked at the version pair.
  2. What is the licence, and where did you read it? The correct answer names the LICENSE file in the repository.
  3. How will you know it works? Compiling is not evidence. The answer should involve the mod loaded in an actual game.

Want the number for your mod? Tell me the version pair, the loader direction, the rough size and the licence, and I'll give you a range.

Price my port on Discord

Written by danisansietev, Forge 1.20.1 mod porting. Last updated August 2026. Questions, corrections or a mod you need moved: open a ticket on my Discord.