{"id":29957,"date":"2026-06-01T15:32:19","date_gmt":"2026-06-01T12:32:19","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/"},"modified":"2026-06-01T15:32:19","modified_gmt":"2026-06-01T12:32:19","slug":"betterconfig","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/","title":{"rendered":"BetterConfig"},"content":{"rendered":"<p># BetterConfig<br \/>\nA very powerful and easy to use command based configuration library for servers and clients.<\/p>\n<p>## Creating a simple configuration<br \/>\nTo start, create a new class. This will be the class where all your configurations are stored. For this example, we&#8217;ll<br \/>\ncall this class `Configs`. Make sure that this class is `public`! Next, create a field for your configuration entry. The<br \/>\nfield should not be final. Mark this field with the annotation `@Config`. The initial value of the field will be used as<br \/>\ndefault (fallback) value. You can add a comment by setting the `comment` attribute.<br \/>\n&#8220;`java<br \/>\npublic class Configs {<br \/>\n    @Config(comment = &#8220;This is an example!&#8221;)<br \/>\n    public static String exampleString = &#8220;default&#8221;;<br \/>\n}<br \/>\n&#8220;`<br \/>\nFinally, register your `Configs` class.<br \/>\n&#8211; For Fabric users, register the `Configs` class in your mod&#8217;s `onInitialize(Client)` method. Replace `<mod id>` with your<br \/>\nmod&#8217;s id. Sometimes you may omit the generics and just do `<>` instead.<br \/>\n  &#8211; On clients:<br \/>\n    &#8220;`java<br \/>\n    new ModConfigBuilder<FabricClientCommandSource, CommandBuildContext>(<mod id>, Configs.class).build();<br \/>\n    &#8220;`<br \/>\n  &#8211; On servers:<br \/>\n    &#8220;`java<br \/>\n    new ModConfigBuilder<CommandSourceStack, CommandBuildContext>(<mod id>, Configs.class).build();<br \/>\n    &#8220;`<br \/>\n&#8211; For Paper users, register the `Configs` class in your plugin&#8217;s `onEnable` method. Replace `<plugin name>` with your<br \/>\nplugin&#8217;s name.<br \/>\n  &#8220;`java<br \/>\n  new ModConfigBuilder<>(<plugin name>, Configs.class).build();<br \/>\n  &#8220;`<br \/>\nThat&#8217;s it! Now you can access `exampleString` through `Configs.exampleString`. You can edit `exampleString` by using the<br \/>\nconfig command.<br \/>\n&#8211; On Fabric there are different commands for the client and server.  For both, replace `<mod id>` with your mod&#8217;s id.<br \/>\n  &#8211; On clients, execute `\/cconfig <mod id> exampleString set <string>`.<br \/>\n  &#8211; On servers, execute `\/config <mod id> exampleString set <string>`.<br \/>\n&#8211; On Paper servers, execute `\/config <plugin name> exampleString set <string>`. Replace `<plugin name>` with your<br \/>\nplugin&#8217;s name.<\/p>\n<p>## That&#8217;s not all!<br \/>\nThis mod also natively supports the use of `Collection`s and `Map`s as variable types. These configurations will have<br \/>\nthe options `add`, `put` and `remove` available. Moreover, you can define your own (de)serialisers to create<br \/>\nconfigurations with arbitrary types. To do this, all you have to do is register the (de)serialiser when you build your<br \/>\nconfig. For instance, to create configurations with type `Block` you can do<br \/>\n&#8220;`java<br \/>\nnew ModConfigBuilder<>(<mod id>, Configs.class)<br \/>\n    .registerTypeHierarchy(Block.class, new BlockAdapter(), BlockArgumentType::block)<br \/>\n    .build();<br \/>\n&#8220;`<br \/>\nwhere `BlockAdapter` extends `TypeAdapter<Block>` and `BlockArgumentType` implements `ArgumentType<Block>`. See<br \/>\n[these tests](fabric\/src\/testmod\/java\/dev\/xpple\/betterconfig) for a complete picture. An identical setup for Paper can<br \/>\nbe found [here](paper\/src\/testplugin\/java\/dev\/xpple\/betterconfig).<\/p>\n<p>Furthermore, you can completely change the behaviour of updating your config values by creating your own methods. Simply<br \/>\nadd one or more of `setter`, `adder`, `putter` or `remover` as attribute to your `@Config` annotation. A great use for<br \/>\nthis would be adding key-value entries to a `Map` based on a single value. Consider the following configuration.<br \/>\n&#8220;`java<br \/>\n@Config(putter = @Config.Putter(&#8220;none&#8221;), adder = @Config.Adder(&#8220;customMapAdder&#8221;))<br \/>\npublic static Map<String, String> exampleMapAdder = new HashMap<>(Map.of(&#8220;a&#8221;, &#8220;A&#8221;, &#8220;b&#8221;, &#8220;B&#8221;));<br \/>\npublic static void customMapAdder(String string) {<br \/>\n    exampleMapAdder.put(string.toLowerCase(Locale.ROOT), string.toUpperCase(Locale.ROOT));<br \/>\n}<br \/>\n&#8220;`<br \/>\nThe value of `&#8221;none&#8221;` for the putter indicates that no putter will be available. This way, you can use this `Map` in your<br \/>\ncode like usual, and add values to it using `\/(c)config <mod id> exampleMapAdder add <string>`. For more details, see<br \/>\n[the JavaDocs for `@Config`](common\/src\/main\/java\/dev\/xpple\/betterconfig\/api\/Config.java).<\/p>\n<p>The parameters of the update method can also be customised.<br \/>\n&#8220;`java<br \/>\n@Config(adder = @Config.Adder(value = &#8220;customTypeAdder&#8221;, type = int.class))<br \/>\npublic static Collection<String> exampleCustomType = new ArrayList<>(List.of(&#8220;%&#8221;, &#8220;@&#8221;));<br \/>\npublic static void customTypeAdder(int codepoint) {<br \/>\n    exampleCustomType.add(Character.toString(codepoint));<br \/>\n}<br \/>\n&#8220;`<br \/>\nFor putters, there are separate key and value type attributes.<\/p>\n<p>And many more things! For some illustrative examples, see the `Configs` class for both<br \/>\n[Fabric](fabric\/src\/testmod\/java\/dev\/xpple\/betterconfig\/Configs.java) and<br \/>\n[Paper](paper\/src\/testplugin\/java\/dev\/xpple\/betterconfig\/Configs.java).<\/p>\n<p>## Installation<br \/>\nReplace `${betterconfig_version}` with the artifact version.<\/p>\n<p>You may choose between my own maven repository and GitHub&#8217;s package repository.<br \/>\n### My own<br \/>\n&#8220;`gradle<br \/>\nrepositories {<br \/>\n    maven {<br \/>\n        url &#8216;https:\/\/maven.xpple.dev\/maven2&#8217;<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<br \/>\n### GitHub packages<br \/>\n&#8220;`gradle<br \/>\nrepositories {<br \/>\n    maven {<br \/>\n        url &#8216;https:\/\/maven.pkg.github.com\/xpple\/BetterConfig&#8217;<br \/>\n        credentials {<br \/>\n            username = project.findProperty(&#8220;gpr.user&#8221;) ?: System.getenv(&#8220;USERNAME&#8221;)<br \/>\n            password = project.findProperty(&#8220;gpr.key&#8221;) ?: System.getenv(&#8220;TOKEN&#8221;)<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n&#8220;`<br \/>\nImport it:<br \/>\n&#8220;`gradle<br \/>\ndependencies {<br \/>\n    \/\/ Fabric<br \/>\n    include modImplementation(&#8216;dev.xpple:betterconfig-fabric:${betterconfig_version}&#8217;)<br \/>\n    \/\/ Paper (also include the JAR in the plugins folder)<br \/>\n    compileOnly &#8216;dev.xpple:betterconfig-paper:${betterconfig_version}&#8217;<br \/>\n}<br \/>\n&#8220;`<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A very powerful and easy to use command based configuration library for servers and clients.<\/p>\n","protected":false},"featured_media":29958,"template":"","meta":{"_minecraft_slug":"betterconfig","_minecraft_project_id":"nqgcleOE","_minecraft_author":"xpple","_minecraft_license":"LGPL-3.0-or-later","_minecraft_downloads":7997,"_minecraft_follows":10,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"betterconfig.zip","_minecraft_size_bytes":1542653,"_minecraft_version_count":37,"_minecraft_updated_at":"2026-05-16T02:24:44.214935Z","_minecraft_date_created":"2023-02-06T22:57:09.361730Z","_minecraft_date_modified":"2025-01-19T20:18:41.185708Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/betterconfig","_minecraft_icon_attachment_id":29958,"_minecraft_imported_at":"2026-06-01T12:32:20+00:00","_minecraft_import_hash":"6407632f7c6886a2e878cc114b47d7da","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[97,873,126,127,91],"mod_loader":[99],"minecraft_version":[57,58,59,36,62],"class_list":["post-29957","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-fabric","mod_category-library","mod_category-management","mod_category-paper","mod_category-storage","mod_loader-fabric","minecraft_version-1-19-3","minecraft_version-1-19-4","minecraft_version-1-20","minecraft_version-1-20-1","minecraft_version-1-21"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>BetterConfig - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"BetterConfig - Minecraft\" \/>\n<meta property=\"og:description\" content=\"A very powerful and easy to use command based configuration library for servers and clients.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/\",\"name\":\"BetterConfig - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png\",\"datePublished\":\"2026-06-01T12:32:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png\",\"width\":128,\"height\":128},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/betterconfig\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"BetterConfig\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"BetterConfig - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/","og_locale":"en_US","og_type":"article","og_title":"BetterConfig - Minecraft","og_description":"A very powerful and easy to use command based configuration library for servers and clients.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/","name":"BetterConfig - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png","datePublished":"2026-06-01T12:32:19+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/betterconfig-icon-dcb197ab476e6ae3773c45e70f91a60fc443bf2d.png","width":128,"height":128},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/betterconfig\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"BetterConfig"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/29957","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/29958"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=29957"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=29957"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=29957"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=29957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}