Skip to main content

A small, plugin-driven, declarative modpack builder,

Project description

Redneck


Redneck is a small modpack build tool for people who want to write their pack definition by hand.

You describe the pack in YAML, split mods into groups, and compile the result into a release artifact such as a Modrinth .mrpack.

Redneck is currently focused on one thing: turning a curated YAML recipe into a buildable modpack artifact.

It is aimed at the authoring side: keeping the pack definition readable, reviewable, and easy to split into variants.

Why use this?

Use redneck when you want:

  • one source tree that can build different pack editions
  • simple hand-written mod declarations
  • groups such as base, qol, performance, server, or visuals
  • a generated .mrpack instead of a hand-assembled archive
  • a quick check that declared mods still match your pack loader and Minecraft version

Do not use redneck if you want a mature pack deployment workflow, installer support, hosting, automatic updates, or full packwiz feature parity. Redneck is much smaller than that.

Installation

pip install redneck

Redneck requires Python 3.12 or newer.

Project layout

A typical redneck project looks like this:

my-pack/
├─ pack.yml
├─ mods/
│  ├─ base.yml
│  ├─ performance.yml
│  └─ qol.yml
└─ config/
   └─ example.toml

pack.yml describes the pack itself.

Files in mods/ describe the mods that can be included in the pack.

Folder like config/ are usually written in the builder config. They are included into the pack, like overrides.

Quick start

Create a new project:

redneck init

This creates a basic pack.yml and project structure.

Then add a mod declaration under mods/:

- load: modrinth
  id: ferrite-core
  project: ferrite-core
  version: 7.0.3-neoforge

Build a Modrinth pack:

redneck build mrpack

The output will be written to the build directory.

pack.yml

Example:

pack:
  id: "nedoserver"
  name: "Nedoserver"
  version: "2.0.0"

versions:
  minecraft: "1.21.1"
  neoforge: "21.1.225"

builders:
  mrpack:
    include_files:
      - "./config/**"

Mod declarations

A basic Modrinth declaration looks like this:

- load: modrinth   # resolver to use  
  id: ferrite-core # local identifier inside this pack
  project: ferrite-core
  version: 7.0.3-neoforge

id is the name redneck uses internally. It should be stable and unique inside your pack.

project and version identify the Modrinth project/version to resolve.

Groups

Every mod belongs to a group.

If no group is specified, the mod belongs to base.

The base group is always included.

- load: modrinth
  id: create
  project: create
  version: mc1.21.1-6.0.9
  # group: base <- hey, it's default as-is! 

- load: modrinth
  id: jade
  project: jade
  version: 15.10.5+neoforge
  group: qol

- load: modrinth
  id: ferrite-core
  project: ferrite-core
  version: 7.0.3-neoforge
  group: performance

Build only the base pack:

redneck build mrpack

Build the base pack plus QoL & performance:

redneck build mrpack -g qol,performance

This lets one source tree produce multiple related packs.

For example:

# Minimal pack
redneck build mrpack

# Normal client pack
redneck build mrpack -g qol,performance

# Heavier client pack
redneck build mrpack -g qol,performance,visuals

# Server-oriented pack
redneck build mrpack -g server,performance

Example: splitting a pack by intent

Instead of keeping every mod in one large file, you can split declarations by purpose.

mods/base.yml:

- load: modrinth
  id: create
  project: create
  version: mc1.21.1-6.0.9

mods/performance.yml:

- load: modrinth
  id: ferrite-core
  project: ferrite-core
  version: 7.0.3-neoforge
  group: performance

mods/qol.yml:

- load: modrinth
  id: jade
  project: jade
  version: 15.10.5+neoforge
  group: qol

Then build different editions from the same source:

redneck build mrpack
redneck build mrpack -g performance
redneck build mrpack -g performance,qol

Checking the pack

Run:

redneck check

This checks the pack definition and asks available plugins to validate what they can.

For Modrinth declarations, redneck can warn when a selected version does not appear to match the configured Minecraft version or loader.

Example output may look like:

warning: stupid-platform-dependent-ium may not support loader neoforge
warning: some-mod may not support Minecraft 1.21.1

check is not a replacement for launching the pack. It is a fast sanity check before building or publishing.

Plugins

Redneck has an internal plugin system, inspired by beets.

Built-in plugins live in the redplug package. They are loaded at startup and register resolvers, builders, and checks with redneck.

Today, the best way to write a plugin is to reference one of the bundled plugins:

  • redplug/modrinth.py resolves Modrinth declarations and builds .mrpack files
  • redplug/modlist.py generates a simple mod list

A tiny build-target plugin looks like this:

from pathlib import Path
from typing import override
from redneck import plugins, builder

class ModCountPlugin(plugins.RedneckPlugin):
    def __init__(self):
        super().__init__()
        plugins.register_builder("modcount", ModCountBuilder())

class ModCountBuilder(builder.ModpackBuilder):
    @override
    def build(self, proj: builder.ResolvedProject, root: Path, options: None) -> Path:
        out = root / ".redneck" / "build" / "modcount.txt"
        out.write_text(f"{proj.meta.pack.name} includes {len(proj.mods)} mods.\n")
        return out

Place the plugin into your packages, into the redplug namespace, the target can be built with:

redneck build modcount

Build targets

Build a Modrinth .mrpack:

redneck build mrpack

Build with groups:

redneck build mrpack -g qol,performance

Other build targets may be provided by plugins.

Current limitations

Redneck is intentionally narrow.

At the moment, expect limitations such as:

  • limited dependency handling
  • no update workflow
  • no installer or hosting story

If you need a complete Minecraft modpack management and deployment workflow today, packwiz is probably the better tool.

If you want a small YAML-first build step for curated pack recipes, redneck may be useful.

Philosophy

Redneck treats the hand-written YAML files as the source of truth. They require the least amount of information from a user, unless one explicitly specifies or overrides it.

Generated files are build artifacts.

The goal is not to make a prettier copy of another tool’s metadata format, but to make the authoring layer pleasant for curated packs: grouped mods, readable declarations, simple variants, and generated outputs.

License

GPL-3.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

redneck-0.3.2.tar.gz (23.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

redneck-0.3.2-py3-none-any.whl (27.7 kB view details)

Uploaded Python 3

File details

Details for the file redneck-0.3.2.tar.gz.

File metadata

  • Download URL: redneck-0.3.2.tar.gz
  • Upload date:
  • Size: 23.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for redneck-0.3.2.tar.gz
Algorithm Hash digest
SHA256 6f079c6c5cb8c796ecd3ce78d038023ad6a8ebdac8970937b14f16826bdbb0d9
MD5 4295d93127eacd0676abf35cee208526
BLAKE2b-256 bfcc4c77e82ff0fca48f465feb36b86e16c2eedcf6528be63c9a8b4b3f2bedd2

See more details on using hashes here.

File details

Details for the file redneck-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: redneck-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 27.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for redneck-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 364bb283d4c9720123fbea090462078e4da8925f73bb75eb06417a58b2af1d96
MD5 8e483ee59d05c0c5128ca3d87c87eda3
BLAKE2b-256 27acdaaa2b71fa8b6060b86e8efcdbfc6f37e7b005ffdf7fdbf1cf53830c3ef4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page