Archie is a Kotlin-first Architectury library mod for Minecraft 1.21.1. It provides shared utilities used by Kernel Panic mods across Fabric and NeoForge.
Full guides (config, GUI, networking, serialization, etc.) live at
docs.kernelpanicsoft.net/Archie and in docs/.
This repository root is a single Gradle build (settings.gradle.kts) using Architectury Loom,
with four products, each split into common/fabric/neoforge subprojects nested under one
directory per product and flattened to single-level project names (e.g. core/fabric →
archie-core-fabric), matching terrarium-earth/Common-Storage-Lib's layout:
core/(archie-core-{common,fabric,neoforge}): the library itself -Archie, networking, config, GUI, transfer, registries, resource packs. This is what gets published.datagen/(archie-datagen-{common,fabric,neoforge}): Archie's datagen DSL. Ships as its own separate mod (archie_datagen), dev-time only - never on a real player's classpath.gametest/(archie-gametest-{common,fabric,neoforge}): Archie's GameTest framework/harness. Also its own separate mod (archie_gametest), dev/test-time only.test/(archie-test-{common,fabric,neoforge}): a throwaway playground mod (archie_test) used to exercise Archie during development - depends oncore/datagen/gametestvia plain project references, so changes there are picked up live.
Run all Gradle commands from the repo root.
Each product's module layout is the same shape:
common/: shared APIs and core implementationfabric/: Fabric entrypoints, run configs, platformactualimplementationsneoforge/: NeoForge entrypoints, run configs, platformactualimplementations
The initialization flow is:
- Loader entrypoint (
ArchieFabricorArchieNeoForge, incore/{fabric,neoforge}) Archie.init()incore/common- Shared systems register events/network/config; datagen/gametest activate via a
ServiceLoader-basedArchieExtensionhook ifarchie-datagen/archie-gametestare present
./gradlew build
./gradlew archie-core-fabric:runClient
./gradlew archie-core-neoforge:runClient
./gradlew archie-datagen-fabric:runDatagen
./gradlew archie-datagen-neoforge:runDatagen
./gradlew archie-gametest-fabric:runGametest
./gradlew archie-gametest-neoforge:runGametest
./gradlew archie-gametest-fabric:runGametestClient
./gradlew archie-gametest-neoforge:runGametestClientTo run the archie-test playground mod, use the same task names against its own modules instead
(e.g. ./gradlew archie-test-fabric:runClient).
- Add gameplay/library logic in
commonfirst, then platform-specificactualcode only when needed. - Keep
expect/actualtriplets named*.common.kt,*.fabric.kt,*.neoforge.kt. - Register packet classes and handlers before calling
register()onArchieNetworkChannel. - Keep loader manifests tokenized (
${mod_id},${versions.*}); values come from Gradle properties/version catalog. - Use
bundleRuntimeLibrary(...)/bundleMod(...)for shipped runtime deps in loader modules. - Runtime-needed-by-
Archie.ktcode (conditions, ingredients, common tags) lives incore, even though the datagen DSL that also touches it lives indatagen-corenever depends ondatagen/gametest.
core/common/src/main/kotlin/net/kernelpanicsoft/archie/Archie.ktcore/common/src/main/kotlin/net/kernelpanicsoft/archie/networking/ArchieNetworkChannel.ktcore/fabric/src/main/kotlin/net/kernelpanicsoft/archie/ArchieFabric.ktcore/neoforge/src/main/kotlin/net/kernelpanicsoft/archie/ArchieNeoForge.ktgradle/libs.versions.toml