diff --git a/Cargo.lock b/Cargo.lock
index 5d08323..59847c6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -954,19 +954,7 @@ dependencies = [
  "arrayvec",
  "bnum",
  "paste",
- "ratio_ops 0.1.0",
-]
-
-[[package]]
-name = "fixed_wide"
-version = "0.1.2"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "a7e01a5b738e313c912fc41c425cf36e10c51647d3fd21d96db3d616344549fa"
-dependencies = [
- "arrayvec",
- "bnum",
- "paste",
- "ratio_ops 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "ratio_ops",
 ]
 
 [[package]]
@@ -1686,9 +1674,9 @@ dependencies = [
 name = "integration-testing"
 version = "0.1.0"
 dependencies = [
- "strafesnet_common 0.6.0",
+ "strafesnet_common",
  "strafesnet_physics",
- "strafesnet_snf 0.3.0",
+ "strafesnet_snf",
 ]
 
 [[package]]
@@ -1903,20 +1891,9 @@ dependencies = [
 name = "linear_ops"
 version = "0.1.0"
 dependencies = [
- "fixed_wide 0.1.2",
+ "fixed_wide",
  "paste",
- "ratio_ops 0.1.0",
-]
-
-[[package]]
-name = "linear_ops"
-version = "0.1.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "b2e6977ac24f47086d8a7a2d4ae1c720e86dfdc8407cf5e34c18bfa01053c456"
-dependencies = [
- "fixed_wide 0.1.2 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "paste",
- "ratio_ops 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "ratio_ops",
 ]
 
 [[package]]
@@ -2068,10 +2045,10 @@ dependencies = [
  "rbx_reflection_database",
  "rbx_xml",
  "rbxassetid 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_bsp_loader 0.3.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_deferred_loader 0.5.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_rbx_loader 0.6.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_snf 0.3.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "strafesnet_bsp_loader",
+ "strafesnet_deferred_loader",
+ "strafesnet_rbx_loader",
+ "strafesnet_snf",
  "thiserror 2.0.11",
  "tokio",
  "vbsp",
@@ -3053,12 +3030,6 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde"
 name = "ratio_ops"
 version = "0.1.0"
 
-[[package]]
-name = "ratio_ops"
-version = "0.1.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "01239195d6afe0509e7e3511b716c0540251dfe7ece0a9a5a27116afb766c42c"
-
 [[package]]
 name = "rav1e"
 version = "0.7.1"
@@ -3423,21 +3394,6 @@ dependencies = [
  "rbx_types",
 ]
 
-[[package]]
-name = "roblox_emulator"
-version = "0.4.7"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "7fc98335ce4b8548b725d727c5b32bd0b38274606c48fce6b6e7e5807d94db6b"
-dependencies = [
- "glam",
- "mlua",
- "phf",
- "rbx_dom_weak",
- "rbx_reflection",
- "rbx_reflection_database",
- "rbx_types",
-]
-
 [[package]]
 name = "rustc-demangle"
 version = "0.1.24"
@@ -3779,15 +3735,15 @@ dependencies = [
  "glam",
  "parking_lot",
  "pollster",
- "strafesnet_bsp_loader 0.3.0",
- "strafesnet_common 0.6.0",
- "strafesnet_deferred_loader 0.5.0",
+ "strafesnet_bsp_loader",
+ "strafesnet_common",
+ "strafesnet_deferred_loader",
  "strafesnet_graphics",
  "strafesnet_physics",
- "strafesnet_rbx_loader 0.6.0",
+ "strafesnet_rbx_loader",
  "strafesnet_session",
  "strafesnet_settings",
- "strafesnet_snf 0.3.0",
+ "strafesnet_snf",
  "wgpu",
  "winit",
 ]
@@ -3797,22 +3753,8 @@ name = "strafesnet_bsp_loader"
 version = "0.3.0"
 dependencies = [
  "glam",
- "strafesnet_common 0.6.0",
- "strafesnet_deferred_loader 0.5.0",
- "vbsp",
- "vmdl",
- "vpk",
-]
-
-[[package]]
-name = "strafesnet_bsp_loader"
-version = "0.3.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "3cc98773f2b98eb708b098946870b769975b63a396b84698b67e3d968029005d"
-dependencies = [
- "glam",
- "strafesnet_common 0.6.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_deferred_loader 0.5.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "strafesnet_common",
+ "strafesnet_deferred_loader",
  "vbsp",
  "vmdl",
  "vpk",
@@ -3824,42 +3766,18 @@ version = "0.6.0"
 dependencies = [
  "arrayvec",
  "bitflags 2.8.0",
- "fixed_wide 0.1.2",
+ "fixed_wide",
  "glam",
  "id",
- "linear_ops 0.1.0",
- "ratio_ops 0.1.0",
-]
-
-[[package]]
-name = "strafesnet_common"
-version = "0.6.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "0c1d7a83e1f6b579c6a9b4dc70c92373ab53b938601cd75928dd6795b5ffef21"
-dependencies = [
- "arrayvec",
- "bitflags 2.8.0",
- "fixed_wide 0.1.2 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "glam",
- "id",
- "linear_ops 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "ratio_ops 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "linear_ops",
+ "ratio_ops",
 ]
 
 [[package]]
 name = "strafesnet_deferred_loader"
 version = "0.5.0"
 dependencies = [
- "strafesnet_common 0.6.0",
-]
-
-[[package]]
-name = "strafesnet_deferred_loader"
-version = "0.5.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "63d5d48e587d5f8bf5385bee3505ed790727fef68de855cf58247a08c5952bef"
-dependencies = [
- "strafesnet_common 0.6.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "strafesnet_common",
 ]
 
 [[package]]
@@ -3870,7 +3788,7 @@ dependencies = [
  "ddsfile",
  "glam",
  "id",
- "strafesnet_common 0.6.0",
+ "strafesnet_common",
  "strafesnet_session",
  "strafesnet_settings",
  "wgpu",
@@ -3883,7 +3801,7 @@ dependencies = [
  "arrayvec",
  "glam",
  "id",
- "strafesnet_common 0.6.0",
+ "strafesnet_common",
 ]
 
 [[package]]
@@ -3899,29 +3817,9 @@ dependencies = [
  "rbx_reflection_database",
  "rbx_xml",
  "rbxassetid 0.1.0",
- "roblox_emulator 0.4.7",
- "strafesnet_common 0.6.0",
- "strafesnet_deferred_loader 0.5.0",
-]
-
-[[package]]
-name = "strafesnet_rbx_loader"
-version = "0.6.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "e4659a49128c8d12b9fbdb289969cae04bfc5c1750d4273897700c5c17730d8a"
-dependencies = [
- "bytemuck",
- "glam",
- "lazy-regex",
- "rbx_binary",
- "rbx_dom_weak",
- "rbx_mesh",
- "rbx_reflection_database",
- "rbx_xml",
- "rbxassetid 0.1.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "roblox_emulator 0.4.7 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_common 0.6.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
- "strafesnet_deferred_loader 0.5.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "roblox_emulator",
+ "strafesnet_common",
+ "strafesnet_deferred_loader",
 ]
 
 [[package]]
@@ -3930,10 +3828,10 @@ version = "0.1.0"
 dependencies = [
  "glam",
  "replace_with",
- "strafesnet_common 0.6.0",
+ "strafesnet_common",
  "strafesnet_physics",
  "strafesnet_settings",
- "strafesnet_snf 0.3.0",
+ "strafesnet_snf",
 ]
 
 [[package]]
@@ -3943,7 +3841,7 @@ dependencies = [
  "configparser",
  "directories",
  "glam",
- "strafesnet_common 0.6.0",
+ "strafesnet_common",
 ]
 
 [[package]]
@@ -3952,18 +3850,7 @@ version = "0.3.0"
 dependencies = [
  "binrw 0.14.1",
  "id",
- "strafesnet_common 0.6.0",
-]
-
-[[package]]
-name = "strafesnet_snf"
-version = "0.3.0"
-source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/"
-checksum = "fd24a22c484ca04213fa44b1d34bfbec385f0d176a2b5829cfa59ba7987b80d5"
-dependencies = [
- "binrw 0.14.1",
- "id",
- "strafesnet_common 0.6.0 (sparse+https://git.itzana.me/api/packages/strafesnet/cargo/)",
+ "strafesnet_common",
 ]
 
 [[package]]
diff --git a/map-tool/Cargo.toml b/map-tool/Cargo.toml
index 0f541f5..ffa261d 100644
--- a/map-tool/Cargo.toml
+++ b/map-tool/Cargo.toml
@@ -19,10 +19,10 @@ rbx_dom_weak = { version = "2.7.0", registry = "strafesnet" }
 rbx_reflection_database = { version = "0.2.10", registry = "strafesnet" }
 rbx_xml = { version = "0.13.3", registry = "strafesnet" }
 rbxassetid = { version = "0.1.0", registry = "strafesnet" }
-strafesnet_bsp_loader = { version = "0.3.0", registry = "strafesnet" }
-strafesnet_deferred_loader = { version = "0.5.0", registry = "strafesnet" }
-strafesnet_rbx_loader = { version = "0.6.0", registry = "strafesnet" }
-strafesnet_snf = { version = "0.3.0", registry = "strafesnet" }
+strafesnet_bsp_loader = { version = "0.3.0", path = "../lib/bsp_loader", registry = "strafesnet" }
+strafesnet_deferred_loader = { version = "0.5.0", path = "../lib/deferred_loader", registry = "strafesnet" }
+strafesnet_rbx_loader = { version = "0.6.0", path = "../lib/rbx_loader", registry = "strafesnet" }
+strafesnet_snf = { version = "0.3.0", path = "../lib/snf", registry = "strafesnet" }
 thiserror = "2.0.11"
 tokio = { version = "1.43.0", features = ["macros", "rt-multi-thread", "fs"] }
 vbsp = "0.6.0"