diff --git a/lib/linear_ops/src/macros/matrix.rs b/lib/linear_ops/src/macros/matrix.rs
index 69db874..399b8e0 100644
--- a/lib/linear_ops/src/macros/matrix.rs
+++ b/lib/linear_ops/src/macros/matrix.rs
@@ -204,13 +204,19 @@ macro_rules! impl_matrix_named_fields_shape {
 			type Target=$struct_outer<Vector<$size_inner,T>>;
 			#[inline]
 			fn deref(&self)->&Self::Target{
-				unsafe{core::mem::transmute(&self.array)}
+				// This cast is valid because Matrix has #[repr(transparent)]
+				let ptr=&self.array as *const [[T;$size_inner];$size_outer] as *const Self::Target;
+				// SAFETY: this pointer is non-null because it comes from a reference
+				unsafe{&*ptr}
 			}
 		}
 		impl<T> core::ops::DerefMut for Matrix<$size_outer,$size_inner,T>{
 			#[inline]
 			fn deref_mut(&mut self)->&mut Self::Target{
-				unsafe{core::mem::transmute(&mut self.array)}
+				// This cast is valid because Matrix has #[repr(transparent)]
+				let ptr=&mut self.array as *mut [[T;$size_inner];$size_outer] as *mut Self::Target;
+				// SAFETY: this pointer is non-null because it comes from a reference
+				unsafe{&mut*ptr}
 			}
 		}
 	}
diff --git a/lib/linear_ops/src/macros/vector.rs b/lib/linear_ops/src/macros/vector.rs
index 6505782..dee50ab 100644
--- a/lib/linear_ops/src/macros/vector.rs
+++ b/lib/linear_ops/src/macros/vector.rs
@@ -330,13 +330,19 @@ macro_rules! impl_vector_named_fields {
 			type Target=$struct<T>;
 			#[inline]
 			fn deref(&self)->&Self::Target{
-				unsafe{core::mem::transmute(&self.array)}
+				// This cast is valid because Vector has #[repr(transparent)]
+				let ptr=&self.array as *const [T;$size] as *const Self::Target;
+				// SAFETY: this pointer is non-null because it comes from a reference
+				unsafe{&*ptr}
 			}
 		}
 		impl<T> core::ops::DerefMut for Vector<$size,T>{
 			#[inline]
 			fn deref_mut(&mut self)->&mut Self::Target{
-				unsafe{core::mem::transmute(&mut self.array)}
+				// This cast is valid because Vector has #[repr(transparent)]
+				let ptr=&mut self.array as *mut [T;$size] as *mut Self::Target;
+				// SAFETY: this pointer is non-null because it comes from a reference
+				unsafe{&mut*ptr}
 			}
 		}
 	}
diff --git a/lib/roblox_emulator/src/runner/runner.rs b/lib/roblox_emulator/src/runner/runner.rs
index 197366a..7c3eb98 100644
--- a/lib/roblox_emulator/src/runner/runner.rs
+++ b/lib/roblox_emulator/src/runner/runner.rs
@@ -65,8 +65,11 @@ impl Runner{
 			globals.set("game",super::instance::Instance::new_unchecked(context.services.game)).map_err(Error::RustLua)?;
 			globals.set("workspace",super::instance::Instance::new_unchecked(context.services.workspace)).map_err(Error::RustLua)?;
 		}
-		//this makes set_app_data shut up about the lifetime
-		self.lua.set_app_data::<crate::context::LuaAppData>(unsafe{core::mem::transmute(&mut context.dom)});
+		// SAFETY: This is not a &'static mut WeakDom,
+		// but as long as Runnable<'a> holds the lifetime of &'a mut Context
+		// it is a valid unique reference.
+		let ptr=&mut context.dom as *mut rbx_dom_weak::WeakDom;
+		self.lua.set_app_data::<crate::context::LuaAppData>(unsafe{&mut*ptr});
 		#[cfg(feature="run-service")]
 		self.lua.set_app_data::<crate::scheduler::Scheduler>(crate::scheduler::Scheduler::default());
 		Ok(Runnable{