diff --git a/Cargo.lock b/Cargo.lock
index 4664788..095b1af 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -13,9 +13,9 @@ dependencies = [
 
 [[package]]
 name = "allocator-api2"
-version = "0.2.19"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f"
+checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9"
 
 [[package]]
 name = "anyhow"
@@ -228,12 +228,12 @@ dependencies = [
 [[package]]
 name = "hbbytecode"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#b6274f3455d0545a64f2cc866b39d409e0a73427"
+source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#d99672b75179b79249c4b6b91dfccef0b757fa3a"
 
 [[package]]
 name = "hblang"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#b6274f3455d0545a64f2cc866b39d409e0a73427"
+source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#d99672b75179b79249c4b6b91dfccef0b757fa3a"
 dependencies = [
  "hashbrown 0.15.1",
  "hbbytecode",
@@ -245,7 +245,7 @@ dependencies = [
 [[package]]
 name = "hbvm"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#b6274f3455d0545a64f2cc866b39d409e0a73427"
+source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#d99672b75179b79249c4b6b91dfccef0b757fa3a"
 dependencies = [
  "hbbytecode",
 ]
@@ -675,18 +675,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "serde"
-version = "1.0.214"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.214"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs
index d0270ff..aa4f6cd 100644
--- a/kernel/src/arch/x86_64/mod.rs
+++ b/kernel/src/arch/x86_64/mod.rs
@@ -111,7 +111,7 @@ unsafe extern "C" fn oops() -> ! {
 unsafe extern "C" fn start() -> ! {
     logging::init();
     crate::logger::init().expect("failed to set logger");
-    log::info!("Initialising AKern {}", crate::VERSION);
+    log::debug!("Initialising AKern {}", crate::VERSION);
 
     static HDHM_REQ: HhdmRequest = HhdmRequest::new(0);
     memory::init_pt(VirtAddr::new(
@@ -190,7 +190,7 @@ unsafe extern "C" fn start() -> ! {
     // TODO: Add in rdseed and rdrand as sources for randomness
     let _rand = xml::XMLElement::new("Random");
 
-    log::trace!("Getting boot modules");
+    log::debug!("Getting boot modules");
     let bm = MOD_REQ.get_response().get();
 
     let mut bootmodules = alloc::vec::Vec::new();
@@ -228,7 +228,7 @@ unsafe extern "C" fn start() -> ! {
                 break;
             }
         }
-        log::info!("Boot module count: {:?}", bootmodules.len());
+        log::debug!("Boot module count: {:?}", bootmodules.len());
         assert_eq!(bm.module_count, bootmodules.len() as u64);
     }
 
diff --git a/kernel/src/arch/x86_64/pci/mod.rs b/kernel/src/arch/x86_64/pci/mod.rs
index af0fe63..878ef4c 100644
--- a/kernel/src/arch/x86_64/pci/mod.rs
+++ b/kernel/src/arch/x86_64/pci/mod.rs
@@ -69,7 +69,7 @@ pub fn check_device(bus: u8, device: u8) -> Option<PciDeviceInfo> {
     }
 
     let (reg2, addr) = unsafe { pci_config_read_2(bus, device, 0, 0x8) };
-    log::info!("pci device-({}) addr {} is {}", device, addr, reg2);
+    log::debug!("pci device-({}) addr {} is {}", device, addr, reg2);
     let class = ((reg2 >> 16) & 0x0000_FFFF) as u16;
     let pci_class = PciFullClass::from_u16(class);
     let header_type = get_header_type(bus, device, 0);
diff --git a/kernel/src/holeybytes/ecah.rs b/kernel/src/holeybytes/ecah.rs
index 8a03816..b4ef634 100644
--- a/kernel/src/holeybytes/ecah.rs
+++ b/kernel/src/holeybytes/ecah.rs
@@ -58,10 +58,10 @@ pub fn handler(vm: &mut Vm) {
                     true => IpcBuffer::new(true, length),
                 },
             );
-            info!("Buffer ID: {}", buff_id);
             vm.registers[1] = hbvm::value::Value(buff_id);
         }
         2 => {
+            log::error!("Oops, deleting buffers is not implemented.")
             // Delete buffer
         }
         3 => {
diff --git a/kernel/src/holeybytes/kernel_services/logging_service.rs b/kernel/src/holeybytes/kernel_services/logging_service.rs
index b1fbf4a..ea61cec 100644
--- a/kernel/src/holeybytes/kernel_services/logging_service.rs
+++ b/kernel/src/holeybytes/kernel_services/logging_service.rs
@@ -9,7 +9,20 @@ use log::Record;
 pub fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
     let msg_vec = block_read(mem_addr, length);
 
-    let log_level = msg_vec[0];
+    use log::Level::*;
+    let log_level = match msg_vec[0] {
+        0 | 48 => Error,
+        1 | 49 => Warn,
+        2 | 50 => Info,
+        3 | 51 => Debug,
+        4 | 52 => Trace,
+        _ => {
+            return Err(LogError::InvalidLogFormat);
+        }
+    };
+    if log_level > log::max_level() {
+        return Ok(());
+    }
     let strptr = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap());
     let strlen = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap()) as usize;
 
@@ -20,18 +33,6 @@ pub fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(),
 
     match core::str::from_utf8(&str) {
         Ok(strr) => {
-            use log::Level::*;
-            let log_level = match log_level {
-                0 | 48 => Error,
-                1 | 49 => Warn,
-                2 | 50 => Info,
-                3 | 51 => Debug,
-                4 | 52 => Trace,
-                _ => {
-                    return Err(LogError::InvalidLogFormat);
-                }
-            };
-
             log::logger().log(
                 &Record::builder()
                     .args(format_args!("{}", strr))
diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs
index 347aa34..7ca0780 100644
--- a/kernel/src/kmain.rs
+++ b/kernel/src/kmain.rs
@@ -71,7 +71,18 @@ pub fn kmain(_cmdline: &str, boot_modules: BootModules) -> ! {
             let cmd = module.cmd.trim_matches('"');
             let cmd_len = cmd.len() as u64;
 
-            log::info!("Spawning {} with arguments \"{}\"", module.path, cmd);
+            log::info!(
+                "Starting {}",
+                module
+                    .path
+                    .split('/')
+                    .last()
+                    .unwrap()
+                    .split('.')
+                    .next()
+                    .unwrap()
+            );
+            log::debug!("Spawning {} with arguments \"{}\"", module.path, cmd);
 
             // decode AbleOS Executable format
             let header = &module.bytes[0..46];
@@ -92,7 +103,7 @@ pub fn kmain(_cmdline: &str, boot_modules: BootModules) -> ! {
             let code_length = u64::from_le_bytes(header[7..15].try_into().unwrap());
             let data_length = u64::from_le_bytes(header[15..23].try_into().unwrap());
             let end = (code_length + data_length) as usize;
-            log::info!("{code_length} + {data_length} = {end}");
+            log::debug!("{code_length} + {data_length} = {end}");
 
             let mut thr = ExecThread::new(&module.bytes[offset..end], Address::new(0));
             if cmd_len > 0 {
diff --git a/sysdata/libraries/stn/src/buffer.hb b/sysdata/libraries/stn/src/buffer.hb
index aa16637..e54b959 100644
--- a/sysdata/libraries/stn/src/buffer.hb
+++ b/sysdata/libraries/stn/src/buffer.hb
@@ -4,15 +4,15 @@ recv := fn($Expr: type, buffer_id: uint, memory_map_location: ^Expr): void {
 	return @eca(4, buffer_id, memory_map_location, @sizeof(Expr))
 }
 
-write := fn($Expr: type, msg: ^Expr, buffer_id: uint): void {
+write := fn($Expr: type, buffer_id: uint, msg: ^Expr): void {
 	return @eca(3, buffer_id, msg, @sizeof(Expr))
 }
 
-recv_length := fn(buffer_id: uint, memory_map_location: ^u8, length: uint): void {
+recv_length := fn(length: uint, memory_map_location: ^u8, buffer_id: uint): void {
 	return @eca(4, buffer_id, memory_map_location, length)
 }
 
-write_length := fn(msg: ^u8, buffer_id: uint, length: uint): void {
+write_length := fn(length: uint, msg: ^u8, buffer_id: uint): void {
 	return @eca(3, buffer_id, msg, length)
 }
 
@@ -22,6 +22,14 @@ create := fn(msg: ^u8): uint {
 	return @eca(3, 0, BufferMsg.(0, msg, @inline(string.length, msg)), @sizeof(BufferMsg))
 }
 
+create_without_name := fn(): uint {
+	return @eca(1, 0)
+}
+
+delete_buffer := fn(buffer_id: uint): void {
+	return @eca(2, buffer_id)
+}
+
 search := fn(msg: ^u8): uint {
 	return @eca(3, 0, BufferMsg.(3, msg, @inline(string.length, msg)), @sizeof(BufferMsg))
 }
\ No newline at end of file
diff --git a/sysdata/libraries/stn/src/string.hb b/sysdata/libraries/stn/src/string.hb
index efea870..e617498 100644
--- a/sysdata/libraries/stn/src/string.hb
+++ b/sysdata/libraries/stn/src/string.hb
@@ -4,118 +4,60 @@ length := fn(ptr: ^u8): uint {
 }
 
 display_int := fn(num: int, p: ^u8, radix: uint): ^u8 {
+	is_negative := num < 0
+	if is_negative num = -num
+
 	ptr := p
-	negative := num < 0
-	if negative {
-		num = -num
-	}
 
-	if radix == 2 {
-		*ptr = 48
-		ptr += 1;
-		*ptr = 98
-		ptr += 1
-	} else if radix == 16 {
-		*ptr = 48
-		ptr += 1;
-		*ptr = 120
-		ptr += 1
-	} else if radix == 8 {
-		*ptr = 48
-		ptr += 1;
-		*ptr = 111
-		ptr += 1
-	}
-	digits_start := ptr
 	if num == 0 {
-		*ptr = 48
-		ptr += 1
-	} else {
-		loop if num == 0 break else {
-			digit := num % @bitcast(radix)
-			if digit < 10 {
-				*ptr = @intcast(digit) + 48
-			} else {
-				*ptr = @intcast(digit) + 55
-			}
-			ptr += 1
-			num /= @bitcast(radix)
-		}
+		*ptr = 0x30;
+		*(ptr + 1) = 0
+		return p
 	}
 
-	if negative {
-		*ptr = 45
+	loop if num == 0 break else {
+		remainder := num % @bitcast(radix)
+		num /= @bitcast(radix);
+		*ptr = @intcast(remainder + 0x30)
+		if remainder > 9 {
+			*ptr = @intcast(remainder - 10 + 0x41)
+		}
 		ptr += 1
-	};
+	}
 
-	*ptr = 0
-
-	@inline(reverse, digits_start)
+	if is_negative {
+		*ptr = 0x2D
+		ptr += 1
+	}
+	// ! it gets broked when you do this ??
+	// *ptr = 0
 
+	@inline(reverse, p)
 	return p
 }
 
 reverse := fn(s: ^u8): void {
-	i := 0
-	j := @inline(length, s) - 1
+	j := s + @inline(length, s) - 1
 	temp := @as(u8, 0)
-	loop if i >= j break else {
-		temp = *(s + i);
-		*(s + i) = *(s + j);
-		*(s + j) = temp
-		i += 1
+	loop if s < j {
+		temp = *s;
+		*s = *j;
+		*j = temp
+		s += 1
 		j -= 1
-	}
-	return
+	} else return
 }
 
 equals := fn(lhs: ^u8, rhs: ^u8): bool {
 	if lhs == rhs {
 		return true
 	}
-	i := 0
-	loop if *(lhs + i) != *(rhs + i) {
+	loop if *lhs != *rhs {
 		return false
 	} else if *lhs == 0 {
 		return true
 	} else {
-		i += 1
+		lhs += 1
+		rhs += 1
 	}
-}
-
-contains := fn(haystack: ^u8, needle: ^u8): bool {
-	haystack_len := @inline(length, haystack)
-	needle_len := @inline(length, needle)
-
-	if needle_len == 0 {
-		return true
-	}
-	if haystack_len < needle_len {
-		return false
-	}
-
-	max_start := haystack_len - needle_len
-
-	pos := 0
-	loop if pos > max_start break else {
-		is_match := true
-		offset := 0
-
-		loop if offset >= needle_len break else {
-			if *(haystack + pos + offset) != *(needle + offset) {
-				is_match = false
-			}
-			if is_match == false {
-				break
-			}
-			offset += 1
-		}
-
-		if is_match {
-			return true
-		}
-		pos += 1
-	}
-
-	return false
 }
\ No newline at end of file
diff --git a/sysdata/libraries/sunset_proto/src/client.hb b/sysdata/libraries/sunset_proto/src/client.hb
index bc23e0d..6590754 100644
--- a/sysdata/libraries/sunset_proto/src/client.hb
+++ b/sysdata/libraries/sunset_proto/src/client.hb
@@ -1,79 +1,59 @@
 .{math: .{Vec2}, buffer, log, memory} := @use("../../stn/src/lib.hb");
-.{Surface, new_surface} := @use("../../render/src/lib.hb");
-.{Window, WindowData, WindowProps, MessageHeader, message, BUFFER} := @use("./lib.hb")
+.{Window, WindowData, WindowProps, MessageHeader, send_message, message, await_buffer, await_message, BUFFER} := @use("./lib.hb")
+render := @use("../../render/src/lib.hb")
 
-server_id := @as(?uint, null)
+server_id := @as(uint, idk)
+screen := @as(render.Surface, idk)
 
-init := fn(): void {
-	log.info("client: waiting for server\0")
-	id := 0
-	loop if id != 0 {
-		server_id = id
-		log.info("client: done waiting\0")
-		return
-	} else {
-		id = buffer.search(BUFFER)
-	}
+find_server := fn(): void {
+	// ! to be removed in the future
+	screen = render.init(false)
+	render.clear(screen, render.black)
+	log.debug("client: waiting for server\0")
+	server_id = await_buffer(BUFFER)
+	log.debug("client: found server\0")
 }
 
-// wait_for_message := fn($Expr: type, ptr: ^?Expr, buffer_id: uint): bool {
-// 	timer := 0
-// 	loop if timer < 1000 {
-// 		buffer.recv(?Expr, buffer_id, ptr)
-// 		if *ptr != null {
-// 			return true
-// 		}
-// 		timer -= 1
-// 	}
-// 	return false
-// }
-
 new := fn(props: WindowProps): ?Window {
-	if server_id == null {
-		init()
-	}
-	buffer.write(?MessageHeader, &@as(?MessageHeader, .(message.syn, @sizeof(WindowProps))), @unwrap(server_id))
-	log.info("client: sent syn\0")
-
-	timer := 0
-	response := memory.uninit(MessageHeader)
-	// if wait_for_message(MessageHeader, &response, @unwrap(server_id)) == false {
-	// 	return null
-	// }
-	loop if timer < 1000 {
-		buffer.recv(?MessageHeader, @unwrap(server_id), &response)
-		if response != null {
-			break
-		}
-		timer += 1
-	} else {
-		log.error("client: no response in timeout\0")
-		return null
-	}
+	send_message(MessageHeader, .(message.syn, 0), server_id)
+	log.debug("client: sent syn\0")
+	response := await_message(MessageHeader, server_id)
 	if response.kind != message.ack {
-		log.error("client: refused\0")
+		log.error("client: refused syn\0")
 		return null
 	}
-	log.info("client: received ack\0")
+	log.debug("client: got ack\0")
 
 	buffer_id := response.data
-	buffer.write(?WindowProps, &@as(?WindowProps, props), buffer_id)
-	log.info("client: sent props\0")
+	send_message(WindowProps, props, buffer_id)
+	log.debug("client: sent props\0")
 
-	timer = 0
-	response2 := memory.uninit(WindowData)
-	loop if timer < 1000 {
-		buffer.recv(?WindowData, buffer_id, &response2)
+	response2 := await_message(WindowData, buffer_id)
+	log.debug("client: got window data\0")
+	surface := render.new_surface(
+		response2.props.dimensions.x,
+		response2.props.dimensions.y,
+	)
+	return .(@as(WindowData, response2), surface)
+}
 
-		if response2 != null {
-			log.info("client: received window data\0")
-			surface := new_surface(
-				response2.props.dimensions.x,
-				response2.props.dimensions.y,
-			)
-			return .(@as(WindowData, response2), surface)
-		}
-		timer += 1
-	}
-	return null
+// ! client buffers are not being read by the server yet
+quit := fn(client: Window): void {
+	send_message(MessageHeader, .(message.quit, 0), client.data.buffer_id)
+}
+
+shutdown_server := fn(): void {
+	send_message(MessageHeader, .(message.shutdown, 0), server_id)
+}
+
+update_props := fn(client: Window): bool {
+	log.error("client: update props unimplemented\0")
+	return false
+}
+
+//! temporarily just throw our window at the screen
+frame_ready := fn(client: Window): void {
+	send_message(MessageHeader, .(message.ready, 0), client.data.buffer_id)
+	log.warn("client: we are blitting to screen from the client\n\r      this is temporary behaviour\0")
+	render.put_surface(screen, client.surface, client.data.props.position, false)
 }
\ No newline at end of file
diff --git a/sysdata/libraries/sunset_proto/src/lib.hb b/sysdata/libraries/sunset_proto/src/lib.hb
index b5f8a95..053ee05 100644
--- a/sysdata/libraries/sunset_proto/src/lib.hb
+++ b/sysdata/libraries/sunset_proto/src/lib.hb
@@ -1,4 +1,4 @@
-.{math: .{Vec2}} := @use("../../stn/src/lib.hb");
+.{math: .{Vec2}, buffer, memory} := @use("../../stn/src/lib.hb");
 .{Surface} := @use("../../render/src/lib.hb")
 
 $BUFFER := "sunset\0"
@@ -7,6 +7,34 @@ client := @use("./client.hb")
 server := @use("./server.hb")
 message := @use("./message.hb")
 
+receive_message := fn($Expr: type, buffer_id: uint): ?Expr {
+	recv := @as(?Expr, null)
+	@inline(buffer.recv, ?Expr, buffer_id, &recv)
+	return recv
+}
+
+send_message := fn($Expr: type, msg: Expr, buffer_id: uint): void {
+	@inline(buffer.write, ?Expr, buffer_id, &@as(?Expr, msg))
+}
+
+await_buffer := fn(name: ^u8): uint {
+	id := 0
+	loop if id != 0 return id else id = buffer.search(BUFFER)
+}
+
+await_message := fn($Expr: type, buffer_id: uint): Expr {
+	response := @as(?Expr, null)
+	loop {
+		@inline(buffer.recv, ?Expr, buffer_id, &response)
+		if response != null {
+			i := 0
+			return @as(Expr, response)
+		}
+	}
+}
+
+// ! we need a better message format but this will do for now.
+// enums would be nice
 MessageHeader := packed struct {
 	kind: uint,
 	data: uint,
@@ -15,7 +43,7 @@ MessageHeader := packed struct {
 WindowProps := struct {
 	position: Vec2(uint),
 	dimensions: Vec2(uint),
-	// replace with owned string type later
+	// ! replace with owned string type later
 	title: ^u8,
 }
 
diff --git a/sysdata/libraries/sunset_proto/src/message.hb b/sysdata/libraries/sunset_proto/src/message.hb
index 9c69092..b12d3d7 100644
--- a/sysdata/libraries/sunset_proto/src/message.hb
+++ b/sysdata/libraries/sunset_proto/src/message.hb
@@ -1,6 +1,8 @@
+// ! all values in this file are subject to change.
 $syn := 1
 $ack := 2
 $refused := 3
 $quit := 4
 $update_props := 5
-$shutdown := 6
\ No newline at end of file
+$shutdown := 6
+$ready := 7
\ No newline at end of file
diff --git a/sysdata/libraries/sunset_proto/src/server.hb b/sysdata/libraries/sunset_proto/src/server.hb
index 46d4617..1c14ee8 100644
--- a/sysdata/libraries/sunset_proto/src/server.hb
+++ b/sysdata/libraries/sunset_proto/src/server.hb
@@ -1,65 +1,46 @@
 .{math, log, string, random, buffer, memory} := @use("../../stn/src/lib.hb");
 .{Surface, new_surface} := @use("../../render/src/lib.hb");
-.{Window, WindowProps, WindowData, MessageHeader, BUFFER, message} := @use("./lib.hb")
+.{Window, WindowProps, WindowData, MessageHeader, BUFFER, message, receive_message, send_message, await_message} := @use("./lib.hb")
 
 WindowServer := struct {
 	window_count: uint,
 	id: uint,
-	// replace this with an actual collection when we get an allocator
+	// ! replace this with an actual collection when we get an allocator
 	windows: ^WindowData,
 }
 
-server := @as(?WindowServer, null)
+// ! in the future this should be safely handled
+server := @as(WindowServer, idk)
 
-init := fn(): void {
-	if server != null {
-		return
-	}
-	log.info("server: starting server\0")
+start := fn(): void {
 	windows := memory.alloc(WindowData, 10)
 	server = .(0, buffer.create(BUFFER), windows)
+	log.debug("server: started server\0")
 }
 
+// ! this function will be rewritten to several functions that allow the server mainloop to handle these itself
 handle_connections := fn(): bool {
-	if server == null {
-		return false
-	}
-	recv := memory.uninit(MessageHeader)
-	buffer.recv(?MessageHeader, @unwrap(server).id, &recv)
+	recv := receive_message(MessageHeader, server.id)
 	if recv == null {
 		return true
-	} else if recv.kind == message.syn {
-		buffer_id := buffer.create("asdf\0")
-		buffer.write(?MessageHeader, &@as(?MessageHeader, .(message.ack, buffer_id)), @unwrap(server).id)
-		log.info("server: sent ack\0")
+	}
+	if recv.kind == message.syn {
+		buffer_id := buffer.create_without_name()
+
+		send_message(MessageHeader, .(message.ack, buffer_id), server.id)
+		log.debug("server: sent ack\0")
+
+		resp := await_message(WindowProps, buffer_id)
+		log.debug("server: received props\0")
 
-		timer := 0
-		resp := memory.uninit(WindowProps)
-		loop if timer < 1000 {
-			buffer.recv(?WindowProps, buffer_id, &resp)
-			if resp != null {
-				break
-			}
-			timer += 1
-		} else {
-			log.error("server: no props in timeout\0")
-			return true
-		}
-		log.info("server: received props\0")
-		surface := new_surface(resp.dimensions.x, resp.dimensions.y)
 		data := WindowData.(@as(WindowProps, resp), buffer_id)
-		buffer.write(?WindowData, &@as(?WindowData, data), buffer_id)
-		log.info("server: sent window data\0");
-		*(@unwrap(server).windows + @unwrap(server).window_count) = data
-		@unwrap(server).window_count += 1
-	} else if recv.kind == message.quit {
-		// todo: quit
+		send_message(WindowData, data, buffer_id)
+		log.debug("server: sent window data\0");
+		*(server.windows + server.window_count) = data
+		server.window_count += 1
 	} else if recv.kind == message.shutdown {
+		log.warn("server: shutdown handled without validation\n\r      this is temporary behaviour\0")
 		return false
 	}
 	return true
-}
-
-should_shutdown := fn(): bool {
-	return false
 }
\ No newline at end of file
diff --git a/sysdata/programs/ps2_keyboard_driver/src/main.hb b/sysdata/programs/ps2_keyboard_driver/src/main.hb
index 41485ca..9d2c8df 100644
--- a/sysdata/programs/ps2_keyboard_driver/src/main.hb
+++ b/sysdata/programs/ps2_keyboard_driver/src/main.hb
@@ -34,7 +34,7 @@ main := fn(): int {
 		prev_input = input
 		kevent := KeyEvent.(false, true, input)
 
-		buffer.write(KeyEvent, &kevent, buf)
+		buffer.write(KeyEvent, buf, &kevent)
 	}
 	return 0
 }
\ No newline at end of file
diff --git a/sysdata/programs/ps2_mouse_driver/src/main.hb b/sysdata/programs/ps2_mouse_driver/src/main.hb
index 5468017..1faa417 100644
--- a/sysdata/programs/ps2_mouse_driver/src/main.hb
+++ b/sysdata/programs/ps2_mouse_driver/src/main.hb
@@ -145,7 +145,7 @@ main := fn(): int {
 		event.x_change = x_change
 		event.y_change = y_change
 
-		buffer.write(MouseEvent, &event, mouse_buffer)
+		buffer.write(MouseEvent, mouse_buffer, &event)
 	}
 
 	return 0
diff --git a/sysdata/programs/render_example/src/examples/colors.hb b/sysdata/programs/render_example/src/examples/colors.hb
index bb23933..d6c14db 100644
--- a/sysdata/programs/render_example/src/examples/colors.hb
+++ b/sysdata/programs/render_example/src/examples/colors.hb
@@ -12,10 +12,10 @@ example := fn(): void {
 	loop {
 		render.clear(screen, color)
 		render.sync(screen)
-		if (color.b & 255) == 255 | (color.b & 255) == 0 {
-			n = -n
+		if color.b == 255 | color.b == 0 {
+			// compiler bug workaround
+			n = 0 - n
 		}
 		color.b += n
 	}
-	return
 }
\ No newline at end of file
diff --git a/sysdata/programs/sunset_client/src/main.hb b/sysdata/programs/sunset_client/src/main.hb
index 86b8ac7..1dfc989 100644
--- a/sysdata/programs/sunset_client/src/main.hb
+++ b/sysdata/programs/sunset_client/src/main.hb
@@ -1,12 +1,20 @@
 .{log, string} := @use("../../../libraries/stn/src/lib.hb")
 sunset := @use("../../../libraries/sunset_proto/src/lib.hb")
+render := @use("../../../libraries/render/src/lib.hb")
 
 main := fn(): void {
-	window := sunset.client.new(.(.(100, 100), .(100, 100), "Hello, World!\0"))
-	if window == null {
-		log.error("client: window was null\0")
+	sunset.client.find_server()
+	client := sunset.client.new(.(.(100, 100), .(100, 100), "Hello, World!\0"))
+	if client == null {
+		log.error("we did not get a window\0")
 		return
 	}
-	log.info("client: window title:\0")
-	log.info(window.data.props.title)
+	if sunset.client.update_props(client) == false {
+		log.error("we did not update props\0")
+	}
+
+	render.put_filled_circle(client.surface, .(50, 50), 20, render.white)
+	sunset.client.frame_ready(client)
+	sunset.client.quit(client)
+	sunset.client.shutdown_server()
 }
\ No newline at end of file
diff --git a/sysdata/programs/sunset_server/src/main.hb b/sysdata/programs/sunset_server/src/main.hb
index 98f421b..79dc01e 100644
--- a/sysdata/programs/sunset_server/src/main.hb
+++ b/sysdata/programs/sunset_server/src/main.hb
@@ -1,7 +1,7 @@
 sunset := @use("../../../libraries/sunset_proto/src/lib.hb")
 
 main := fn(): void {
-	sunset.server.init()
+	sunset.server.start()
 	loop if sunset.server.handle_connections() {
 	}
 }
\ No newline at end of file