diff --git a/Cargo.lock b/Cargo.lock
index c79c66e..2bc0612 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -360,6 +360,8 @@ name = "strafesnet-scanner"
 version = "0.1.0"
 dependencies = [
  "rbx_binary",
+ "rbx_dom_weak",
+ "rbx_reflection_database",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 0117d13..dca4fad 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,3 +7,5 @@ edition = "2021"
 
 [dependencies]
 rbx_binary = "0.7.1"
+rbx_dom_weak = "2.5.0"
+rbx_reflection_database = "0.2.7"
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..34c88a5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,64 @@
-fn main() {
-    println!("Hello, world!");
+fn class_is_a(class: &str, superclass: &str) -> bool {
+    if class==superclass {
+        return true
+    }
+    let class_descriptor=rbx_reflection_database::get().classes.get(class);
+    if let Some(descriptor) = &class_descriptor {
+        if let Some(class_super) = &descriptor.superclass {
+            return class_is_a(&class_super, superclass)
+        }
+    }
+    return false
+}
+
+fn recursive_collect_scripts(scripts: &mut std::vec::Vec<String>,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance){
+    for &referent in instance.children() {
+        let c = dom.get_by_ref(referent).unwrap();
+        if class_is_a(c.class.as_str(), "LuaSourceContainer") {
+            if let Some(rbx_dom_weak::types::Variant::String(s)) = c.properties.get("Source") {
+                scripts.push(s.clone());
+            }
+        }
+        recursive_collect_scripts(scripts,dom,c);
+    }
+}
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+    // Using buffered I/O is recommended with rbx_binary
+    let input = std::io::BufReader::new(std::fs::File::open("map.rbxm")?);
+
+    let dom = rbx_binary::from_reader(input)?;
+
+    //Construct allowed scripts
+    let mut allowed = std::collections::HashSet::<String>::new();
+    for entry in std::fs::read_dir("allowed")? {
+        allowed.insert(std::fs::read_to_string(entry?.path())?);
+    }
+
+    let mut scripts = std::vec::Vec::<String>::new();
+    recursive_collect_scripts(&mut scripts, &dom, dom.root());
+
+    //check scribb
+    let mut any_failed=false;
+    for (i,script) in scripts.iter().enumerate() {
+        if allowed.contains(script) {
+            println!("pass");
+        }else{
+            println!("fail");
+            any_failed=true;
+            std::fs::write(format!("blocked/{}.lua",i),script)?;
+        }
+    }
+    if any_failed {
+        println!("One or more scripts are not allowed.");
+        return Ok(())//everything is not ok but idk how to return an error LMAO
+    }
+    println!("All scripts passed!");
+    // std::process::Command::new("rbxcompiler")
+    // .arg("--compile=false")
+    // .arg("--group=6980477")
+    // .arg("--asset=5692139100")
+    // .arg("--input=map.rbxm")
+    // .spawn()?;
+    Ok(())
 }