diff --git a/python_payload/main.py b/python_payload/main.py
index b8fbae8a5188bc7c21169bc0027044ec1f610c94..f886ff4fa6821e43dcb1f078037a0fbc9f327430 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -1,5 +1,6 @@
 from machine import Pin
 from hardware import *
+import utils
 import time
 import cap_touch_demo
 import melodic_demo
@@ -27,9 +28,6 @@ SELECT_TEXT = [
 ]
 
 BACKGROUND_COLOR = 0
-GREEN = 0b0000011111100000
-RED = 0b1111100000000000
-BLUE = 0b0000000000011111
 
 # pin numbers
 # right side: left 37, down 0, right 35
@@ -37,84 +35,37 @@ BLUE = 0b0000000000011111
 # NOTE: All except for 0 should be initialized with Pin.PULL_UP
 # 0 (bootsel) probably not but idk? never tried
 
-def clear_all_leds():
-    for i in range(40):
-        set_led_rgb(i, 0, 0, 0)
-    update_leds()
-
-def draw_text_big(text, x, y):
-    ypos = 120+int(len(text)/2) + int(y)
-    xpos = 120+int(len(text[0])/2) + int(x)
-    for l, line in enumerate(text):
-        for p, pixel in enumerate(line):
-            if(pixel == '#'):
-                display_draw_pixel(xpos - 2*p, ypos - 2*l, RED)
-                display_draw_pixel(xpos - 2*p, ypos - 2*l-1, BLUE)
-                display_draw_pixel(xpos - 2*p-1, ypos - 2*l, BLUE)
-                display_draw_pixel(xpos - 2*p-1, ypos - 2*l-1, RED)
-
-def highlight_bottom_petal(num, RED, GREEN, BLUE):
-    start = 4 + 8*num
-    for i in range(7):
-        set_led_rgb(((i+start)%40), RED, GREEN, BLUE)
-    update_leds()
-
-def long_bottom_petal_captouch_blocking(num, ms):
-    if(get_captouch((num*2) + 1) == 1):
-        time.sleep_ms(ms)
-        if(get_captouch((num*2) + 1) == 1):
-            return True
-    return False
-
-def draw_rect(x,y,w,h,col):
-    for j in range(w):
-        for k in range(h):
-            display_draw_pixel(x+j,y+k,col)
-
-def draw_volume_slider():
-    global volume
-    length = 96 + ((volume - 20) * 1.6)
-    if length > 96:
-        length = 96
-    if length < 0:
-        length = 0
-    length = int(length)
-    draw_rect(70,20,100,10,GREEN)
-    draw_rect(71,21,98,8, 0)
-    draw_rect(72+96-length,22,length,6,GREEN)
-
-
 def run_menu():
     global foreground
     display_fill(BACKGROUND_COLOR)
-    draw_text_big(SELECT_TEXT, 0, 0)
-    draw_volume_slider()
+    utils.draw_text_big(SELECT_TEXT, 0, 0)
+    utils.draw_volume_slider(volume)
     display_update()
 
     selected_petal = None
     selected_module = None
     for petal, module in enumerate(MODULES):
-        if long_bottom_petal_captouch_blocking(petal, 20):
+        if utils.long_bottom_petal_captouch_blocking(petal, 20):
             selected_petal = petal
             selected_module = module
             break
 
     if selected_petal is not None:
-        clear_all_leds()
-        highlight_bottom_petal(selected_petal, 55, 0, 0)
+        utils.clear_all_leds()
+        utils.highlight_bottom_petal(selected_petal, 55, 0, 0)
         display_fill(BACKGROUND_COLOR)
         display_update()
         foreground = selected_module.run
         time.sleep_ms(100)
-        clear_all_leds()
+        utils.clear_all_leds()
         selected_module.foreground()
 
 def foreground_menu():
-    clear_all_leds()
-    highlight_bottom_petal(0,0,55,55);
-    highlight_bottom_petal(1,55,0,55);
+    utils.clear_all_leds()
+    utils.highlight_bottom_petal(0,0,55,55);
+    utils.highlight_bottom_petal(1,55,0,55);
     display_fill(BACKGROUND_COLOR)
-    draw_text_big(SELECT_TEXT, 0, 0)
+    utils.draw_text_big(SELECT_TEXT, 0, 0)
     display_update()
 
 def set_rel_volume(vol):
diff --git a/python_payload/utils.py b/python_payload/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..52b2b00f509c8a66ab0328fe396598dd63d2ef6c
--- /dev/null
+++ b/python_payload/utils.py
@@ -0,0 +1,51 @@
+import time
+from hardware import *
+
+RED = 0b1111100000000000
+GREEN = 0b0000011111100000
+BLUE = 0b0000000000011111
+
+def clear_all_leds():
+    for i in range(40):
+        set_led_rgb(i, 0, 0, 0)
+    update_leds()
+
+def draw_text_big(text, x, y):
+    ypos = 120+int(len(text)/2) + int(y)
+    xpos = 120+int(len(text[0])/2) + int(x)
+    for l, line in enumerate(text):
+        for p, pixel in enumerate(line):
+            if(pixel == '#'):
+                display_draw_pixel(xpos - 2*p, ypos - 2*l, RED)
+                display_draw_pixel(xpos - 2*p, ypos - 2*l-1, BLUE)
+                display_draw_pixel(xpos - 2*p-1, ypos - 2*l, BLUE)
+                display_draw_pixel(xpos - 2*p-1, ypos - 2*l-1, RED)
+
+def highlight_bottom_petal(num, RED, GREEN, BLUE):
+    start = 4 + 8*num
+    for i in range(7):
+        set_led_rgb(((i+start)%40), RED, GREEN, BLUE)
+    update_leds()
+
+def long_bottom_petal_captouch_blocking(num, ms):
+    if(get_captouch((num*2) + 1) == 1):
+        time.sleep_ms(ms)
+        if(get_captouch((num*2) + 1) == 1):
+            return True
+    return False
+
+def draw_rect(x,y,w,h,col):
+    for j in range(w):
+        for k in range(h):
+            display_draw_pixel(x+j,y+k,col)
+
+def draw_volume_slider(volume):
+    length = 96 + ((volume - 20) * 1.6)
+    if length > 96:
+        length = 96
+    if length < 0:
+        length = 0
+    length = int(length)
+    draw_rect(70,20,100,10,GREEN)
+    draw_rect(71,21,98,8, 0)
+    draw_rect(72+96-length,22,length,6,GREEN)