diff --git a/README.md b/README.md
index e20a3134..2bed670a 100644
--- a/README.md
+++ b/README.md
@@ -16,3 +16,10 @@ bun dev
Open [http://localhost:5173](http://localhost:5173) with your browser to see the result.
You can start editing the page by modifying `src/app/index.jsx`. The page auto-updates as you edit the file.
+
+
+**Helpful for debugging**
+* [chrome://usb-internals/](chrome://usb-internals/)
+* [chrome://device-log/](chrome://device-log/)
+* Add `?fast=1` to the URL to skip flashing the system partition (the slowest). Useful for testing the full flow quickly.
+* Add `?windows=1` to the URL to force Windows mode (shows Zadig driver instructions). Useful for testing the Windows flow on other platforms.
\ No newline at end of file
diff --git a/deploy-preview.sh b/deploy-preview.sh
new file mode 100755
index 00000000..fc035f67
--- /dev/null
+++ b/deploy-preview.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -e
+
+BRANCH="${1:-$(git branch --show-current)}"
+
+bun run build
+bunx wrangler pages deploy dist --project-name=connect --branch="$BRANCH"
+
+echo ""
+echo "Preview URL: https://${BRANCH}.connect-d5y.pages.dev"
diff --git a/src/app.html b/src/app.html
index c6072191..6bc08c2d 100644
--- a/src/app.html
+++ b/src/app.html
@@ -6,7 +6,7 @@
- Under Device in the menu bar, select{" "}
- Create New Device.
-
-
-
- Fill in three fields. The first field is just a description and you can fill in anything. The next two
- fields are very important. Fill them in with{" "}
- {VENDOR_ID} and {PRODUCT_ID}
- respectively. Press "Install Driver" and give it a few minutes to install.
-
-
-
-
No additional software is required for macOS, Linux or Android.
- {/if}
- {/if}
-
-
-
-
-
Flashing
-
Follow these steps to put your device into QDL mode:
-
-
Unplug the device and wait for the LED to switch off.
-
- First, connect the device to your computer using the lowerUSB-C port
- (port 1).
-
-
- Second, connect power to the upper
- OBD-C
- port (port 2).
-
-
-
-
-
- Your device's screen will remain blank for the entire flashing process. This is normal.
-
- {#if browser}
- {#if isLinux()}
- Note for Linux users
-
- On Linux systems, devices in QDL mode are automatically bound to the kernel's qcserial driver, and need
- to be unbound before we can access the device. Copy the script below into your terminal and run it after
- plugging in your device.
-
-
- {/if}
- {/if}
-
- Next, click the button to start flashing. From the prompt select the device which starts with
- “QUSB_BULK”.
-
-
- The process can take 30+ minutes depending on your internet connection and system performance. Do not unplug the
- device until all steps are complete.
-
-
-
-
-
-
Troubleshooting
-
Lost connection
-
- Try using high quality USB 3 cables. You should also try different USB ports on the front or back of your
- computer. If you're using a USB hub, try connecting directly to your computer instead.
-
-
My device's screen is blank
-
- This is normal in QDL mode. You can verify that the “QUSB_BULK” device shows up when you press the
- Flash button to know that it is working correctly.
-
-
My device says “fastboot mode”
-
- You may have followed outdated instructions for flashing. Please read the instructions above for putting your
- device into QDL mode.
-
-
General Tips
-
-
Try another computer or OS
-
Try different USB ports on your computer
-
- Try different USB-C cables; low quality cables are often the source of problems. Note that the included OBD-C
- cable will not work.
-
-
-
Other questions
-
- If you need help, join our Discord server
- and go to the #hw-three-3x channel.
-
+ {#each steps as stepName, index (stepName)}
+ {@const isCompleted = index < currentStep}
+ {@const isCurrent = index === currentStep}
+ {@const isClickable = index < currentStep}
+
+ {#if index > 0}
+
+ {/if}
+
+
+ {/each}
+
\ No newline at end of file
diff --git a/src/routes/_components/ConnectInstructions.svelte b/src/routes/_components/ConnectInstructions.svelte
new file mode 100644
index 00000000..a4decbf6
--- /dev/null
+++ b/src/routes/_components/ConnectInstructions.svelte
@@ -0,0 +1,59 @@
+
+
+
+
+
Connect your device
+
Follow these steps to prepare your device for flashing
+
+
+
+
+
+
+
+ A
+ Unplug the device
+
+ {#if !isCommaFour}
+
+ B
+ Wait for the light on the back to fully turn off
+
+ {/if}
+
+ {isCommaFour ? 'B' : 'C'}
+ Connect port 1 to your computer
+
+
+ {isCommaFour ? 'C' : 'D'}
+ Connect port 2 to your computer or a power brick
+
+
+
+
+
+ Your device's screen will remain blank. This is normal.
+
+
+
+
\ No newline at end of file
diff --git a/src/routes/_components/DebugInfo.svelte b/src/routes/_components/DebugInfo.svelte
new file mode 100644
index 00000000..7fa60571
--- /dev/null
+++ b/src/routes/_components/DebugInfo.svelte
@@ -0,0 +1,114 @@
+
+
+
+
+
+ Copy this debug info and paste it in{' '}
+ Discord
+ {' '}or{' '}
+ GitHub Issues.
+
+ {#if onClose}
+
+ {/if}
+
+
+ {getDebugReport()}
+
+
+
\ No newline at end of file
diff --git a/src/routes/_components/DevicePicker.svelte b/src/routes/_components/DevicePicker.svelte
new file mode 100644
index 00000000..13d2f757
--- /dev/null
+++ b/src/routes/_components/DevicePicker.svelte
@@ -0,0 +1,57 @@
+
+
+
+
+
Which device are you flashing?
+
Select your comma device
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/routes/_components/DeviceState.svelte b/src/routes/_components/DeviceState.svelte
new file mode 100644
index 00000000..2751b663
--- /dev/null
+++ b/src/routes/_components/DeviceState.svelte
@@ -0,0 +1,19 @@
+
+
+
+ Restore your comma device to a fresh factory state
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/LinearProgress.svelte b/src/routes/_components/LinearProgress.svelte
similarity index 100%
rename from src/lib/components/LinearProgress.svelte
rename to src/routes/_components/LinearProgress.svelte
diff --git a/src/routes/_components/LinuxUnbind.svelte b/src/routes/_components/LinuxUnbind.svelte
new file mode 100644
index 00000000..d19cb58d
--- /dev/null
+++ b/src/routes/_components/LinuxUnbind.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+
Unbind from qcserial
+
+ On Linux, devices in QDL mode are bound to the kernel's qcserial driver.
+ Run this command in a terminal to unbind it:
+
+
+
+
+
+ {DETACH_SCRIPT}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/routes/_components/WebUSBConnect.svelte b/src/routes/_components/WebUSBConnect.svelte
new file mode 100644
index 00000000..31e8c99f
--- /dev/null
+++ b/src/routes/_components/WebUSBConnect.svelte
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
Select your device
+
+ Click the button below to open the device selector, then choose QUSB_BULK_CID from the list.
+
+
+
+
\ No newline at end of file
diff --git a/src/routes/_components/WindowsZadig.svelte b/src/routes/_components/WindowsZadig.svelte
new file mode 100644
index 00000000..b8757078
--- /dev/null
+++ b/src/routes/_components/WindowsZadig.svelte
@@ -0,0 +1,61 @@
+
+
+
+
+
Install USB Driver
+
Windows requires a driver to communicate with your device