diff --git a/Cargo.lock b/Cargo.lock
index ba4de2d5cebcc6d51435aed97cb43ef21737883a..2d282391afc7e4aa6f9bb411325fa0ef74875d08 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -11,6 +11,56 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "anstream"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
+dependencies = [
+ "anstyle",
+ "once_cell",
+ "windows-sys",
+]
+
 [[package]]
 name = "anyhow"
 version = "1.0.98"
@@ -38,18 +88,58 @@ version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
 
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
 [[package]]
 name = "cfg_aliases"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
 
+[[package]]
+name = "clap"
+version = "4.5.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+
 [[package]]
 name = "convert_case"
 version = "0.7.1"
@@ -171,9 +261,7 @@ dependencies = [
  "anyhow",
  "bitflags",
  "bytecount",
- "cfg-if",
  "derive_more",
- "godot",
  "log",
  "memchr",
  "nom",
@@ -182,12 +270,39 @@ dependencies = [
  "thiserror",
 ]
 
+[[package]]
+name = "grimoire_cli"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "clap",
+ "log",
+ "thiserror",
+]
+
+[[package]]
+name = "grimoire_godot"
+version = "0.0.1"
+dependencies = [
+ "anyhow",
+ "derive_more",
+ "godot",
+ "log",
+ "thiserror",
+]
+
 [[package]]
 name = "heck"
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
 [[package]]
 name = "libc"
 version = "0.2.172"
@@ -259,6 +374,12 @@ dependencies = [
  "nom",
 ]
 
+[[package]]
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
 [[package]]
 name = "proc-macro2"
 version = "1.0.95"
@@ -336,6 +457,12 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
 [[package]]
 name = "syn"
 version = "2.0.100"
@@ -391,6 +518,12 @@ version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
 
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
 [[package]]
 name = "venial"
 version = "0.6.1"
@@ -400,3 +533,76 @@ dependencies = [
  "proc-macro2",
  "quote",
 ]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff --git a/Cargo.toml b/Cargo.toml
index 3edf4d3efab4f40fb91fd6356dc3f01559bf6d40..0a61f10764622b198a9ea5de7807cbace139ed3e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,8 @@
-[package]
-name         = "grimoire"
-description  = "The Grimoire Engine, a VN engine done for fun"
+[workspace]
+resolver = "3"
+members = ["grimoire", "grimoire_cli", "grimoire_godot"]
+
+[workspace.package]
 version      = "0.0.1"
 license      = "MIT"
 rust-version = "1.86"
@@ -10,38 +12,39 @@ authors = [
     "Maƫlle Martin <maelle.martin@proton.me>",
 ]
 
+[profile]
+dev     = { debug = true,  opt-level = "s" }
+release = { debug = false, opt-level = 3, panic = "abort", strip = true, codegen-units = 1, lto = true }
 
-[lib]
-crate-type = ["cdylib"]
+[workspace.dependencies]
+anyhow      =   "1"
+nom         =   "8"
+nom_locate  =   "5"
+bytecount   = "0.6"
+thiserror   =   "2"
+log         = "0.4"
 
+[workspace.dependencies.derive_more]
+version  = "2"
+features = ["full"]
 
-[profile.release]
-debug         = false
-opt-level     = 3
-panic         = "abort"
-strip         = true
-codegen-units = 1
-lto           = true
+[workspace.dependencies.smol_str]
+version  = "0.3"
+features = ["serde"]
 
+[workspace.dependencies.clap]
+version  = "4"
+features = ["derive"]
 
-[profile.dev]
-debug     = true
-opt-level = "s"
+[workspace.dependencies.bitflags]
+version = "2"
+default-features = false
 
+[workspace.dependencies.memchr]
+version = "2"
+default-features = false
 
-[dependencies]
-anyhow      = "1"
-nom         = "8"
-nom_locate  = "5"
-bytecount   = "0.6"
-cfg-if      = "1"
-thiserror   = "2"
-log         = "0.4"
-derive_more = { version = "2",   features = ["full"] }
-smol_str    = { version = "0.3", features = ["serde"] }
-bitflags    = { version = "2",   default-features = false }
-memchr      = { version = "*",   default-features = false } # ^1.0.0 + ^2.0
-
-[dependencies.godot]
+[workspace.dependencies.godot]
 git      = "https://github.com/godot-rust/gdext.git"
 features = ["api-4-4", "register-docs"]
+
diff --git a/grimoire/Cargo.toml b/grimoire/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..e0696514052a90a4f22df9b773f23f5f6022665e
--- /dev/null
+++ b/grimoire/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name        = "grimoire"
+description = "The Grimoire Engine, a VN engine done for fun"
+version.workspace      = true
+license.workspace      = true
+rust-version.workspace = true
+edition.workspace      = true
+authors.workspace      = true
+
+[dependencies]
+anyhow.workspace     = true
+nom.workspace        = true
+nom_locate.workspace = true
+bytecount.workspace  = true
+thiserror.workspace  = true
+log.workspace        = true
+derive_more.workspace= true
+smol_str.workspace   = true
+bitflags.workspace   = true
+memchr.workspace     = true
diff --git a/src/error.rs b/grimoire/src/error.rs
similarity index 100%
rename from src/error.rs
rename to grimoire/src/error.rs
diff --git a/src/expr/mod.rs b/grimoire/src/expr/mod.rs
similarity index 100%
rename from src/expr/mod.rs
rename to grimoire/src/expr/mod.rs
diff --git a/grimoire/src/lib.rs b/grimoire/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..1dc5c4853e9ff3780577039ea9243d8048585b9a
--- /dev/null
+++ b/grimoire/src/lib.rs
@@ -0,0 +1,5 @@
+pub mod error;
+pub mod expr;
+pub mod parser;
+pub mod spell;
+pub mod state;
diff --git a/src/parser/error.rs b/grimoire/src/parser/error.rs
similarity index 100%
rename from src/parser/error.rs
rename to grimoire/src/parser/error.rs
diff --git a/src/parser/expr.rs b/grimoire/src/parser/expr.rs
similarity index 100%
rename from src/parser/expr.rs
rename to grimoire/src/parser/expr.rs
diff --git a/src/parser/mod.rs b/grimoire/src/parser/mod.rs
similarity index 100%
rename from src/parser/mod.rs
rename to grimoire/src/parser/mod.rs
diff --git a/src/parser/span.rs b/grimoire/src/parser/span.rs
similarity index 95%
rename from src/parser/span.rs
rename to grimoire/src/parser/span.rs
index 6a0deb3820b578ddcbc4512607406ad275be10cd..3bfe1ad4778a7b51b29279d1fdd8997b9b9937ac 100644
--- a/src/parser/span.rs
+++ b/grimoire/src/parser/span.rs
@@ -56,7 +56,7 @@ impl<'a> Span<'a> {
     /// The fragment that is spanned.
     /// The fragment represents a part of the input of the parser.
     pub fn fragment(&self) -> &str {
-        &self.fragment
+        self.fragment
     }
 
     pub fn into_fragment(self) -> &'a str {
@@ -64,7 +64,7 @@ impl<'a> Span<'a> {
     }
 
     fn slice_by(&self, next_fragment: &'a str) -> Self {
-        let consumed_len = self.fragment.offset(&next_fragment);
+        let consumed_len = self.fragment.offset(next_fragment);
         if consumed_len == 0 {
             return Self {
                 line: self.line,
@@ -133,10 +133,10 @@ impl<'a> Input for Span<'a> {
 
 impl Compare<&str> for Span<'_> {
     fn compare(&self, t: &str) -> nom::CompareResult {
-        todo!()
+        self.fragment().compare(t)
     }
 
     fn compare_no_case(&self, t: &str) -> nom::CompareResult {
-        todo!()
+        self.fragment().compare_no_case(t)
     }
 }
diff --git a/src/parser/utils.rs b/grimoire/src/parser/utils.rs
similarity index 100%
rename from src/parser/utils.rs
rename to grimoire/src/parser/utils.rs
diff --git a/src/spell/arguments.rs b/grimoire/src/spell/arguments.rs
similarity index 100%
rename from src/spell/arguments.rs
rename to grimoire/src/spell/arguments.rs
diff --git a/src/spell/factory.rs b/grimoire/src/spell/factory.rs
similarity index 100%
rename from src/spell/factory.rs
rename to grimoire/src/spell/factory.rs
diff --git a/src/spell/mod.rs b/grimoire/src/spell/mod.rs
similarity index 100%
rename from src/spell/mod.rs
rename to grimoire/src/spell/mod.rs
diff --git a/src/spell/traits.rs b/grimoire/src/spell/traits.rs
similarity index 100%
rename from src/spell/traits.rs
rename to grimoire/src/spell/traits.rs
diff --git a/src/state.rs b/grimoire/src/state.rs
similarity index 100%
rename from src/state.rs
rename to grimoire/src/state.rs
diff --git a/grimoire_cli/Cargo.toml b/grimoire_cli/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..9f29b9e54643d085dc8f73a52da548f29cc37d6d
--- /dev/null
+++ b/grimoire_cli/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name        = "grimoire_cli"
+description = "The Grimoire Engine CLI"
+version.workspace      = true
+license.workspace      = true
+rust-version.workspace = true
+edition.workspace      = true
+authors.workspace      = true
+
+[dependencies]
+anyhow.workspace    = true
+thiserror.workspace = true
+log.workspace       = true
+clap.workspace      = true
+
diff --git a/grimoire_cli/src/main.rs b/grimoire_cli/src/main.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b49dfb4c9545e2284801db106b906daefd80b218
--- /dev/null
+++ b/grimoire_cli/src/main.rs
@@ -0,0 +1,2 @@
+
+fn main() {}
diff --git a/grimoire_godot/Cargo.toml b/grimoire_godot/Cargo.toml
new file mode 100644
index 0000000000000000000000000000000000000000..cb4dca5f7205fc6eff618db3888d9c8b0b5f07b7
--- /dev/null
+++ b/grimoire_godot/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name        = "grimoire_godot"
+description = "The Grimoire Engine godot bindings"
+version.workspace      = true
+license.workspace      = true
+rust-version.workspace = true
+edition.workspace      = true
+authors.workspace      = true
+
+[lib]
+name       = "grimoire"
+crate-type = ["cdylib"]
+
+[dependencies]
+anyhow.workspace     = true
+thiserror.workspace  = true
+log.workspace        = true
+derive_more.workspace= true
+godot.workspace      = true
diff --git a/src/dummy.rs b/grimoire_godot/src/dummy.rs
similarity index 100%
rename from src/dummy.rs
rename to grimoire_godot/src/dummy.rs
diff --git a/grimoire_godot/src/lib.rs b/grimoire_godot/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..037b73841468f495f2be64f386eb434a928ea38d
--- /dev/null
+++ b/grimoire_godot/src/lib.rs
@@ -0,0 +1,8 @@
+mod dummy;
+
+use godot::prelude::{gdextension, ExtensionLibrary};
+
+struct GrimoireExtension;
+
+#[gdextension]
+unsafe impl ExtensionLibrary for GrimoireExtension {}
diff --git a/src/lib.rs b/src/lib.rs
deleted file mode 100644
index 56217569cdc5ef6d03c7964cbda13df30a5460c1..0000000000000000000000000000000000000000
--- a/src/lib.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-pub mod error;
-pub mod expr;
-pub mod parser;
-pub mod spell;
-pub mod state;
-
-pub mod dummy;
-
-use godot::prelude::{ExtensionLibrary, gdextension};
-
-struct GrimoireExtension;
-
-#[gdextension]
-unsafe impl ExtensionLibrary for GrimoireExtension {}