Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MinecraftModSync

Are you irritated of prompts every-now-and-then that ask you to update XYZ mod when you launch minecraft??
Oh yeah, me too.
So I wrote this simple node program that does the job for you. It will download the latest mods in one click.

Easily download the latest mods from Modrinth & CurseForge for specified game version and loader (in my case, fabric).

New Features and Updates (v-2.2.0)

  • Now supports separate collection IDs for client and server mods in Modrinth.

  • Automatically downloads mods into separate folders for client and server environments.

Key Notes:

  • You need to manually create new collection and assign server mods to that collection.
  • Client collection can still be auto updated with npm run update based on followed projects
  • Defaults to the client collection ID for scripts unless otherwise specified.

Changes to ModsConfig.json file

  • modrinthCollectionId now accepts separate collection id for client and server mods

    "modrinthCollectionId": {
    "client": "<insert Client-side mods collection ID>",
    "server": "<insert Server-side mods collection ID>"
    }

Technical Changes

  • npm run check now lists the mods sorted alphabetically.
  • Refactored code to use async await wherever possible.
  • Separated the download file logic into its own dedicated module to improve code organization.

New Features and Updates (v-2.1.0)

Support for Modrinth Collections is finally here

  • Say goodbye to manual list updates!

With Modrinth adding collections ( & making life easier),

  • you only need to maintain the public collection from where you want to download the mods.
  • no hassle of manually updating the mods list in config file.

Changes to ModsConfig.json file

  • Addition of two new fields

    "modrinthUserId": "<instert your user id here>",
    "modrinthCollectionId": "<insert (public) collection id here>",
  • Note:

    • After adding userId & CollectionId renameModsConfig_example.json to ModsConfig.json

Added NPM scripts

  • So you feel you're a wizard when you:

    npm run download

    hope you guessed it, it downloads the mods
    - if public collection defined in config && collection valid
    - downloads the mods in the public collection
    - else
    - if user id defined in config && valid api key in .env
    - downloads the mods in the followed projects
    rest all cases, may the node be with you
    

    npm run check

    - Lists down the available and not available mods for the game version defined in ModsConfig
    - Some mods might take quite some time to get updated to latest version of MC
    - helpful if you just want to "check" which mods are available & not available when a new version is dropped eg 1.20.5, 1.21 etc
    
  • You feel its a chore adding the followed projects (private) to the public collection

    npm run update

    [requires api key]
    updates your public collection from your followed projects (private collection)
    
  • You feel like the modern way isn't for you and you want to live the old life:

    npm run list

    - it lists down the mods in the same format as requied in config file so you can download mods via legacy way
    

    npm run legacy

    - for backwards compatibility
    

Usage

  1. ModsConfig.json is the configuration file:

    • It defines game version, loader and list of mods.
    • Mod_Name is just a place holder and can be named anything you want.
    • Project_ID must be correct. Visit Modrinth to get the project id of the mod.

    Add more mods as required. Do not forget to add "," after every "}" when adding a new mods to list.
    Use below json structure
    {
    "Mod_Name": <name>,
    "Project_ID": <id>
    }
    

    Here is the sample attached - Seprate list maintained for modrinth and Curseforge mods.

    {
    "gameVersion": "1.20.1",
    "loader": "fabric",
    "modsList_Modrinth": [
    {
    "Mod_Name": "Fabric API",
    "Project_ID": "P7dR8mSH"
    },
    {
    "Mod_Name": "Sodium",
    "Project_ID": "AANobbMI"
    },
    {
    "Mod_Name": "Lithium",
    "Project_ID": "gvQqBUqZ"
    }
    ],
    "modsList_CurseForge": [
    {
    "Mod_Name": "Litematica",
    "Project_ID": "308892"
    }
    ]
    }

  2. Create a .env file to define your API KEYS.

  • CurseForge and Modrinth required API KEY.

  • Modrinth requires api key only for followed mods- if you have public collection, feel free to skip

    CF_API_KEY=<api-key>
    MODRINTH_API_KEY=<api-key>
    
  1. Run the tool with the configuration file as an argument:

    npm run <script_name>
    

  2. The tool will download the latest mod specified in the ModsConfig.json. directly from your modrinth collection / followed mods.

No longer need to define manually

Why it needs to be defined Manually?

Ahhh.. coz I am Lazy & didn't want to implement a complex mod manager like system.
This is for those who use only a specifc set of mods and don't need to change it often.
In this case it becomes very easy to manually keep track of required mods.

Wondering how lazy am I? Uhmm... this Lazy

Still Lazy enough to not implement:

  • Other loaders for curseforge

    • Curseforge is kinda dead now, majority have moved to modrinth

      letloaderType=loader==="fabric" ? 4 : 1;
  • Limited Error Handling

    • to avoid over complications in code
    • avoid crazy development time
    • This is supposed to be a simple quick hack program for downloading mods in 1 command

For the nerds out you there

get follows response from network tab for modrinth followed mods Then use below code to get the array list to avoid manually configuring the list

res=follows.filter(o=>o.project_type==="mod").map(({ id, slug })=>({Mod_Name: slug,Project_ID: id}));


Image for Reference

Contributions

Suggestions / Contributions are welcome! Feel free to open issues or pull requests for improvements or bug fixes.

License

This project is licensed under the MIT

Acknowledgments

  • This project utilizes the Modrinth & CurseForge API to retrieve mod information and download links.

About

Easily download the latest mods from Modrinth for a specific game version and loader. Now supports modrinth collections. & added script to list down mods available / not available for specified game version

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages