diff --git a/embassy/demos/picow/build.rs b/embassy/demos/picow/build.rs
index 3f915f931254e27ef7a904d5e572f753d1b9f57a..7ba8277d34842bb68b96edbfb143c12242153d3e 100644
--- a/embassy/demos/picow/build.rs
+++ b/embassy/demos/picow/build.rs
@@ -12,8 +12,14 @@ use std::env;
 use std::fs::File;
 use std::io::Write;
 use std::path::PathBuf;
+use std::process::Command;
 
 fn main() {
+    link();
+    git();
+}
+
+fn link() {
     // Put `memory.x` in our output directory and ensure it's
     // on the linker search path.
     let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap());
@@ -34,3 +40,14 @@ fn main() {
     println!("cargo:rustc-link-arg-bins=-Tlink-rp.x");
     println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
 }
+
+fn git() {
+    let git_rev = Command::new("git")
+        .args(&["describe", "--always", "--tags", "--dirty=+"])
+        .output()
+        .map(|o| String::from_utf8(o.stdout).unwrap().to_string())
+        .unwrap_or("(unknown)".to_string());
+
+    println!("cargo:rustc-env=GIT_REV={git_rev}");
+    println!("cargo:rerun-if-changed=.git/HEAD");
+}
diff --git a/embassy/demos/picow/src/picowmenu.rs b/embassy/demos/picow/src/picowmenu.rs
index 3770c7dc26d271440484b0b88544de8f6fa22b61..b610422629e3d069a1bb20366f74f5e3e07b11c7 100644
--- a/embassy/demos/picow/src/picowmenu.rs
+++ b/embassy/demos/picow/src/picowmenu.rs
@@ -602,7 +602,7 @@ fn do_bootsel(_item: &Item<MenuCtx>, args: &[&str], context: &mut MenuCtx) {
 fn do_about(_item: &Item<MenuCtx>, _args: &[&str], context: &mut MenuCtx) {
     let _ = writeln!(
         context,
-        "Sunset SSH, USB serial\nMatt Johnston <matt@ucc.asn.au>\n"
+        "Sunset SSH, USB serial\nMatt Johnston <matt@ucc.asn.au>\n{}", env!("GIT_REV"),
     );
 }