diff --git a/README.md b/README.md
new file mode 100644
index 0000000..93c2d7c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,114 @@
+# RegistryLib
+A small library for a Minecraft Paper Plugins that allows loading and saving data in a datapack-like format.
+
+## Getting Started
+### Installation
+Available releases and installation instructions can be found on the [[https://repo.axolotsh.org/#/releases/io/github/axolotsh/registrylib | repository website]].
+
+#### Maven:
+Add following to your ```pom.xml```:
+```xml
+
+ axolotsh-repository-releases
+ axolotsh-repository
+ https://repo.axolotsh.org/releases
+
+
+
+ io.github.axolotsh
+ registrylib
+ VERSION
+
+```
+
+#### Gradle Groovy:
+Add following to your ```build.gradle```:
+```groovy
+maven {
+ name "axolotsh-repository"
+ url "https://repo.axolotsh.org/releases"
+}
+
+compileOnly "io.github.axolotsh:registrylib:VERSION"
+```
+
+#### Gradle Kotlin:
+Add following to your ```build.gradle.kts```:
+```kotlin
+maven {
+ name = "axolotsh-repository"
+ url = uri("https://repo.axolotsh.org/releases")
+}
+
+compileOnly("io.github.axolotsh:registrylib:VERSION")
+```
+
+### Creating a registry
+``Registry<>`` requires a class that implements the ``Keyed`` interface. This can be done as shown below:
+```java
+import net.kyori.adventure.key.Key;
+import net.kyori.adventure.key.Keyed;
+
+public class ItemInfo implements Keyed {
+ private transient Key key;
+ public Key key() {
+ return key;
+ }
+
+ private String name;
+ public String name() {
+ return name;
+ }
+
+ public ItemInfo(Key key, String name) {
+ this.key = key;
+ this.name = name;
+ }
+}
+```
+Note that the ``key`` variable is marked as transient. ``RegistryLoader`` sets this variable based on the file path.
+Then you can create the registry as follows:
+```java
+import io.github.axolotsh.registrylib.Registry;
+
+public static final Registry ITEM_INFO_REGISTRY = new Registry<>("item", ItemInfo.class);
+```
+The first ``String`` argument, which in this example is ``"item"``, denotes the registry category, which divides the registry into different directories during serialization.
+Thus, an object with the key ``"myplugin:multitool"`` will be written to the file system at the path ``"myplugin/item/multitool.json"``.
+### Using a registry
+Managing objects in the registry is very similar to managing them in the list.
+```java
+var registry = ITEM_INFO_REGISTRY;
+
+var myItemKey = Key.key("multitool");
+var myItem = new ItemInfo(myItemKey, "MultiTool");
+
+registry
+ .clear() // Clear all registry entries.
+ .add(myItem) // Add entry to registry.
+ .remove(myItemKey); // Remove entry from registry by key.
+
+if (registry.contains(myItemKey)) // Checks if the registry contains a value with this key.
+ registry.remove(myItem); // Remove specific item.
+
+// Accessing item form registry by key.
+// If it doesn't exist - create one and add it to registry.
+var item = registry.getOrAdd(myItemKey, () -> {
+ return myItem;
+});
+```
+### Saving and Loading a registry
+You can save and load registry to the file system with ``RegistryLoader``.
+```java
+var registryLoader = RegistryLoader.builder()
+ .logger(getPluginLogger())
+ .rootPath(getDataPath().resolve("data"))
+ .build();
+
+// Save registry
+registryLoader.saveAll(ITEM_INFO_REGISTRY);
+
+// Load registry
+ITEM_INFO_REGISTRY.clear();
+registryLoader.loadAll(ITEM_INFO_REGISTRY);
+```
\ No newline at end of file