diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts
index ce01b91b3..d4ab4eb0b 100644
--- a/fabric/build.gradle.kts
+++ b/fabric/build.gradle.kts
@@ -17,7 +17,18 @@ configurations {
     getByName("developmentFabric").extendsFrom(configurations["common"])
 }
 
-loom.accessWidenerPath.set(project(":common").loom.accessWidenerPath)
+loom {
+    accessWidenerPath.set(project(":common").loom.accessWidenerPath)
+    runs.create("datagen") {
+        server()
+        name("Data Generation")
+        vmArg("-Dfabric-api.datagen")
+        vmArg("-Dfabric-api.datagen.output-dir=${project(":fabric").file("src/main/generated/resources").absolutePath}")
+        vmArg("-Dfabric-api.datagen.modid=generations_core")
+
+        runDir("build/datagen")
+    }
+}
 
 dependencies {
     modImplementation("net.fabricmc:fabric-loader:${project.properties["fabric_loader_version"]}")
diff --git a/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/DataGen.java b/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/DataGen.java
new file mode 100644
index 000000000..accb2755c
--- /dev/null
+++ b/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/DataGen.java
@@ -0,0 +1,12 @@
+package generations.gg.generations.core.generationscore.fabric.datagen;
+
+import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
+import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
+
+public class DataGen implements DataGeneratorEntrypoint {
+    @Override
+    public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
+        FabricDataGenerator.Pack pack = fabricDataGenerator.createPack();
+        FabricTagsDataGen.init(pack);
+    }
+}
diff --git a/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/FabricTagsDataGen.java b/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/FabricTagsDataGen.java
new file mode 100644
index 000000000..b0e455dd8
--- /dev/null
+++ b/fabric/src/main/java/generations/gg/generations/core/generationscore/fabric/datagen/FabricTagsDataGen.java
@@ -0,0 +1,45 @@
+package generations.gg.generations.core.generationscore.fabric.datagen;
+
+import generations.gg.generations.core.generationscore.tags.GenerationsBlockTags;
+import generations.gg.generations.core.generationscore.tags.GenerationsItemTags;
+import generations.gg.generations.core.generationscore.world.level.block.GenerationsWood;
+import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
+import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
+import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
+import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBlockTags;
+import net.fabricmc.fabric.api.tag.convention.v1.ConventionalItemTags;
+import net.minecraft.core.HolderLookup;
+
+import java.util.concurrent.CompletableFuture;
+
+public class FabricTagsDataGen {
+    public static void init(FabricDataGenerator.Pack pack) {
+        pack.addProvider(BlockTagsProvider::new);
+        pack.addProvider(ItemTagsProvider::new);
+    }
+}
+
+class BlockTagsProvider extends FabricTagProvider.BlockTagProvider {
+    public BlockTagsProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) {
+        super(output, registriesFuture);
+    }
+
+    @Override
+    protected void addTags(HolderLookup.Provider arg) {
+        getOrCreateTagBuilder(ConventionalBlockTags.ORES).addTag(GenerationsBlockTags.GENERATIONSORES);
+        getOrCreateTagBuilder(ConventionalBlockTags.BOOKSHELVES).add(GenerationsWood.GHOST_BOOKSHELF.get(), GenerationsWood.ULTRA_DARK_BOOKSHELF.get(), GenerationsWood.ULTRA_JUNGLE_BOOKSHELF.get());
+    }
+}
+
+class ItemTagsProvider extends FabricTagProvider.ItemTagProvider {
+
+    public ItemTagsProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> completableFuture) {
+        super(output, completableFuture);
+    }
+
+    @Override
+    protected void addTags(HolderLookup.Provider arg) {
+        getOrCreateTagBuilder(ConventionalItemTags.ORES).addTag(GenerationsItemTags.GENERATIONSORES);
+        getOrCreateTagBuilder(ConventionalItemTags.BOOKSHELVES).add(GenerationsWood.GHOST_BOOKSHELF.get().asItem(), GenerationsWood.ULTRA_DARK_BOOKSHELF.get().asItem(), GenerationsWood.ULTRA_JUNGLE_BOOKSHELF.get().asItem());
+    }
+}
diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json
index 105dc5891..c476ea7ea 100644
--- a/fabric/src/main/resources/fabric.mod.json
+++ b/fabric/src/main/resources/fabric.mod.json
@@ -17,6 +17,9 @@
     ],
     "client" : [
       "generations.gg.generations.core.generationscore.fabric.client.GenerationsCoreClientFabric"
+    ],
+    "fabric-datagen": [
+      "generations.gg.generations.core.generationscore.fabric.datagen.DataGen"
     ]
   },
   "mixins": [
