COWMODSКаталог модов
Commander

ВЕРСИИ (28)

beta

0.9.0 (1.21)

0.9.0-1.21-build.24
6 авг. 2024 г.739Minecraft: 1.21, 1.21.1fabric
Скачать
Что нового
### What's New: User Changes: * Added the (data pack) expression library! This feature allows adding common expressions to a library where each is identified using an Identifier. ```json5 { "replace": false, // Can be omitted. "expressions": { "test:cool_expression": "score * 2.5", "test:boolean_expression": "level.isDay && !level.isRaining" } } ``` Later on, these expressions can be evaluated inside other expressions using the library container, like so: ``` sqrt(library.my_id:some_value) * library.my_id:other_value ``` Or in `execute`/`scoreboard` brigadier commands using `cmd:library`. Prefer using the library in Brigadier commands! It does not require parsing the expression in-place! * Brigadier macros in JSON commands should now correctly fail on dangling braces. Dev Changes: * Added more javadoc to the `api` package. * Removed `evalex` and `mapping-io` from pom.xml * Added `LongExpression`. Similar to `Arithmetica` and `BooleanExpression`, but for longs! * Tried to fix expression equality. * Added missing 'parameter' methods to `Arithmetica`, `BooleanExpression` and `BrigadierMacro`. * Added `Expression.Result#NULL`. Other Changes: * The mod should now fail with slightly better error messages. * Inlined constant `BooleanExpression` instances.
beta

0.9.0 (1.20.1)

0.9.0-1.20.1-build.23
6 авг. 2024 г.81,4 тыс.Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: * Added the (data pack) expression library! This feature allows adding common expressions to a library where each is identified using an Identifier. ```json5 { "replace": false, // Can be omitted. "expressions": { "test:cool_expression": "score * 2.5", "test:boolean_expression": "level.isDay && !level.isRaining" } } ``` Later on, these expressions can be evaluated inside other expressions using the library container, like so: ``` sqrt(library.my_id:some_value) * library.my_id:other_value ``` Or in `execute`/`scoreboard` brigadier commands using `cmd:library`. Prefer using the library in Brigadier commands! It does not require parsing the expression in-place! * Brigadier macros in JSON commands should now correctly fail on dangling braces. Dev Changes: * Added more javadoc to the `api` package. * Removed `evalex` and `mapping-io` from pom.xml * Added `LongExpression`. Similar to `Arithmetica` and `BooleanExpression`, but for longs! * Tried to fix expression equality. * Added missing 'parameter' methods to `Arithmetica`, `BooleanExpression` and `BrigadierMacro`. * Added `Expression.Result#NULL`. Other Changes: * The mod should now fail with slightly better error messages. * Inlined constant `BooleanExpression` instances.
alpha

0.8.0 (1.21)

0.8.0-1.21-build.22
27 июл. 2024 г.184Minecraft: 1.21fabric
Скачать
Что нового
### What's New: User Changes: * Added `?.` and `?` null safe operators. - `?.` Used on structures. Same as `.`, but returns null if there's no such field in structure. - `?` Used with anything that can be null. Returns the right operand if left is null or left if not. These operators allow you to quickly check for nulls in your expressions. Let's image a situation like this: You have a variable `struct.x` which might not exist and maybe null. Before, you'd have to write something like this: `if(structContainsKey(struct, 'x') && struct.x != null, struct.x, valueElse())'` Now this can be shortened to: `struct?.x ? valueElse()`. Do note that `?` has a very low precedence, so in ambiguous cases you'll have to wrap it in parentheses. e.g. `23 + struct?.x ? 23` -> `23 + (struct?.x ? 23)`. * Java `Optional`s are now unwrapped in expressions. * Minecraft `Identifier`s are now converted to strings in expressions. * Gson elements can now be used in expressions. Dev Changes: * Fixed `equals` on CustomDataAccessors. * Added `LootContext` as an argument for the `CustomFields#addVirtualField` function. Other Changes: * Updated mEvalEx to fix expression inlining.
beta

0.8.0 (1.20.4)

0.8.0-1.20.4-build.21
27 июл. 2024 г.197Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: * Added `?.` and `?` null safe operators. - `?.` Used on structures. Same as `.`, but returns null if there's no such field in structure. - `?` Used with anything that can be null. Returns the right operand if left is null or left if not. These operators allow you to quickly check for nulls in your expressions. Let's image a situation like this: You have a variable `struct.x` which might not exist and maybe null. Before, you'd have to write something like this: `if(structContainsKey(struct, 'x') && struct.x != null, struct.x, valueElse())'` Now this can be shortened to: `struct?.x ? valueElse()`. Do note that `?` has a very low precedence, so in ambiguous cases you'll have to wrap it in parentheses. e.g. `23 + struct?.x ? 23` -> `23 + (struct?.x ? 23)`. * Java `Optional`s are now unwrapped in expressions. * Minecraft `Identifier`s are now converted to strings in expressions. * Gson elements can now be used in expressions. Dev Changes: * Fixed `equals` on CustomDataAccessors. * Added `LootContext` as an argument for the `CustomFields#addVirtualField` function. Other Changes: * Updated mEvalEx to fix expression inlining.
beta

0.8.0 (1.20.1)

0.8.0-1.20.1-build.20
27 июл. 2024 г.209Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: * Added `?.` and `?` null safe operators. - `?.` Used on structures. Same as `.`, but returns null if there's no such field in structure. - `?` Used with anything that can be null. Returns the right operand if left is null or left if not. These operators allow you to quickly check for nulls in your expressions. Let's image a situation like this: You have a variable `struct.x` which might not exist and maybe null. Before, you'd have to write something like this: `if(structContainsKey(struct, 'x') && struct.x != null, struct.x, valueElse())'` Now this can be shortened to: `struct?.x ? valueElse()`. Do note that `?` has a very low precedence, so in ambiguous cases you'll have to wrap it in parentheses. e.g. `23 + struct?.x ? 23` -> `23 + (struct?.x ? 23)`. * Java `Optional`s are now unwrapped in expressions. * Minecraft `Identifier`s are now converted to strings in expressions. * Gson elements can now be used in expressions. Dev Changes: * Fixed `equals` on CustomDataAccessors. * Added `LootContext` as an argument for the `CustomFields#addVirtualField` function. Other Changes: * Updated mEvalEx to fix expression inlining.
alpha

0.7.0 (1.21)

0.7.0-1.21-build.19
25 июл. 2024 г.186Minecraft: 1.21fabric
Скачать
Что нового
### What's New: User Changes: * Added `arrayFindAny` and `arrayFindFirst` functions to expressions. As the name suggests, those functions will try to find an element of an array or return `null` if the array is empty. * Added `chain` function to expressions. This function operates on the results of the first one and allows chaining multiple function calls together like so: ``` //`it` is the result of the previous function, unless there's a lower level lamda. chain(arrayOf(2, 3, 6), arrayMap(it, sqrt(it)), arrayFindFirst(it)); //this is the same as: arrayFindFirst(arrayMap(arrayOf(2, 3, 6), sqrt(it))) ``` * Added `remove` to `cmd:data`. * Added `cmd:operate` to the `scoreboard players` command. * Added registry access for expressions! Now you can access the game's static and dynamic content registries by using new `Registry` and `DynamicRegistry` functions. * Why is this useful? For example, this allows you to compare item stacks based on their item type: ``` this_entity.getHandSlots[0].getItem == Registry('item').access.chest ``` * For item and block registries there is a shortcut: `Item`, `Block`. ``` this_entity.getHandSlots[0].getItem == Item('chest') ``` * `Biome` and `DimensionType` are available dynamic registry shortcuts. Dev Changes: There's a handful new experimental APIs, which allow you to extend the expression system. * Exposed `Object getValue()` and `Result convert(Object o)` in Expression.Result. * Exposed `Expression eval(LootContext context, Map<String, Object> parameters)` in Expression. * Exposed `ProxyMap`, `ObjectConverter` and `CustomDataAccessor` (which is now a valid data type). * Exposed `CustomFields`. One of the more interesting APIs. Allows adding new 'virtual' fields to reflective expression objects. ```java static { CustomFields.addVirtualField(Entity.class, "nbt", NbtPredicate::entityToNbt); } ``` Other Changes: * Switched to a custom fork of EvalEx. * Switched to 16-digit precision from the EvalEx's standard of 68-digit.
beta

0.7.0 (1.20.4)

0.7.0-1.20.4-build.18
25 июл. 2024 г.222Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: * Added `arrayFindAny` and `arrayFindFirst` functions to expressions. As the name suggests, those functions will try to find an element of an array or return `null` if the array is empty. * Added `chain` function to expressions. This function operates on the results of the first one and allows chaining multiple function calls together like so: ``` //`it` is the result of the previous function, unless there's a lower level lamda. chain(arrayOf(2, 3, 6), arrayMap(it, sqrt(it)), arrayFindFirst(it)); //this is the same as: arrayFindFirst(arrayMap(arrayOf(2, 3, 6), sqrt(it))) ``` * Added `remove` to `cmd:data`. * Added `cmd:operate` to the `scoreboard players` command. * Added registry access for expressions! Now you can access the game's static and dynamic content registries by using new `Registry` and `DynamicRegistry` functions. * Why is this useful? For example, this allows you to compare item stacks based on their item type: ``` this_entity.getHandSlots[0].getItem == Registry('item').access.chest ``` * For item and block registries there is a shortcut: `Item`, `Block`. ``` this_entity.getHandSlots[0].getItem == Item('chest') ``` * `Biome` and `DimensionType` are available dynamic registry shortcuts. Dev Changes: There's a handful new experimental APIs, which allow you to extend the expression system. * Exposed `Object getValue()` and `Result convert(Object o)` in Expression.Result. * Exposed `Expression eval(LootContext context, Map<String, Object> parameters)` in Expression. * Exposed `ProxyMap`, `ObjectConverter` and `CustomDataAccessor` (which is now a valid data type). * Exposed `CustomFields`. One of the more interesting APIs. Allows adding new 'virtual' fields to reflective expression objects. ```java static { CustomFields.addVirtualField(Entity.class, "nbt", NbtPredicate::entityToNbt); } ``` Other Changes: * Switched to a custom fork of EvalEx. * Switched to 16-digit precision from the EvalEx's standard of 68-digit.
beta

0.7.0 (1.20.1)

0.7.0-1.20.1-build.17
25 июл. 2024 г.313Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: * Added `arrayFindAny` and `arrayFindFirst` functions to expressions. As the name suggests, those functions will try to find an element of an array or return `null` if the array is empty. * Added `chain` function to expressions. This function operates on the results of the first one and allows chaining multiple function calls together like so: ``` //`it` is the result of the previous function, unless there's a lower level lamda. chain(arrayOf(2, 3, 6), arrayMap(it, sqrt(it)), arrayFindFirst(it)); //this is the same as: arrayFindFirst(arrayMap(arrayOf(2, 3, 6), sqrt(it))) ``` * Added `remove` to `cmd:data`. * Added `cmd:operate` to the `scoreboard players` command. * Added registry access for expressions! Now you can access the game's static and dynamic content registries by using new `Registry` and `DynamicRegistry` functions. * Why is this useful? For example, this allows you to compare item stacks based on their item type: ``` this_entity.getHandSlots[0].getItem == Registry('item').access.chest ``` * For item and block registries there is a shortcut: `Item`, `Block`. ``` this_entity.getHandSlots[0].getItem == Item('chest') ``` * `Biome` and `DimensionType` are available dynamic registry shortcuts. Dev Changes: There's a handful new experimental APIs, which allow you to extend the expression system. * Exposed `Object getValue()` and `Result convert(Object o)` in Expression.Result. * Exposed `Expression eval(LootContext context, Map<String, Object> parameters)` in Expression. * Exposed `ProxyMap`, `ObjectConverter` and `CustomDataAccessor` (which is now a valid data type). * Exposed `CustomFields`. One of the more interesting APIs. Allows adding new 'virtual' fields to reflective expression objects. ```java static { CustomFields.addVirtualField(Entity.class, "nbt", NbtPredicate::entityToNbt); } ``` Other Changes: * Switched to a custom fork of EvalEx. * Switched to 16-digit precision from the EvalEx's standard of 68-digit.
beta

0.6.0 (1.20.4)

0.6.0-1.20.4-build.16
11 июл. 2024 г.151Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: * Added `cmd:expression` to `/execute if`. * Updated EvalEx to v3.3.0. [Release Notes...](https://github.com/ezylang/EvalEx/releases/tag/3.3.0) * Removed `commander:store_expression_data` and `commander:store_nbt_data` JSON commands, as they can be easily replaced by the brigadier command and don't offer any advantages. Example replacement: ```json { "type": "commander:store_expression_data", "target": "level", "selector": "origin", "key": "my_cool_data", "expression": "random(0, 2)" } ``` Becomes: ```json { "type": "commander:commands", "selector": "origin", "commands": [ "cmd:data write level my_cool_data ${{random(0, 2)}}" ] } ```
beta

0.6.0 (1.20.1)

0.6.0-1.20.1-build.15
11 июл. 2024 г.1,3 тыс.Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: * Added `cmd:expression` to `/execute if`. * Updated EvalEx to v3.3.0. [Release Notes...](https://github.com/ezylang/EvalEx/releases/tag/3.3.0) * Removed `commander:store_expression_data` and `commander:store_nbt_data` JSON commands, as they can be easily replaced by the brigadier command and don't offer any advantages. Example replacement: ```json { "type": "commander:store_expression_data", "target": "level", "selector": "origin", "key": "my_cool_data", "expression": "random(0, 2)" } ``` Becomes: ```json { "type": "commander:commands", "selector": "origin", "commands": [ "cmd:data write level my_cool_data ${{random(0, 2)}}" ] } ```
beta

0.5.0 (1.20.4)

0.5.0-1.20.4-build.14
11 мая 2024 г.182Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: This update introduces new JSON commands to interact with persistent data. `commander:store_nbt_data` which allows you to store a simple string or number value, and `commander:store_expression_data` just like `store_nbt_data`, but with expressions. ```json5 { "type": "commander:store_nbt_data", //command type "target": "level", //the target we want to attach data to. "selector": "origin", //Selector for position and entity targets. "key": "cmd_my_cool_data", //The data key for later reference. "element": "Hello World!" //Our string or number value. This is a nbt element, so true and false are not supported. } ``` `store_expression_data` is identical, but `element` is renamed to `expression` and only accepts expressions. The target can be one of the following: - `level` current level. Any selector. - `chunk` selected chunk. Position selector. - `entity` selected entity. Entity selector. - `block_entity` selected block entity. Position selector. Later on this data can be used in expressions like so: `level.storage.my_cool_data * 0.7` or `this_entity.storage.even_cooler_data == 'freak''`. Along with the JSON command this update introduces a the `cmd:data` brigadier command. This command allows you to read and write data just like the JSON command. The syntax goes like this: `cmd:data` -> operation (`read`/`write`) -> target -> selector (`@s`/`~ ~ ~`) -> key (-> data (for `write`)) Other Changes: * Moved mappings cache to `~/.commander`. * Mapping are now saved as compressed TSRG2. Dev Changes: * Added `is(Type)Value` to expression result.
beta

0.5.0 (1.20.1)

0.5.0-1.20.1-build.13
11 мая 2024 г.6,6 тыс.Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: This update introduces new JSON commands to interact with persistent data. `commander:store_nbt_data` which allows you to store a simple string or number value, and `commander:store_expression_data` just like `store_nbt_data`, but with expressions. ```json5 { "type": "commander:store_nbt_data", //command type "target": "level", //the target we want to attach data to. "selector": "origin", //Selector for position and entity targets. "key": "cmd_my_cool_data", //The data key for later reference. "element": "Hello World!" //Our string or number value. This is a nbt element, so true and false are not supported. } ``` `store_expression_data` is identical, but `element` is renamed to `expression` and only accepts expressions. The target can be one of the following: - `level` current level. Any selector. - `chunk` selected chunk. Position selector. - `entity` selected entity. Entity selector. - `block_entity` selected block entity. Position selector. Later on this data can be used in expressions like so: `level.storage.my_cool_data * 0.7` or `this_entity.storage.even_cooler_data == 'freak''`. Along with the JSON command this update introduces a the `cmd:data` brigadier command. This command allows you to read and write data just like the JSON command. The syntax goes like this: `cmd:data` -> operation (`read`/`write`) -> target -> selector (`@s`/`~ ~ ~`) -> key (-> data (for `write`)) Other Changes: * Moved mappings cache to `~/.commander`. * Mapping are now saved as compressed TSRG2. Dev Changes: * Added `is(Type)Value` to expression result.
beta

0.4.1 (1.20.4)

0.4.1-1.20.4-build.12
10 мая 2024 г.134Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: * Fixed `arrayAllMatch` acting like `arrayAnyMatch`. * Added `attributes` field to living entities. * Loot Context access in expressions is now cached.
beta

0.4.1 (1.20.1)

0.4.1-1.20.1-build.11
10 мая 2024 г.156Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: * Fixed `arrayAllMatch` acting like `arrayAnyMatch`. * Added `attributes` field to living entities. * Loot Context access in expressions is now cached.
beta

0.4.0 (1.20.4)

0.4.0-1.20.4-build.10
9 мая 2024 г.159Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: User Changes: This update extends the expression syntax to support nbt and block properties. * Returned to downloading mappings at startup. * Compound and List NBT tags are now properly supported. * Added `nbt` field to item stacks, entities and block entities. This Allows you to access NBT data like so: `this_entity.nbt.Air`. You should avoid NBT access, as it can get extremely slow. * Added `properties` field to *states. This can be used to access block state properties like so: `block_state.properties.candles`. * Added lots of new functions. Consult the wiki for more info! * Added `short_circuit` to `defaulted`, `all_of`, `any_of`. If true, commands will terminate immediately upon the condition failing. * `hasContext` and `structContainsKey` now accept VarArgs. * Removed arbitrary map support, as it was pretty poorly implemented. * Constants are now case-sensitive. Dev Changes: * Moved Command codecs to MapCodec. * Added BooleanExpression, similar to Arithmtica. * Added `runTriState` to EventExecutors.
beta

0.4.0 (1.20.1)

0.4.0-1.20.1-build.9
9 мая 2024 г.190Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: User Changes: This update extends the expression syntax to support nbt and block properties. * Returned to downloading mappings at startup. * Compound and List NBT tags are now properly supported. * Added `nbt` field to item stacks, entities and block entities. This Allows you to access NBT data like so: `this_entity.nbt.Air`. You should avoid NBT access, as it can get extremely slow. * Added `properties` field to *states. This can be used to access block state properties like so: `block_state.properties.candles`. * Added lots of new functions. Consult the wiki for more info! * Added `short_circuit` to `defaulted`, `all_of`, `any_of`. If true, commands will terminate immediately upon the condition failing. * `hasContext` and `structContainsKey` now accept VarArgs. * Removed arbitrary map support, as it was pretty poorly implemented. * Constants are now case-sensitive. Dev Changes: * Moved Command codecs to MapCodec. * Added BooleanExpression, similar to Arithmtica. * Added `runTriState` to EventExecutors.
beta

0.3.2 (1.20.4)

0.3.2-1.20.4-build.6
27 апр. 2024 г.146Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: * Slightly improved error messages returned by `cmd:arithmetica`.
beta

0.3.2 (1.20.1)

0.3.2-1.20.1-build.5
27 апр. 2024 г.181Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Slightly improved error messages returned by `cmd:arithmetica`.
beta

0.3.1 (1.20.1)

0.3.1-1.20.1-build.3
26 апр. 2024 г.200Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Added `hasContext` function to expressions. Allows checking if loot context has the required parameter: `if(hasContext("tool"), "Hi", "Bye")`
beta

0.3.1 (1.20.4)

0.3.1-1.20.4-build.4
26 апр. 2024 г.166Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: * Added `hasContext` function to expressions. Allows checking if loot context has the required parameter: `if(hasContext("tool"), "Hi", "Bye")`
beta

0.3.0 (1.20.1)

0.3.0-1.20.1-build.1
26 апр. 2024 г.125Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Added entity parameter to `cmd:explode`. The entity will be marked as the "creator" of the explosion and other entities will redirect their anger to the entity if affected by the explosion. * Added fire parameter to `cmd:explode`. Creates fire, if true. * Fixed `double` casts converting numbers to scientific notation. * `long` and `int` casts no longer actually convert to their types, instead they truncate the trailing zeros.
beta

0.3.0 (1.20.4)

0.3.0-1.20.4-build.2
26 апр. 2024 г.137Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: * Added entity parameter to `cmd:explode`. The entity will be marked as the "creator" of the explosion and other entities will redirect their anger to the entity if affected by the explosion. * Added fire parameter to `cmd:explode`. Creates fire, if true. * Fixed `double` casts converting numbers to scientific notation. * `long` and `int` casts no longer actually convert to their types, instead they truncate the trailing zeros.
beta

0.2.2 (1.20.4)

0.2.2-1.20.4-build.64
19 апр. 2024 г.121Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: * Exposed Expressions in the `api` package. * You can now specify `commander:commands` in advancement rewards. * Mappings are no longer downloaded on startup. * Added shaded licenses. * Fixed conditioned selector crash on 1.20.4.
beta

0.2.2 (1.20.1)

0.2.2-1.20.1-build.63
19 апр. 2024 г.132Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Exposed Expressions in the `api` package. * You can now specify `commander:commands` in advancement rewards. * Mappings are no longer downloaded on startup. * Added shaded licenses. * Fixed conditioned selector crash on 1.20.4.
alpha

0.2.1 (1.20.4)

0.2.1-1.20.4-build.59
18 апр. 2024 г.123Minecraft: 1.20.4fabric
Скачать
Что нового
### What's New: * Added `structContainsKey` function to expressions. * Moved custom `random`, `lerp` and `clamp` functions to BigDecimal. * There was an attempt at optimizing reflective field lookups by caching invalid fields and constructing a lazy class hierarchy which propagates found fields and methods downstream.
beta

0.2.1 (1.20.1)

0.2.1-1.20.1-build.58
18 апр. 2024 г.112Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Added `structContainsKey` function to expressions. * Moved custom `random`, `lerp` and `clamp` functions to BigDecimal. * There was an attempt at optimizing reflective field lookups by caching invalid fields and constructing a lazy class hierarchy which propagates found fields and methods downstream.
beta

0.2.0 (1.20.1)

0.2.0-1.20.1-build.54
17 апр. 2024 г.152Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Switched to [EvalEX](https://ezylang.github.io/EvalEx/) for expression parsing. This comes with a bunch of improvements. The main of which is support for all object fields and methods, for example: Before you had a limited number of "extractions" you could use on an object, like `x` and `player/level`, but now, you can specify **any** field or method: Old: ``` /say hi ${{this_entity[x]}} ``` New: ``` /say hi ${{this_entity.getX}} /say hi ${{round(sqrt(abs(level.getSeed)), 0)}} ``` * Added additional casts to the `$(){{}}` syntax. `bool`, `int`, `double` * `cmd:arithmetica` now supports casts and returns strings by default. Now it also requires permission level 2.
beta

0.1.0 (1.20.1)

0.1.0-1.20.1-build.47
12 апр. 2024 г.129Minecraft: 1.20.1fabric
Скачать
Что нового
### What's New: * Initial release 🥳