kitgit

tirbofish/dropbear · commit

a6a5f38e0377eec8d38caa9828d398191ff94e16

started the switching to swift instead of gleam (as it is more suitable)

Unverified

tk <4tkbytes@pm.me> · 2025-09-25 14:01

view full diff

diff --git a/.github/workflows/swift_doc.yaml b/.github/workflows/swift_doc.yaml
new file mode 100644
index 0000000..0ac991f
--- /dev/null
+++ b/.github/workflows/swift_doc.yaml
@@ -0,0 +1,168 @@
+name: Generate Swift Documentation
+
+on:
+  push:
+    branches: [ main ]
+    paths:
+      - '**/*.swift'
+      - '.github/workflows/swift-docs.yaml'
+  pull_request:
+    branches: [ main ]
+    paths:
+      - '**/*.swift'
+  workflow_dispatch:
+
+permissions:
+  contents: read
+  pages: write
+  id-token: write
+
+concurrency:
+  group: "pages"
+  cancel-in-progress: false
+
+jobs:
+  generate-docs:
+    runs-on: ubuntu-latest
+    
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+      with:
+        submodules: recursive
+    
+    - name: Setup Swift
+      uses: swift-actions/setup-swift@v1
+      with:
+        swift-version: "5.9"
+    
+    - name: Install Swift-DocC Plugin
+      run: |
+        # Install Swift-DocC plugin for documentation generation
+        swift package plugin --allow-writing-to-directory docs \
+          generate-documentation --target dropbear --disable-indexing \
+          --transform-for-static-hosting --hosting-base-path dropbear \
+          --output-directory docs || true
+        
+        # Alternative: Use swift-doc if DocC doesn't work
+        if [ ! -d "docs" ] || [ -z "$(ls -A docs)" ]; then
+          echo "DocC failed, trying swift-doc..."
+          
+          # Install swift-doc
+          git clone https://github.com/SwiftDocOrg/swift-doc.git
+          cd swift-doc
+          swift build -c release
+          sudo cp .build/release/swift-doc /usr/local/bin/
+          cd ..
+          
+          # Generate documentation with swift-doc
+          mkdir -p docs
+          find . -name "*.swift" -not -path "./swift-doc/*" | head -20 | while read file; do
+            echo "Processing: $file"
+            swift-doc generate "$file" --module-name "$(basename $(dirname $file))" --output docs/ --format html || true
+          done
+        fi
+    
+    - name: Create index.html if missing
+      run: |
+        if [ ! -f "docs/index.html" ]; then
+          cat > docs/index.html << 'EOF'
+        <!DOCTYPE html>
+        <html lang="en">
+        <head>
+            <meta charset="UTF-8">
+            <meta name="viewport" content="width=device-width, initial-scale=1.0">
+            <title>Dropbear Swift Documentation</title>
+            <style>
+                body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; margin: 40px; }
+                h1 { color: #333; }
+                .module { margin: 20px 0; padding: 20px; border: 1px solid #ddd; border-radius: 8px; }
+                a { color: #007AFF; text-decoration: none; }
+                a:hover { text-decoration: underline; }
+            </style>
+        </head>
+        <body>
+            <h1>🐨 Dropbear Swift Documentation</h1>
+            <p>Documentation for Swift scripting in the Dropbear game engine.</p>
+            
+            <div class="module">
+                <h2>Available Documentation</h2>
+                <p>Swift documentation files will be listed here once generated.</p>
+            </div>
+            
+            <div class="module">
+                <h3>About Dropbear</h3>
+                <p>Dropbear is a game engine made in Rust and scripted with Swift. Visit the main repository for more information.</p>
+                <a href="https://github.com/4tkbytes/dropbear">GitHub Repository</a>
+            </div>
+        </body>
+        </html>
+        EOF
+        fi
+        
+        # List generated files
+        echo "Generated documentation files:"
+        find docs -name "*.html" -type f || echo "No HTML files found"
+    
+    - name: Setup Pages
+      if: github.ref == 'refs/heads/main'
+      uses: actions/configure-pages@v4
+      
+    - name: Upload artifact
+      if: github.ref == 'refs/heads/main'
+      uses: actions/upload-pages-artifact@v3
+      with:
+        path: ./docs
+        
+    - name: Deploy to GitHub Pages
+      if: github.ref == 'refs/heads/main'
+      id: deployment
+      uses: actions/deploy-pages@v4
+
+  # Fallback job for manual Swift file documentation
+  backup-docs:
+    runs-on: ubuntu-latest
+    if: failure()
+    
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v4
+      
+    - name: Find and document Swift files
+      run: |
+        mkdir -p docs
+        
+        # Create a simple documentation index
+        cat > docs/index.html << 'EOF'
+        <!DOCTYPE html>
+        <html>
+        <head>
+            <title>Dropbear Swift Code</title>
+            <style>
+                body { font-family: monospace; margin: 40px; }
+                .file { margin: 20px 0; padding: 20px; background: #f5f5f5; }
+                pre { background: #fff; padding: 15px; overflow-x: auto; }
+            </style>
+        </head>
+        <body>
+            <h1>Dropbear Swift Code Documentation</h1>
+        EOF
+        
+        # Find all Swift files and add them to documentation
+        find . -name "*.swift" -not -path "./.git/*" | while read file; do
+          echo "<div class='file'>" >> docs/index.html
+          echo "<h2>$(basename $file)</h2>" >> docs/index.html
+          echo "<p>Path: $file</p>" >> docs/index.html
+          echo "<pre>" >> docs/index.html
+          head -50 "$file" | sed 's/</\&lt;/g; s/>/\&gt;/g' >> docs/index.html
+          echo "</pre>" >> docs/index.html
+          echo "</div>" >> docs/index.html
+        done
+        
+        echo "</body></html>" >> docs/index.html
+        
+    - name: Upload backup docs
+      if: github.ref == 'refs/heads/main'
+      uses: actions/upload-pages-artifact@v3
+      with:
+        path: ./docs
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index f5ab93d..dc8b8b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,8 +26,5 @@ docs
 
 dropbear_future-queue/test.log
 
-# gleam
-*.beam
-*.ez
-/build
-erl_crash.dump
+*/.build/*
+.build/*
\ No newline at end of file
diff --git a/Package.swift b/Package.swift
new file mode 100644
index 0000000..e5ab6f8
--- /dev/null
+++ b/Package.swift
@@ -0,0 +1,26 @@
+// swift-tools-version: 6.2
+
+import PackageDescription
+
+let package = Package(
+    name: "dropbear",
+    products: [
+        .library(
+            name: "dropbear",
+            type: .dynamic,
+            targets: ["dropbear"],
+        ),
+    ],
+    dependencies: [
+        // .package(url: "https://github.com/nicklockwood/VectorMath", from: "0.4.0")
+    ],
+    targets: [
+        .target(
+            name: "dropbear"
+        ),
+        .testTarget(
+            name: "dropbearTests",
+            dependencies: ["dropbear"]
+        ),
+    ]
+)
diff --git a/README.md b/README.md
index 244de31..caadc83 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,22 @@
 # dropbear
 
-dropbear is a game engine used to create games. It's made in rust. It's name is a double entendre, with it being the nickname of koalas but also fits in nicely with the theme of rust utilising memory management with "drops".
+dropbear is a game engine used to create games, made in `Rust` and scripted with `Swift`.
 
-If you might have not realised, all the crates/projects names are after Australian flora and fauna.
+It's name is a double entendre, with it being the nickname of koalas but also fits in nicely with the theme of rust utilising memory management with "drops".
+
+If you might have not realised, all the crates/projects names are after Australian items.
 
 ## Projects
 
 - [dropbear-engine](https://github.com/4tkbytes/dropbear/tree/main/dropbear-engine) is the rendering engine that uses wgpu and the main name of the project.
-- [eucalyptus-editor](https://github.com/4tkbytes/dropbear/tree/main/eucalyptus-editor) is the visual editor used to create games visually, taking inspiration from Unity, Roblox Studio and other engines.
+- [eucalyptus-editor](https://github.com/4tkbytes/dropbear/tree/main/eucalyptus-editor) is the visual editor used to create games visually, taking inspiration from Unity, Unreal, Roblox Studio and other engines.
 - [eucalyptus-core](https://github.com/4tkbytes/dropbear/tree/main/eucalyptus-core) is the library used by both `redback-runtime` and `eucalyptus-editor` to share configs and metadata between each other.
-- [redback-runtime](https://github.com/4tkbytes/redback-runtime) is the runtime used to load .eupak files and run the games loaded on them.
+- [redback-runtime](https://github.com/4tkbytes/redback-runtime) is the runtime used to load .eupak files and run the game loaded on them.
 
 ### Related Projects
+
 - [dropbear_future-queue](https://github.com/4tkbytes/dropbear/tree/main/dropbear_future-queue) is a handy library for dealing with async in a sync context
-- [model_to_image](https://github.com/4tkbytes/model_to_image) is a library used to generate thumbnails and images from a 3D model with the help of `russimp-ng`
+- [model_to_image](https://github.com/4tkbytes/model_to_image) is a library used to generate thumbnails and images from a 3D model with the help of `russimp-ng` and a custom made rasteriser. _(very crude but usable)_
 
 ## Build
 
@@ -23,6 +26,7 @@ With Unix systems (macOS not tested), you will have to download a couple depende
 
 <!-- If you have a macOS system, please create a PR and add your own implementation. I know you need to use brew, but I don't know what dependencies to install.  -->
 
+#### Dependencies
 
 ```bash
 # ubuntu
@@ -33,9 +37,14 @@ sudo pacman -Syu base-devel systemd pkgconf openssl clang cmake meson assimp
 
 ```
 
+#### Swift
+
+If you are using the Eucalyptus editor and are planning on scripting, you will have to download the Swift language. Don't fret, the Swift language is available to all major operating systems _(not only macOS to contrary belief)_, and can be easily downloaded here: [https://www.swift.org/install](https://www.swift.org/install)
 
 After downloading the requirements, you are free to build it using cargo.
 
+#### Engine Build
+
 ```bash
 git clone git@github.com:4tkbytes/dropbear
 cd dropbear
@@ -48,13 +57,17 @@ git submodule update
 cargo build
 ```
 
+### Prebuilt
+
 If you do not want to build it locally, you are able to download the latest action build (if no releases have been made).
 
 [nightly.link](https://nightly.link/4tkbytes/dropbear/workflows/create_executable.yaml/main?preview)
 
 ## Usage
 
-todo
+Despite the dropbear-engine (and other components) being made in Rust, the editor has chosen the scripting language of choice to be `Swift`.
+
+API documentation and articles are available at (todo)
 
 ## Compability
 
@@ -65,16 +78,15 @@ todo
 
 <sup>1</sup> Will never be implemented; not intended for that platform.
 
-<sup>2</sup>  Made some progress on implementing, but currently a WIP. 
+<sup>2</sup>  Made some progress on implementing, but currently a WIP.
 
 ## Contributions
 
 Yeah yeah, go ahead and contribute. Make sure it works, and its not spam, and any tests pass.
 
 # Licensing
-In the case someone actually makes something with my engine and distributes it, it (meaning **dropbear-engine**, 
-**eucalyptus** and **redback-runtime**) must abide by the license in [LICENSE.md](LICENSE.md). 
 
-<!-- The gleek package is licensed under the [MIT License](https://mit-license.org/), which allows for anyone to use my 
-library without _much_ restrictions.  -->
+In the case someone actually makes something with my engine and distributes it, the projects (meaning **dropbear-engine**,
+**eucalyptus** and **redback-runtime**) must abide by the license in [LICENSE.md](LICENSE.md).
 
+The **dropbear_future-queue** rust library is available under the `MIT` license, which can be used by anyone.
diff --git a/Sources/dropbear/dropbear.swift b/Sources/dropbear/dropbear.swift
new file mode 100644
index 0000000..24a86be
--- /dev/null
+++ b/Sources/dropbear/dropbear.swift
@@ -0,0 +1,38 @@
+/// A class that all scripts inherit, which define simple functions which are ran
+/// in the dropbear rust engine. 
+public class RunnableScript {
+    /// Loads the content/variables/states into the entity/scene. 
+    /// It runs ONLY ONCE. 
+    public func onLoad() {
+        fatalError("Hey there! I'm not overriden. You might wanna do something about this onLoad function!")
+    }
+
+    /// Updates the engine context with the content inside the function
+    /// - Parameter dt: Deltatime/the time it takes for the previous frame to render as a `Float`
+    public func onUpdate(dt: Float) {
+        fatalError("Hey there! I'm not overriden. You might wanna do something about this onUpdate function!")
+    }
+}
+
+public func getInput() -> Input {
+    Input()
+}
+
+// todo
+public func getCurrentScene() -> Scene! {
+    if true /* check if script is attached to scene */ {
+        Scene()
+    } else {
+        nil
+    }
+}
+
+// todo
+public func getAttachedEntity() -> Entity {
+    Entity()
+}
+
+// todo
+public func getScene() -> Scene {
+    Scene()
+}
\ No newline at end of file
diff --git a/Sources/dropbear/entity.swift b/Sources/dropbear/entity.swift
new file mode 100644
index 0000000..e2e885a
--- /dev/null
+++ b/Sources/dropbear/entity.swift
@@ -0,0 +1,3 @@
+public class Entity {
+    // todo: work on
+}
\ No newline at end of file
diff --git a/Sources/dropbear/example.swift b/Sources/dropbear/example.swift
new file mode 100644
index 0000000..37441c2
--- /dev/null
+++ b/Sources/dropbear/example.swift
@@ -0,0 +1,16 @@
+// example testing module, do not use in production
+
+class Player: RunnableScript {
+    override func onLoad() {
+        print("I have risen")
+        // let current_scene = dropbear.getCurrentScene()
+        // let player = current_scene?.getEntity("player")
+        if dropbear.getInput().isKeyPressed(Key.W) {
+            // player?.moveForward()
+        }
+    }
+
+    override func onUpdate(dt: Float) {
+        print("I am currently awake")
+    }
+}
\ No newline at end of file
diff --git a/Sources/dropbear/input.swift b/Sources/dropbear/input.swift
new file mode 100644
index 0000000..aa4e7a6
--- /dev/null
+++ b/Sources/dropbear/input.swift
@@ -0,0 +1,14 @@
+public class Input {
+    public func isKeyPressed(_ key: Key) -> Bool {
+        // add checking here
+        return false;
+    }
+}
+
+public enum Key {
+    case W
+    case A
+    case S
+    case D
+    // add more here
+}
\ No newline at end of file
diff --git a/Sources/dropbear/math.swift b/Sources/dropbear/math.swift
new file mode 100644
index 0000000..ea72e6d
--- /dev/null
+++ b/Sources/dropbear/math.swift
@@ -0,0 +1,40 @@
+/// A type alias for making the creation of `Vector3` simple. 
+/// 
+/// Defaults to `Double`
+typealias Vector3D = Math.Vector3<Double>
+
+/** Math library for the dropbear-engine Swift API
+* I couldn't seem to find any sort of library that deals with vector math, so why not I create my own
+*/
+enum Math {
+    /// A class containing an `x`, `y` and `z` value of type `T`. 
+    /// 
+    /// The type `T` must conform as
+    /// an `ExpressibleByIntegerLiteral` (no strings or other stuff). 
+    class Vector3<T> 
+    where T: ExpressibleByIntegerLiteral {
+        /// The first value in a `Vector3`
+        var x: T
+        /// The second value in a `Vector3`
+        var y: T
+        /// The third value in a `Vector3`
+        var z: T
+
+        /// Initialises a new Vector3
+        /// - Parameters:
+        ///   - x: A value of type T
+        ///   - y: A value of type T
+        ///   - z: A value of type T
+        init(x: T, y: T, z: T) {
+            self.x = x
+            self.y = y
+            self.z = z
+        }
+
+        /// Creates a new Vector3 of type T with all values set to zero. 
+        /// - Returns: Vector3 of type T
+        static func zero() -> Vector3<T> {
+            return Vector3(x: 0, y: 0, z: 0)
+        }
+    }
+}
\ No newline at end of file
diff --git a/Sources/dropbear/registry.swift b/Sources/dropbear/registry.swift
new file mode 100644
index 0000000..33f0777
--- /dev/null
+++ b/Sources/dropbear/registry.swift
@@ -0,0 +1,4 @@
+class ScriptRegistry {
+    var scripts: [String: () -> RunnableScript] = [:]
+    
+}
\ No newline at end of file
diff --git a/Sources/dropbear/scene.swift b/Sources/dropbear/scene.swift
new file mode 100644
index 0000000..643d93d
--- /dev/null
+++ b/Sources/dropbear/scene.swift
@@ -0,0 +1,7 @@
+public class Scene {
+    // create more info on this scene
+
+    public func getEntity(_ label: String) -> Entity! {
+        return nil
+    }
+}
\ No newline at end of file
diff --git a/Tests/dropbearTests/dropbearTests.swift b/Tests/dropbearTests/dropbearTests.swift
new file mode 100644
index 0000000..cb7386b
--- /dev/null
+++ b/Tests/dropbearTests/dropbearTests.swift
@@ -0,0 +1,6 @@
+import Testing
+@testable import dropbear
+
+@Test func example() async throws {
+    // Write your test here and use APIs like `#expect(...)` to check expected conditions.
+}
diff --git a/eucalyptus-editor/src/build/gleam.rs b/eucalyptus-editor/src/build/gleam.rs
deleted file mode 100644
index 4d29d12..0000000
--- a/eucalyptus-editor/src/build/gleam.rs
+++ /dev/null
@@ -1,600 +0,0 @@
-use app_dirs2::{AppDataType, app_dir};
-use futures_util::StreamExt;
-use std::path::{Path, PathBuf};
-use std::process::Command;
-use tokio::fs;
-use tokio::io::AsyncWriteExt;
-use tokio::sync::mpsc::UnboundedSender;
-use crate::APP_INFO;
-
-const GLEAM_VERSION: &str = "1.12.0";
-const BUN_VERSION: &str = "1.2.22";
-const JAVY_VERSION: &str = "6.0.0";
-
-#[derive(Clone)]
-pub enum InstallStatus {
-    NotStarted,
-    InProgress {
-        tool: String,
-        step: String,
-        progress: f32,
-    },
-    Success,
-    Failed(String),
-}
-
-/// Compiles a gleam project into runnable JS using a pipeline
-pub struct GleamScriptCompiler {
-    #[allow(dead_code)]
-    project_location: PathBuf,
-}
-
-#[allow(dead_code)]
-impl GleamScriptCompiler {
-    #[allow(dead_code)]
-    pub fn new(project_location: impl AsRef<Path>) -> Self {
-        GleamScriptCompiler {
-            project_location: project_location.as_ref().to_path_buf(),
-        }
-    }
-
-    pub async fn evaluate(&self) -> anyhow::Result<()> {
-        Ok(())
-    }
-
-    pub async fn build(
-        &self,
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        Self::ensure_dependencies(sender).await?;
-        Ok(())
-    }
-
-    pub async fn ensure_dependencies(
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::NotStarted);
-        }
-
-        log::info!("Checking dependencies...");
-
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::InProgress {
-                tool: "None".to_string(),
-                step: "Checking existing tools...".to_string(),
-                progress: 0.05,
-            });
-        }
-
-        let gleam_available = Self::check_tool_in_path("gleam").await;
-        let bun_available = Self::check_tool_in_path("bun").await;
-        let javy_available = Self::check_tool_in_path("javy").await;
-
-        if gleam_available && bun_available && javy_available {
-            log::info!("All dependencies found in PATH");
-            if let Some(ref s) = sender {
-                let _ = s.send(InstallStatus::Success);
-            }
-            return Ok(());
-        }
-
-        if !(cfg!(target_os = "windows") || cfg!(target_os = "linux") || cfg!(target_os = "macos"))
-        {
-            anyhow::bail!("The operating system is not supported for building the Gleam project")
-        }
-
-        let app_dir = app_dir(AppDataType::UserData, &APP_INFO, "")
-            .map_err(|e| anyhow::anyhow!("Failed to get app directory: {}", e))?;
-
-        let tools_to_install: Vec<(&str, bool)> = vec![
-            ("Gleam", gleam_available),
-            ("Bun", bun_available),
-            ("Javy", javy_available),
-        ];
-        let total_to_install = tools_to_install.iter().filter(|(_, avail)| !avail).count();
-        let mut installed_count = 0;
-
-        if !gleam_available {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Gleam".to_string(),
-                    step: "Downloading Gleam...".to_string(),
-                    progress: 0.2 + (installed_count as f32 / total_to_install as f32) * 0.6,
-                });
-            }
-            Self::download_gleam(&app_dir, sender.clone()).await?;
-            installed_count += 1;
-        } else {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Gleam".to_string(),
-                    step: "Done!".to_string(),
-                    progress: 1.0,
-                });
-            }
-            installed_count += 1;
-        }
-
-        if !bun_available {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Bun".to_string(),
-                    step: "Downloading Bun...".to_string(),
-                    progress: 0.2 + (installed_count as f32 / total_to_install as f32) * 0.6,
-                });
-            }
-            Self::download_bun(&app_dir, sender.clone()).await?;
-            installed_count += 1;
-        } else {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Bun".to_string(),
-                    step: "Done!".to_string(),
-                    progress: 1.0,
-                });
-            }
-            installed_count += 1;
-        }
-
-        if !javy_available {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Javy".to_string(),
-                    step: "Downloading Javy...".to_string(),
-                    progress: 0.2 + (installed_count as f32 / total_to_install as f32) * 0.6,
-                });
-            }
-            Self::download_javy(&app_dir, sender.clone()).await?;
-            installed_count += 1;
-        } else {
-            if let Some(ref s) = sender.clone() {
-                let _ = s.send(InstallStatus::InProgress {
-                    tool: "Javy".to_string(),
-                    step: "Done!".to_string(),
-                    progress: 1.0,
-                });
-            }
-            installed_count += 1;
-        }
-
-        if let Some(ref s) = sender.clone() {
-            let _ = s.send(InstallStatus::Success);
-        }
-
-        log::info!(
-            "All {} dependencies installed successfully",
-            installed_count
-        );
-        Ok(())
-    }
-
-    async fn check_tool_in_path(tool: &str) -> bool {
-        let cmd = if cfg!(target_os = "windows") {
-            Command::new("where").arg(tool).output()
-        } else {
-            Command::new("which").arg(tool).output()
-        };
-
-        match cmd {
-            Ok(output) => output.status.success(),
-            Err(_) => false,
-        }
-    }
-
-    pub async fn download_gleam(
-        app_dir: impl AsRef<Path>,
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        let gleam_dir = app_dir.as_ref()
-            .join("dependencies")
-            .join("gleam")
-            .join(GLEAM_VERSION);
-
-        if gleam_dir.exists() {
-            log::info!(
-                "Gleam v{} already cached at {}",
-                GLEAM_VERSION,
-                app_dir.as_ref().display()
-            );
-            return Ok(());
-        }
-
-        log::info!("Downloading Gleam v{}...", GLEAM_VERSION);
-
-        let gleam_link = Self::get_gleam_download_url()?;
-        Self::download_and_extract(&gleam_link, &gleam_dir, "gleam", sender).await?;
-
-        log::info!("Gleam v{} downloaded successfully", GLEAM_VERSION);
-        Ok(())
-    }
-
-    pub async fn download_bun(
-        app_dir: impl AsRef<Path>,
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        let bun_dir = app_dir.as_ref().join("dependencies").join("bun").join(BUN_VERSION);
-
-        if bun_dir.exists() {
-            log::info!(
-                "Bun v{} already cached at {}",
-                BUN_VERSION,
-                app_dir.as_ref().display()
-            );
-            return Ok(());
-        }
-
-        log::info!("Downloading Bun v{}...", BUN_VERSION);
-
-        let bun_link = Self::get_bun_download_url()?;
-        Self::download_and_extract(&bun_link, &bun_dir, "bun", sender).await?;
-
-        log::info!("Bun v{} downloaded successfully", BUN_VERSION);
-        Ok(())
-    }
-
-    pub async fn download_javy(
-        app_dir: impl AsRef<Path>,
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        let javy_dir = app_dir.as_ref().join("dependencies").join("javy").join(JAVY_VERSION);
-
-        if javy_dir.exists() {
-            log::info!(
-                "Javy v{} already cached at {}",
-                JAVY_VERSION,
-                app_dir.as_ref().display()
-            );
-            return Ok(());
-        }
-
-        log::info!("Downloading Javy v{}...", JAVY_VERSION);
-
-        let javy_link = Self::get_javy_download_url()?;
-        Self::download_and_extract(&javy_link, &javy_dir, "javy", sender).await?;
-
-        log::info!("Javy v{} downloaded successfully", JAVY_VERSION);
-        Ok(())
-    }
-
-    async fn download_and_extract(
-        url: &str,
-        target_dir: impl AsRef<Path>,
-        tool_name: &str,
-        sender: Option<UnboundedSender<InstallStatus>>,
-    ) -> anyhow::Result<()> {
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::InProgress {
-                step: format!("Creating directories for {}...", tool_name),
-                progress: 0.0,
-                tool: tool_name.to_string(),
-            });
-        }
-
-        fs::create_dir_all(target_dir.as_ref()).await?;
-
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::InProgress {
-                step: format!("Downloading {}...", tool_name),
-                progress: 0.3,
-                tool: tool_name.to_string(),
-            });
-        }
-
-        let response = reqwest::get(url).await?;
-        let total_size = response.content_length().unwrap_or(0);
-        let mut downloaded = 0;
-        let mut stream = response.bytes_stream();
-
-        let temp_file = target_dir.as_ref().join(format!("{}_download", tool_name));
-        let mut file = fs::File::create(&temp_file).await?;
-
-        while let Some(item) = stream.next().await {
-            let bytes = item?;
-            file.write_all(&bytes).await?;
-            downloaded += bytes.len() as u64;
-
-            if let Some(ref s) = sender {
-                let progress = 0.3 + (downloaded as f32 / total_size as f32) * 0.4;
-                let _ = s.send(InstallStatus::InProgress {
-                    step: format!("Downloading {}...", tool_name),
-                    progress,
-                    tool: tool_name.to_string(),
-                });
-            }
-        }
-
-        file.sync_all().await?;
-        drop(file);
-
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::InProgress {
-                step: format!("Extracting {}...", tool_name),
-                progress: 0.7,
-                tool: tool_name.to_string(),
-            });
-        }
-
-        if url.ends_with(".zip") {
-            Self::extract_zip(&temp_file, target_dir).await?;
-        } else if url.ends_with(".tar.gz") {
-            Self::extract_tar_gz(&temp_file, target_dir).await?;
-        } else if url.ends_with(".gz") {
-            Self::extract_gz(&temp_file, target_dir, tool_name).await?;
-        }
-
-        fs::remove_file(&temp_file).await?;
-
-        if let Some(ref s) = sender {
-            let _ = s.send(InstallStatus::InProgress {
-                step: format!("{} installation complete", tool_name),
-                progress: 0.9,
-                tool: tool_name.to_string(),
-            });
-        }
-
-        Ok(())
-    }
-
-    async fn extract_zip(archive: impl AsRef<Path>, target_dir: impl AsRef<Path>) -> anyhow::Result<()> {
-        let file = std::fs::File::open(archive)?;
-        let mut archive = zip::ZipArchive::new(file)?;
-
-        for i in 0..archive.len() {
-            let mut file = archive.by_index(i)?;
-            let outpath = target_dir.as_ref().join(file.name());
-
-            if file.is_dir() {
-                fs::create_dir_all(&outpath).await?;
-            } else {
-                if let Some(p) = outpath.parent() {
-                    fs::create_dir_all(p).await?;
-                }
-                let mut outfile = fs::File::create(&outpath).await?;
-                let mut buffer = Vec::new();
-                std::io::Read::read_to_end(&mut file, &mut buffer)?;
-                outfile.write_all(&buffer).await?;
-            }
-        }
-        Ok(())
-    }
-
-    async fn extract_tar_gz(archive: impl AsRef<Path>, target_dir: impl AsRef<Path>) -> anyhow::Result<()> {
-        let file = std::fs::File::open(archive)?;
-        let tar = flate2::read::GzDecoder::new(file);
-        let mut archive = tar::Archive::new(tar);
-
-        for entry in archive.entries()? {
-            let mut entry = entry?;
-            let path = target_dir.as_ref().join(entry.path()?);
-            entry.unpack(path)?;
-        }
-        Ok(())
-    }
-
-    async fn extract_gz(
-        archive: impl AsRef<Path>,
-        target_dir: impl AsRef<Path>,
-        tool_name: &str,
-    ) -> anyhow::Result<()> {
-        let file = std::fs::File::open(archive)?;
-        let mut decoder = flate2::read::GzDecoder::new(file);
-        let mut buffer = Vec::new();
-        std::io::Read::read_to_end(&mut decoder, &mut buffer)?;
-
-        let exe_name = if cfg!(target_os = "windows") {
-            format!("{}.exe", tool_name)
-        } else {
-            tool_name.to_string()
-        };
-
-        let output_path = target_dir.as_ref().join(exe_name);
-        let mut output_file = fs::File::create(&output_path).await?;
-        output_file.write_all(&buffer).await?;
-
-        #[cfg(unix)]
-        {
-            use std::os::unix::fs::PermissionsExt;
-            let mut perms = output_file.metadata().await?.permissions();
-            perms.set_mode(0o755);
-            fs::set_permissions(&output_path, perms).await?;
-        }
-
-        Ok(())
-    }
-
-    fn get_gleam_download_url() -> anyhow::Result<String> {
-        let gleam_link = {
-            #[cfg(target_os = "windows")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/gleam-lang/gleam/releases/download/v{}/gleam-v{}-{}-pc-windows-msvc.zip",
-                    GLEAM_VERSION, GLEAM_VERSION, arch,
-                )
-            }
-
-            #[cfg(target_os = "linux")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/gleam-lang/gleam/releases/download/v{}/gleam-v{}-{}-unknown-linux-musl.tar.gz",
-                    GLEAM_VERSION, GLEAM_VERSION, arch,
-                )
-            }
-
-            #[cfg(target_os = "macos")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/gleam-lang/gleam/releases/download/v{}/gleam-v{}-{}-apple-darwin.tar.gz",
-                    GLEAM_VERSION, GLEAM_VERSION, arch,
-                )
-            }
-        };
-        Ok(gleam_link)
-    }
-
-    fn get_bun_download_url() -> anyhow::Result<String> {
-        let bun_link = {
-            #[cfg(target_os = "windows")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/oven-sh/bun/releases/download/bun-v{}/bun-windows-{}.zip",
-                    BUN_VERSION, arch,
-                )
-            }
-
-            #[cfg(target_os = "linux")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/oven-sh/bun/releases/download/bun-v{}/bun-linux-{}.zip",
-                    BUN_VERSION, arch,
-                )
-            }
-
-            #[cfg(target_os = "macos")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "aarch64"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/oven-sh/bun/releases/download/bun-v{}/bun-darwin-{}.zip",
-                    BUN_VERSION, arch,
-                )
-            }
-        };
-        Ok(bun_link)
-    }
-
-    fn get_javy_download_url() -> anyhow::Result<String> {
-        let javy_link = {
-            #[cfg(target_os = "windows")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        anyhow::bail!(
-                            "This arch is not available for prebuilt download. Please build this from source"
-                        );
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/bytecodealliance/javy/releases/download/v{}/javy-{}-windows-v{}.gz",
-                    JAVY_VERSION, arch, JAVY_VERSION
-                )
-            }
-
-            #[cfg(target_os = "linux")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "arm"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/bytecodealliance/javy/releases/download/v{}/javy-{}-linux-v{}.gz",
-                    JAVY_VERSION, arch, JAVY_VERSION
-                )
-            }
-
-            #[cfg(target_os = "macos")]
-            {
-                let arch = {
-                    if cfg!(target_arch = "aarch64") {
-                        "arm"
-                    } else if cfg!(target_arch = "x86_64") {
-                        "x86_64"
-                    } else {
-                        anyhow::bail!(
-                            "This architecture is not supported for building the gleam project"
-                        );
-                    }
-                };
-                format!(
-                    "https://github.com/bytecodealliance/javy/releases/download/v{}/javy-{}-macos-v{}.gz",
-                    JAVY_VERSION, arch, JAVY_VERSION
-                )
-            }
-        };
-        Ok(javy_link)
-    }
-}
-
-#[tokio::test]
-async fn check_if_dependencies_install() {
-    GleamScriptCompiler::ensure_dependencies(None)
-        .await
-        .unwrap();
-}
diff --git a/eucalyptus-editor/src/build/mod.rs b/eucalyptus-editor/src/build/mod.rs
index 642ead9..f299197 100644
--- a/eucalyptus-editor/src/build/mod.rs
+++ b/eucalyptus-editor/src/build/mod.rs
@@ -1,5 +1,3 @@
-pub mod gleam;
-
 use std::{collections::HashMap, fs, path::PathBuf, process::Command};
 use std::path::Path;
 use clap::ArgMatches;
@@ -15,7 +13,7 @@ pub fn package(project_path: PathBuf, _sub_matches: &ArgMatches) -> anyhow::Resu
     let build_dir = project_path
         .parent()
         .ok_or(anyhow::anyhow!("Unable to get parent"))?
-        .join("build");
+        .join(".build");
 
     // check health
     println!("Checking health (checking if commands exist)");
@@ -96,7 +94,7 @@ pub fn package(project_path: PathBuf, _sub_matches: &ArgMatches) -> anyhow::Resu
     let output_dir = project_path
         .parent()
         .ok_or(anyhow::anyhow!("Unable to get parent"))?
-        .join("build")
+        .join(".build")
         .join("package");
     std::fs::create_dir_all(&output_dir)?;
 
@@ -108,7 +106,7 @@ pub fn package(project_path: PathBuf, _sub_matches: &ArgMatches) -> anyhow::Resu
     let eupak_source = project_path
         .parent()
         .ok_or(anyhow::anyhow!("Unable to get parent"))?
-        .join("build")
+        .join(".build")
         .join("output")
         .join(format!("{}.eupak", project_name));
     let eupak_dest = output_dir.join(format!("{}.eupak", project_name));
@@ -147,7 +145,7 @@ pub fn package(project_path: PathBuf, _sub_matches: &ArgMatches) -> anyhow::Resu
     let zip_path = project_path
         .parent()
         .ok_or(anyhow::anyhow!("Unable to get parent"))?
-        .join("build")
+        .join(".build")
         .join(format!("{}.zip", project_name));
     create_zip_package(&output_dir, &zip_path)?;
 
@@ -350,7 +348,7 @@ pub fn build(
     };
     log::info!(" > Copied scene data");
 
-    let build_dir = project_path.parent().unwrap().join("build").join("output");
+    let build_dir = project_path.parent().unwrap().join(".build").join("output");
     fs::create_dir_all(&build_dir)?;
     log::info!(" > Created build dir");
 
@@ -514,4 +512,4 @@ fn check_assimp_availability() -> bool {
     }
 
     false
-}
+}
\ No newline at end of file
diff --git a/eucalyptus-editor/src/camera.rs b/eucalyptus-editor/src/camera.rs
index 7f6a431..2030e86 100644
--- a/eucalyptus-editor/src/camera.rs
+++ b/eucalyptus-editor/src/camera.rs
@@ -2,10 +2,9 @@ use crate::editor::component::InspectableComponent;
 use crate::editor::{EntityType, Signal, StaticallyKept, UndoableAction};
 use dropbear_engine::camera::Camera;
 use egui::{CollapsingHeader, Ui};
-use eucalyptus_core::camera::{CameraAction, CameraComponent, CameraType};
+use eucalyptus_core::camera::{CameraComponent, CameraType};
 use hecs::Entity;
 use std::time::Instant;
-use eucalyptus_core::success;
 
 impl InspectableComponent for Camera {
     fn inspect(
diff --git a/eucalyptus-editor/src/debug.rs b/eucalyptus-editor/src/debug.rs
index 1852032..3b3dc4d 100644
--- a/eucalyptus-editor/src/debug.rs
+++ b/eucalyptus-editor/src/debug.rs
@@ -1,153 +1,11 @@
 //! Used to aid with debugging any issues with the editor.
-use crate::build::gleam::GleamScriptCompiler;
-use crate::build::gleam::InstallStatus;
+
 use crate::editor::Signal;
-use egui::ProgressBar;
 use egui::Ui;
-use egui::Window;
-use tokio::sync::mpsc;
-
-pub struct DependencyInstaller {
-    pub progress_receiver: Option<mpsc::UnboundedReceiver<InstallStatus>>,
-    pub is_installing: bool,
-
-    pub gleam_progress: f32,
-    pub bun_progress: f32,
-    pub javy_progress: f32,
-
-    pub gleam_status: String,
-    pub bun_status: String,
-    pub javy_status: String,
-}
-
-impl Default for DependencyInstaller {
-    fn default() -> Self {
-        Self {
-            progress_receiver: None,
-            is_installing: false,
-            gleam_progress: 0.0,
-            bun_progress: 0.0,
-            javy_progress: 0.0,
-            gleam_status: "Not started".to_string(),
-            bun_status: "Not started".to_string(),
-            javy_status: "Not started".to_string(),
-        }
-    }
-}
-
-impl DependencyInstaller {
-    pub fn update_progress(&mut self) {
-        let mut local_prog_rec = false;
-        let mut update_tool_status: (bool, String, f32, String) = Default::default();
-        if let Some(receiver) = &mut self.progress_receiver {
-            while let Ok(status) = receiver.try_recv() {
-                match status {
-                    InstallStatus::NotStarted => {
-                        self.is_installing = false;
-                    }
-                    InstallStatus::InProgress {
-                        tool,
-                        step,
-                        progress,
-                    } => {
-                        self.is_installing = true;
-                        update_tool_status =
-                            (true, String::from(&tool), progress, String::from(&step));
-                    }
-                    InstallStatus::Success => {
-                        self.is_installing = false;
-                        local_prog_rec = true;
-                        self.gleam_status = "Complete".to_string();
-                        self.gleam_progress = 1.0;
-                        self.bun_status = "Complete".to_string();
-                        self.bun_progress = 1.0;
-                        self.javy_status = "Complete".to_string();
-                        self.javy_progress = 1.0;
-                    }
-                    InstallStatus::Failed(msg) => {
-                        self.is_installing = false;
-                        log::error!("Installation error: {}", msg);
-                        self.gleam_status = format!("Error: {}", msg);
-                        self.bun_status = format!("Error: {}", msg);
-                        self.javy_status = format!("Error: {}", msg);
-                    }
-                }
-            }
-        }
-        if local_prog_rec {
-            self.progress_receiver = None;
-        }
-        if update_tool_status.0 {
-            self.update_tool_status(
-                update_tool_status.1.as_str(),
-                update_tool_status.2,
-                update_tool_status.3.as_str(),
-            );
-        }
-    }
-
-    fn update_tool_status(&mut self, tool: &str, progress: f32, status: &str) {
-        match tool.to_lowercase().as_str() {
-            "gleam" => {
-                self.gleam_progress = progress;
-                self.gleam_status = status.to_string();
-            }
-            "bun" => {
-                self.bun_progress = progress;
-                self.bun_status = status.to_string();
-            }
-            "javy" => {
-                self.javy_progress = progress;
-                self.javy_status = status.to_string();
-            }
-            _ => {}
-        }
-    }
-
-    pub fn show_installation_window(&mut self, ctx: &egui::Context) {
-        Window::new("Installing Dependencies")
-            .resizable(true)
-            .collapsible(false)
-            .default_width(400.0)
-            .show(ctx, |ui| {
-                ui.heading("Installing Dependencies");
-
-                ui.separator();
-
-                ui.label("Gleam:");
-                ui.label(&self.gleam_status);
-                ui.add(ProgressBar::new(self.gleam_progress).show_percentage());
-                ui.separator();
-
-                ui.label("Bun:");
-                ui.label(&self.bun_status);
-                ui.add(ProgressBar::new(self.bun_progress).show_percentage());
-                ui.separator();
-
-                ui.label("Javy:");
-                ui.label(&self.javy_status);
-                ui.add(ProgressBar::new(self.javy_progress).show_percentage());
-                ui.separator();
-
-                let overall_progress =
-                    (self.gleam_progress + self.bun_progress + self.javy_progress) / 3.0;
-                ui.label("Overall Progress:");
-                ui.add(ProgressBar::new(overall_progress).show_percentage());
-
-                ui.separator();
-
-                if ui.button("Cancel").clicked() {
-                    self.is_installing = false;
-                    self.progress_receiver = None;
-                }
-            });
-    }
-}
 
 pub(crate) fn show_menu_bar(
     ui: &mut Ui,
     signal: &mut Signal,
-    dependency_installer: &mut DependencyInstaller,
 ) {
     ui.menu_button("Debug", |ui_debug| {
         if ui_debug.button("Panic").clicked() {
@@ -159,37 +17,5 @@ pub(crate) fn show_menu_bar(
             log::info!("Show Entities Loaded under Debug Menu is clicked");
             *signal = Signal::LogEntities;
         }
-
-        ui_debug.add_enabled_ui(!dependency_installer.is_installing, |ui| {
-            if ui.button("Ensure dependencies").clicked() {
-                log::info!("Clicked ensure dependencies from debug menu");
-
-                let (sender, receiver) = mpsc::unbounded_channel();
-                dependency_installer.progress_receiver = Some(receiver);
-                dependency_installer.is_installing = true;
-
-                dependency_installer.gleam_progress = 0.0;
-                dependency_installer.bun_progress = 0.0;
-                dependency_installer.javy_progress = 0.0;
-                dependency_installer.gleam_status = "Starting...".to_string();
-                dependency_installer.bun_status = "Starting...".to_string();
-                dependency_installer.javy_status = "Starting...".to_string();
-
-                tokio::task::spawn(async move {
-                    match GleamScriptCompiler::ensure_dependencies(Some(sender.clone())).await {
-                        Ok(_) => {
-                            let _ = sender.send(InstallStatus::Success);
-                        }
-                        Err(e) => {
-                            let _ = sender.send(InstallStatus::Failed(e.to_string()));
-                        }
-                    }
-                });
-            }
-        });
-
-        if ui_debug.button("Evaluate script").clicked() {
-            log::info!("Evaluating script");
-        }
     });
 }
diff --git a/eucalyptus-editor/src/editor/mod.rs b/eucalyptus-editor/src/editor/mod.rs
index 08648ab..7d66b6a 100644
--- a/eucalyptus-editor/src/editor/mod.rs
+++ b/eucalyptus-editor/src/editor/mod.rs
@@ -14,7 +14,7 @@ use std::{
 
 use crate::camera::UndoableCameraAction;
 use crate::debug;
-use crate::{build::build, debug::DependencyInstaller};
+use crate::{build::build};
 use dropbear_engine::{
     camera::Camera,
     entity::{AdoptedEntity, Transform},
@@ -85,8 +85,6 @@ pub struct Editor {
     pub(crate) input_state: InputState,
 
     // channels
-    /// A channel for installing dependencies.
-    dep_installer: DependencyInstaller,
     /// A threadsafe Unbounded Receiver, typically used for checking the status of the world loading
     progress_tx: Option<UnboundedReceiver<WorldLoadingStatus>>,
     /// Unused: A threadsafe Unbounded Sender
@@ -168,7 +166,6 @@ impl Editor {
             input_state: InputState::new(),
             light_manager: LightManager::new(),
             active_camera: Arc::new(Mutex::new(None)),
-            dep_installer: DependencyInstaller::default(),
             _progress_rx: None,
             progress_tx: None,
             is_world_loaded: IsWorldLoadedYet::new(),
@@ -590,7 +587,7 @@ impl Editor {
                 {
                     let cfg = PROJECT.read();
                     if cfg.editor_settings.is_debug_menu_shown {
-                        debug::show_menu_bar(ui, &mut self.signal, &mut self.dep_installer);
+                        debug::show_menu_bar(ui, &mut self.signal);
                     }
                 }
             });
@@ -1172,6 +1169,8 @@ pub enum Signal {
     Delete,
     Undo,
     ScriptAction(ScriptAction),
+    #[allow(dead_code)]
+    // not actions required because follow target is set through scripting. 
     CameraAction(CameraAction),
     Play,
     StopPlaying,
diff --git a/eucalyptus-editor/src/editor/scene.rs b/eucalyptus-editor/src/editor/scene.rs
index b3aad37..6c899c5 100644
--- a/eucalyptus-editor/src/editor/scene.rs
+++ b/eucalyptus-editor/src/editor/scene.rs
@@ -10,7 +10,6 @@ use dropbear_engine::{
 };
 use eucalyptus_core::states::{WorldLoadingStatus};
 use eucalyptus_core::{logging};
-use hecs::Entity;
 use log;
 use parking_lot::Mutex;
 use tokio::sync::mpsc::unbounded_channel;
@@ -261,12 +260,6 @@ impl Scene for Editor {
                 &self.world,
             );
         }
-
-        if self.dep_installer.is_installing {
-            self.dep_installer
-                .show_installation_window(&graphics.shared.get_egui_context());
-        }
-        self.dep_installer.update_progress();
     }
 
     fn render(&mut self, graphics: &mut RenderContext) {
diff --git a/eucalyptus-editor/src/main.rs b/eucalyptus-editor/src/main.rs
index fd27176..94fc948 100644
--- a/eucalyptus-editor/src/main.rs
+++ b/eucalyptus-editor/src/main.rs
@@ -40,7 +40,7 @@ async fn main() -> anyhow::Result<()> {
                     Arg::new("project")
                         .help("Path to the .eucp project file")
                         .value_name("PROJECT_FILE")
-                        .required(false),
+                        .required(true),
                 ),
         )
         .subcommand(
@@ -50,7 +50,7 @@ async fn main() -> anyhow::Result<()> {
                     Arg::new("project")
                         .help("Path to the .eucp project file")
                         .value_name("PROJECT_FILE")
-                        .required(false),
+                        .required(true),
                 ),
         )
         .subcommand(Command::new("read")
@@ -59,10 +59,19 @@ async fn main() -> anyhow::Result<()> {
                     Arg::new("eupak_file")
                         .help("Path to the .eupak file")
                         .value_name("RESOURCE_FILE")
-                        .required(false),
+                        .required(true),
                 ),
         )
         .subcommand(Command::new("health").about("Check the health of the eucalyptus installation"))
+        .subcommand(Command::new("compile")
+            .about("Compiles a project's script into WebAssembly, primarily used for testing")
+            .arg(
+                Arg::new("project")
+                    .help("Path to the .eucp project file")
+                    .value_name("PROJECT_FILE")
+                    .required(true),
+            )
+        )
         .get_matches();
 
     match matches.subcommand() {
@@ -95,7 +104,7 @@ async fn main() -> anyhow::Result<()> {
             crate::build::package(project_path, sub_matches)?;
         }
         Some(("health", _)) => {
-            crate::build::health()?;
+            build::health()?;
         }
         Some(("read", sub_matches)) => {
             let project_path = match sub_matches.get_one::<String>("eupak_file") {
@@ -111,6 +120,21 @@ async fn main() -> anyhow::Result<()> {
 
             crate::build::read_from_eupak(project_path)?;
         }
+        Some(("compile", sub_matches)) => {
+            let _project_path = match sub_matches.get_one::<String>("project") {
+                Some(path) => PathBuf::from(path),
+                None => match find_eucp_file() {
+                    Ok(path) => path,
+                    Err(e) => {
+                        eprintln!("Error: {}", e);
+                        std::process::exit(1);
+                    }
+                },
+            };
+            
+            println!("\"Compile\" command not implemented yet");
+            // crate::build::compile(project_path).await?;
+        }
         None => {
             let config = WindowConfiguration {
                 title: "Eucalyptus, built with dropbear".into(),
diff --git a/eucalyptus-editor/src/menu.rs b/eucalyptus-editor/src/menu.rs
index fd8e9e2..e385194 100644
--- a/eucalyptus-editor/src/menu.rs
+++ b/eucalyptus-editor/src/menu.rs
@@ -14,7 +14,7 @@ use egui::{self, FontId, Frame, RichText};
 use egui_toast_fork::{ToastOptions, Toasts};
 use git2::Repository;
 use log::{self, debug};
-use rfd::FileDialog; // ← Sync version — no async needed
+use rfd::FileDialog;
 use winit::{
     dpi::PhysicalPosition, event::MouseButton, event_loop::ActiveEventLoop, keyboard::KeyCode,
 };
@@ -44,8 +44,7 @@ pub struct MainMenu {
     progress: f32,
     progress_message: String,
 
-    // ❌ REMOVED: file_dialog: Option<FutureHandle>,
-    project_creation_handle: Option<FutureHandle>, // ← Keep — project creation is async
+    project_creation_handle: Option<FutureHandle>,
 
     toast: Toasts,
     is_in_file_dialogue: bool,
@@ -78,8 +77,9 @@ impl MainMenu {
         let handle = queue.push(async move {
             let mut errors = Vec::new();
             let folders = [
-                ("git", 0.1, "Initializing git repository..."),
+                ("git", 0.1, "Initialising git repository..."),
                 ("src", 0.2, "Creating src folder..."),
+                ("swift", 0.25, "Initialising Swift project"),
                 ("resources/models", 0.3, "Creating models folder..."),
                 ("resources/shaders", 0.4, "Creating shaders folder..."),
                 ("resources/textures", 0.5, "Creating textures folder..."),
@@ -116,6 +116,14 @@ impl MainMenu {
                             *global = config;
                             Ok(())
                         }
+                        "swift" => {
+                            let package_template = include_str!("../../resources/Build.swift");
+                            let package_template = package_template.replace("skibidi_toilet_goon_maxx", &project_name);
+                            // do not ask my why i chose skibidi_toilet_goon_maxx, it was just the first word i came up with. 
+                            std::fs::write(path.join("Package.swift"), package_template)?;
+
+                            Ok(())
+                        }
                         _ => {
                             if !full_path.exists() {
                                 fs::create_dir_all(&full_path)
diff --git a/gleam.toml b/gleam.toml
deleted file mode 100644
index 5990b69..0000000
--- a/gleam.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-name = "dropbear"
-version = "1.0.0"
-target = "javascript"
-
-[javscript]
-runtime = "node"
-
-[dependencies]
-gleam_stdlib = ">= 0.44.0 and < 2.0.0"
\ No newline at end of file
diff --git a/manifest.toml b/manifest.toml
deleted file mode 100644
index b3ead9b..0000000
--- a/manifest.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file was generated by Gleam
-# You typically do not need to edit this file
-
-packages = [
-  { name = "gleam_stdlib", version = "0.63.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "E1D5EC07638F606E48F0EA1556044DD805F2ACE9092A6F6AFBE4A0CC4DA21C2F" },
-]
-
-[requirements]
-gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" }
diff --git a/resources/Build.swift b/resources/Build.swift
new file mode 100644
index 0000000..9d0664a
--- /dev/null
+++ b/resources/Build.swift
@@ -0,0 +1,30 @@
+// swift-tools-version: 6.2
+
+// Build system file for the dropbear-engine scripting API
+
+import PackageDescription
+
+let package = Package(
+    name: "skibidi_toilet_goon_maxx",
+    products: [
+        .library(
+            name: "skibidi_toilet_goon_maxx",
+            type: .dynamic, // required as it produces one .dll file
+            targets: ["skibidi_toilet_goon_maxx"]
+        ),
+    ],
+    dependencies: [
+        // add your own dependencies here!
+        // .package(url: "https://github.com/4tkbytes/dropbear", from: "0.0.0")
+    ],
+    targets: [
+        .target(
+            name: "skibidi_toilet_goon_maxx",
+            path: "src",
+            exclude: [
+                // exclude other items here
+                "source.eucc"
+            ]
+        ),
+    ]
+)
diff --git a/src/dropbear.gleam b/src/dropbear.gleam
deleted file mode 100644
index e0f82f6..0000000
--- a/src/dropbear.gleam
+++ /dev/null
@@ -1,60 +0,0 @@
-//// The bridge used for connecting between the dropbear-engine and the
-//// gleam WASM interface.
-////
-//// This can be ran on it's own, but it is pretty useless without attaching to an entity.
-////
-//// # Compile Pipeline
-//// In the rust interface, it compiles Gleam using a Gleam -> JavaScript -> WASM (using javy). Despite using javy
-//// creating large amounts of overhead, it is best choice for compiling JavaScript.
-////
-//// # Targets
-//// Currently, Erlang targets do not do anything (unless you can compile to WASM, which I'm pretty sure you can't.
-//// There is also no library available for a Gleam <-> Rust connection, nor is there a Erlang <-> Rust **practical**
-//// connection. Also, using Erlang for a game engine is extremely impractical and stupid (and a pain to setup).
-////
-//// My other thoughts were to use OCaml, but OCaml has a high learning curve (as if Gleam doesn't already), and is
-//// hard to setup up, including dealing with FFI.
-////
-//// Gleam just seemed like the best language: niche, rising to popularity, can be compiled and integrates with Rust,
-//// and most importantly: Type safety.
-
-import gleam/dict
-import math
-import gleam/option
-import entity
-
-/// The id returned during a query, which allows you to query for other features
-/// 
-/// A very primitive type. 
-pub type QueryId {
-  QueryId(id: Int)
-}
-
-/// Queries the current entity the script is attached to.
-///
-/// Returns None is the script is not attached to anything (i.e. a library), or Some if it is attached,
-/// along with the entity information as shown in `dropbear/entity.Entity`.
-pub fn query_current_entity() -> option.Option(entity.Entity) {
-  option.Some(entity.Entity(0, transform: math.new_transform(), properties: dict.new(), dirty: False, before_dirty_entity: entity.BeforeSyncedEntity(id: 0, transform: math.new_transform(), properties: dict.new())))
-
-}
-
-/// A command that syncs/pushes the data back to the game engine interface.
-///
-/// It is typically automatically triggered at the end of a function (such as at the end of a move function), but can
-/// be triggered manually by running the command.
-///
-/// The sync command takes an input of entity (so perfect for chaining), and then returning an entity. It also updates
-/// the BeforeSyncedEntity to its current iteration.
-pub fn sync(entity: entity.Entity) -> entity.Entity {
-  case entity.dirty {
-    True -> {
-      // mock sync/push
-      entity.Entity(..entity, before_dirty_entity: entity.new_before_synced_entity_from_existing_entity(entity))
-    }
-    False -> {
-      // just return back the entity
-      entity
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/entity.gleam b/src/entity.gleam
deleted file mode 100644
index 31fa752..0000000
--- a/src/entity.gleam
+++ /dev/null
@@ -1,65 +0,0 @@
-//// A module for storing the properties of entities, as well as the manipulation of entities.
-
-import gleam/dict
-import types
-import math
-
-/// A standard type for an entity.
-pub type Entity {
-    Entity(
-        /// The id/reference
-        id: Int,
-        /// The position, rotation and scale of the entity
-        transform: math.Transform,
-        /// The properties of the entity, stored in a gleam dictionary as a String key and
-        /// Value type.
-        properties: dict.Dict(String, types.Value),
-        /// An internal value that checks if the entity is "dirty" and needs to be synced up.
-        ///
-        /// It can be manually synced up using the `dropbear.sync()` command, but in the case
-        /// that it is not used, this flag pushes the changes at the end of the update function.
-        dirty: Bool,
-        before_dirty_entity: BeforeSyncedEntity,
-    )
-}
-
-/// Creates a "dummy"/placeholder value for an Entity.
-///
-/// It's ID is always set to -1 so it cannot be used in any queries.
-pub fn dummy() -> Entity {
-    Entity(id: -1, transform: math.new_transform(), properties: dict.new(), dirty: False, before_dirty_entity: dummy_before())
-}
-
-/// A type used to checked the latest synced change. This is mainly internal, however you can use it
-/// to check which values are dirty or not.
-pub type BeforeSyncedEntity {
-    BeforeSyncedEntity(
-        /// The id/reference
-        id: Int,
-        /// The position, rotation and scale of the entity
-        transform: math.Transform,
-        /// The properties of the entity, stored in a gleam dictionary as a String key and
-        /// Value type.
-        properties: dict.Dict(String, types.Value),
-    )
-}
-
-/// Creates a new dummy value for a BeforeSyncedEntity.
-///
-/// It's ID is always set to -1 so it cannot be used in any queries.
-pub fn dummy_before() -> BeforeSyncedEntity {
-    BeforeSyncedEntity(id: -1, transform: math.new_transform(), properties: dict.new())
-}
-
-/// A hella long name, creates a new BeforeSyncedEntity from an existing Entity.
-///
-/// It mainly exists as an internal helper, thats all...
-pub fn new_before_synced_entity_from_existing_entity(entity: Entity) -> BeforeSyncedEntity {
-    BeforeSyncedEntity(id: entity.id, transform: entity.transform, properties: entity.properties)
-}
-
-/// Sets the position of the entity
-pub fn set_position(entity: Entity, position: math.Vector3(Float)) -> Entity {
-    let transform = math.Transform(..entity.transform, position: position)
-    Entity(..entity, transform:transform, dirty: True)
-}
\ No newline at end of file
diff --git a/src/example.gleam b/src/example.gleam
deleted file mode 100644
index 29253a0..0000000
--- a/src/example.gleam
+++ /dev/null
@@ -1,44 +0,0 @@
-//// A dummy file, do not use. I mean, use it if you want, its public for a reason...
-
-import gleam/io
-import gleam/string
-import gleam/option.{Some}
-import math
-import entity
-import dropbear
-
-pub fn main() {
-  load()
-  update(0.016)
-}
-
-pub fn load() -> Nil {
-  let _ = case dropbear.query_current_entity() {
-    Some(entity) -> {
-        entity.set_position(entity, math.Vector3(1.0, 1.0, 1.0))
-        |> dropbear.sync()
-    }
-    option.None -> {
-      entity.dummy()
-    }
-  }
-
-  io.println("Loaded!")
-}
-
-pub fn update(dt: Float) -> Nil {
-  io.println("Updating...")
-  let _ = case dropbear.query_current_entity() {
-    Some(entity) -> {
-      io.println("Successfully queried entity!")
-      entity.set_position(entity, math.Vector3(1.0, 1.0, 1.0))
-      |> dropbear.sync()
-    }
-    option.None -> {
-      io.println("Could not query entity, creating a dummy entity")
-      entity.dummy()
-    }
-  }
-  io.println("Deltatime is " <> string.inspect(dt))
-  update(dt)
-}
\ No newline at end of file
diff --git a/src/input.gleam b/src/input.gleam
deleted file mode 100644
index 187af64..0000000
--- a/src/input.gleam
+++ /dev/null
@@ -1,2 +0,0 @@
-//// A module for input management and input detection from different IO devices
-//// such as keyboards, mice, and game controllers (for now).
\ No newline at end of file
diff --git a/src/math.gleam b/src/math.gleam
deleted file mode 100644
index 6f95de0..0000000
--- a/src/math.gleam
+++ /dev/null
@@ -1,59 +0,0 @@
-//// A module for the basic types of math that the gleam standard library didn't include.
-
-/// The generic type of an entity, containing a position, rotation and scale.
-pub type Transform {
-  Transform (
-  position: Vector3(Float),
-  rotation: Quaternion(Float),
-  scale: Vector3(Float),
-  )
-}
-
-/// Creates a new transform
-pub fn new_transform() -> Transform {
-  Transform(
-    position: zero_vector3f(),
-    rotation: identity_quatf(),
-    scale: zero_vector3f(),
-  )
-}
-
-/// A type used to show 3 instances of a value.
-pub type Vector3(a) {
-  Vector3(
-  /// X value
-  x: a,
-  /// Y value
-  y: a,
-  /// Z value
-  z: a,
-  )
-}
-
-/// Creates a new Vector3(Float) of all 0.0.
-pub fn zero_vector3f() -> Vector3(Float) {
-  Vector3(
-  x: 0.0,
-  y: 0.0,
-  z: 0.0,
-  )
-}
-
-pub type Quaternion(a) {
-  Quaternion(
-  w: a,
-  x: a,
-  y: a,
-  z: a,
-  )
-}
-
-/// Creates a new quaternion with 1.0 as the scale and 0.0 for the x, y and z.
-pub fn identity_quatf() -> Quaternion(Float) {
-  Quaternion(
-  w: 1.0,
-  x: 0.0,
-  y: 0.0,
-  z: 0.0,
-  )
-}
\ No newline at end of file
diff --git a/src/types.gleam b/src/types.gleam
deleted file mode 100644
index 3123bde..0000000
--- a/src/types.gleam
+++ /dev/null
@@ -1,13 +0,0 @@
-//// Different types and values available to be used.
-
-/// A generic value. It is used in the entity properties.
-pub type Value {
-    /// Integer
-    Int(Int)
-    /// Float
-    Float(Float)
-    /// String
-    String(String)
-    /// Boolean
-    Bool(Bool)
-}
\ No newline at end of file