diff --git a/demo/demo-01/client/pom.xml b/demo/demo-01/client/pom.xml
new file mode 100644
index 000000000..55b4606a5
--- /dev/null
+++ b/demo/demo-01/client/pom.xml
@@ -0,0 +1,55 @@
+
+ 4.0.0
+
+
+ net.zscript.demo
+ demo-01
+ 0.0.1-SNAPSHOT
+
+
+ demo-01-client
+ jar
+ Demo 01 Client
+
+
+
+ net.zscript
+ zscript-java-client-connection
+ ${project.version}
+
+
+ net.zscript
+ zscript-java-client-command-builders
+ ${project.version}
+
+
+
+ org.openjfx
+ javafx-controls
+ 18.0.2
+
+
+ org.openjfx
+ javafx-fxml
+ 18.0.2
+
+
+
+
+
+
+
+ org.openjfx
+ javafx-maven-plugin
+ 0.0.8
+
+ net.zscript.demo01.client.ui.UiMain
+ zscript_demo_01
+ launcher
+
+
+
+
+
diff --git a/demo/demo-01/client/src/main/java/net/zscript/demo01/client/Main.java b/demo/demo-01/client/src/main/java/net/zscript/demo01/client/Main.java
new file mode 100644
index 000000000..354808d7e
--- /dev/null
+++ b/demo/demo-01/client/src/main/java/net/zscript/demo01/client/Main.java
@@ -0,0 +1,11 @@
+package net.zscript.demo01.client;
+
+import net.zscript.model.modules.base.CoreModule;
+
+public class Main {
+ public static void main(String[] args) {
+ CoreModule.activate()
+ .build();
+
+ }
+}
diff --git a/demo/demo-01/client/src/main/java/net/zscript/demo01/client/ui/UiMain.java b/demo/demo-01/client/src/main/java/net/zscript/demo01/client/ui/UiMain.java
new file mode 100644
index 000000000..cff7253a1
--- /dev/null
+++ b/demo/demo-01/client/src/main/java/net/zscript/demo01/client/ui/UiMain.java
@@ -0,0 +1,33 @@
+package net.zscript.demo01.client.ui;
+
+import javafx.application.Application;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.layout.StackPane;
+import javafx.stage.Stage;
+
+public class UiMain extends Application {
+ public static void main(String[] args) {
+ launch(args);
+ }
+
+ @Override
+ public void start(Stage primaryStage) throws Exception {
+ primaryStage.setTitle("Hello World?");
+ Button btn = new Button();
+ btn.setText("Say 'Hello World'");
+ btn.setOnAction(new EventHandler() {
+ @Override
+ public void handle(ActionEvent event) {
+ System.out.println("Hello World!");
+ }
+ });
+
+ StackPane root = new StackPane();
+ root.getChildren().add(btn);
+ primaryStage.setScene(new Scene(root, 300, 250));
+ primaryStage.show();
+ }
+}
diff --git a/demo/demo-01/firmware/pom.xml b/demo/demo-01/firmware/pom.xml
new file mode 100644
index 000000000..9c265bcf4
--- /dev/null
+++ b/demo/demo-01/firmware/pom.xml
@@ -0,0 +1,15 @@
+
+ 4.0.0
+
+
+ net.zscript.demo
+ demo-01
+ 0.0.1-SNAPSHOT
+
+
+ demo-01-firmware
+ pom
+ Demo 01 Firmware
+
diff --git a/demo/demo-01/pom.xml b/demo/demo-01/pom.xml
new file mode 100644
index 000000000..ac5e8766c
--- /dev/null
+++ b/demo/demo-01/pom.xml
@@ -0,0 +1,21 @@
+
+ 4.0.0
+
+
+ net.zscript.demo
+ demo-all
+ 0.0.1-SNAPSHOT
+
+
+ demo-01
+ pom
+ Demo 01
+
+
+ client
+ firmware
+
+
+
diff --git a/demo/pom.xml b/demo/pom.xml
new file mode 100644
index 000000000..9dd867cba
--- /dev/null
+++ b/demo/pom.xml
@@ -0,0 +1,43 @@
+
+ 4.0.0
+
+
+ net.zscript
+ zscript-all
+ 0.0.1-SNAPSHOT
+
+
+ net.zscript.demo
+ demo-all
+ pom
+ Zscript Demos
+
+
+ demo-01
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+ org.assertj
+ assertj-core
+
+
+ org.mockito
+ mockito-core
+
+
+ org.mockito
+ mockito-junit-jupiter
+
+
+
diff --git a/pom.xml b/pom.xml
index cab6cabb1..b57c425e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,6 +42,7 @@
acceptance-tests
simulator
util
+ demo