diff --git a/python_payload/st3m/run.py b/python_payload/st3m/run.py
index b61ddd856955143889b49ddc3ce6db8ef5bd075b..d3bc0063e6f2e852477dc73ab7696948b8d3cae1 100644
--- a/python_payload/st3m/run.py
+++ b/python_payload/st3m/run.py
@@ -1,5 +1,5 @@
 from st3m.reactor import Reactor, Responder
-from st3m.goose import List
+from st3m.goose import List, Optional
 from st3m.ui.menu import (
     MenuItem,
     MenuItemBack,
@@ -23,6 +23,9 @@ import machine
 
 log = logging.Log(__name__, level=logging.INFO)
 
+#: Can be set to a bundle name that should be started instead of the main menu when run_main is called.
+override_main_app: Optional[str] = None
+
 
 def _make_reactor() -> Reactor:
     reactor = Reactor()
@@ -144,6 +147,14 @@ def run_main() -> None:
             MenuItemForeground("System", menu_system),
         ],
     )
+    if override_main_app is not None:
+        requested = [b for b in bundles if b.name == override_main_app]
+        print([b.name for b in bundles])
+        if len(requested) > 1:
+            raise Exception(f"More than one bundle named {override_main_app}")
+        if len(requested) == 0:
+            raise Exception(f"Requested bundle {override_main_app} not found")
+        run_view(requested[0].load())
     run_view(menu_main)
 
 
diff --git a/sim/run.py b/sim/run.py
index c6037d1f30e1828f4390a42729f257c7c0f4803f..8da91ef535ded29c6deb630037505508d8f8ec97 100644
--- a/sim/run.py
+++ b/sim/run.py
@@ -111,5 +111,9 @@ if len(sys.argv) >= 2 and sys.argv[1] == "screenshot":
     import hardware
 
     hardware.SCREENSHOT = True
+elif len(sys.argv) == 2:
+    import st3m.run
+
+    st3m.run.override_main_app = sys.argv[1]
 
 import main