objD is a framework for developing Datapacks for Minecraft.

Get Started →

Built-in Generators

All your favorite generators in one place: Raycasting, Title, Book, Nbt, Entity, and much more Generators


objD generates Scoreboards, setup files and namespaces by itself and provides a high level API


You can build your own Widgets, customize arguments and create your own APIs using the tools that objD gives you.

# Program Datapacks!

Use a programming language to generate Datapacks and benefit from the unlimited enhancements.

# A simple project, in a few lines:

import 'package:objd/core.dart';

final example = NamespacePack();

final namespace = [LoadFile];

final load = Log('Reloaded!');

# objD is build upon Modules

Each part of a Datapack is seperated into Widgets. A Widget can be a simple Command, a group of Commands, whole Files or Packs.

# 70+ Included APIs and Widgets

objD features a lot of in-built Widgets, like Basics(Pack, File, Entity, Group) all the Commands, Text Generators and Utils, like Timers, RNG, Raycasting and Loops.

Get all the information that you need in this youtube series:

# Simple Click Counter Example:

import 'package:objd/core.dart';

(name: 'folder name')
final example = Pack(
  name: 'mypack',
  modules: [
      name: 'onclick',
      onClick: Score(Entity.Self(), 'counter') + 1,
  load: LoadFile,
  main: MainFile,

final load = Log('Runs on Load');

Widget showTitle(String text) => Title(
      show: [TextComponent(text, color: Color.Red)],

final main = If(
  Score(Entity.Self(), 'counter') >= 10,
  then: [
    ShowTitle('clicked ten times!'),
    Score(Entity.Self(), 'counter').reset(),

# Installation

Get started today by installing objD and playing around.


Contribute on GitHub

# Get Connected With the Community and get Updates

# Changelog of all the recent additions

# 0.4.0

  • added Folder Widget to dynamically create folders. All Files and Rawfiles in the child marked with inheritFolder will choose this folder as a default
  • added Textcomponent.none for the edge case that you want to clear a previous set text
  • added predicate parameter to Selector
  • added Scoreboard.modify(whoever uses that)
  • added self, all and player getters on a Scoreboard to easily use the most common score entities
  • added path argument to Context to retrieve the current path set by Folders
  • added a check to help to not exceed the 16 char limit on scoreboards
  • added additional metrics to measure project generation
  • updated all blocks, items and particles to include additions in 21w11a
  • migrated to null safety, read more here: https://dart.dev/null-safety
  • refactored apis, arrangement of required values and nullable types
  • refactored filepaths and path concatenation
  • changed dependencies (removed meta and changed colorize to ansicolor)
  • fixed Area generating NULL instead of 0 by default
  • fixed triggering hotreload if only properties on project changed and refactored mechanics