diff --git a/demo/data/rollball.lua b/demo/data/rollball.lua
index 1221bc17c5a1bc3a13277f25d3e9ac1f46dc271d..7c16c4b72d266b9ba0800ff03b5891130da01e1d 100644
--- a/demo/data/rollball.lua
+++ b/demo/data/rollball.lua
@@ -1 +1,2 @@
-print("File has been loaded!")
\ No newline at end of file
+print("File has been loaded!")
+print(state);
\ No newline at end of file
diff --git a/demo/demo/rollball.cpp b/demo/demo/rollball.cpp
index 55f86311a4ca27a8e96c5824a0c441dcba10833f..c594b320d25862fe824003e668162e1f643e1a40 100644
--- a/demo/demo/rollball.cpp
+++ b/demo/demo/rollball.cpp
@@ -81,7 +81,9 @@ namespace demo {
 		m_phys = physService->create(&world(), entFactory);
 
 		auto* scriptProvider = m_owner.service<fggl::script::ScriptProvider>();
+
 		m_scripts = scriptProvider->create();
+		m_scripts->setGlobal("state", this);
 
 		// asset loader
 		auto* assetLoader = m_owner.service<fggl::assets::Loader>();
diff --git a/include/fggl/script/engine.hpp b/include/fggl/script/engine.hpp
index f81d7f1f6aa7226bae0335da093de01f6327e8fe..fb566cf21009ac979a9a9510c0a5eefffd0efc8f 100644
--- a/include/fggl/script/engine.hpp
+++ b/include/fggl/script/engine.hpp
@@ -40,6 +40,8 @@ namespace fggl::script {
 			// run code in engine
 			virtual bool run(const char* script) = 0;
 			virtual bool load(const char* filename) = 0;
+
+			virtual void setGlobal(const char* name, void* ptr) = 0;
 	};
 
 	class ScriptProvider {
diff --git a/integrations/lua/include/fggl/script/lua/engine.hpp b/integrations/lua/include/fggl/script/lua/engine.hpp
index 0442c7486199daa339e8ebebbecb5570d1c3321a..dcce6f2ad2ae99a7f24a01afdba7be157b5b5c85 100644
--- a/integrations/lua/include/fggl/script/lua/engine.hpp
+++ b/integrations/lua/include/fggl/script/lua/engine.hpp
@@ -45,6 +45,9 @@ namespace fggl::script::lua {
 			bool run(const char* script) override;
 			bool load(const char* filename) override;
 
+			// variables
+			void setGlobal(const char* name, void* ptr) override;
+
 		private:
 			data::Storage* m_storage;
 			lua_State* m_state;
diff --git a/integrations/lua/src/engine.cpp b/integrations/lua/src/engine.cpp
index 984b5885a54fc93fad1a9b8cf1e9887f50149b95..e171ef8da9e8286378f24a76ab4d1785654d2d01 100644
--- a/integrations/lua/src/engine.cpp
+++ b/integrations/lua/src/engine.cpp
@@ -95,4 +95,9 @@ namespace fggl::script::lua {
 		return true;
 	}
 
+	void LuaScriptEngine::setGlobal(const char *name, void *ptr) {
+		lua_pushlightuserdata(m_state, ptr);
+		lua_setglobal(m_state, name);
+	}
+
 }
\ No newline at end of file