diff --git a/Cargo.lock b/Cargo.lock
index 80e32ee..a86f202 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1281,6 +1281,16 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
 [[package]]
 name = "num-traits"
 version = "0.2.19"
@@ -1556,6 +1566,12 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
 [[package]]
 name = "owned_ttf_parser"
 version = "0.25.0"
@@ -1919,6 +1935,15 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
 [[package]]
 name = "shlex"
 version = "1.3.0"
@@ -2118,6 +2143,16 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "thread_local"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
 [[package]]
 name = "tiny-skia"
 version = "0.11.4"
@@ -2222,6 +2257,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
 dependencies = [
  "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
+dependencies = [
+ "nu-ansi-term",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing-core",
+ "tracing-log",
 ]
 
 [[package]]
@@ -2295,6 +2356,12 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
 
+[[package]]
+name = "valuable"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+
 [[package]]
 name = "version_check"
 version = "0.9.5"
@@ -3131,6 +3198,7 @@ dependencies = [
  "thiserror 2.0.12",
  "tokio",
  "tracing",
+ "tracing-subscriber",
  "wgpu",
  "winit",
 ]
diff --git a/engine/Cargo.toml b/engine/Cargo.toml
index 78db639..32e799f 100644
--- a/engine/Cargo.toml
+++ b/engine/Cargo.toml
@@ -24,6 +24,7 @@ bytemuck = "1.21.0"
 futures = "0.3.31"
 cgmath = "0.18.0"
 tracing = "0.1.41"
+tracing-subscriber = "0.3.19"
 
 
 [profile.dev]
diff --git a/engine/src/core/render/ctx.rs b/engine/src/core/render/ctx.rs
index a854ebb..addd7dc 100644
--- a/engine/src/core/render/ctx.rs
+++ b/engine/src/core/render/ctx.rs
@@ -5,7 +5,7 @@ use std::time::Instant;
 use cgmath::{Matrix4, Point3, Rad, Vector3, perspective};
 use futures::executor::block_on;
 use thiserror::Error;
-use wgpu::util::DeviceExt;
+use wgpu::{Backends, InstanceDescriptor, util::DeviceExt};
 use winit::window::Window;
 
 #[derive(Debug, Error)]
@@ -240,7 +240,10 @@ pub struct WgpuCtx<'window> {
 
 impl<'window> WgpuCtx<'window> {
     pub async fn new(window: Arc<Window>) -> Result<WgpuCtx<'window>, ContextError> {
-        let instance = wgpu::Instance::default();
+        let instance = wgpu::Instance::new(&InstanceDescriptor {
+            backends: Backends::from_comma_list("dx12,metal,opengl,webgpu"),
+            ..Default::default()
+        });
         let surface = instance.create_surface(Arc::clone(&window))?;
         let adapter = instance
             .request_adapter(&wgpu::RequestAdapterOptions {
@@ -255,8 +258,7 @@ impl<'window> WgpuCtx<'window> {
                 &wgpu::DeviceDescriptor {
                     label: None,
                     required_features: wgpu::Features::empty(),
-                    required_limits: wgpu::Limits::downlevel_webgl2_defaults()
-                        .using_resolution(adapter.limits()),
+                    required_limits: wgpu::Limits::default().using_resolution(adapter.limits()),
                     memory_hints: wgpu::MemoryHints::Performance,
                 },
                 None,
diff --git a/engine/src/core/render/mod.rs b/engine/src/core/render/mod.rs
index 5bf1b7f..0eb47b8 100644
--- a/engine/src/core/render/mod.rs
+++ b/engine/src/core/render/mod.rs
@@ -31,7 +31,13 @@ impl ApplicationHandler for App<'_> {
             );
             let window_id = window.id();
             let wgpu_ctx = WgpuCtx::new_blocking(window.clone()).unwrap();
-            self.windows.insert(window_id, WindowContext { window, ctx: wgpu_ctx });
+            self.windows.insert(
+                window_id,
+                WindowContext {
+                    window,
+                    ctx: wgpu_ctx,
+                },
+            );
         }
     }
 
@@ -45,7 +51,7 @@ impl ApplicationHandler for App<'_> {
             WindowEvent::CloseRequested => {
                 if let Some(window_context) = self.windows.remove(&window_id) {
                     drop(window_context);
-                    println!("Window: {:?} closed, exiting", window_id);
+                    debug!("Window: {:?} closed, exiting", window_id);
                 }
                 if self.windows.is_empty() {
                     event_loop.exit();
@@ -63,10 +69,14 @@ impl ApplicationHandler for App<'_> {
                     match code {
                         winit::keyboard::KeyCode::Space => {
                             debug!("Space key pressed");
-                            if let Some(window_context) = self.windows.values_mut().next() {
+                            if let Some(window_context) = self.windows.get_mut(&window_id){
                                 match window_context.ctx.bg_color() {
-                                    wgpu::Color::WHITE => window_context.ctx.change_bg_color(wgpu::Color::BLACK),
-                                    wgpu::Color::BLACK => window_context.ctx.change_bg_color(wgpu::Color::WHITE),
+                                    wgpu::Color::WHITE => {
+                                        window_context.ctx.change_bg_color(wgpu::Color::BLACK)
+                                    }
+                                    wgpu::Color::BLACK => {
+                                        window_context.ctx.change_bg_color(wgpu::Color::WHITE)
+                                    }
                                     _ => window_context.ctx.change_bg_color(wgpu::Color::WHITE),
                                 }
                             }
@@ -82,7 +92,13 @@ impl ApplicationHandler for App<'_> {
                             );
                             let window_id = new_window.id();
                             let wgpu_ctx = WgpuCtx::new_blocking(new_window.clone()).unwrap();
-                            self.windows.insert(window_id, WindowContext { window: new_window, ctx: wgpu_ctx });
+                            self.windows.insert(
+                                window_id,
+                                WindowContext {
+                                    window: new_window,
+                                    ctx: wgpu_ctx,
+                                },
+                            );
                         }
                         _ => info!("Unimplemented keycode: {:?}", code),
                     }
@@ -99,8 +115,7 @@ impl ApplicationHandler for App<'_> {
                 if let Some(window_context) = self.windows.get_mut(&window_id) {
                     window_context.ctx.resize(size.into());
                     window_context.window.request_redraw();
-                    let size_str: String =
-                        size.height.to_string() + "x" + &size.width.to_string();
+                    let size_str: String = size.height.to_string() + "x" + &size.width.to_string();
                     debug!("Window resized to {:?}", size_str);
                 }
             }
diff --git a/engine/src/main.rs b/engine/src/main.rs
index b876d76..8b0784f 100644
--- a/engine/src/main.rs
+++ b/engine/src/main.rs
@@ -4,18 +4,33 @@ use colored::Colorize;
 use tokio::runtime;
 #[allow(unused_imports)]
 use tracing::{debug, error, info, warn};
+use tracing::{level_filters::LevelFilter, subscriber::set_global_default};
+use tracing_subscriber::{layer::Filter, util::SubscriberInitExt};
 use winit::event_loop::EventLoop;
 pub mod core;
 
+fn init_logger() {
+    let subscriber = tracing_subscriber::fmt()
+        .with_max_level(LevelFilter::DEBUG)
+        .with_level(true)
+        .compact()
+        .pretty()
+        .log_internal_errors(false)
+        .without_time()
+        .with_thread_names(true)
+        .finish();
+
+    set_global_default(subscriber).expect("Failed to set default subscriber");
+}
+
 #[tokio::main(flavor = "current_thread")]
 async fn main() -> anyhow::Result<()> {
+    init_logger();
     if !cfg!(debug_assertions) {
-        println!("{}", "Debug mode disabled".bright_blue());
+        info!("{}", "Debug mode disabled".bright_blue());
         set_panic_hook();
     }
     setup();
-    splash::print_splash();
-    info!("Type 'help' for a list of commands.");
 
     let repl_thread = std::thread::spawn(|| {
         let rt = runtime::Builder::new_current_thread()
@@ -26,6 +41,9 @@ async fn main() -> anyhow::Result<()> {
     });
 
     let event_loop = EventLoop::new().unwrap();
+    splash::print_splash();
+    info!("Type 'help' for a list of commands.");
+
     core::render::init_renderer(event_loop);
 
     if let Err(_) = repl_thread.join() {