diff --git a/Cargo.lock b/Cargo.lock
index bf7628721..1b93c0d27 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,35 +2,20 @@
 # It is not intended for manual editing.
 version = 4
 
-[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli 0.28.1",
-]
-
 [[package]]
 name = "addr2line"
 version = "0.24.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
 dependencies = [
- "gimli 0.31.1",
+ "gimli",
 ]
 
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
 [[package]]
 name = "adler2"
-version = "2.0.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
 
 [[package]]
 name = "aead"
@@ -69,12 +54,12 @@ dependencies = [
 
 [[package]]
 name = "ahash"
-version = "0.8.11"
+version = "0.8.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
 dependencies = [
  "cfg-if",
- "getrandom",
+ "getrandom 0.3.3",
  "once_cell",
  "version_check",
  "zerocopy",
@@ -94,10 +79,10 @@ name = "alias"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -135,9 +120,9 @@ dependencies = [
 
 [[package]]
 name = "alloy-chains"
-version = "0.1.57"
+version = "0.1.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ab9d1367c6ffb90c93fb4a9a4989530aa85112438c6f73a734067255d348469"
+checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb"
 dependencies = [
  "alloy-primitives",
  "num_enum",
@@ -157,7 +142,7 @@ dependencies = [
  "alloy-trie",
  "auto_impl",
  "c-kzg",
- "derive_more",
+ "derive_more 1.0.0",
  "serde",
 ]
 
@@ -193,14 +178,14 @@ dependencies = [
  "alloy-transport",
  "futures",
  "futures-util",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
 ]
 
 [[package]]
 name = "alloy-core"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "648275bb59110f88cc5fa9a176845e52a554ebfebac2d21220bcda8c9220f797"
+checksum = "9d8bcce99ad10fe02640cfaec1c6bc809b837c783c1d52906aa5af66e2a196f6"
 dependencies = [
  "alloy-dyn-abi",
  "alloy-json-abi",
@@ -211,9 +196,9 @@ dependencies = [
 
 [[package]]
 name = "alloy-dyn-abi"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc9138f4f0912793642d453523c3116bd5d9e11de73b70177aa7cb3e94b98ad2"
+checksum = "eb8e762aefd39a397ff485bc86df673465c4ad3ec8819cc60833a8a3ba5cdc87"
 dependencies = [
  "alloy-json-abi",
  "alloy-primitives",
@@ -245,7 +230,7 @@ checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e"
 dependencies = [
  "alloy-primitives",
  "alloy-rlp",
- "derive_more",
+ "derive_more 1.0.0",
  "serde",
 ]
 
@@ -261,7 +246,7 @@ dependencies = [
  "alloy-rlp",
  "alloy-serde",
  "c-kzg",
- "derive_more",
+ "derive_more 1.0.0",
  "once_cell",
  "serde",
  "sha2",
@@ -281,9 +266,9 @@ dependencies = [
 
 [[package]]
 name = "alloy-json-abi"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24acd2f5ba97c7a320e67217274bc81fe3c3174b8e6144ec875d9d54e760e278"
+checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b"
 dependencies = [
  "alloy-primitives",
  "alloy-sol-type-parser",
@@ -301,7 +286,7 @@ dependencies = [
  "alloy-sol-types",
  "serde",
  "serde_json",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
  "tracing",
 ]
 
@@ -327,7 +312,7 @@ dependencies = [
  "futures-utils-wasm",
  "serde",
  "serde_json",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
 ]
 
 [[package]]
@@ -345,26 +330,26 @@ dependencies = [
 
 [[package]]
 name = "alloy-primitives"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec878088ec6283ce1e90d280316aadd3d6ce3de06ff63d68953c855e7e447e92"
+checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e"
 dependencies = [
  "alloy-rlp",
  "bytes",
  "cfg-if",
  "const-hex",
- "derive_more",
+ "derive_more 2.0.1",
  "foldhash",
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
  "indexmap",
  "itoa",
  "k256",
  "keccak-asm",
  "paste",
  "proptest",
- "rand",
+ "rand 0.8.5",
  "ruint",
- "rustc-hash 2.1.0",
+ "rustc-hash 2.1.1",
  "serde",
  "sha3",
  "tiny-keccak",
@@ -402,7 +387,7 @@ dependencies = [
  "schnellru",
  "serde",
  "serde_json",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
  "tokio",
  "tracing",
  "url",
@@ -430,9 +415,9 @@ dependencies = [
 
 [[package]]
 name = "alloy-rlp"
-version = "0.3.11"
+version = "0.3.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6"
+checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4"
 dependencies = [
  "alloy-rlp-derive",
  "arrayvec",
@@ -441,13 +426,13 @@ dependencies = [
 
 [[package]]
 name = "alloy-rlp-derive"
-version = "0.3.11"
+version = "0.3.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943"
+checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -512,7 +497,7 @@ dependencies = [
  "alloy-rlp",
  "alloy-serde",
  "alloy-sol-types",
- "derive_more",
+ "derive_more 1.0.0",
  "itertools 0.13.0",
  "serde",
  "serde_json",
@@ -540,7 +525,7 @@ dependencies = [
  "auto_impl",
  "elliptic-curve",
  "k256",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
 ]
 
 [[package]]
@@ -556,8 +541,8 @@ dependencies = [
  "async-trait",
  "coins-ledger",
  "futures-util",
- "semver 1.0.25",
- "thiserror 2.0.11",
+ "semver 1.0.26",
+ "thiserror 2.0.12",
  "tracing",
 ]
 
@@ -574,8 +559,8 @@ dependencies = [
  "async-trait",
  "eth-keystore",
  "k256",
- "rand",
- "thiserror 2.0.11",
+ "rand 0.8.5",
+ "thiserror 2.0.12",
 ]
 
 [[package]]
@@ -589,31 +574,31 @@ dependencies = [
  "alloy-primitives",
  "alloy-signer",
  "async-trait",
- "semver 1.0.25",
- "thiserror 2.0.11",
+ "semver 1.0.26",
+ "thiserror 2.0.12",
  "tracing",
  "trezor-client",
 ]
 
 [[package]]
 name = "alloy-sol-macro"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d039d267aa5cbb7732fa6ce1fd9b5e9e29368f580f80ba9d7a8450c794de4b2"
+checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2"
 dependencies = [
  "alloy-sol-macro-expander",
  "alloy-sol-macro-input",
  "proc-macro-error2",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "alloy-sol-macro-expander"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "620ae5eee30ee7216a38027dec34e0585c55099f827f92f50d11e3d2d3a4a954"
+checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26"
 dependencies = [
  "alloy-json-abi",
  "alloy-sol-macro-input",
@@ -623,33 +608,34 @@ dependencies = [
  "proc-macro-error2",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "syn-solidity",
  "tiny-keccak",
 ]
 
 [[package]]
 name = "alloy-sol-macro-input"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad9f7d057e00f8c5994e4ff4492b76532c51ead39353aa2ed63f8c50c0f4d52e"
+checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e"
 dependencies = [
  "alloy-json-abi",
  "const-hex",
  "dunce",
  "heck 0.5.0",
+ "macro-string",
  "proc-macro2",
  "quote",
  "serde_json",
- "syn 2.0.96",
+ "syn 2.0.104",
  "syn-solidity",
 ]
 
 [[package]]
 name = "alloy-sol-type-parser"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74e60b084fe1aef8acecda2743ff2d93c18ff3eb67a2d3b12f62582a1e66ef5e"
+checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c"
 dependencies = [
  "serde",
  "winnow",
@@ -657,9 +643,9 @@ dependencies = [
 
 [[package]]
 name = "alloy-sol-types"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1382302752cd751efd275f4d6ef65877ddf61e0e6f5ac84ef4302b79a33a31a"
+checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab"
 dependencies = [
  "alloy-json-abi",
  "alloy-primitives",
@@ -680,7 +666,7 @@ dependencies = [
  "futures-utils-wasm",
  "serde",
  "serde_json",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
  "tokio",
  "tower",
  "tracing",
@@ -712,7 +698,7 @@ dependencies = [
  "alloy-pubsub",
  "alloy-transport",
  "futures",
- "http 1.2.0",
+ "http 1.3.1",
  "rustls",
  "serde_json",
  "tokio",
@@ -723,14 +709,14 @@ dependencies = [
 
 [[package]]
 name = "alloy-trie"
-version = "0.7.8"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6917c79e837aa7b77b7a6dae9f89cbe15313ac161c4d3cfaf8909ef21f3d22d8"
+checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b"
 dependencies = [
  "alloy-primitives",
  "alloy-rlp",
  "arrayvec",
- "derive_more",
+ "derive_more 1.0.0",
  "nybbles",
  "serde",
  "smallvec",
@@ -760,9 +746,9 @@ dependencies = [
 
 [[package]]
 name = "anstream"
-version = "0.6.18"
+version = "0.6.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -775,44 +761,44 @@ dependencies = [
 
 [[package]]
 name = "anstyle"
-version = "1.0.10"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.6"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.1.2"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
 dependencies = [
  "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.7"
+version = "3.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
+checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
 dependencies = [
  "anstyle",
- "once_cell",
+ "once_cell_polyfill",
  "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "anyhow"
-version = "1.0.97"
+version = "1.0.98"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
+checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
 
 [[package]]
 name = "app-store"
@@ -822,16 +808,16 @@ dependencies = [
  "alloy-sol-types",
  "anyhow",
  "bincode",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
- "rand",
+ "rand 0.8.5",
  "serde",
  "serde_json",
  "sha2",
  "sha3",
  "url",
  "urlencoding 2.1.3",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
  "zip 1.1.4",
 ]
 
@@ -967,7 +953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c"
 dependencies = [
  "num-traits",
- "rand",
+ "rand 0.8.5",
 ]
 
 [[package]]
@@ -977,7 +963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185"
 dependencies = [
  "num-traits",
- "rand",
+ "rand 0.8.5",
 ]
 
 [[package]]
@@ -1008,18 +994,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "async-trait"
-version = "0.1.85"
+version = "0.1.88"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056"
+checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -1041,34 +1027,34 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
 
 [[package]]
 name = "auto_impl"
-version = "1.2.1"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73"
+checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
 
 [[package]]
 name = "backtrace"
-version = "0.3.71"
+version = "0.3.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
+checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
 dependencies = [
- "addr2line 0.21.0",
- "cc",
+ "addr2line",
  "cfg-if",
  "libc",
- "miniz_oxide 0.7.4",
- "object 0.32.2",
+ "miniz_oxide",
+ "object",
  "rustc-demangle",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -1097,9 +1083,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "base64ct"
-version = "1.6.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba"
 
 [[package]]
 name = "bimap"
@@ -1122,7 +1108,7 @@ version = "0.69.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "cexpr",
  "clang-sys",
  "itertools 0.12.1",
@@ -1133,23 +1119,41 @@ dependencies = [
  "regex",
  "rustc-hash 1.1.0",
  "shlex",
- "syn 2.0.96",
+ "syn 2.0.104",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.71.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3"
+dependencies = [
+ "bitflags 2.9.1",
+ "cexpr",
+ "clang-sys",
+ "itertools 0.13.0",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash 2.1.1",
+ "shlex",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "bit-set"
-version = "0.5.3"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
 dependencies = [
  "bit-vec",
 ]
 
 [[package]]
 name = "bit-vec"
-version = "0.6.3"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
 
 [[package]]
 name = "bitflags"
@@ -1159,9 +1163,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.8.0"
+version = "2.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
+checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
 
 [[package]]
 name = "bitvec"
@@ -1195,9 +1199,9 @@ dependencies = [
 
 [[package]]
 name = "blst"
-version = "0.3.13"
+version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874"
+checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080"
 dependencies = [
  "cc",
  "glob",
@@ -1221,15 +1225,18 @@ dependencies = [
 
 [[package]]
 name = "bumpalo"
-version = "3.16.0"
+version = "3.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
+dependencies = [
+ "allocator-api2",
+]
 
 [[package]]
 name = "byte-slice-cast"
-version = "1.2.2"
+version = "1.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c"
+checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d"
 
 [[package]]
 name = "byteorder"
@@ -1239,9 +1246,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.9.0"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
+checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
 dependencies = [
  "serde",
 ]
@@ -1258,12 +1265,11 @@ dependencies = [
 
 [[package]]
 name = "bzip2-sys"
-version = "0.1.11+1.0.8"
+version = "0.1.13+1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14"
 dependencies = [
  "cc",
- "libc",
  "pkg-config",
 ]
 
@@ -1284,18 +1290,18 @@ dependencies = [
 
 [[package]]
 name = "camino"
-version = "1.1.9"
+version = "1.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3"
+checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "cap-fs-ext"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f78efdd7378980d79c0f36b519e51191742d2c9f91ffa5e228fba9f3806d2e1"
+checksum = "e41cc18551193fe8fa6f15c1e3c799bc5ec9e2cfbfaa8ed46f37013e3e6c173c"
 dependencies = [
  "cap-primitives",
  "cap-std",
@@ -1305,21 +1311,21 @@ dependencies = [
 
 [[package]]
 name = "cap-net-ext"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ac68674a6042af2bcee1adad9f6abd432642cf03444ce3a5b36c3f39f23baf8"
+checksum = "9f83833816c66c986e913b22ac887cec216ea09301802054316fc5301809702c"
 dependencies = [
  "cap-primitives",
  "cap-std",
- "rustix",
+ "rustix 1.0.7",
  "smallvec",
 ]
 
 [[package]]
 name = "cap-primitives"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc15faeed2223d8b8e8cc1857f5861935a06d06713c4ac106b722ae9ce3c369"
+checksum = "0a1e394ed14f39f8bc26f59d4c0c010dbe7f0a1b9bafff451b1f98b67c8af62a"
 dependencies = [
  "ambient-authority",
  "fs-set-times",
@@ -1327,44 +1333,45 @@ dependencies = [
  "io-lifetimes",
  "ipnet",
  "maybe-owned",
- "rustix",
+ "rustix 1.0.7",
+ "rustix-linux-procfs",
  "windows-sys 0.59.0",
  "winx",
 ]
 
 [[package]]
 name = "cap-rand"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dea13372b49df066d1ae654e5c6e41799c1efd9f6b36794b921e877ea4037977"
+checksum = "0acb89ccf798a28683f00089d0630dfaceec087234eae0d308c05ddeaa941b40"
 dependencies = [
  "ambient-authority",
- "rand",
+ "rand 0.8.5",
 ]
 
 [[package]]
 name = "cap-std"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3dbd3e8e8d093d6ccb4b512264869e1281cdb032f7940bd50b2894f96f25609"
+checksum = "07c0355ca583dd58f176c3c12489d684163861ede3c9efa6fd8bba314c984189"
 dependencies = [
  "cap-primitives",
  "io-extras",
  "io-lifetimes",
- "rustix",
+ "rustix 1.0.7",
 ]
 
 [[package]]
 name = "cap-time-ext"
-version = "3.4.2"
+version = "3.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd736b20fc033f564a1995fb82fc349146de43aabba19c7368b4cb17d8f9ea53"
+checksum = "491af520b8770085daa0466978c75db90368c71896523f2464214e38359b1a5b"
 dependencies = [
  "ambient-authority",
  "cap-primitives",
  "iana-time-zone",
  "once_cell",
- "rustix",
+ "rustix 1.0.7",
  "winx",
 ]
 
@@ -1385,7 +1392,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
 dependencies = [
  "camino",
  "cargo-platform",
- "semver 1.0.25",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "thiserror 1.0.69",
@@ -1396,17 +1403,17 @@ name = "cat"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "cc"
-version = "1.2.10"
+version = "1.2.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229"
+checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
 dependencies = [
  "jobserver",
  "libc",
@@ -1424,9 +1431,9 @@ dependencies = [
 
 [[package]]
 name = "cfg-if"
-version = "1.0.0"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
 
 [[package]]
 name = "chacha20"
@@ -1460,16 +1467,16 @@ dependencies = [
  "alloy-sol-types",
  "anyhow",
  "bincode",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
- "rand",
+ "rand 0.8.5",
  "serde",
  "serde_json",
  "sha2",
  "sha3",
  "url",
  "urlencoding 2.1.3",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
  "zip 1.1.4",
 ]
 
@@ -1511,9 +1518,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.5.27"
+version = "4.5.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796"
+checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -1521,9 +1528,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.5.27"
+version = "4.5.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7"
+checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1533,27 +1540,27 @@ dependencies = [
 
 [[package]]
 name = "clap_derive"
-version = "4.5.24"
+version = "4.5.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
+checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.7.4"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
 
 [[package]]
 name = "cmake"
-version = "0.1.52"
+version = "0.1.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e"
+checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
 dependencies = [
  "cc",
 ]
@@ -1574,7 +1581,7 @@ dependencies = [
  "byteorder",
  "cfg-if",
  "const-hex",
- "getrandom",
+ "getrandom 0.2.16",
  "hidapi-rusb",
  "js-sys",
  "log",
@@ -1589,9 +1596,9 @@ dependencies = [
 
 [[package]]
 name = "color-eyre"
-version = "0.6.3"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5"
+checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d"
 dependencies = [
  "backtrace",
  "color-spantrace",
@@ -1604,9 +1611,9 @@ dependencies = [
 
 [[package]]
 name = "color-spantrace"
-version = "0.2.1"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2"
+checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427"
 dependencies = [
  "once_cell",
  "owo-colors",
@@ -1616,15 +1623,15 @@ dependencies = [
 
 [[package]]
 name = "colorchoice"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
 
 [[package]]
 name = "const-hex"
-version = "1.14.0"
+version = "1.14.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c"
+checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff"
 dependencies = [
  "cfg-if",
  "cpufeatures",
@@ -1639,6 +1646,26 @@ version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
 
+[[package]]
+name = "const_format"
+version = "0.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd"
+dependencies = [
+ "const_format_proc_macros",
+]
+
+[[package]]
+name = "const_format_proc_macros"
+version = "0.2.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
 [[package]]
 name = "constant_time_eq"
 version = "0.1.5"
@@ -1655,11 +1682,11 @@ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
 name = "contacts"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -1689,27 +1716,45 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
 dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "cranelift-assembler-x64"
+version = "0.120.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ff8e35182c7372df00447cb90a04e584e032c42b9b9b6e8c50ddaaf0d7900d5"
+dependencies = [
+ "cranelift-assembler-x64-meta",
+]
+
+[[package]]
+name = "cranelift-assembler-x64-meta"
+version = "0.120.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14220f9c2698015c3b94dc6b84ae045c1c45509ddc406e43c6139252757fdb7a"
+dependencies = [
+ "cranelift-srcgen",
+]
+
 [[package]]
 name = "cranelift-bforest"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ba4f80548f22dc9c43911907b5e322c5555544ee85f785115701e6a28c9abe1"
+checksum = "d372ef2777ceefd75829e1390211ac240e9196bc60699218f7ea2419038288ee"
 dependencies = [
  "cranelift-entity",
 ]
 
 [[package]]
 name = "cranelift-bitset"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "005884e3649c3e5ff2dc79e8a94b138f11569cc08a91244a292714d2a86e9156"
+checksum = "56323783e423818fa89ce8078e90a3913d2a6e0810399bfce8ebd7ee87baa81f"
 dependencies = [
  "serde",
  "serde_derive",
@@ -1717,11 +1762,12 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe4036255ec33ce9a37495dfbcfc4e1118fd34e693eff9a1e106336b7cd16a9b"
+checksum = "74ffb780aab6186c6e9ba26519654b1ac55a09c0a866f6088a4efbbd84da68ed"
 dependencies = [
  "bumpalo",
+ "cranelift-assembler-x64",
  "cranelift-bforest",
  "cranelift-bitset",
  "cranelift-codegen-meta",
@@ -1729,11 +1775,12 @@ dependencies = [
  "cranelift-control",
  "cranelift-entity",
  "cranelift-isle",
- "gimli 0.31.1",
- "hashbrown 0.14.5",
+ "gimli",
+ "hashbrown 0.15.4",
  "log",
+ "pulley-interpreter",
  "regalloc2",
- "rustc-hash 2.1.0",
+ "rustc-hash 2.1.1",
  "serde",
  "smallvec",
  "target-lexicon",
@@ -1741,33 +1788,36 @@ dependencies = [
 
 [[package]]
 name = "cranelift-codegen-meta"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7ca74f4b68319da11d39e894437cb6e20ec7c2e11fbbda823c3bf207beedff7"
+checksum = "c23ef13814d3b39c869650d5961128cbbecad83fbdff4e6836a03ecf6862d7ed"
 dependencies = [
+ "cranelift-assembler-x64-meta",
  "cranelift-codegen-shared",
+ "cranelift-srcgen",
+ "pulley-interpreter",
 ]
 
 [[package]]
 name = "cranelift-codegen-shared"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "897e54f433a0269c4187871aa06d452214d5515d228d5bdc22219585e9eef895"
+checksum = "b9f623300657679f847803ce80811454bfff89cea4f6bf684be5c468d4a73631"
 
 [[package]]
 name = "cranelift-control"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29cb4018f5bf59fb53f515fa9d80e6f8c5ce19f198dc538984ebd23ecf8965ec"
+checksum = "31f4168af69989aa6b91fab46799ed4df6096f3209f4a6c8fb4358f49c60188f"
 dependencies = [
  "arbitrary",
 ]
 
 [[package]]
 name = "cranelift-entity"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "305399fd781a2953ac78c1396f02ff53144f39c33eb7fc7789cf4e8936d13a96"
+checksum = "ca6fa9bae1c8de26d71ac2162f069447610fd91e7780cb480ee0d76ac81eabb8"
 dependencies = [
  "cranelift-bitset",
  "serde",
@@ -1776,9 +1826,9 @@ dependencies = [
 
 [[package]]
 name = "cranelift-frontend"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9230b460a128d53653456137751d27baf567947a3ab8c0c4d6e31fd08036d81e"
+checksum = "b8219205608aa0b0e6769b580284a7e055c7e0c323c1041cde7ca078add3e412"
 dependencies = [
  "cranelift-codegen",
  "log",
@@ -1788,26 +1838,32 @@ dependencies = [
 
 [[package]]
 name = "cranelift-isle"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b961e24ae3ec9813a24a15ae64bbd2a42e4de4d79a7f3225a412e3b94e78d1c8"
+checksum = "588d0c5964f10860b04043e55aab26d7f7a206b0fd4f10c5260e8aa5773832bd"
 
 [[package]]
 name = "cranelift-native"
-version = "0.114.0"
+version = "0.120.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d5bd76df6c9151188dfa428c863b33da5b34561b67f43c0cf3f24a794f9fa1f"
+checksum = "19ed3c94cb97b14f92b6a94a1d45ef8c851f6a2ad9114e5d91d233f7da638fed"
 dependencies = [
  "cranelift-codegen",
  "libc",
  "target-lexicon",
 ]
 
+[[package]]
+name = "cranelift-srcgen"
+version = "0.120.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85256fac1519a7d25a040c1d850fba67478f3f021ad5fdf738ba4425ee862dbf"
+
 [[package]]
 name = "crc"
-version = "3.2.1"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
+checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675"
 dependencies = [
  "crc-catalog",
 ]
@@ -1829,9 +1885,9 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.14"
+version = "0.5.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
 dependencies = [
  "crossbeam-utils",
 ]
@@ -1867,7 +1923,7 @@ version = "0.27.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "crossterm_winapi",
  "futures-core",
  "libc",
@@ -1900,7 +1956,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
 dependencies = [
  "generic-array",
- "rand_core",
+ "rand_core 0.6.4",
  "subtle",
  "zeroize",
 ]
@@ -1912,7 +1968,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array",
- "rand_core",
+ "rand_core 0.6.4",
  "typenum",
 ]
 
@@ -1948,7 +2004,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -2015,9 +2071,9 @@ dependencies = [
 
 [[package]]
 name = "data-encoding"
-version = "2.7.0"
+version = "2.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f"
+checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
 
 [[package]]
 name = "debugid"
@@ -2025,7 +2081,7 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
 dependencies = [
- "uuid 1.12.1",
+ "uuid 1.17.0",
 ]
 
 [[package]]
@@ -2036,9 +2092,9 @@ checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b"
 
 [[package]]
 name = "der"
-version = "0.7.9"
+version = "0.7.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
+checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
 dependencies = [
  "const-oid",
  "zeroize",
@@ -2046,9 +2102,9 @@ dependencies = [
 
 [[package]]
 name = "deranged"
-version = "0.3.11"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
 dependencies = [
  "powerfmt",
 ]
@@ -2072,7 +2128,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -2106,7 +2162,16 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
 dependencies = [
- "derive_more-impl",
+ "derive_more-impl 1.0.0",
+]
+
+[[package]]
+name = "derive_more"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
+dependencies = [
+ "derive_more-impl 2.0.1",
 ]
 
 [[package]]
@@ -2117,7 +2182,19 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
+ "unicode-xid",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
  "unicode-xid",
 ]
 
@@ -2152,33 +2229,13 @@ dependencies = [
  "dirs-sys-next",
 ]
 
-[[package]]
-name = "dirs"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
-dependencies = [
- "dirs-sys 0.3.7",
-]
-
 [[package]]
 name = "dirs"
 version = "5.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
 dependencies = [
- "dirs-sys 0.4.1",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
-dependencies = [
- "libc",
- "redox_users",
- "winapi",
+ "dirs-sys",
 ]
 
 [[package]]
@@ -2212,7 +2269,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -2232,11 +2289,11 @@ name = "download"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -2244,16 +2301,16 @@ name = "downloads"
 version = "0.5.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
- "rand",
+ "rand 0.8.5",
  "serde",
  "serde_json",
  "sha2",
  "sha3",
  "url",
  "urlencoding 2.1.3",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
  "zip 1.1.4",
 ]
 
@@ -2281,15 +2338,15 @@ dependencies = [
 name = "echo"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
- "wit-bindgen",
+ "hyperware_process_lib 2.0.0",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "either"
-version = "1.13.0"
+version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
 
 [[package]]
 name = "elliptic-curve"
@@ -2304,7 +2361,7 @@ dependencies = [
  "generic-array",
  "group",
  "pkcs8",
- "rand_core",
+ "rand_core 0.6.4",
  "sec1",
  "subtle",
  "zeroize",
@@ -2351,18 +2408,18 @@ dependencies = [
 
 [[package]]
 name = "equivalent"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
 
 [[package]]
 name = "errno"
-version = "0.3.10"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
+checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
 dependencies = [
  "libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.60.2",
 ]
 
 [[package]]
@@ -2377,7 +2434,7 @@ dependencies = [
  "hex",
  "hmac",
  "pbkdf2 0.11.0",
- "rand",
+ "rand 0.8.5",
  "scrypt",
  "serde",
  "serde_json",
@@ -2439,22 +2496,22 @@ dependencies = [
 
 [[package]]
 name = "fd-lock"
-version = "4.0.2"
+version = "4.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947"
+checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78"
 dependencies = [
  "cfg-if",
- "rustix",
- "windows-sys 0.52.0",
+ "rustix 1.0.7",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "ff"
-version = "0.13.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
+checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393"
 dependencies = [
- "rand_core",
+ "rand_core 0.6.4",
  "subtle",
 ]
 
@@ -2471,20 +2528,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534"
 dependencies = [
  "byteorder",
- "rand",
+ "rand 0.8.5",
  "rustc-hex",
  "static_assertions",
 ]
 
 [[package]]
 name = "flate2"
-version = "1.0.35"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
+checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
 dependencies = [
  "crc32fast",
  "libz-ng-sys",
- "miniz_oxide 0.8.3",
+ "miniz_oxide",
 ]
 
 [[package]]
@@ -2495,9 +2552,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "foldhash"
-version = "0.1.4"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
 
 [[package]]
 name = "foreign-types"
@@ -2534,12 +2591,12 @@ dependencies = [
 
 [[package]]
 name = "fs-set-times"
-version = "0.20.2"
+version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e2e6123af26f0f2c51cc66869137080199406754903cc926a7690401ce09cb4"
+checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a"
 dependencies = [
  "io-lifetimes",
- "rustix",
+ "rustix 1.0.7",
  "windows-sys 0.59.0",
 ]
 
@@ -2549,13 +2606,13 @@ version = "0.2.0"
 dependencies = [
  "anyhow",
  "bincode",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
- "rand",
+ "rand 0.8.5",
  "serde",
  "serde_json",
  "sha2",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
  "zip 1.1.4",
 ]
 
@@ -2621,7 +2678,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -2675,7 +2732,7 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "debugid",
  "fxhash",
  "serde",
@@ -2697,25 +2754,37 @@ dependencies = [
 name = "get_block"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "getrandom"
-version = "0.2.15"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
 dependencies = [
  "cfg-if",
  "js-sys",
  "libc",
- "wasi",
+ "wasi 0.11.1+wasi-snapshot-preview1",
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "getrandom"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
+]
+
 [[package]]
 name = "ghash"
 version = "0.5.1"
@@ -2726,12 +2795,6 @@ dependencies = [
  "polyval",
 ]
 
-[[package]]
-name = "gimli"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
-
 [[package]]
 name = "gimli"
 version = "0.31.1"
@@ -2749,7 +2812,7 @@ version = "0.18.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "libc",
  "libgit2-sys",
  "log",
@@ -2771,7 +2834,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
 dependencies = [
  "ff",
- "rand_core",
+ "rand_core 0.6.4",
  "subtle",
 ]
 
@@ -2796,16 +2859,16 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.4.7"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
+checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5"
 dependencies = [
  "atomic-waker",
  "bytes",
  "fnv",
  "futures-core",
  "futures-sink",
- "http 1.2.0",
+ "http 1.3.1",
  "indexmap",
  "slab",
  "tokio",
@@ -2826,14 +2889,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
  "ahash",
- "serde",
 ]
 
 [[package]]
 name = "hashbrown"
-version = "0.15.2"
+version = "0.15.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
 dependencies = [
  "allocator-api2",
  "equivalent",
@@ -2890,15 +2952,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 name = "help"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
- "wit-bindgen",
+ "hyperware_process_lib 2.0.0",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.9"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
 
 [[package]]
 name = "hex"
@@ -2914,21 +2976,21 @@ name = "hfetch"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "rmp-serde",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "hi"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -2960,13 +3022,13 @@ dependencies = [
  "alloy-sol-types",
  "anyhow",
  "hex",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "rmp-serde",
  "serde",
  "serde_json",
  "thiserror 1.0.69",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -2975,10 +3037,10 @@ version = "0.1.2"
 dependencies = [
  "anyhow",
  "bincode",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -2994,9 +3056,9 @@ dependencies = [
 
 [[package]]
 name = "http"
-version = "1.2.0"
+version = "1.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
 dependencies = [
  "bytes",
  "fnv",
@@ -3021,27 +3083,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
 dependencies = [
  "bytes",
- "http 1.2.0",
+ "http 1.3.1",
 ]
 
 [[package]]
 name = "http-body-util"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
 dependencies = [
  "bytes",
- "futures-util",
- "http 1.2.0",
+ "futures-core",
+ "http 1.3.1",
  "http-body 1.0.1",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "httparse"
-version = "1.9.5"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
 
 [[package]]
 name = "httpdate"
@@ -3066,7 +3128,7 @@ dependencies = [
  "httpdate",
  "itoa",
  "pin-project-lite",
- "socket2 0.5.8",
+ "socket2 0.5.10",
  "tokio",
  "tower-service",
  "tracing",
@@ -3075,15 +3137,15 @@ dependencies = [
 
 [[package]]
 name = "hyper"
-version = "1.5.2"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0"
+checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
 dependencies = [
  "bytes",
  "futures-channel",
  "futures-util",
- "h2 0.4.7",
- "http 1.2.0",
+ "h2 0.4.10",
+ "http 1.3.1",
  "http-body 1.0.1",
  "httparse",
  "itoa",
@@ -3095,13 +3157,12 @@ dependencies = [
 
 [[package]]
 name = "hyper-rustls"
-version = "0.27.5"
+version = "0.27.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
+checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
 dependencies = [
- "futures-util",
- "http 1.2.0",
- "hyper 1.5.2",
+ "http 1.3.1",
+ "hyper 1.6.0",
  "hyper-util",
  "rustls",
  "rustls-pki-types",
@@ -3132,7 +3193,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
 dependencies = [
  "bytes",
  "http-body-util",
- "hyper 1.5.2",
+ "hyper 1.6.0",
  "hyper-util",
  "native-tls",
  "tokio",
@@ -3142,26 +3203,33 @@ dependencies = [
 
 [[package]]
 name = "hyper-util"
-version = "0.1.10"
+version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
+checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb"
 dependencies = [
+ "base64 0.22.1",
  "bytes",
  "futures-channel",
+ "futures-core",
  "futures-util",
- "http 1.2.0",
+ "http 1.3.1",
  "http-body 1.0.1",
- "hyper 1.5.2",
+ "hyper 1.6.0",
+ "ipnet",
+ "libc",
+ "percent-encoding",
  "pin-project-lite",
- "socket2 0.5.8",
+ "socket2 0.5.10",
+ "system-configuration",
  "tokio",
  "tower-service",
  "tracing",
+ "windows-registry",
 ]
 
 [[package]]
 name = "hyperdrive"
-version = "1.3.0"
+version = "1.3.1"
 dependencies = [
  "aes-gcm",
  "alloy",
@@ -3170,7 +3238,6 @@ dependencies = [
  "alloy-sol-types",
  "anyhow",
  "argon2",
- "async-trait",
  "base64 0.22.1",
  "bincode",
  "chrono",
@@ -3181,7 +3248,7 @@ dependencies = [
  "generic-array",
  "hex",
  "hmac",
- "http 1.2.0",
+ "http 1.3.1",
  "indexmap",
  "jwt",
  "lazy_static",
@@ -3190,7 +3257,7 @@ dependencies = [
  "nohash-hasher",
  "open",
  "public-ip",
- "rand",
+ "rand 0.8.5",
  "regex",
  "reqwest",
  "ring",
@@ -3202,7 +3269,7 @@ dependencies = [
  "serde_json",
  "sha2",
  "snow",
- "socket2 0.5.8",
+ "socket2 0.5.10",
  "static_dir",
  "tokio",
  "tokio-tungstenite 0.21.0",
@@ -3217,7 +3284,7 @@ dependencies = [
 
 [[package]]
 name = "hyperdrive_lib"
-version = "1.3.0"
+version = "1.3.1"
 dependencies = [
  "lib",
 ]
@@ -3232,20 +3299,44 @@ dependencies = [
  "anyhow",
  "chrono",
  "hex",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
- "rand",
+ "rand 0.8.5",
  "rmp-serde",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+checksum = "cf494b07a304db184b1de6500a27608e0110818acfdc3a357d4e4ad514a66afb"
+dependencies = [
+ "alloy",
+ "alloy-primitives",
+ "alloy-sol-macro",
+ "alloy-sol-types",
+ "anyhow",
+ "base64 0.22.1",
+ "bincode",
+ "http 1.3.1",
+ "mime_guess",
+ "rand 0.8.5",
+ "regex",
+ "rmp-serde",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+ "url",
+ "wit-bindgen 0.36.0",
+]
+
+[[package]]
+name = "hyperware_process_lib"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -3255,9 +3346,9 @@ dependencies = [
  "base64 0.22.1",
  "bincode",
  "color-eyre",
- "http 1.2.0",
+ "http 1.3.1",
  "mime_guess",
- "rand",
+ "rand 0.8.5",
  "regex",
  "rmp-serde",
  "serde",
@@ -3267,19 +3358,20 @@ dependencies = [
  "tracing-error",
  "tracing-subscriber",
  "url",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.61"
+version = "0.1.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
+ "log",
  "wasm-bindgen",
  "windows-core",
 ]
@@ -3295,21 +3387,22 @@ dependencies = [
 
 [[package]]
 name = "icu_collections"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
 dependencies = [
  "displaydoc",
+ "potential_utf",
  "yoke",
  "zerofrom",
  "zerovec",
 ]
 
 [[package]]
-name = "icu_locid"
-version = "1.5.0"
+name = "icu_locale_core"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
 dependencies = [
  "displaydoc",
  "litemap",
@@ -3318,31 +3411,11 @@ dependencies = [
  "zerovec",
 ]
 
-[[package]]
-name = "icu_locid_transform"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
-dependencies = [
- "displaydoc",
- "icu_locid",
- "icu_locid_transform_data",
- "icu_provider",
- "tinystr",
- "zerovec",
-]
-
-[[package]]
-name = "icu_locid_transform_data"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
-
 [[package]]
 name = "icu_normalizer"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
 dependencies = [
  "displaydoc",
  "icu_collections",
@@ -3350,67 +3423,54 @@ dependencies = [
  "icu_properties",
  "icu_provider",
  "smallvec",
- "utf16_iter",
- "utf8_iter",
- "write16",
  "zerovec",
 ]
 
 [[package]]
 name = "icu_normalizer_data"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
 
 [[package]]
 name = "icu_properties"
-version = "1.5.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
 dependencies = [
  "displaydoc",
  "icu_collections",
- "icu_locid_transform",
+ "icu_locale_core",
  "icu_properties_data",
  "icu_provider",
- "tinystr",
+ "potential_utf",
+ "zerotrie",
  "zerovec",
 ]
 
 [[package]]
 name = "icu_properties_data"
-version = "1.5.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
 
 [[package]]
 name = "icu_provider"
-version = "1.5.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
 dependencies = [
  "displaydoc",
- "icu_locid",
- "icu_provider_macros",
+ "icu_locale_core",
  "stable_deref_trait",
  "tinystr",
  "writeable",
  "yoke",
  "zerofrom",
+ "zerotrie",
  "zerovec",
 ]
 
-[[package]]
-name = "icu_provider_macros"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.96",
-]
-
 [[package]]
 name = "id-arena"
 version = "2.2.1"
@@ -3447,9 +3507,9 @@ dependencies = [
 
 [[package]]
 name = "idna_adapter"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
 dependencies = [
  "icu_normalizer",
  "icu_properties",
@@ -3472,7 +3532,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -3506,20 +3566,20 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
 
 [[package]]
 name = "indexmap"
-version = "2.7.1"
+version = "2.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
+checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
 dependencies = [
  "equivalent",
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
  "serde",
 ]
 
 [[package]]
 name = "inout"
-version = "0.1.3"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
 dependencies = [
  "generic-array",
 ]
@@ -3529,11 +3589,11 @@ name = "install"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -3558,6 +3618,16 @@ version = "2.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
 
+[[package]]
+name = "iri-string"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
 [[package]]
 name = "is-docker"
 version = "0.2.0"
@@ -3611,14 +3681,23 @@ dependencies = [
 ]
 
 [[package]]
-name = "itoa"
-version = "1.0.14"
+name = "itertools"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+dependencies = [
+ "either",
+]
 
 [[package]]
-name = "ittapi"
-version = "0.4.0"
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "ittapi"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1"
 dependencies = [
@@ -3638,10 +3717,11 @@ dependencies = [
 
 [[package]]
 name = "jobserver"
-version = "0.1.32"
+version = "0.1.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
+checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
 dependencies = [
+ "getrandom 0.3.3",
  "libc",
 ]
 
@@ -3707,16 +3787,16 @@ name = "kill"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "kit"
-version = "1.0.0"
-source = "git+https://github.com/hyperware-ai/kit?rev=12a4fde#12a4fde16f0f81a271d82559061da277c30d757f"
+version = "1.0.2"
+source = "git+https://github.com/hyperware-ai/kit?rev=7ec84b7#7ec84b7f17ff636761dc9190dc003e274ced6990"
 dependencies = [
  "alloy",
  "alloy-sol-macro",
@@ -3727,21 +3807,21 @@ dependencies = [
  "chrono",
  "clap",
  "color-eyre",
- "dirs 5.0.1",
+ "dirs",
  "fs-err",
  "git2",
  "hex",
- "hyperware_process_lib",
+ "hyperware_process_lib 1.2.1",
  "nix 0.27.1",
  "proc-macro2",
  "regex",
  "reqwest",
  "rpassword",
- "semver 1.0.25",
+ "semver 1.0.26",
  "serde",
  "serde_json",
  "sha2",
- "syn 2.0.96",
+ "syn 2.0.104",
  "thiserror 1.0.69",
  "tokio",
  "toml",
@@ -3751,7 +3831,7 @@ dependencies = [
  "tracing-error",
  "tracing-subscriber",
  "walkdir",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
  "zip 0.6.6",
 ]
 
@@ -3773,14 +3853,20 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
 
+[[package]]
+name = "leb128fmt"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+
 [[package]]
 name = "lib"
-version = "1.3.0"
+version = "1.3.1"
 dependencies = [
  "alloy",
  "anyhow",
  "lazy_static",
- "rand",
+ "rand 0.8.5",
  "regex",
  "reqwest",
  "ring",
@@ -3795,9 +3881,9 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.169"
+version = "0.2.174"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
+checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
 
 [[package]]
 name = "libgit2-sys"
@@ -3815,19 +3901,19 @@ dependencies = [
 
 [[package]]
 name = "libloading"
-version = "0.8.6"
+version = "0.8.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
+checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
 dependencies = [
  "cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.53.2",
 ]
 
 [[package]]
 name = "libm"
-version = "0.2.11"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
+checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
 
 [[package]]
 name = "libredox"
@@ -3835,7 +3921,7 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "libc",
 ]
 
@@ -3845,7 +3931,7 @@ version = "0.16.0+8.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c"
 dependencies = [
- "bindgen",
+ "bindgen 0.69.5",
  "bzip2-sys",
  "cc",
  "glob",
@@ -3868,9 +3954,9 @@ dependencies = [
 
 [[package]]
 name = "libssh2-sys"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee"
+checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9"
 dependencies = [
  "cc",
  "libc",
@@ -3894,9 +3980,9 @@ dependencies = [
 
 [[package]]
 name = "libz-ng-sys"
-version = "1.1.21"
+version = "1.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cee1488e961a80d172564fd6fcda11d8a4ac6672c06fe008e9213fa60520c2b"
+checksum = "a7118c2c2a3c7b6edc279a8b19507672b9c4d716f95e671172dfa4e23f9fd824"
 dependencies = [
  "cmake",
  "libc",
@@ -3904,9 +3990,9 @@ dependencies = [
 
 [[package]]
 name = "libz-sys"
-version = "1.1.21"
+version = "1.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa"
+checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d"
 dependencies = [
  "cc",
  "libc",
@@ -3920,33 +4006,33 @@ version = "0.4.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
 
+[[package]]
+name = "linux-raw-sys"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
+
 [[package]]
 name = "litemap"
-version = "0.7.4"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
+checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
 
 [[package]]
 name = "lock_api"
-version = "0.4.12"
+version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
 dependencies = [
  "autocfg",
  "scopeguard",
 ]
 
-[[package]]
-name = "lockfree-object-pool"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
-
 [[package]]
 name = "log"
-version = "0.4.25"
+version = "0.4.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
 
 [[package]]
 name = "lru"
@@ -3954,7 +4040,7 @@ version = "0.12.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
 dependencies = [
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
 ]
 
 [[package]]
@@ -3983,22 +4069,33 @@ version = "0.1.0"
 dependencies = [
  "anyhow",
  "clap",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "regex",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "mach2"
-version = "0.4.2"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
+checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44"
 dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "macro-string"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
+]
+
 [[package]]
 name = "matchers"
 version = "0.1.0"
@@ -4022,9 +4119,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4"
 
 [[package]]
 name = "memchr"
-version = "2.7.4"
+version = "2.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
 
 [[package]]
 name = "memfd"
@@ -4032,7 +4129,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64"
 dependencies = [
- "rustix",
+ "rustix 0.38.44",
 ]
 
 [[package]]
@@ -4068,18 +4165,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.4"
+version = "0.8.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
 dependencies = [
  "adler2",
 ]
@@ -4092,19 +4180,19 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
 dependencies = [
  "libc",
  "log",
- "wasi",
+ "wasi 0.11.1+wasi-snapshot-preview1",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "mio"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
 dependencies = [
  "libc",
- "wasi",
- "windows-sys 0.52.0",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -4127,9 +4215,9 @@ dependencies = [
 
 [[package]]
 name = "native-tls"
-version = "0.2.12"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
+checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
 dependencies = [
  "libc",
  "log",
@@ -4146,10 +4234,10 @@ dependencies = [
 name = "net-diagnostics"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "rmp-serde",
  "serde",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -4180,7 +4268,7 @@ version = "0.27.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "cfg-if",
  "libc",
 ]
@@ -4189,11 +4277,11 @@ dependencies = [
 name = "node_info"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -4259,9 +4347,9 @@ dependencies = [
 
 [[package]]
 name = "num_cpus"
-version = "1.16.0"
+version = "1.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
 dependencies = [
  "hermit-abi",
  "libc",
@@ -4269,23 +4357,24 @@ dependencies = [
 
 [[package]]
 name = "num_enum"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
+checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a"
 dependencies = [
  "num_enum_derive",
+ "rustversion",
 ]
 
 [[package]]
 name = "num_enum_derive"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
+checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -4301,15 +4390,6 @@ dependencies = [
  "smallvec",
 ]
 
-[[package]]
-name = "object"
-version = "0.32.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
-dependencies = [
- "memchr",
-]
-
 [[package]]
 name = "object"
 version = "0.36.7"
@@ -4317,16 +4397,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
 dependencies = [
  "crc32fast",
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
  "indexmap",
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.20.2"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
+checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
 
 [[package]]
 name = "opaque-debug"
@@ -4347,11 +4433,11 @@ dependencies = [
 
 [[package]]
 name = "openssl"
-version = "0.10.68"
+version = "0.10.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
+checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "cfg-if",
  "foreign-types",
  "libc",
@@ -4368,7 +4454,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -4379,9 +4465,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.104"
+version = "0.9.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
+checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571"
 dependencies = [
  "cc",
  "libc",
@@ -4403,41 +4489,43 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
 [[package]]
 name = "owo-colors"
-version = "3.5.0"
+version = "4.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec"
 
 [[package]]
 name = "parity-scale-codec"
-version = "3.6.12"
+version = "3.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee"
+checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa"
 dependencies = [
  "arrayvec",
  "bitvec",
  "byte-slice-cast",
+ "const_format",
  "impl-trait-for-tuples",
  "parity-scale-codec-derive",
+ "rustversion",
  "serde",
 ]
 
 [[package]]
 name = "parity-scale-codec-derive"
-version = "3.6.12"
+version = "3.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c"
+checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "parking_lot"
-version = "0.12.3"
+version = "0.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
 dependencies = [
  "lock_api",
  "parking_lot_core",
@@ -4445,9 +4533,9 @@ dependencies = [
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.10"
+version = "0.9.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
 dependencies = [
  "cfg-if",
  "libc",
@@ -4463,7 +4551,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
 dependencies = [
  "base64ct",
- "rand_core",
+ "rand_core 0.6.4",
  "subtle",
 ]
 
@@ -4474,7 +4562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166"
 dependencies = [
  "base64ct",
- "rand_core",
+ "rand_core 0.6.4",
  "subtle",
 ]
 
@@ -4516,20 +4604,20 @@ dependencies = [
 name = "peer"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "rmp-serde",
  "serde",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "peers"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "rmp-serde",
  "serde",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -4540,12 +4628,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "pest"
-version = "2.7.15"
+version = "2.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
+checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
 dependencies = [
  "memchr",
- "thiserror 2.0.11",
+ "thiserror 2.0.12",
  "ucd-trie",
 ]
 
@@ -4561,22 +4649,22 @@ dependencies = [
 
 [[package]]
 name = "pin-project"
-version = "1.1.8"
+version = "1.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916"
+checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"
 dependencies = [
  "pin-project-internal",
 ]
 
 [[package]]
 name = "pin-project-internal"
-version = "1.1.8"
+version = "1.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
+checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -4603,9 +4691,9 @@ dependencies = [
 
 [[package]]
 name = "pkg-config"
-version = "0.3.31"
+version = "0.3.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
 
 [[package]]
 name = "poly1305"
@@ -4642,6 +4730,15 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "potential_utf"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
+dependencies = [
+ "zerovec",
+]
+
 [[package]]
 name = "powerfmt"
 version = "0.2.0"
@@ -4650,21 +4747,21 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.20"
+version = "0.2.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
 dependencies = [
  "zerocopy",
 ]
 
 [[package]]
 name = "prettyplease"
-version = "0.2.29"
+version = "0.2.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac"
+checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a"
 dependencies = [
  "proc-macro2",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -4680,9 +4777,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro-crate"
-version = "3.2.0"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
+checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
 dependencies = [
  "toml_edit",
 ]
@@ -4706,7 +4803,7 @@ dependencies = [
  "proc-macro-error-attr2",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -4717,9 +4814,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.93"
+version = "1.0.95"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
 dependencies = [
  "unicode-ident",
 ]
@@ -4731,22 +4828,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9ecfcd7b51a1b9249fb47359a9f8d57a9e9dbc71857c5cfd08f98764f7106a3d"
 dependencies = [
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "proptest"
-version = "1.5.0"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d"
+checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f"
 dependencies = [
  "bit-set",
  "bit-vec",
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "lazy_static",
  "num-traits",
- "rand",
- "rand_chacha",
+ "rand 0.9.1",
+ "rand_chacha 0.9.0",
  "rand_xorshift",
  "regex-syntax 0.8.5",
  "rusty-fork",
@@ -4776,9 +4873,9 @@ dependencies = [
 
 [[package]]
 name = "psm"
-version = "0.1.24"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
+checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f"
 dependencies = [
  "cc",
 ]
@@ -4806,13 +4903,13 @@ dependencies = [
 
 [[package]]
 name = "pulley-interpreter"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3b8d81cf799e20564931e9867ca32de545188c6ee4c2e0f6e41d32f0c7dc6fb"
+checksum = "aeb99cb5a3ada8e95a246d09f5fdb609f021bf740efd3ca9bddf458e3293a6a0"
 dependencies = [
  "cranelift-bitset",
  "log",
- "sptr",
+ "wasmtime-math",
 ]
 
 [[package]]
@@ -4823,13 +4920,19 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
 
 [[package]]
 name = "quote"
-version = "1.0.38"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
 dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
 [[package]]
 name = "radium"
 version = "0.7.0"
@@ -4853,11 +4956,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
 dependencies = [
  "libc",
- "rand_chacha",
- "rand_core",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
  "serde",
 ]
 
+[[package]]
+name = "rand"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
+dependencies = [
+ "rand_chacha 0.9.0",
+ "rand_core 0.9.3",
+]
+
 [[package]]
 name = "rand_chacha"
 version = "0.3.1"
@@ -4865,7 +4978,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
 dependencies = [
  "ppv-lite86",
- "rand_core",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.9.3",
 ]
 
 [[package]]
@@ -4874,16 +4997,25 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
+dependencies = [
+ "getrandom 0.3.3",
 ]
 
 [[package]]
 name = "rand_xorshift"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f"
+checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a"
 dependencies = [
- "rand_core",
+ "rand_core 0.9.3",
 ]
 
 [[package]]
@@ -4908,11 +5040,11 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.8"
+version = "0.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
+checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
 ]
 
 [[package]]
@@ -4921,21 +5053,22 @@ version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.16",
  "libredox",
  "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "regalloc2"
-version = "0.10.2"
+version = "0.12.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12908dbeb234370af84d0579b9f68258a0f67e201412dd9a2814e6f45b2fc0f0"
+checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734"
 dependencies = [
- "hashbrown 0.14.5",
+ "allocator-api2",
+ "bumpalo",
+ "hashbrown 0.15.4",
  "log",
- "rustc-hash 2.1.0",
- "slice-group-by",
+ "rustc-hash 2.1.1",
  "smallvec",
 ]
 
@@ -4985,68 +5118,64 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
 
 [[package]]
 name = "reqwest"
-version = "0.12.12"
+version = "0.12.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
+checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813"
 dependencies = [
  "base64 0.22.1",
  "bytes",
  "encoding_rs",
  "futures-core",
- "futures-util",
- "h2 0.4.7",
- "http 1.2.0",
+ "h2 0.4.10",
+ "http 1.3.1",
  "http-body 1.0.1",
  "http-body-util",
- "hyper 1.5.2",
+ "hyper 1.6.0",
  "hyper-rustls",
  "hyper-tls",
  "hyper-util",
- "ipnet",
  "js-sys",
  "log",
  "mime",
  "native-tls",
- "once_cell",
  "percent-encoding",
  "pin-project-lite",
- "rustls-pemfile",
+ "rustls-pki-types",
  "serde",
  "serde_json",
  "serde_urlencoded",
  "sync_wrapper",
- "system-configuration",
  "tokio",
  "tokio-native-tls",
  "tower",
+ "tower-http",
  "tower-service",
  "url",
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
- "windows-registry",
 ]
 
 [[package]]
 name = "reset"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "reset-cache"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5054,11 +5183,11 @@ name = "reset-store"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5073,15 +5202,14 @@ dependencies = [
 
 [[package]]
 name = "ring"
-version = "0.17.8"
+version = "0.17.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
 dependencies = [
  "cc",
  "cfg-if",
- "getrandom",
+ "getrandom 0.2.16",
  "libc",
- "spin",
  "untrusted",
  "windows-sys 0.52.0",
 ]
@@ -5136,30 +5264,30 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746"
 
 [[package]]
 name = "rpassword"
-version = "7.3.1"
+version = "7.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f"
+checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39"
 dependencies = [
  "libc",
  "rtoolbox",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "rtoolbox"
-version = "0.0.2"
+version = "0.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e"
+checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f"
 dependencies = [
  "libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "ruint"
-version = "1.12.4"
+version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f"
+checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4"
 dependencies = [
  "alloy-rlp",
  "ark-ff 0.3.0",
@@ -5173,7 +5301,8 @@ dependencies = [
  "parity-scale-codec",
  "primitive-types",
  "proptest",
- "rand",
+ "rand 0.8.5",
+ "rand 0.9.1",
  "rlp",
  "ruint-macro",
  "serde",
@@ -5203,7 +5332,7 @@ version = "0.31.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "fallible-iterator",
  "fallible-streaming-iterator",
  "hashlink",
@@ -5213,9 +5342,9 @@ dependencies = [
 
 [[package]]
 name = "rustc-demangle"
-version = "0.1.24"
+version = "0.1.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
 
 [[package]]
 name = "rustc-hash"
@@ -5225,9 +5354,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
 [[package]]
 name = "rustc-hash"
-version = "2.1.0"
+version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497"
+checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
 
 [[package]]
 name = "rustc-hex"
@@ -5250,7 +5379,7 @@ version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
 dependencies = [
- "semver 1.0.25",
+ "semver 1.0.26",
 ]
 
 [[package]]
@@ -5259,20 +5388,41 @@ version = "0.38.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "errno",
- "itoa",
  "libc",
- "linux-raw-sys",
- "once_cell",
+ "linux-raw-sys 0.4.15",
  "windows-sys 0.59.0",
 ]
 
+[[package]]
+name = "rustix"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
+dependencies = [
+ "bitflags 2.9.1",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.9.4",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "rustix-linux-procfs"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056"
+dependencies = [
+ "once_cell",
+ "rustix 1.0.7",
+]
+
 [[package]]
 name = "rustls"
-version = "0.23.21"
+version = "0.23.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8"
+checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643"
 dependencies = [
  "once_cell",
  "ring",
@@ -5283,25 +5433,19 @@ dependencies = [
 ]
 
 [[package]]
-name = "rustls-pemfile"
-version = "2.2.0"
+name = "rustls-pki-types"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
+checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
 dependencies = [
- "rustls-pki-types",
+ "zeroize",
 ]
 
-[[package]]
-name = "rustls-pki-types"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37"
-
 [[package]]
 name = "rustls-webpki"
-version = "0.102.8"
+version = "0.103.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
+checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435"
 dependencies = [
  "ring",
  "rustls-pki-types",
@@ -5310,9 +5454,9 @@ dependencies = [
 
 [[package]]
 name = "rustversion"
-version = "1.0.19"
+version = "1.0.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
 
 [[package]]
 name = "rusty-fork"
@@ -5328,9 +5472,9 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.18"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
 
 [[package]]
 name = "salsa20"
@@ -5414,7 +5558,7 @@ version = "2.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "core-foundation",
  "core-foundation-sys",
  "libc",
@@ -5442,9 +5586,9 @@ dependencies = [
 
 [[package]]
 name = "semver"
-version = "1.0.25"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03"
+checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
 dependencies = [
  "serde",
 ]
@@ -5466,29 +5610,29 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73"
 
 [[package]]
 name = "serde"
-version = "1.0.217"
+version = "1.0.219"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
+checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.217"
+version = "1.0.219"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
+checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.137"
+version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b"
+checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
 dependencies = [
  "itoa",
  "memchr",
@@ -5498,9 +5642,9 @@ dependencies = [
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.8"
+version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
 dependencies = [
  "serde",
 ]
@@ -5521,11 +5665,11 @@ dependencies = [
 name = "set-nodes"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5534,12 +5678,12 @@ version = "0.1.0"
 dependencies = [
  "anyhow",
  "base64 0.22.1",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "rmp-serde",
  "serde",
  "serde_json",
  "url",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5555,9 +5699,9 @@ dependencies = [
 
 [[package]]
 name = "sha2"
-version = "0.10.8"
+version = "0.10.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
 dependencies = [
  "cfg-if",
  "cpufeatures",
@@ -5593,15 +5737,6 @@ dependencies = [
  "lazy_static",
 ]
 
-[[package]]
-name = "shellexpand"
-version = "2.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4"
-dependencies = [
- "dirs 4.0.0",
-]
-
 [[package]]
 name = "shlex"
 version = "1.3.0"
@@ -5613,19 +5748,19 @@ name = "sign"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "rmp-serde",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "signal-hook"
-version = "0.3.17"
+version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
 dependencies = [
  "libc",
  "signal-hook-registry",
@@ -5644,9 +5779,9 @@ dependencies = [
 
 [[package]]
 name = "signal-hook-registry"
-version = "1.4.2"
+version = "1.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
 dependencies = [
  "libc",
 ]
@@ -5658,7 +5793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
 dependencies = [
  "digest 0.10.7",
- "rand_core",
+ "rand_core 0.6.4",
 ]
 
 [[package]]
@@ -5669,24 +5804,15 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
 
 [[package]]
 name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "slice-group-by"
-version = "0.3.1"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7"
+checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
 
 [[package]]
 name = "smallvec"
-version = "1.13.2"
+version = "1.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
 dependencies = [
  "serde",
 ]
@@ -5700,7 +5826,7 @@ dependencies = [
  "blake2",
  "chacha20poly1305",
  "curve25519-dalek",
- "rand_core",
+ "rand_core 0.6.4",
  "ring",
  "rustc_version 0.4.1",
  "sha2",
@@ -5719,9 +5845,9 @@ dependencies = [
 
 [[package]]
 name = "socket2"
-version = "0.5.8"
+version = "0.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
+checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
 dependencies = [
  "libc",
  "windows-sys 0.52.0",
@@ -5768,22 +5894,22 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
 name = "start-providing"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
 name = "state"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5813,11 +5939,11 @@ dependencies = [
 name = "stop-providing"
 version = "0.1.0"
 dependencies = [
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -5834,24 +5960,24 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
 [[package]]
 name = "strum"
-version = "0.26.3"
+version = "0.27.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32"
 dependencies = [
  "strum_macros",
 ]
 
 [[package]]
 name = "strum_macros"
-version = "0.26.4"
+version = "0.27.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
+checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8"
 dependencies = [
  "heck 0.5.0",
  "proc-macro2",
  "quote",
  "rustversion",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -5873,9 +5999,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.96"
+version = "2.0.104"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
+checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -5884,14 +6010,14 @@ dependencies = [
 
 [[package]]
 name = "syn-solidity"
-version = "0.8.19"
+version = "0.8.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b84e4d83a0a6704561302b917a932484e1cae2d8c6354c64be8b7bac1c1fe057"
+checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412"
 dependencies = [
  "paste",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -5905,13 +6031,13 @@ dependencies = [
 
 [[package]]
 name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -5920,7 +6046,7 @@ version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "core-foundation",
  "system-configuration-sys",
 ]
@@ -5941,12 +6067,12 @@ version = "0.27.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "cap-fs-ext",
  "cap-std",
  "fd-lock",
  "io-lifetimes",
- "rustix",
+ "rustix 0.38.44",
  "windows-sys 0.59.0",
  "winx",
 ]
@@ -5959,21 +6085,20 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.16"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "tempfile"
-version = "3.15.0"
+version = "3.20.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
+checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
 dependencies = [
- "cfg-if",
  "fastrand",
- "getrandom",
+ "getrandom 0.3.3",
  "once_cell",
- "rustix",
+ "rustix 1.0.7",
  "windows-sys 0.59.0",
 ]
 
@@ -5992,12 +6117,12 @@ version = "0.1.1"
 dependencies = [
  "anyhow",
  "bincode",
- "hyperware_process_lib",
- "rand",
+ "hyperware_process_lib 2.0.0",
+ "rand 0.8.5",
  "regex",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -6006,12 +6131,12 @@ version = "0.1.1"
 dependencies = [
  "anyhow",
  "bincode",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
  "thiserror 1.0.69",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -6025,11 +6150,11 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "2.0.11"
+version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
+checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
 dependencies = [
- "thiserror-impl 2.0.11",
+ "thiserror-impl 2.0.12",
 ]
 
 [[package]]
@@ -6040,28 +6165,27 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "2.0.11"
+version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
+checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "thread_local"
-version = "1.1.8"
+version = "1.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
 dependencies = [
  "cfg-if",
- "once_cell",
 ]
 
 [[package]]
@@ -6075,9 +6199,9 @@ dependencies = [
 
 [[package]]
 name = "time"
-version = "0.3.37"
+version = "0.3.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
+checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
 dependencies = [
  "deranged",
  "itoa",
@@ -6090,15 +6214,15 @@ dependencies = [
 
 [[package]]
 name = "time-core"
-version = "0.1.2"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
 
 [[package]]
 name = "time-macros"
-version = "0.2.19"
+version = "0.2.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
+checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
 dependencies = [
  "num-conv",
  "time-core",
@@ -6115,9 +6239,9 @@ dependencies = [
 
 [[package]]
 name = "tinystr"
-version = "0.7.6"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
 dependencies = [
  "displaydoc",
  "zerovec",
@@ -6125,9 +6249,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.8.1"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8"
+checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -6140,17 +6264,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.43.0"
+version = "1.45.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
+checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779"
 dependencies = [
  "backtrace",
  "bytes",
  "libc",
- "mio 1.0.3",
+ "mio 1.0.4",
  "pin-project-lite",
  "signal-hook-registry",
- "socket2 0.5.8",
+ "socket2 0.5.10",
  "tokio-macros",
  "windows-sys 0.52.0",
 ]
@@ -6163,7 +6287,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -6178,9 +6302,9 @@ dependencies = [
 
 [[package]]
 name = "tokio-rustls"
-version = "0.26.1"
+version = "0.26.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37"
+checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
 dependencies = [
  "rustls",
  "tokio",
@@ -6225,14 +6349,14 @@ dependencies = [
  "tokio",
  "tokio-rustls",
  "tungstenite 0.24.0",
- "webpki-roots",
+ "webpki-roots 0.26.11",
 ]
 
 [[package]]
 name = "tokio-util"
-version = "0.7.13"
+version = "0.7.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
+checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
 dependencies = [
  "bytes",
  "futures-core",
@@ -6243,9 +6367,9 @@ dependencies = [
 
 [[package]]
 name = "toml"
-version = "0.8.19"
+version = "0.8.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
+checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -6255,36 +6379,43 @@ dependencies = [
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.8"
+version = "0.6.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
+checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.22.22"
+version = "0.22.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
+checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
 dependencies = [
  "indexmap",
  "serde",
  "serde_spanned",
  "toml_datetime",
+ "toml_write",
  "winnow",
 ]
 
+[[package]]
+name = "toml_write"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
+
 [[package]]
 name = "top"
 version = "0.2.0"
 dependencies = [
  "anyhow",
  "clap",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -6302,6 +6433,24 @@ dependencies = [
  "tower-service",
 ]
 
+[[package]]
+name = "tower-http"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
+dependencies = [
+ "bitflags 2.9.1",
+ "bytes",
+ "futures-util",
+ "http 1.3.1",
+ "http-body 1.0.1",
+ "iri-string",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
 [[package]]
 name = "tower-layer"
 version = "0.3.3"
@@ -6340,20 +6489,20 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.28"
+version = "0.1.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
+checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.33"
+version = "0.1.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
 dependencies = [
  "once_cell",
  "valuable",
@@ -6423,6 +6572,17 @@ dependencies = [
  "tracing-serde",
 ]
 
+[[package]]
+name = "trait-variant"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
+]
+
 [[package]]
 name = "trezor-client"
 version = "0.1.4"
@@ -6450,7 +6610,7 @@ dependencies = [
  "lazy_static",
  "log",
  "radix_trie",
- "rand",
+ "rand 0.8.5",
  "thiserror 1.0.69",
  "time",
  "tokio",
@@ -6474,7 +6634,7 @@ dependencies = [
  "ipnet",
  "lazy_static",
  "log",
- "rand",
+ "rand 0.8.5",
  "smallvec",
  "thiserror 1.0.69",
  "tinyvec",
@@ -6497,11 +6657,11 @@ dependencies = [
  "byteorder",
  "bytes",
  "data-encoding",
- "http 1.2.0",
+ "http 1.3.1",
  "httparse",
  "log",
  "native-tls",
- "rand",
+ "rand 0.8.5",
  "sha1",
  "thiserror 1.0.69",
  "url",
@@ -6517,10 +6677,10 @@ dependencies = [
  "byteorder",
  "bytes",
  "data-encoding",
- "http 1.2.0",
+ "http 1.3.1",
  "httparse",
  "log",
- "rand",
+ "rand 0.8.5",
  "rustls",
  "rustls-pki-types",
  "sha1",
@@ -6530,9 +6690,9 @@ dependencies = [
 
 [[package]]
 name = "typenum"
-version = "1.17.0"
+version = "1.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
 
 [[package]]
 name = "ucd-trie"
@@ -6572,9 +6732,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.15"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
 
 [[package]]
 name = "unicode-normalization"
@@ -6599,9 +6759,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
 
 [[package]]
 name = "unicode-width"
-version = "0.2.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
 
 [[package]]
 name = "unicode-xid"
@@ -6614,11 +6774,11 @@ name = "uninstall"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "hyperware_process_lib",
+ "hyperware_process_lib 2.0.0",
  "process_macros",
  "serde",
  "serde_json",
- "wit-bindgen",
+ "wit-bindgen 0.42.1",
 ]
 
 [[package]]
@@ -6666,12 +6826,6 @@ version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
 
-[[package]]
-name = "utf16_iter"
-version = "1.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
-
 [[package]]
 name = "utf8_iter"
 version = "1.0.4"
@@ -6690,15 +6844,19 @@ version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
 dependencies = [
- "getrandom",
+ "getrandom 0.2.16",
  "serde",
 ]
 
 [[package]]
 name = "uuid"
-version = "1.12.1"
+version = "1.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b"
+checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
 
 [[package]]
 name = "valuable"
@@ -6720,9 +6878,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
 name = "wait-timeout"
-version = "0.2.0"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6"
+checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11"
 dependencies = [
  "libc",
 ]
@@ -6777,9 +6935,18 @@ dependencies = [
 
 [[package]]
 name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasi"
+version = "0.14.2+wasi-0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+dependencies = [
+ "wit-bindgen-rt 0.39.0",
+]
 
 [[package]]
 name = "wasm-bindgen"
@@ -6803,7 +6970,7 @@ dependencies = [
  "log",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "wasm-bindgen-shared",
 ]
 
@@ -6838,7 +7005,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -6854,39 +7021,49 @@ dependencies = [
 
 [[package]]
 name = "wasm-encoder"
-version = "0.219.1"
+version = "0.220.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29cbbd772edcb8e7d524a82ee8cef8dd046fc14033796a754c3ad246d019fa54"
+checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1"
 dependencies = [
  "leb128",
- "wasmparser 0.219.1",
+ "wasmparser 0.220.1",
 ]
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2"
 dependencies = [
- "leb128",
- "wasmparser 0.220.0",
+ "leb128fmt",
+ "wasmparser 0.229.0",
 ]
 
 [[package]]
 name = "wasm-encoder"
-version = "0.224.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7249cf8cb0c6b9cb42bce90c0a5feb276fbf963fa385ff3d818ab3d90818ed6"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
- "wasmparser 0.224.0",
+ "leb128fmt",
+ "wasmparser 0.230.0",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.235.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a"
+dependencies = [
+ "leb128fmt",
+ "wasmparser 0.235.0",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.220.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7"
 dependencies = [
  "anyhow",
  "indexmap",
@@ -6894,100 +7071,122 @@ dependencies = [
  "serde_derive",
  "serde_json",
  "spdx",
- "wasm-encoder 0.220.0",
- "wasmparser 0.220.0",
+ "wasm-encoder 0.220.1",
+ "wasmparser 0.220.1",
+]
+
+[[package]]
+name = "wasm-metadata"
+version = "0.230.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
+dependencies = [
+ "anyhow",
+ "indexmap",
+ "wasm-encoder 0.230.0",
+ "wasmparser 0.230.0",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.219.1"
+version = "0.220.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c771866898879073c53b565a6c7b49953795159836714ac56a5befb581227c5"
+checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25"
 dependencies = [
  "ahash",
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "hashbrown 0.14.5",
  "indexmap",
- "semver 1.0.25",
+ "semver 1.0.26",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.229.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c"
+dependencies = [
+ "bitflags 2.9.1",
+ "hashbrown 0.15.4",
+ "indexmap",
+ "semver 1.0.26",
  "serde",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
- "bitflags 2.8.0",
- "hashbrown 0.14.5",
+ "bitflags 2.9.1",
+ "hashbrown 0.15.4",
  "indexmap",
- "semver 1.0.25",
+ "semver 1.0.26",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.224.0"
+version = "0.235.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65881a664fdd43646b647bb27bf186ab09c05bf56779d40aed4c6dce47d423f5"
+checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "indexmap",
- "semver 1.0.25",
+ "semver 1.0.26",
 ]
 
 [[package]]
 name = "wasmprinter"
-version = "0.219.1"
+version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "228cdc1f30c27816da225d239ce4231f28941147d34713dee8f1fff7cb330e54"
+checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e"
 dependencies = [
  "anyhow",
  "termcolor",
- "wasmparser 0.219.1",
+ "wasmparser 0.229.0",
 ]
 
 [[package]]
 name = "wasmtime"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b79302e3e084713249cc5622e8608e7410afdeeea8c8026d04f491d1fab0b4b"
+checksum = "15396de4fce22e431aa913a9d17325665e72a39aaa7972c8aeae7507eff6144f"
 dependencies = [
- "addr2line 0.24.2",
+ "addr2line",
  "anyhow",
  "async-trait",
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "bumpalo",
  "cc",
  "cfg-if",
  "encoding_rs",
  "fxprof-processed-profile",
- "gimli 0.31.1",
- "hashbrown 0.14.5",
+ "gimli",
+ "hashbrown 0.15.4",
  "indexmap",
  "ittapi",
  "libc",
- "libm",
  "log",
  "mach2",
  "memfd",
- "object 0.36.7",
+ "object",
  "once_cell",
- "paste",
  "postcard",
  "psm",
  "pulley-interpreter",
  "rayon",
- "rustix",
- "semver 1.0.25",
+ "rustix 1.0.7",
+ "semver 1.0.26",
  "serde",
  "serde_derive",
  "serde_json",
  "smallvec",
  "sptr",
  "target-lexicon",
- "wasm-encoder 0.219.1",
- "wasmparser 0.219.1",
+ "trait-variant",
+ "wasm-encoder 0.229.0",
+ "wasmparser 0.229.0",
  "wasmtime-asm-macros",
  "wasmtime-cache",
  "wasmtime-component-macro",
@@ -6997,6 +7196,7 @@ dependencies = [
  "wasmtime-fiber",
  "wasmtime-jit-debug",
  "wasmtime-jit-icache-coherence",
+ "wasmtime-math",
  "wasmtime-slab",
  "wasmtime-versioned-export-macros",
  "wasmtime-winch",
@@ -7006,59 +7206,59 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-asm-macros"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe53a24e7016a5222875d8ca3ad6024b464465985693c42098cd0bb710002c28"
+checksum = "c8d13b1a25d9b77ce42b4641a797e8c0bde0643b9ad5aaa36ce7e00cf373ffab"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
 name = "wasmtime-cache"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0677a7e76c24746b68e3657f7cc50c0ff122ee7e97bbda6e710c1b790ebc93cb"
+checksum = "dfc77a5e7d358c0180745021735de789e0d8d64a9eb740d54cee525a164f0343"
 dependencies = [
  "anyhow",
- "base64 0.21.7",
+ "base64 0.22.1",
  "directories-next",
  "log",
  "postcard",
- "rustix",
+ "rustix 1.0.7",
  "serde",
  "serde_derive",
  "sha2",
  "toml",
  "windows-sys 0.59.0",
- "zstd 0.13.2",
+ "zstd 0.13.3",
 ]
 
 [[package]]
 name = "wasmtime-component-macro"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e118acbd2bc09b32ad8606bc7cef793bf5019c1b107772e64dc6c76b5055d40b"
+checksum = "be73f1c13b25cf7c062ea2f3aba8a92abe4284a14b49e866e4962824802da5cf"
 dependencies = [
  "anyhow",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "wasmtime-component-util",
  "wasmtime-wit-bindgen",
- "wit-parser 0.219.1",
+ "wit-parser 0.229.0",
 ]
 
 [[package]]
 name = "wasmtime-component-util"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a6db4f3ee18c699629eabb9c64e77efe5a93a5137f098db7cab295037ba41c2"
+checksum = "1cba282555a9f2443f4e40e415772ea98acabbc341e9b3b905f541ff304cbc5e"
 
 [[package]]
 name = "wasmtime-cranelift"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b87e6c78f562b50aff1afd87ff32a57e241424c846c1c8f3c5fd352d2d62906"
+checksum = "a0c2c2e083dc4c119cca61cc42ca6b3711b75ed9823f77b684ee009c74f939d8"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -7067,55 +7267,56 @@ dependencies = [
  "cranelift-entity",
  "cranelift-frontend",
  "cranelift-native",
- "gimli 0.31.1",
- "itertools 0.12.1",
+ "gimli",
+ "itertools 0.14.0",
  "log",
- "object 0.36.7",
+ "object",
+ "pulley-interpreter",
  "smallvec",
  "target-lexicon",
- "thiserror 1.0.69",
- "wasmparser 0.219.1",
+ "thiserror 2.0.12",
+ "wasmparser 0.229.0",
  "wasmtime-environ",
  "wasmtime-versioned-export-macros",
 ]
 
 [[package]]
 name = "wasmtime-environ"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c25bfeaa16432d59a0706e2463d315ef4c9ebcfaf5605670b99d46373bdf9f27"
+checksum = "357542664493b1359727f235b615ae74f63bd46aa4d0c587b09e3b060eb0b8ef"
 dependencies = [
  "anyhow",
  "cpp_demangle",
  "cranelift-bitset",
  "cranelift-entity",
- "gimli 0.31.1",
+ "gimli",
  "indexmap",
  "log",
- "object 0.36.7",
+ "object",
  "postcard",
  "rustc-demangle",
- "semver 1.0.25",
+ "semver 1.0.26",
  "serde",
  "serde_derive",
  "smallvec",
  "target-lexicon",
- "wasm-encoder 0.219.1",
- "wasmparser 0.219.1",
+ "wasm-encoder 0.229.0",
+ "wasmparser 0.229.0",
  "wasmprinter",
  "wasmtime-component-util",
 ]
 
 [[package]]
 name = "wasmtime-fiber"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759ab0caa3821a6211743fe1eed448ab9df439e3af6c60dea15486c055611806"
+checksum = "d83e697b13d6ae9eff31edac86673aabaf8dbf20267f2aa20e831dd01da480a3"
 dependencies = [
  "anyhow",
  "cc",
  "cfg-if",
- "rustix",
+ "rustix 1.0.7",
  "wasmtime-asm-macros",
  "wasmtime-versioned-export-macros",
  "windows-sys 0.59.0",
@@ -7123,20 +7324,21 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-jit-debug"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab2a056056e9ac6916c2b8e4743408560300c1355e078c344211f13210d449b3"
+checksum = "6748fe974240d45e6bb25ac8e9a600be36f77347253cbbb35bd2d72e01ff0ece"
 dependencies = [
- "object 0.36.7",
- "rustix",
+ "cc",
+ "object",
+ "rustix 1.0.7",
  "wasmtime-versioned-export-macros",
 ]
 
 [[package]]
 name = "wasmtime-jit-icache-coherence"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91b218a92866f74f35162f5d03a4e0f62cd0e1cc624285b1014275e5d4575fad"
+checksum = "175e924dbc944c185808466d1e90b5a7feb610f3b9abdfe26f8ee25fd1086d1c"
 dependencies = [
  "anyhow",
  "cfg-if",
@@ -7144,32 +7346,41 @@ dependencies = [
  "windows-sys 0.59.0",
 ]
 
+[[package]]
+name = "wasmtime-math"
+version = "33.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d9448adcd9c5980c0eac1630794bd1be3cf573c28d0630f7d3184405b36bcfe"
+dependencies = [
+ "libm",
+]
+
 [[package]]
 name = "wasmtime-slab"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d5f8acf677ee6b3b8ba400dd9753ea4769e56a95c4b30b045ac6d2d54b2f8ea"
+checksum = "b50f7c227d6a925d9dfd0fbfdbf06877cb2fe387bb3248049706b19b5f86e560"
 
 [[package]]
 name = "wasmtime-versioned-export-macros"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df09be00c38f49172ca9936998938476e3f2df782673a39ae2ef9fb0838341b6"
+checksum = "55b39ffeda28be925babb2d45067d8ba2c67d2227328c5364d23b4152eba9950"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "wasmtime-wasi"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad5cf227161565057fc994edf14180341817372a218f1597db48a43946e5f875"
+checksum = "1d357e5699ed32103d0dab897c3965fd66f1ba29a37072d441199e7febe6324e"
 dependencies = [
  "anyhow",
  "async-trait",
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "bytes",
  "cap-fs-ext",
  "cap-net-ext",
@@ -7180,29 +7391,43 @@ dependencies = [
  "futures",
  "io-extras",
  "io-lifetimes",
- "rustix",
+ "rustix 1.0.7",
  "system-interface",
- "thiserror 1.0.69",
+ "thiserror 2.0.12",
  "tokio",
  "tracing",
  "url",
  "wasmtime",
+ "wasmtime-wasi-io",
  "wiggle",
  "windows-sys 0.59.0",
 ]
 
+[[package]]
+name = "wasmtime-wasi-io"
+version = "33.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43418871afd46c188231e4d822d375c0660c7a1484db3f7f247e552186e971a2"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "bytes",
+ "futures",
+ "wasmtime",
+]
+
 [[package]]
 name = "wasmtime-winch"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d6b5297bea14d8387c3974b2b011de628cc9b188f135cec752b74fd368964b"
+checksum = "1f180e6a8c0724608cd2d55ceb7d03ed3a729ca78fcd34a6756f36cf9a5fd546"
 dependencies = [
  "anyhow",
  "cranelift-codegen",
- "gimli 0.31.1",
- "object 0.36.7",
+ "gimli",
+ "object",
  "target-lexicon",
- "wasmparser 0.219.1",
+ "wasmparser 0.229.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
  "winch-codegen",
@@ -7210,21 +7435,21 @@ dependencies = [
 
 [[package]]
 name = "wasmtime-wit-bindgen"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf3963c9c29df91564d8bd181eb00d0dbaeafa1b2a01e15952bb7391166b704e"
+checksum = "6f8d793a398e2974d562e65c8d366f39a942fe1ce7970244d9d6e5f96f29b534"
 dependencies = [
  "anyhow",
  "heck 0.5.0",
  "indexmap",
- "wit-parser 0.219.1",
+ "wit-parser 0.229.0",
 ]
 
 [[package]]
 name = "wasmtimer"
-version = "0.4.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23"
+checksum = "d8d49b5d6c64e8558d9b1b065014426f35c18de636895d24893dbbd329743446"
 dependencies = [
  "futures",
  "js-sys",
@@ -7245,24 +7470,24 @@ dependencies = [
 
 [[package]]
 name = "wast"
-version = "224.0.0"
+version = "235.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d722a51e62b669d17e5a9f6bc8ec210178b37d869114355aa46989686c5c6391"
+checksum = "1eda4293f626c99021bb3a6fbe4fbbe90c0e31a5ace89b5f620af8925de72e13"
 dependencies = [
  "bumpalo",
- "leb128",
+ "leb128fmt",
  "memchr",
- "unicode-width 0.2.0",
- "wasm-encoder 0.224.0",
+ "unicode-width 0.2.1",
+ "wasm-encoder 0.235.0",
 ]
 
 [[package]]
 name = "wat"
-version = "1.224.0"
+version = "1.235.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71dece6a7dd5bcbcf8d256606c7fb3faa36286d46bf3f98185407719a5ceede2"
+checksum = "e777e0327115793cb96ab220b98f85327ec3d11f34ec9e8d723264522ef206aa"
 dependencies = [
- "wast 224.0.0",
+ "wast 235.0.0",
 ]
 
 [[package]]
@@ -7277,23 +7502,32 @@ dependencies = [
 
 [[package]]
 name = "webpki-roots"
-version = "0.26.7"
+version = "0.26.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e"
+checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9"
+dependencies = [
+ "webpki-roots 1.0.1",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502"
 dependencies = [
  "rustls-pki-types",
 ]
 
 [[package]]
 name = "wiggle"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e0f6ef83a263c0fa11957c363aeaa76dc84832484d0e119f22810d4d0e09a7"
+checksum = "73aed697b5eb6a5726dca57f85199f73c61dee669e58faab71086eb7eda6b077"
 dependencies = [
  "anyhow",
  "async-trait",
- "bitflags 2.8.0",
- "thiserror 1.0.69",
+ "bitflags 2.9.1",
+ "thiserror 2.0.12",
  "tracing",
  "wasmtime",
  "wiggle-macro",
@@ -7301,28 +7535,27 @@ dependencies = [
 
 [[package]]
 name = "wiggle-generate"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd266b290a0fdace3af6a05c6ebbcc54de303a774448ecf5a98cd0bc12d89c52"
+checksum = "d477015cda1d476b7e45d50eeb93d9038df8f24827007669065292651b26d225"
 dependencies = [
  "anyhow",
  "heck 0.5.0",
  "proc-macro2",
  "quote",
- "shellexpand",
- "syn 2.0.96",
+ "syn 2.0.104",
  "witx",
 ]
 
 [[package]]
 name = "wiggle-macro"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b8eb1a5783540696c59cefbfc9e52570c2d5e62bd47bdf0bdcef29231879db2"
+checksum = "71ac603ee46847d2e3c142ba715d326f1045155c7758f4e8dd001d5f92810c12"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "wiggle-generate",
 ]
 
@@ -7359,64 +7592,91 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
 name = "winch-codegen"
-version = "27.0.0"
+version = "33.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b42b678c8651ec4900d7600037d235429fc985c31cbc33515885ec0d2a9e158"
+checksum = "ad3072bf7c270d5e29a3d69744c81665dd3adb6e60f123925393a1c150bf9ec4"
 dependencies = [
  "anyhow",
+ "cranelift-assembler-x64",
  "cranelift-codegen",
- "gimli 0.31.1",
+ "gimli",
  "regalloc2",
  "smallvec",
  "target-lexicon",
- "wasmparser 0.219.1",
+ "thiserror 2.0.12",
+ "wasmparser 0.229.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
 ]
 
 [[package]]
 name = "windows-core"
-version = "0.52.0"
+version = "0.61.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
 dependencies = [
- "windows-targets 0.52.6",
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "windows-link"
-version = "0.1.1"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
 
 [[package]]
 name = "windows-registry"
-version = "0.2.0"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
+checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820"
 dependencies = [
+ "windows-link",
  "windows-result",
  "windows-strings",
- "windows-targets 0.52.6",
 ]
 
 [[package]]
 name = "windows-result"
-version = "0.2.0"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
 dependencies = [
- "windows-targets 0.52.6",
+ "windows-link",
 ]
 
 [[package]]
 name = "windows-strings"
-version = "0.1.0"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
 dependencies = [
- "windows-result",
- "windows-targets 0.52.6",
+ "windows-link",
 ]
 
 [[package]]
@@ -7446,6 +7706,15 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.2",
+]
+
 [[package]]
 name = "windows-targets"
 version = "0.48.5"
@@ -7470,13 +7739,29 @@ dependencies = [
  "windows_aarch64_gnullvm 0.52.6",
  "windows_aarch64_msvc 0.52.6",
  "windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
+ "windows_i686_gnullvm 0.52.6",
  "windows_i686_msvc 0.52.6",
  "windows_x86_64_gnu 0.52.6",
  "windows_x86_64_gnullvm 0.52.6",
  "windows_x86_64_msvc 0.52.6",
 ]
 
+[[package]]
+name = "windows-targets"
+version = "0.53.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
+dependencies = [
+ "windows_aarch64_gnullvm 0.53.0",
+ "windows_aarch64_msvc 0.53.0",
+ "windows_i686_gnu 0.53.0",
+ "windows_i686_gnullvm 0.53.0",
+ "windows_i686_msvc 0.53.0",
+ "windows_x86_64_gnu 0.53.0",
+ "windows_x86_64_gnullvm 0.53.0",
+ "windows_x86_64_msvc 0.53.0",
+]
+
 [[package]]
 name = "windows_aarch64_gnullvm"
 version = "0.48.5"
@@ -7489,6 +7774,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.48.5"
@@ -7501,6 +7792,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.48.5"
@@ -7513,12 +7810,24 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
+
 [[package]]
 name = "windows_i686_gnullvm"
 version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.48.5"
@@ -7531,6 +7840,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.48.5"
@@ -7543,6 +7858,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.48.5"
@@ -7555,6 +7876,12 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.48.5"
@@ -7567,11 +7894,17 @@ version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+
 [[package]]
 name = "winnow"
-version = "0.6.24"
+version = "0.7.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a"
+checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
 dependencies = [
  "memchr",
 ]
@@ -7582,7 +7915,7 @@ version = "0.36.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "windows-sys 0.59.0",
 ]
 
@@ -7592,8 +7925,18 @@ version = "0.36.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
 dependencies = [
- "wit-bindgen-rt",
- "wit-bindgen-rust-macro",
+ "wit-bindgen-rt 0.36.0",
+ "wit-bindgen-rust-macro 0.36.0",
+]
+
+[[package]]
+name = "wit-bindgen"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
+dependencies = [
+ "wit-bindgen-rt 0.42.1",
+ "wit-bindgen-rust-macro 0.42.1",
 ]
 
 [[package]]
@@ -7604,7 +7947,18 @@ checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
 dependencies = [
  "anyhow",
  "heck 0.5.0",
- "wit-parser 0.220.0",
+ "wit-parser 0.220.1",
+]
+
+[[package]]
+name = "wit-bindgen-core"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
+dependencies = [
+ "anyhow",
+ "heck 0.5.0",
+ "wit-parser 0.230.0",
 ]
 
 [[package]]
@@ -7613,7 +7967,27 @@ version = "0.36.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
 dependencies = [
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
+]
+
+[[package]]
+name = "wit-bindgen-rt"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+dependencies = [
+ "bitflags 2.9.1",
+]
+
+[[package]]
+name = "wit-bindgen-rt"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
+dependencies = [
+ "bitflags 2.9.1",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
@@ -7626,10 +8000,26 @@ dependencies = [
  "heck 0.5.0",
  "indexmap",
  "prettyplease",
- "syn 2.0.96",
- "wasm-metadata",
- "wit-bindgen-core",
- "wit-component",
+ "syn 2.0.104",
+ "wasm-metadata 0.220.1",
+ "wit-bindgen-core 0.36.0",
+ "wit-component 0.220.1",
+]
+
+[[package]]
+name = "wit-bindgen-rust"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
+dependencies = [
+ "anyhow",
+ "heck 0.5.0",
+ "indexmap",
+ "prettyplease",
+ "syn 2.0.104",
+ "wasm-metadata 0.230.0",
+ "wit-bindgen-core 0.42.1",
+ "wit-component 0.230.0",
 ]
 
 [[package]]
@@ -7642,64 +8032,116 @@ dependencies = [
  "prettyplease",
  "proc-macro2",
  "quote",
- "syn 2.0.96",
- "wit-bindgen-core",
- "wit-bindgen-rust",
+ "syn 2.0.104",
+ "wit-bindgen-core 0.36.0",
+ "wit-bindgen-rust 0.36.0",
+]
+
+[[package]]
+name = "wit-bindgen-rust-macro"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
+dependencies = [
+ "anyhow",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.104",
+ "wit-bindgen-core 0.42.1",
+ "wit-bindgen-rust 0.42.1",
+]
+
+[[package]]
+name = "wit-component"
+version = "0.220.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627"
+dependencies = [
+ "anyhow",
+ "bitflags 2.9.1",
+ "indexmap",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "wasm-encoder 0.220.1",
+ "wasm-metadata 0.220.1",
+ "wasmparser 0.220.1",
+ "wit-parser 0.220.1",
 ]
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
- "bitflags 2.8.0",
+ "bitflags 2.9.1",
  "indexmap",
  "log",
  "serde",
  "serde_derive",
  "serde_json",
- "wasm-encoder 0.220.0",
- "wasm-metadata",
- "wasmparser 0.220.0",
- "wit-parser 0.220.0",
+ "wasm-encoder 0.230.0",
+ "wasm-metadata 0.230.0",
+ "wasmparser 0.230.0",
+ "wit-parser 0.230.0",
 ]
 
 [[package]]
 name = "wit-parser"
-version = "0.219.1"
+version = "0.220.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a86f669283257e8e424b9a4fc3518e3ade0b95deb9fbc0f93a1876be3eda598"
+checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a"
 dependencies = [
  "anyhow",
  "id-arena",
  "indexmap",
  "log",
- "semver 1.0.25",
+ "semver 1.0.26",
  "serde",
  "serde_derive",
  "serde_json",
  "unicode-xid",
- "wasmparser 0.219.1",
+ "wasmparser 0.220.1",
 ]
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.229.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "459c6ba62bf511d6b5f2a845a2a736822e38059c1cfa0b644b467bbbfae4efa6"
 dependencies = [
  "anyhow",
  "id-arena",
  "indexmap",
  "log",
- "semver 1.0.25",
+ "semver 1.0.26",
  "serde",
  "serde_derive",
  "serde_json",
  "unicode-xid",
- "wasmparser 0.220.0",
+ "wasmparser 0.229.0",
+]
+
+[[package]]
+name = "wit-parser"
+version = "0.230.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
+dependencies = [
+ "anyhow",
+ "id-arena",
+ "indexmap",
+ "log",
+ "semver 1.0.26",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "unicode-xid",
+ "wasmparser 0.230.0",
 ]
 
 [[package]]
@@ -7714,23 +8156,17 @@ dependencies = [
  "wast 35.0.2",
 ]
 
-[[package]]
-name = "write16"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
-
 [[package]]
 name = "writeable"
-version = "0.5.5"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
 
 [[package]]
 name = "ws_stream_wasm"
-version = "0.7.4"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5"
+checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc"
 dependencies = [
  "async_io_stream",
  "futures",
@@ -7739,7 +8175,7 @@ dependencies = [
  "pharos",
  "rustc_version 0.4.1",
  "send_wrapper",
- "thiserror 1.0.69",
+ "thiserror 2.0.12",
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
@@ -7756,9 +8192,9 @@ dependencies = [
 
 [[package]]
 name = "yoke"
-version = "0.7.5"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
 dependencies = [
  "serde",
  "stable_deref_trait",
@@ -7768,55 +8204,54 @@ dependencies = [
 
 [[package]]
 name = "yoke-derive"
-version = "0.7.5"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "synstructure",
 ]
 
 [[package]]
 name = "zerocopy"
-version = "0.7.35"
+version = "0.8.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
 dependencies = [
- "byteorder",
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.35"
+version = "0.8.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
 name = "zerofrom"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
 dependencies = [
  "zerofrom-derive",
 ]
 
 [[package]]
 name = "zerofrom-derive"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
  "synstructure",
 ]
 
@@ -7837,14 +8272,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
 ]
 
 [[package]]
 name = "zerovec"
-version = "0.10.4"
+version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
 dependencies = [
  "yoke",
  "zerofrom",
@@ -7853,13 +8299,13 @@ dependencies = [
 
 [[package]]
 name = "zerovec-derive"
-version = "0.10.3"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.96",
+ "syn 2.0.104",
 ]
 
 [[package]]
@@ -7906,20 +8352,18 @@ dependencies = [
  "thiserror 1.0.69",
  "time",
  "zopfli",
- "zstd 0.13.2",
+ "zstd 0.13.3",
 ]
 
 [[package]]
 name = "zopfli"
-version = "0.8.1"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946"
+checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7"
 dependencies = [
  "bumpalo",
  "crc32fast",
- "lockfree-object-pool",
  "log",
- "once_cell",
  "simd-adler32",
 ]
 
@@ -7934,11 +8378,11 @@ dependencies = [
 
 [[package]]
 name = "zstd"
-version = "0.13.2"
+version = "0.13.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
+checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
 dependencies = [
- "zstd-safe 7.2.1",
+ "zstd-safe 7.2.4",
 ]
 
 [[package]]
@@ -7953,19 +8397,20 @@ dependencies = [
 
 [[package]]
 name = "zstd-safe"
-version = "7.2.1"
+version = "7.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
+checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
 dependencies = [
  "zstd-sys",
 ]
 
 [[package]]
 name = "zstd-sys"
-version = "2.0.13+zstd.1.5.6"
+version = "2.0.15+zstd.1.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
+checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
 dependencies = [
+ "bindgen 0.71.1",
  "cc",
  "pkg-config",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index da3c9482b..271df2708 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "hyperdrive_lib"
 authors = ["Sybil Technologies AG"]
-version = "1.3.0"
+version = "1.3.1"
 edition = "2021"
 description = "A general-purpose sovereign cloud computing platform"
 homepage = "https://hyperware.ai"
diff --git a/README.md b/README.md
index f4c86c50f..a606e377c 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,7 @@ cargo install wasm-tools
 
 # Get Rust version 1.85.1
 rustup update 1.85.1
+rustup default 1.85.1
 
 rustup target add wasm32-wasip1
 
diff --git a/css/hyperware.css b/css/hyperware.css
index 8583cff4d..1d2fb9b66 100644
--- a/css/hyperware.css
+++ b/css/hyperware.css
@@ -1,4 +1,36 @@
-@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@700&display=swap');
+@font-face {
+    font-family: 'chaneyextended';
+    src: url('/chaneyextended.woff2') format('woff2');
+}
+
+@font-face {
+    font-family: 'Clash Display';
+    src: url('/ClashDisplay-Variable.woff2') format('woff2');
+}
+
+@font-face {
+    font-family: 'Neue Haas Grotesk';
+    src: url('/NHaasGroteskTXPro-55Rg.woff') format('woff');
+    font-weight: 500;
+}
+
+@font-face {
+    font-family: 'Neue Haas Grotesk';
+    src: url('/NHaasGroteskTXPro-75Bd.woff') format('woff');
+    font-weight: 700;
+}
+
+.display {
+    font-family: 'chaneyextended', sans-serif;
+}
+
+.prose {
+    font-family: 'Neue Haas Grotesk', sans-serif;
+}
+
+.clash {
+    font-family: 'Clash Display', sans-serif;
+}
 
 /* Variables */
 :root {
@@ -34,7 +66,7 @@
 
     --link-color: light-dark(var(--secondary-color), var(--primary-color));
 
-    --font-family-main: 'Space Grotesk', monospace;
+    --font-family-main: 'Neue Haas Grotesk', monospace;
 
     /* Add modern CSS variables */
     --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
@@ -89,7 +121,7 @@ html {
 }
 
 body {
-    font-family: 'Space Grotesk', sans-serif;
+    font-family: 'Neue Haas Grotesk', sans-serif;
     margin: 0;
     overflow-x: hidden;
     padding: 0;
diff --git a/css/uno.config.ts b/css/uno.config.ts
index d75576c95..69e87da9b 100644
--- a/css/uno.config.ts
+++ b/css/uno.config.ts
@@ -27,6 +27,7 @@ const config = {
             white: '#f6f6f6',
             neon: '#dcff71',
             blue: '#004fff',
+            iris: '#004fff',
             orange: '#dd6e42',
             magenta: '#bf1363',
             transparent: 'transparent',
diff --git a/hyperdrive/Cargo.toml b/hyperdrive/Cargo.toml
index 63fbd4b64..1c0607e83 100644
--- a/hyperdrive/Cargo.toml
+++ b/hyperdrive/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "hyperdrive"
 authors = ["Sybil Technologies AG"]
-version = "1.3.0"
+version = "1.3.1"
 edition = "2021"
 description = "A general-purpose sovereign cloud computing platform"
 homepage = "https://hyperware.ai"
@@ -42,7 +42,6 @@ alloy-sol-macro = "0.8.15"
 alloy-sol-types = "0.8.15"
 anyhow = "1.0.71"
 argon2 = "0.5.3"
-async-trait = "0.1.71"
 base64 = "0.22.0"
 bincode = "1.3.3"
 chrono = "0.4.31"
@@ -84,6 +83,6 @@ unicode-segmentation = "1.11"
 unicode-width = "0.1.13"
 url = "2.4.1"
 warp = "0.3.5"
-wasmtime = "27.0.0"
-wasmtime-wasi = "27.0.0"
+wasmtime = "33.0.0"
+wasmtime-wasi = "33.0.0"
 zip = "1.1.1"
diff --git a/hyperdrive/packages/app-store/Cargo.lock b/hyperdrive/packages/app-store/Cargo.lock
index 3e36b475e..5ad4fcd86 100644
--- a/hyperdrive/packages/app-store/Cargo.lock
+++ b/hyperdrive/packages/app-store/Cargo.lock
@@ -1491,9 +1491,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1639,9 +1636,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1929,10 +1925,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2912,15 +2908,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3454,39 +3441,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3638,9 +3620,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3648,9 +3630,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3659,18 +3641,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3684,9 +3668,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3699,9 +3683,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3718,9 +3702,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/app-store/app-store/Cargo.toml b/hyperdrive/packages/app-store/app-store/Cargo.toml
index 771d6a0f5..75fb510ad 100644
--- a/hyperdrive/packages/app-store/app-store/Cargo.toml
+++ b/hyperdrive/packages/app-store/app-store/Cargo.toml
@@ -11,7 +11,7 @@ alloy-primitives = "0.8.15"
 alloy-sol-types = "0.8.15"
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 rand = "0.8"
 serde = { version = "1.0", features = ["derive"] }
@@ -20,7 +20,7 @@ sha2 = "0.10.8"
 sha3 = "0.10.8"
 url = "2.4.1"
 urlencoding = "2.1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 zip = { version = "1.1.1", default-features = false }
 
 [lib]
diff --git a/hyperdrive/packages/app-store/app-store/src/http_api.rs b/hyperdrive/packages/app-store/app-store/src/http_api.rs
index 5e1f8bdda..7e7806953 100644
--- a/hyperdrive/packages/app-store/app-store/src/http_api.rs
+++ b/hyperdrive/packages/app-store/app-store/src/http_api.rs
@@ -84,7 +84,7 @@ fn make_widget() -> String {
             box-sizing: border-box;
             margin: 0;
             padding: 0;
-            font-family: 'Space Grotesk', monospace;
+            font-family: 'Neue Haas Grotesk', monospace;
         }
 
         body {
diff --git a/hyperdrive/packages/app-store/chain/Cargo.toml b/hyperdrive/packages/app-store/chain/Cargo.toml
index ba12ab3e5..c11d45b84 100644
--- a/hyperdrive/packages/app-store/chain/Cargo.toml
+++ b/hyperdrive/packages/app-store/chain/Cargo.toml
@@ -11,7 +11,7 @@ alloy-primitives = "0.8.15"
 alloy-sol-types = "0.8.15"
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 rand = "0.8"
 serde = { version = "1.0", features = ["derive"] }
@@ -20,7 +20,7 @@ sha2 = "0.10.8"
 sha3 = "0.10.8"
 url = "2.4.1"
 urlencoding = "2.1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 zip = { version = "1.1.1", default-features = false }
 
 [lib]
diff --git a/hyperdrive/packages/app-store/download/Cargo.toml b/hyperdrive/packages/app-store/download/Cargo.toml
index 54d2fcbc5..866052691 100644
--- a/hyperdrive/packages/app-store/download/Cargo.toml
+++ b/hyperdrive/packages/app-store/download/Cargo.toml
@@ -8,11 +8,11 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/app-store/downloads/Cargo.toml b/hyperdrive/packages/app-store/downloads/Cargo.toml
index e379426ec..84d7c7806 100644
--- a/hyperdrive/packages/app-store/downloads/Cargo.toml
+++ b/hyperdrive/packages/app-store/downloads/Cargo.toml
@@ -8,7 +8,7 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 rand = "0.8"
 serde = { version = "1.0", features = ["derive"] }
@@ -17,7 +17,7 @@ sha2 = "0.10.8"
 sha3 = "0.10.8"
 url = "2.4.1"
 urlencoding = "2.1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 zip = { version = "1.1.4", default-features = false, features = ["deflate"] }
 
 [lib]
diff --git a/hyperdrive/packages/app-store/ft-worker/Cargo.toml b/hyperdrive/packages/app-store/ft-worker/Cargo.toml
index 23244ecb5..a9928f379 100644
--- a/hyperdrive/packages/app-store/ft-worker/Cargo.toml
+++ b/hyperdrive/packages/app-store/ft-worker/Cargo.toml
@@ -9,13 +9,13 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 rand = "0.8"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 sha2 = "0.10.8"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 zip = { version = "1.1.4", default-features = false, features = ["deflate"] }
 
 [lib]
diff --git a/hyperdrive/packages/app-store/install/Cargo.toml b/hyperdrive/packages/app-store/install/Cargo.toml
index 2e3d699bc..043d46cf3 100644
--- a/hyperdrive/packages/app-store/install/Cargo.toml
+++ b/hyperdrive/packages/app-store/install/Cargo.toml
@@ -8,11 +8,11 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/app-store/reset-store/Cargo.toml b/hyperdrive/packages/app-store/reset-store/Cargo.toml
index a55129813..9d988d154 100644
--- a/hyperdrive/packages/app-store/reset-store/Cargo.toml
+++ b/hyperdrive/packages/app-store/reset-store/Cargo.toml
@@ -8,11 +8,11 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/app-store/uninstall/Cargo.toml b/hyperdrive/packages/app-store/uninstall/Cargo.toml
index 7b6cb9084..3dff56703 100644
--- a/hyperdrive/packages/app-store/uninstall/Cargo.toml
+++ b/hyperdrive/packages/app-store/uninstall/Cargo.toml
@@ -8,11 +8,11 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/contacts/Cargo.lock b/hyperdrive/packages/contacts/Cargo.lock
index 51003cc54..b10d17b48 100644
--- a/hyperdrive/packages/contacts/Cargo.lock
+++ b/hyperdrive/packages/contacts/Cargo.lock
@@ -1387,9 +1387,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1535,9 +1532,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1813,10 +1809,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2783,15 +2779,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3307,39 +3294,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3491,9 +3473,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3501,9 +3483,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3512,18 +3494,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3537,9 +3521,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3552,9 +3536,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3571,9 +3555,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/contacts/contacts/Cargo.toml b/hyperdrive/packages/contacts/contacts/Cargo.toml
index dc2ebafff..8252fee2a 100644
--- a/hyperdrive/packages/contacts/contacts/Cargo.toml
+++ b/hyperdrive/packages/contacts/contacts/Cargo.toml
@@ -7,11 +7,11 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/contacts/get-names/Cargo.toml b/hyperdrive/packages/contacts/get-names/Cargo.toml
index a429346ea..ae333fe25 100644
--- a/hyperdrive/packages/contacts/get-names/Cargo.toml
+++ b/hyperdrive/packages/contacts/get-names/Cargo.toml
@@ -6,11 +6,11 @@ publish = false
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/contacts/pkg/ui/index.html b/hyperdrive/packages/contacts/pkg/ui/index.html
index bdd6ab6ba..674c167c8 100644
--- a/hyperdrive/packages/contacts/pkg/ui/index.html
+++ b/hyperdrive/packages/contacts/pkg/ui/index.html
@@ -12,16 +12,24 @@
         document.title = "contacts - " + window.our.node;
     </script>
     <style>
+        body {
+            background-color: #004fff;
+        }
+
         h1,
         h2,
         h3,
         h4,
         h5,
-        h6,
+        h6 {
+            font-family: 'Clash Display', sans-serif;
+            font-weight: 500;
+        }
+
         p,
         a,
         li {
-            font-family: 'Space Grotesk', monospace;
+            font-family: 'Neue Haas Grotesk', sans-serif;
         }
 
         #title {
@@ -31,6 +39,7 @@
             max-width: 720px;
             min-width: 300px;
             margin: 0 auto;
+            color: #fff;
         }
 
         #title h1 {
@@ -45,52 +54,44 @@
 
         #edit {
             max-width: 720px;
-            margin: 0 auto;
-        }
-
-        #contacts-article {
-            margin: 20px;
         }
 
         main {
+            position: relative;
             margin: 0 auto;
             padding: 20px;
-            max-width: 960px;
-            min-width: 300px;
-        }
-
-        form.add-contact {
-            max-width: 400px;
+            width: 100%;
+            max-width: 720px;
+            display: flex;
+            flex-direction: column;
+            gap: 20px;
+            z-index: 1;
         }
 
         #contacts {
+            display: flex;
+            flex-direction: column;
+            gap: 16px;
             list-style: none;
         }
 
-        .contact:first-of-type {
-            margin-top: 10px;
-        }
-
         .contact {
             padding: 10px;
-            border: 1px solid var(--tasteful-dark);
+            border: 1px solid var(--neon-green);
             border-radius: 5px;
-            margin-bottom: 10px;
-            display: grid;
+            display: flex;
+            flex-direction: column;
             gap: 10px;
-            grid-auto-flow: row;
-            grid-template-areas:
-                "name name delete"
-                "fields fields fields"
-                "add-field add-field add-field";
+            background-color: var(--white);
         }
 
         .contact h3 {
-            grid-area: name;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
         }
 
         .contact ul {
-            grid-area: fields;
             list-style: none;
             max-width: 100%;
             min-width: 0;
@@ -101,12 +102,19 @@
         }
 
         form.delete-contact {
-            grid-area: delete;
+            margin-left: auto;
+        }
+
+        .delete-contact button {
+
+            background-color: transparent !important;
+            color: var(--magenta);
         }
 
         form.add-field {
-            grid-area: add-field;
-            max-width: 400px;
+            display: flex;
+            flex-direction: column;
+            gap: 10px;
         }
 
         .remove-field {
@@ -114,10 +122,47 @@
             font-size: 0.8em;
             padding: 3px 10px;
         }
+
+        input[type="text"] {
+            background-color: #0001;
+            border: 1px solid var(--neon-green);
+            color: #fff;
+            padding: 10px;
+            border-radius: 5px;
+            font-size: 1em;
+            font-family: 'Neue Haas Grotesk', sans-serif;
+            font-weight: 500;
+            font-style: normal;
+        }
     </style>
 </head>
 
 <body>
+    <svg width="393" height="356" viewBox="0 0 393 356" fill="none" xmlns="http://www.w3.org/2000/svg"
+        style="position: absolute; bottom: 0; left: 0; width: 100%;  background-position: center; background-size: cover; pointer-events: none; z-index: 0;">
+        <g clip-path="url(#clip0_1483_2725)">
+            <path
+                d="M339.268 685.316L339.268 535.649L454.813 461.579L454.813 396.535L512.8 359.361C533.086 346.359 559.152 346.359 579.438 359.361L658.066 409.776"
+                stroke="#DCFF71" stroke-width="2" stroke-miterlimit="10" />
+            <path d="M56.1093 299.808L-283.025 517.208" stroke="#DCFF71" stroke-width="2" stroke-miterlimit="10" />
+            <path
+                d="M56.1089 299.807L56.1089 117.788L106.584 85.4356C120.47 76.524 138.29 76.524 152.19 85.4356L202.652 117.788L202.652 299.807L152.19 267.455C138.303 258.543 120.483 258.543 106.584 267.455L56.1089 299.807Z"
+                stroke="#DCFF71" stroke-width="2" stroke-miterlimit="10" />
+            <path d="M454.811 461.492L454.811 279.422L202.652 117.789" stroke="#DCFF71" stroke-width="2"
+                stroke-miterlimit="10" />
+            <path
+                d="M339.267 535.636L322.661 546.29L289.197 524.844L221.775 481.649C209.874 474 202.665 460.847 202.665 446.735L202.665 299.794L305.259 365.584L404.16 428.987L454.824 461.478L454.824 461.567"
+                stroke="#DCFF71" stroke-width="2" stroke-miterlimit="10" />
+            <path
+                d="M56.109 299.808L56.109 446.748C56.109 460.861 48.9128 474.013 37.0118 481.663L-59.4357 543.489L-117.41 580.65C-137.722 593.651 -163.762 593.651 -184.074 580.65L-283.025 517.221L-283.025 335.189L56.0964 117.801L56.0964 299.82"
+                stroke="#DCFF71" stroke-width="2" stroke-miterlimit="10" />
+        </g>
+        <defs>
+            <clipPath id="clip0_1483_2725">
+                <rect width="393" height="356" fill="white" transform="translate(393 356) rotate(-180)" />
+            </clipPath>
+        </defs>
+    </svg>
     <span id="title">
         <button id="back-button"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 576 512"
                 height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
@@ -128,6 +173,41 @@
         <h1>contacts</h1>
     </span>
     <main>
+        <?xml version="1.0" encoding="UTF-8"?>
+        <svg id="Hyperware Logo" data-name="Hyperware Logo" xmlns="http://www.w3.org/2000/svg"
+            viewBox="0 0 622.27 595.09" style="width: 64px; margin: 0 auto;">
+            <defs>
+                <style>
+                    .cls-1 {
+                        fill: #dcff71;
+                    }
+                </style>
+            </defs>
+            <g id="Capa_1" data-name="Capa 1">
+                <g>
+                    <g>
+                        <g>
+                            <path class="cls-1"
+                                d="M99.56,188.21L0,476.27l93.56.03c10.8,0,20.4-6.84,23.93-17.05l53.59-155.07c3.79-10.97,1.73-23.11-5.45-32.22l-66.06-83.76Z" />
+                            <path class="cls-1"
+                                d="M420.78,118.82l-30.14,87.1c-3.74,10.8-13.91,18.04-25.34,18.04h-70.48c-10.46,0-20.34-4.76-26.81-12.97l-72.67-92.17h225.44Z" />
+                        </g>
+                        <path class="cls-1"
+                            d="M101.63,0l-42.74,123.61c-1.85,5.35-.99,11.28,2.3,15.93l38.37,48.67,17.69-51.16c3.77-10.91,14.05-18.23,25.59-18.23h52.5L101.63,0Z" />
+                    </g>
+                    <g>
+                        <g>
+                            <path class="cls-1"
+                                d="M522.71,406.88l99.56-288.06-93.56-.03c-10.8,0-20.4,6.84-23.93,17.05l-53.59,155.07c-3.79,10.97-1.73,23.11,5.45,32.22l66.06,83.76Z" />
+                            <path class="cls-1"
+                                d="M201.49,476.27l30.14-87.1c3.74-10.8,13.91-18.04,25.34-18.04h70.48c10.46,0,20.34,4.76,26.81,12.97l72.67,92.17h-225.44Z" />
+                        </g>
+                        <path class="cls-1"
+                            d="M520.64,595.09l42.74-123.61c1.85-5.35.99-11.28-2.3-15.93l-38.37-48.67-17.69,51.16c-3.77,10.91-14.05,18.23-25.59,18.23h-52.5l93.71,118.82Z" />
+                    </g>
+                </g>
+            </g>
+        </svg>
         <article id="edit">
             <form id="add-contact">
                 <input type="text" name="node" placeholder="node name (e.g. my-friend.os)">
diff --git a/hyperdrive/packages/contacts/pkg/ui/script.js b/hyperdrive/packages/contacts/pkg/ui/script.js
index 2ea7dd545..93f1216fd 100644
--- a/hyperdrive/packages/contacts/pkg/ui/script.js
+++ b/hyperdrive/packages/contacts/pkg/ui/script.js
@@ -23,7 +23,12 @@ function populate_contacts(contacts) {
         const li = document.createElement('li');
         const div = document.createElement('div');
         div.classList.add('contact');
-        div.innerHTML = `<h3>${node}</h3>
+        div.innerHTML = `<h3>
+        <span>${node}</span>
+        <form class="delete-contact" id="${node}">
+            <button type="submit">❌</button>
+        </form>
+        </h3>
         <ul>
         ${Object.entries(contact).sort((a, b) => a[0].localeCompare(b[0])).map(([field, value]) => `
             <li>
@@ -32,9 +37,6 @@ function populate_contacts(contacts) {
             </li>
         `).join('')}
         </ul>
-        <form class="delete-contact" id="${node}">
-            <button type="submit">delete</button>
-        </form>
         <form class="add-field" id="${node}">
             <input type="text" name="field" placeholder="field (e.g. name)">
             <input type="text" name="value" placeholder="value (e.g. John Doe)" title="Enter any valid JSON value (e.g. &quot;John Doe&quot;, 42, true, [1,2,3], {&quot;key&quot;:&quot;value&quot;})">
@@ -48,10 +50,12 @@ function populate_contacts(contacts) {
     ul.querySelectorAll('.delete-contact').forEach(form => {
         form.addEventListener('submit', function (e) {
             e.preventDefault();
-            const node = this.getAttribute('id');
-            api_call({
-                "RemoveContact": node
-            });
+            if (confirm('Are you sure you want to remove this contact?')) {
+                const node = this.getAttribute('id');
+                api_call({
+                    "RemoveContact": node
+                });
+            }
         });
     });
 
@@ -112,9 +116,11 @@ document.getElementById('add-contact').addEventListener('submit', (e) => {
 })
 
 function removeField(node, field) {
-    api_call({
-        "RemoveField": [node, field]
-    });
+    if (confirm('Are you sure you want to remove this field?')) {
+        api_call({
+            "RemoveField": [node, field]
+        });
+    }
 }
 
 // Setup WebSocket connection
diff --git a/hyperdrive/packages/hns-indexer/Cargo.lock b/hyperdrive/packages/hns-indexer/Cargo.lock
index 675dd0a07..9152cd23d 100644
--- a/hyperdrive/packages/hns-indexer/Cargo.lock
+++ b/hyperdrive/packages/hns-indexer/Cargo.lock
@@ -1411,9 +1411,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1576,9 +1573,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1864,10 +1860,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2911,15 +2907,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3509,39 +3496,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3715,9 +3697,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3725,9 +3707,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3736,18 +3718,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3761,9 +3745,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3776,9 +3760,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3795,9 +3779,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/hns-indexer/get-block/Cargo.toml b/hyperdrive/packages/hns-indexer/get-block/Cargo.toml
index ec48b9197..520da6a2a 100644
--- a/hyperdrive/packages/hns-indexer/get-block/Cargo.toml
+++ b/hyperdrive/packages/hns-indexer/get-block/Cargo.toml
@@ -7,10 +7,10 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hns-indexer/hns-indexer/Cargo.toml b/hyperdrive/packages/hns-indexer/hns-indexer/Cargo.toml
index 470bf8f2f..b809cf1a5 100644
--- a/hyperdrive/packages/hns-indexer/hns-indexer/Cargo.toml
+++ b/hyperdrive/packages/hns-indexer/hns-indexer/Cargo.toml
@@ -11,13 +11,13 @@ anyhow = "1.0"
 alloy-primitives = "0.8.15"
 alloy-sol-types = "0.8.15"
 hex = "0.4.3"
-hyperware_process_lib = { version = "1.2.0", features = ["logging"] }
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719", features = ["logging"] }
 process_macros = "0.1"
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 thiserror = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hns-indexer/node-info/Cargo.toml b/hyperdrive/packages/hns-indexer/node-info/Cargo.toml
index a70f965ec..55f706f5b 100644
--- a/hyperdrive/packages/hns-indexer/node-info/Cargo.toml
+++ b/hyperdrive/packages/hns-indexer/node-info/Cargo.toml
@@ -7,11 +7,11 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 process_macros = "0.1"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hns-indexer/reset/Cargo.toml b/hyperdrive/packages/hns-indexer/reset/Cargo.toml
index 5a82f081a..0e45edd95 100644
--- a/hyperdrive/packages/hns-indexer/reset/Cargo.toml
+++ b/hyperdrive/packages/hns-indexer/reset/Cargo.toml
@@ -7,11 +7,11 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 process_macros = "0.1"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hns-indexer/state/Cargo.toml b/hyperdrive/packages/hns-indexer/state/Cargo.toml
index c2b80f654..011652df8 100644
--- a/hyperdrive/packages/hns-indexer/state/Cargo.toml
+++ b/hyperdrive/packages/hns-indexer/state/Cargo.toml
@@ -7,11 +7,11 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 process_macros = "0.1"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/homepage/Cargo.lock b/hyperdrive/packages/homepage/Cargo.lock
index 95e6d23ef..6218c60ce 100644
--- a/hyperdrive/packages/homepage/Cargo.lock
+++ b/hyperdrive/packages/homepage/Cargo.lock
@@ -1364,9 +1364,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1524,9 +1521,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1802,10 +1798,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2762,15 +2758,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3286,39 +3273,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3470,9 +3452,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3480,9 +3462,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3491,18 +3473,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3516,9 +3500,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3531,9 +3515,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3550,9 +3534,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/homepage/homepage/Cargo.toml b/hyperdrive/packages/homepage/homepage/Cargo.toml
index fd71abab7..128e96d97 100644
--- a/hyperdrive/packages/homepage/homepage/Cargo.toml
+++ b/hyperdrive/packages/homepage/homepage/Cargo.toml
@@ -9,10 +9,10 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/homepage/homepage/src/lib.rs b/hyperdrive/packages/homepage/homepage/src/lib.rs
index 42fe08975..d09dbb4b2 100644
--- a/hyperdrive/packages/homepage/homepage/src/lib.rs
+++ b/hyperdrive/packages/homepage/homepage/src/lib.rs
@@ -110,23 +110,83 @@ fn init(our: Address) {
 
     http_server
         .bind_http_static_path(
-            "/h-green.svg",
-            false, // h-green.svg is not auth'd so that apps on subdomains can use it too!
+            "/manifest.json",
+            false, // manifest.json is not auth'd so that PWA works properly
             false,
-            Some("image/svg+xml".to_string()),
-            include_str!("../../pkg/h-green.svg").into(),
+            Some("application/json".to_string()),
+            include_str!("../../pkg/ui/manifest.json").into(),
+        )
+        .expect("failed to bind /manifest.json");
+
+    http_server
+        .bind_http_static_path(
+            "/ClashDisplay-Variable.woff2",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("font/woff2".to_string()),
+            include_bytes!("../../pkg/ui/ClashDisplay-Variable.woff2").into(),
+        )
+        .expect("failed to bind /ClashDisplay-Variable.woff2");
+
+    http_server
+        .bind_http_static_path(
+            "/NHaasGroteskTXPro-55Rg.woff",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("font/woff".to_string()),
+            include_bytes!("../../pkg/ui/NHaasGroteskTXPro-55Rg.woff").into(),
+        )
+        .expect("failed to bind /NHaasGroteskTXPro-55Rg.woff");
+
+    http_server
+        .bind_http_static_path(
+            "/NHaasGroteskTXPro-75Bd.woff",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("font/woff".to_string()),
+            include_bytes!("../../pkg/ui/NHaasGroteskTXPro-75Bd.woff").into(),
         )
-        .expect("failed to bind /h-green.svg");
+        .expect("failed to bind /NHaasGroteskTXPro-75Bd.woff");
 
     http_server
         .bind_http_static_path(
-            "/h-plain.svg",
-            false, // h-plain.svg is not auth'd so that apps on subdomains can use it too!
+            "/chaneyextended.woff2",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("font/woff".to_string()),
+            include_bytes!("../../pkg/ui/chaneyextended.woff2").into(),
+        )
+        .expect("failed to bind /chaneyextended.woff2");
+
+    http_server
+        .bind_http_static_path(
+            "/icon.svg",
+            false, // icon.svg is not auth'd so that PWA works properly
             false,
             Some("image/svg+xml".to_string()),
-            include_str!("../../pkg/h-plain.svg").into(),
+            include_str!("../../pkg/ui/icon.svg").into(),
+        )
+        .expect("failed to bind /icon.svg");
+
+    http_server
+        .bind_http_static_path(
+            "/icon-180.png",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("image/png".to_string()),
+            include_bytes!("../../pkg/ui/icon-180.png").into(),
+        )
+        .expect("failed to bind /icon.svg");
+
+    http_server
+        .bind_http_static_path(
+            "/chaneyextended.woff2",
+            false, // icon-180.png is not auth'd so that PWA works properly
+            false,
+            Some("image/png".to_string()),
+            include_bytes!("../../pkg/ui/chaneyextended.woff2").into(),
         )
-        .expect("failed to bind /h-plain.svg");
+        .expect("failed to bind /icon.svg");
 
     // because boot uses this path to check if homepage is served yet,
     // it's best to respond dynamically and only serve this path once
diff --git a/hyperdrive/packages/homepage/pkg/h-green.svg b/hyperdrive/packages/homepage/pkg/h-green.svg
deleted file mode 100644
index 8f9b4b44e..000000000
--- a/hyperdrive/packages/homepage/pkg/h-green.svg
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   width="1000"
-   height="1000"
-   viewBox="0 0 1000 1000"
-   fill="none"
-   version="1.1"
-   id="svg25"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg">
-  <rect
-     x="20"
-     y="20"
-     width="960"
-     height="960"
-     rx="480"
-     fill="url(#paint0_linear_1955_10320)"
-     fill-opacity="0.4"
-     id="rect2" />
-  <rect
-     x="20"
-     y="20"
-     width="960"
-     height="960"
-     rx="480"
-     stroke="url(#paint1_linear_1955_10320)"
-     stroke-width="40"
-     id="rect4"
-     style="stroke:#e5ff44" />
-  <defs
-     id="defs23">
-    <linearGradient
-       id="paint0_linear_1955_10320"
-       x1="500"
-       y1="0"
-       x2="500"
-       y2="1000"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#paint1_linear_1955_10320">
-      <stop
-         stop-color="#F35422"
-         id="stop8"
-         style="stop-color:#e5ff44;stop-opacity:1" />
-      <stop
-         offset="1"
-         stop-opacity="0"
-         id="stop10" />
-    </linearGradient>
-    <linearGradient
-       id="paint1_linear_1955_10320"
-       x1="782.5"
-       y1="73.5"
-       x2="185.5"
-       y2="894.5"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#F35422"
-         id="stop13" />
-      <stop
-         offset="1"
-         stop-color="#A5310C"
-         id="stop15" />
-    </linearGradient>
-  </defs>
-  <path
-     style="fill:#e5ff44;stroke-width:2.34975"
-     d="m 310.20514,746.65966 c -26.10534,-7.98067 -49.32208,-34.589 -53.13225,-60.89397 -1.14804,-7.92593 -1.60637,-97.19543 -1.0185,-198.37664 1.1717,-201.66871 0.22834,-192.68203 22.57134,-215.02502 22.49386,-22.49385 12.25727,-21.5025 222.03328,-21.5025 209.77606,0 199.53936,-0.99135 222.03326,21.5025 22.527,22.52699 21.5025,11.6978 21.5025,227.2894 0,215.59163 1.0245,204.76245 -21.5025,227.28942 -22.398,22.398 -13.0255,21.44089 -216.77711,22.13701 -102.14485,0.34898 -190.21436,-0.7401 -195.71002,-2.4202 z M 403.4602,672.2299 c 20.52944,-15.65856 23.61245,-26.7433 23.61245,-84.89676 0,-51.42563 0,-51.42563 10.24278,-61.66841 10.2428,-10.2428 10.2428,-10.2428 56.33535,-10.2428 46.09256,0 46.09256,0 56.33533,10.2428 10.24281,10.24278 10.24281,10.24278 10.30044,62.19797 0.0524,47.26476 0.76422,53.19685 7.88422,65.70876 14.2217,24.99151 51.8212,37.37611 75.8107,24.97067 5.4,-2.79244 14.7828,-10.73157 20.8506,-17.6425 11.0325,-12.56532 11.0325,-12.56532 11.0194,-169.25236 -0.012,-149.36036 -0.3337,-157.21298 -6.8707,-167.93408 -21.9986,-36.0791 -81.44,-32.61888 -100.8676,5.87173 -7.1564,14.17853 -7.88425,20.59081 -7.88425,69.46133 0,53.84079 0,53.84079 -10.24281,64.08357 -10.24277,10.2428 -10.24277,10.2428 -56.33533,10.2428 -46.09255,0 -46.09255,0 -56.33535,-10.2428 -10.24278,-10.24278 -10.24278,-10.24278 -10.24278,-65.17251 0,-62.12308 -2.80401,-72.52952 -23.87311,-88.5997 -10.57206,-8.06371 -15.77163,-9.43852 -35.69679,-9.43852 -20.00805,0 -25.10637,1.3608 -35.87707,9.57602 -23.67044,18.05433 -24.06837,21.29625 -22.94278,186.91564 1.00201,147.4341 1.00201,147.4341 9.6618,160.06756 13.48845,19.67781 29.61088,27.61513 53.1956,26.18897 14.77672,-0.89356 22.88209,-3.54389 31.9199,-10.43738 z m -54.68697,-33.56395 c -5.19541,-5.74086 -5.79926,-21.19119 -5.79926,-148.38164 0,-133.09145 0.4009,-142.33634 6.40811,-147.77279 7.30045,-6.60682 18.94006,-7.48265 28.86337,-2.17186 6.53349,3.49662 6.77786,8.85699 6.77786,148.67443 0,127.1888 -0.67795,145.72501 -5.50646,150.55351 -7.435,7.43501 -23.62886,6.96006 -30.74362,-0.90165 z m 259.01154,0.90165 c -4.8262,-4.82618 -5.5065,-23.19388 -5.5065,-148.67444 0,-157.28998 -0.425,-154.1809 21.0763,-154.1809 20.8021,0 20.973,1.25665 20.973,154.1809 0,119.77713 -0.741,139.66298 -5.4548,146.39299 -6.4779,9.24844 -22.9148,10.45468 -31.088,2.28145 z"
-     id="path2" />
-</svg>
diff --git a/hyperdrive/packages/homepage/pkg/h-plain.svg b/hyperdrive/packages/homepage/pkg/h-plain.svg
deleted file mode 100644
index 1e4414f42..000000000
--- a/hyperdrive/packages/homepage/pkg/h-plain.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   width="1000"
-   height="1000"
-   viewBox="0 0 1000 1000"
-   fill="none"
-   version="1.1"
-   id="svg6"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg">
-  <defs
-     id="defs10" />
-  <rect
-     width="1000"
-     height="1000"
-     rx="500"
-     fill="#FFF5D9"
-     fill-opacity="0.4"
-     id="rect2" />
-  <path
-     style="fill:#fff5d9;stroke-width:2.34975"
-     d="m 310.20513,746.65966 c -26.10534,-7.98067 -49.32208,-34.589 -53.13225,-60.89397 -1.14804,-7.92593 -1.60637,-97.19543 -1.0185,-198.37664 1.1717,-201.66871 0.22834,-192.68203 22.57134,-215.02502 22.49386,-22.49385 12.25727,-21.5025 222.03328,-21.5025 209.77601,0 199.53941,-0.99135 222.03328,21.5025 22.52697,22.52699 21.5025,11.6978 21.5025,227.2894 0,215.59163 1.02447,204.76245 -21.5025,227.28942 -22.39802,22.398 -13.02547,21.44089 -216.77713,22.13701 -102.14485,0.34898 -190.21436,-0.7401 -195.71002,-2.4202 z m 93.25506,-74.42976 c 20.52944,-15.65856 23.61245,-26.7433 23.61245,-84.89676 0,-51.42563 0,-51.42563 10.24278,-61.66841 10.2428,-10.2428 10.2428,-10.2428 56.33535,-10.2428 46.09256,0 46.09256,0 56.33533,10.2428 10.24281,10.24278 10.24281,10.24278 10.30044,62.19797 0.0524,47.26476 0.76422,53.19685 7.88424,65.70876 14.22169,24.99151 51.82117,37.37611 75.81065,24.97067 5.39998,-2.79244 14.78278,-10.73157 20.85066,-17.6425 11.0325,-12.56532 11.0325,-12.56532 11.01939,-169.25236 -0.0118,-149.36036 -0.33375,-157.21298 -6.87074,-167.93408 -21.99859,-36.0791 -81.43999,-32.61888 -100.86759,5.87173 -7.15643,14.17853 -7.88424,20.59081 -7.88424,69.46133 0,53.84079 0,53.84079 -10.24281,64.08357 -10.24277,10.2428 -10.24277,10.2428 -56.33533,10.2428 -46.09255,0 -46.09255,0 -56.33535,-10.2428 -10.24278,-10.24278 -10.24278,-10.24278 -10.24278,-65.17251 0,-62.12308 -2.80401,-72.52952 -23.87311,-88.5997 -10.57206,-8.06371 -15.77163,-9.43852 -35.69679,-9.43852 -20.00805,0 -25.10637,1.3608 -35.87707,9.57602 -23.67044,18.05433 -24.06837,21.29625 -22.94278,186.91564 1.00201,147.4341 1.00201,147.4341 9.6618,160.06756 13.48845,19.67781 29.61088,27.61513 53.1956,26.18897 14.77672,-0.89356 22.88209,-3.54389 31.9199,-10.43738 z m -54.68697,-33.56395 c -5.19541,-5.74086 -5.79926,-21.19119 -5.79926,-148.38164 0,-133.09145 0.4009,-142.33634 6.40811,-147.77279 7.30045,-6.60682 18.94006,-7.48265 28.86337,-2.17186 6.53349,3.49662 6.77786,8.85699 6.77786,148.67443 0,127.1888 -0.67795,145.72501 -5.50646,150.55351 -7.435,7.43501 -23.62886,6.96006 -30.74362,-0.90165 z m 259.01149,0.90165 c -4.82618,-4.82618 -5.50646,-23.19388 -5.50646,-148.67444 0,-157.28998 -0.42502,-154.1809 21.07626,-154.1809 20.80214,0 20.97308,1.25665 20.97308,154.1809 0,119.77713 -0.74099,139.66298 -5.45488,146.39299 -6.47783,9.24844 -22.91477,10.45468 -31.088,2.28145 z"
-     id="path2" />
-</svg>
diff --git a/hyperdrive/packages/homepage/ui/index.html b/hyperdrive/packages/homepage/ui/index.html
index ecac13a59..c11bebde8 100644
--- a/hyperdrive/packages/homepage/ui/index.html
+++ b/hyperdrive/packages/homepage/ui/index.html
@@ -33,6 +33,15 @@
   <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
   <meta name="viewport"
     content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1.00001, viewport-fit=cover" />
+
+  <!-- PWA Meta Tags -->
+  <meta name="theme-color" content="#000000" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+  <meta name="apple-mobile-web-app-title" content="Hyperdrive" />
+  <link rel="apple-touch-icon" href="/icon-180.png" />
+  <link rel="manifest" href="/manifest.json" />
+
   <link rel="stylesheet" href="/hyperware.css">
 </head>
 
@@ -45,4 +54,4 @@
   </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/hyperdrive/packages/homepage/ui/public/ClashDisplay-Variable.woff2 b/hyperdrive/packages/homepage/ui/public/ClashDisplay-Variable.woff2
new file mode 100644
index 000000000..f06199f3d
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/ClashDisplay-Variable.woff2 differ
diff --git a/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-55Rg.woff b/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-55Rg.woff
new file mode 100644
index 000000000..49b929b73
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-55Rg.woff differ
diff --git a/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-75Bd.woff b/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-75Bd.woff
new file mode 100644
index 000000000..b9cf619eb
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/NHaasGroteskTXPro-75Bd.woff differ
diff --git a/hyperdrive/packages/homepage/ui/public/chaneyextended.woff2 b/hyperdrive/packages/homepage/ui/public/chaneyextended.woff2
new file mode 100644
index 000000000..ec9082075
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/chaneyextended.woff2 differ
diff --git a/hyperdrive/packages/homepage/ui/public/chaneywide.woff2 b/hyperdrive/packages/homepage/ui/public/chaneywide.woff2
new file mode 100644
index 000000000..fa14af3a0
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/chaneywide.woff2 differ
diff --git a/hyperdrive/packages/homepage/ui/public/icon-180.png b/hyperdrive/packages/homepage/ui/public/icon-180.png
new file mode 100644
index 000000000..82cd89907
Binary files /dev/null and b/hyperdrive/packages/homepage/ui/public/icon-180.png differ
diff --git a/hyperdrive/packages/homepage/ui/public/icon.svg b/hyperdrive/packages/homepage/ui/public/icon.svg
new file mode 100644
index 000000000..86d3bf3ee
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/public/icon.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 1080">
+  <defs>
+    <style>
+      .cls-1 {
+        fill: #004fff;
+      }
+
+      .cls-2 {
+        fill: #dcff71;
+      }
+    </style>
+  </defs>
+  <g id="Capa_1" data-name="Capa 1">
+    <g>
+      <rect class="cls-1" width="1080" height="1080"/>
+      <g>
+        <g>
+          <g>
+            <path class="cls-2" d="M328.43,430.67l-99.56,288.06,93.56.03c10.8,0,20.4-6.84,23.93-17.05l53.59-155.07c3.79-10.97,1.73-23.11-5.45-32.22l-66.06-83.76Z"/>
+            <path class="cls-2" d="M649.64,361.28l-30.14,87.1c-3.74,10.8-13.91,18.04-25.34,18.04h-70.48c-10.46,0-20.34-4.76-26.81-12.97l-72.67-92.17h225.44Z"/>
+          </g>
+          <path class="cls-2" d="M330.49,242.45l-42.74,123.61c-1.85,5.35-.99,11.28,2.3,15.93l38.37,48.67,17.69-51.16c3.77-10.91,14.05-18.23,25.59-18.23h52.5l-93.71-118.82Z"/>
+        </g>
+        <g>
+          <g>
+            <path class="cls-2" d="M751.57,649.33l99.56-288.06-93.56-.03c-10.8,0-20.4,6.84-23.93,17.05l-53.59,155.07c-3.79,10.97-1.73,23.11,5.45,32.22l66.06,83.76Z"/>
+            <path class="cls-2" d="M430.36,718.72l30.14-87.1c3.74-10.8,13.91-18.04,25.34-18.04h70.48c10.46,0,20.34,4.76,26.81,12.97l72.67,92.17h-225.44Z"/>
+          </g>
+          <path class="cls-2" d="M749.51,837.55l42.74-123.61c1.85-5.35.99-11.28-2.3-15.93l-38.37-48.67-17.69,51.16c-3.77,10.91-14.05,18.23-25.59,18.23h-52.5l93.71,118.82Z"/>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/public/manifest.json b/hyperdrive/packages/homepage/ui/public/manifest.json
new file mode 100644
index 000000000..5baed590e
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/public/manifest.json
@@ -0,0 +1,29 @@
+{
+  "name": "Hyperdrive",
+  "short_name": "Hyperdrive",
+  "description": "Your sovereign cloud computer, built for crypto",
+  "start_url": "/",
+  "scope": "/",
+  "display": "standalone",
+  "orientation": "portrait",
+  "theme_color": "#353534",
+  "background_color": "#353534",
+  "icons": [
+    {
+      "src": "/icon.svg",
+      "sizes": "1080x1080",
+      "type": "image/svg+xml",
+      "purpose": "any"
+    },
+    {
+      "src": "/icon.svg",
+      "sizes": "1080x1080",
+      "type": "image/svg+xml",
+      "purpose": "maskable"
+    }
+  ],
+  "categories": ["productivity", "utilities"],
+  "screenshots": [],
+  "related_applications": [],
+  "prefer_related_applications": false
+}
diff --git a/hyperdrive/packages/homepage/ui/public/sw.js b/hyperdrive/packages/homepage/ui/public/sw.js
new file mode 100644
index 000000000..686454f23
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/public/sw.js
@@ -0,0 +1,80 @@
+// Minimal service worker for PWA installability
+// This is an online-only PWA, so we only cache the app shell
+
+const CACHE_NAME = 'hyperdrive-v1';
+const urlsToCache = [
+  '/',
+  '/index.html',
+  '/manifest.json'
+];
+
+// Install event - cache app shell
+self.addEventListener('install', (event) => {
+  event.waitUntil(
+    caches.open(CACHE_NAME)
+      .then((cache) => {
+        console.log('Opened cache');
+        return cache.addAll(urlsToCache);
+      })
+      .then(() => self.skipWaiting())
+  );
+});
+
+// Activate event - clean up old caches
+self.addEventListener('activate', (event) => {
+  event.waitUntil(
+    caches.keys().then((cacheNames) => {
+      return Promise.all(
+        cacheNames.map((cacheName) => {
+          if (cacheName !== CACHE_NAME) {
+            console.log('Deleting old cache:', cacheName);
+            return caches.delete(cacheName);
+          }
+        })
+      );
+    }).then(() => self.clients.claim())
+  );
+});
+
+// Fetch event - network first strategy (online-only app)
+self.addEventListener('fetch', (event) => {
+  // Skip non-GET requests
+  if (event.request.method !== 'GET') {
+    return;
+  }
+
+  // Skip cross-origin requests
+  if (!event.request.url.startsWith(self.location.origin)) {
+    return;
+  }
+
+  event.respondWith(
+    // Try network first
+    fetch(event.request)
+      .then((response) => {
+        // Clone the response before using it
+        const responseToCache = response.clone();
+
+        // Update cache with fresh response for app shell files
+        if (urlsToCache.includes(new URL(event.request.url).pathname)) {
+          caches.open(CACHE_NAME)
+            .then((cache) => {
+              cache.put(event.request, responseToCache);
+            });
+        }
+
+        return response;
+      })
+      .catch(() => {
+        // If network fails, try cache (only for app shell)
+        return caches.match(event.request);
+      })
+  );
+});
+
+// Listen for messages from the app
+self.addEventListener('message', (event) => {
+  if (event.data && event.data.type === 'SKIP_WAITING') {
+    self.skipWaiting();
+  }
+});
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/AllApps.tsx b/hyperdrive/packages/homepage/ui/src/components/AllApps.tsx
deleted file mode 100644
index 8a64df913..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/AllApps.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import React, { useState, useEffect, useMemo } from "react";
-import useHomepageStore, { HomepageApp } from "../store/homepageStore";
-import AppDisplay from "./AppDisplay";
-import classNames from "classnames";
-
-const AllApps: React.FC = () => {
-  const { apps } = useHomepageStore();
-  const [expanded, setExpanded] = useState(false);
-  const [isMobile, setIsMobile] = useState(false);
-  const [visibleApps, setVisibleApps] = useState(5);
-  const [orderedApps, setOrderedApps] = useState<HomepageApp[]>([]);
-  const [draggedIndex, setDraggedIndex] = useState<number | null>(null);
-  const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);
-
-  useEffect(() => {
-    const handleResize = () => {
-      const mobile = window.innerWidth <= 768;
-      setIsMobile(mobile);
-      setVisibleApps(mobile ? 0 : window.innerWidth <= 1024 ? 3 : 5);
-    };
-
-    handleResize();
-    window.addEventListener("resize", handleResize);
-    return () => window.removeEventListener("resize", handleResize);
-  }, []);
-
-  // Sort apps based on persisted order
-  const sortedApps = useMemo(() => {
-    // Use orderedApps if we have them, otherwise fall back to apps
-    const appsToSort = orderedApps.length ? orderedApps : apps;
-    return [...appsToSort]
-      .sort((a, b) => a.order - b.order)
-      .filter(app => app.path !== null);
-  }, [apps, orderedApps]);
-
-  const displayedApps = expanded
-    ? sortedApps
-    : sortedApps.slice(0, visibleApps);
-  const hasMoreApps = sortedApps.length > visibleApps;
-
-  const handleExpandClick = () => {
-    setExpanded(!expanded);
-  };
-
-  const handleDragStart = (e: React.DragEvent, index: number) => {
-    e.dataTransfer.setData("text/plain", index.toString());
-    setDraggedIndex(index);
-  };
-
-  const handleDragOver = (e: React.DragEvent, index: number) => {
-    e.preventDefault();
-    setDragOverIndex(index);
-  };
-
-  const handleDragEnd = () => {
-    setDraggedIndex(null);
-    setDragOverIndex(null);
-  };
-
-  const handleDrop = (e: React.DragEvent, dropIndex: number) => {
-    e.preventDefault();
-    const dragIndex = parseInt(e.dataTransfer.getData("text/plain"), 10);
-    if (dragIndex === dropIndex) return;
-
-    const newSortedApps = [...sortedApps];
-    const [movedApp] = newSortedApps.splice(dragIndex, 1);
-    newSortedApps.splice(dropIndex, 0, movedApp);
-
-    const updatedApps = newSortedApps.map((app, index) => ({
-      ...app,
-      order: index
-    }));
-
-    setOrderedApps(updatedApps);
-
-    handleDragEnd();
-
-    // Sync the order with the backend
-    fetch('/order', {
-      method: 'POST',
-      headers: {
-        'Content-Type': 'application/json'
-      },
-      credentials: 'include',
-      body: JSON.stringify(newSortedApps.map((app, index) => [app.id, index]))
-    });
-  };
-
-  return (
-    <div
-      className={classNames(`
-        all-apps
-        fixed bottom-0 left-0 right-0 z-40
-        bg-black 
-        p-0 
-        rounded-none md:rounded-b-lg
-        border border-solid border-1 border-black dark:border-white border-t-0
-        shadow-lg
-        md:static
-      `, {
-      })}>
-      <div
-        className={classNames("apps-grid", {
-          expanded: expanded,
-          mobile: isMobile,
-          noExpandButton: !hasMoreApps
-        })}
-        style={{
-          gridTemplateColumns: `repeat(${Math.min(displayedApps.length, 5)}, 1fr)`,
-          /* Remove the border that would continue to the Show Apps button when it's not present */
-          borderBottom: hasMoreApps ? '0.5px solid rgba(255, 255, 255, 0.2)' : 'none'
-        }}
-      >
-        {displayedApps.map((app, index) => (
-          <div
-            key={`${app.id}-${app.order}`}
-            draggable
-            onDragStart={(e) => handleDragStart(e, index)}
-            onDragOver={(e) => handleDragOver(e, index)}
-            onDragEnd={handleDragEnd}
-            onDrop={(e) => handleDrop(e, index)}
-            className={classNames("app-wrapper", {
-              dragging: draggedIndex === index,
-              "drag-over": dragOverIndex === index,
-              lastApp: index === displayedApps.length - 1,
-              firstApp: index === 0,
-              "first-in-row": index % 5 === 0,
-              "last-in-row": (index + 1) % 5 === 0 || index === displayedApps.length - 1
-            })}
-          >
-            <AppDisplay app={app} />
-            <div className="drag-handle">⋮⋮</div>
-          </div>
-        ))}
-      </div>
-      {(hasMoreApps || isMobile) && (
-        <button className="expand-button" onClick={handleExpandClick}>
-          {expanded
-            ? "Hide Apps"
-            : `Show ${isMobile ? "Apps" : `All (${sortedApps.length})`}`}
-        </button>
-      )}
-    </div>
-  );
-};
-
-export default AllApps;
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppContainer.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppContainer.tsx
new file mode 100644
index 000000000..240d9b46e
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppContainer.tsx
@@ -0,0 +1,66 @@
+import React, { useRef, useState } from 'react';
+import type { RunningApp } from '../../../types/app.types';
+
+interface AppContainerProps {
+  app: RunningApp;
+  isVisible: boolean;
+}
+
+export const AppContainer: React.FC<AppContainerProps> = ({ app, isVisible }) => {
+  const iframeRef = useRef<HTMLIFrameElement>(null);
+  const [hasError, setHasError] = useState(false);
+  const [isLoading, setIsLoading] = useState(true);
+
+  // Ensure we have a valid path
+  const appUrl = app.path || `/app:${app.process}:${app.publisher}.os/`;
+
+  const handleError = () => {
+    setHasError(true);
+    setIsLoading(false);
+    console.error(`Failed to load app: ${app.label}`);
+  };
+
+  const handleLoad = () => {
+    setIsLoading(false);
+  };
+
+  return (
+    <div
+      className={`fixed inset-0 bg-white z-30 transition-transform duration-300
+        ${isVisible ? 'translate-x-0' : 'translate-x-full'}`}
+    >
+      {hasError ? (
+        <div className="w-full h-full flex items-center justify-center bg-gradient-to-b from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-900">
+          <div className="text-center">
+            <div className="text-6xl mb-4">⚠️</div>
+            <h2 className="text-xl font-semibold mb-2 text-gray-800 dark:text-gray-200">Failed to load {app.label}</h2>
+            <p className="text-gray-600 dark:text-gray-400">The app could not be loaded.</p>
+          </div>
+        </div>
+      ) : (
+        <>
+          {isLoading && (
+            <div className="absolute inset-0 flex items-center justify-center bg-gradient-to-b from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-900 z-10">
+              <div className="text-center">
+                <div className="w-12 h-12 border-4 border-gray-300 dark:border-gray-600 border-t-blue-500 rounded-full animate-spin mb-4"></div>
+                <p className="text-gray-600 dark:text-gray-400">Loading {app.label}...</p>
+              </div>
+            </div>
+          )}
+          <iframe
+            ref={iframeRef}
+            src={appUrl}
+            className="w-full h-full border-0"
+            title={app.label}
+            onError={handleError}
+            onLoad={handleLoad}
+            // Allow all necessary permissions for subdomain redirects
+            allow="accelerometer; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; usb; xr-spatial-tracking"
+            // Enhanced sandbox permissions
+            sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-top-navigation allow-modals allow-downloads allow-presentation allow-storage-access-by-user-activation"
+          />
+        </>
+      )}
+    </div>
+  );
+};
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx
new file mode 100644
index 000000000..2d7c93794
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx
@@ -0,0 +1,76 @@
+import React, { useState, useMemo } from 'react';
+import type { HomepageApp } from '../../../types/app.types';
+import { useAppStore } from '../../../stores/appStore';
+import { useNavigationStore } from '../../../stores/navigationStore';
+import { usePersistenceStore } from '../../../stores/persistenceStore';
+import { AppIcon } from './AppIcon';
+
+export const AppDrawer: React.FC = () => {
+  const { apps } = useAppStore();
+  const { isAppDrawerOpen, toggleAppDrawer, openApp } = useNavigationStore();
+  const { homeScreenApps, addToHomeScreen } = usePersistenceStore();
+  const [searchQuery, setSearchQuery] = useState('');
+
+  const filteredApps = useMemo(() => {
+    return apps
+      .filter(app => app.label.toLowerCase().includes(searchQuery.toLowerCase()))
+      .sort((a, b) => a.label.localeCompare(b.label));
+  }, [apps, searchQuery]);
+
+  const handleAddToHome = (app: HomepageApp) => {
+    // Ensure we don't duplicate
+    if (!homeScreenApps.includes(app.id)) {
+      addToHomeScreen(app.id);
+    }
+    toggleAppDrawer();
+  };
+
+  if (!isAppDrawerOpen) return null;
+
+  return (
+    <div className="fixed inset-0 bg-gradient-to-b from-gray-900/98 to-black/98 backdrop-blur-xl z-50 flex flex-col">
+      <div className="p-4">
+        <div className="relative">
+          <input
+            type="text"
+            placeholder="Search apps..."
+            value={searchQuery}
+            onChange={(e) => setSearchQuery(e.target.value)}
+            className="w-full px-4 py-3 pl-12 bg-white/10 backdrop-blur rounded-2xl text-white placeholder-white/50 border border-white/20 focus:border-blue-400 focus:outline-none transition-all"
+            autoFocus
+          />
+          <div className="absolute left-4 top-1/2 transform -translate-y-1/2 text-white/50">
+            🔍
+          </div>
+        </div>
+      </div>
+
+      <div className="flex-1 overflow-y-auto p-4">
+        <div className="grid grid-cols-4 md:grid-cols-6 gap-6">
+          {filteredApps.map(app => (
+            <div key={app.id} className="relative group">
+              <div onClick={() => openApp(app)}>
+                <AppIcon app={app} isEditMode={false} />
+              </div>
+              {!homeScreenApps.includes(app.id) && (
+                <button
+                  onClick={() => handleAddToHome(app)}
+                  className="absolute -top-3 -right-3 w-8 h-8 bg-green-500 text-white rounded-full flex items-center justify-center text-lg font-bold shadow-lg hover:bg-green-600 transition-colors"
+                >
+                  +
+                </button>
+              )}
+            </div>
+          ))}
+        </div>
+      </div>
+
+      <button
+        onClick={toggleAppDrawer}
+        className="m-4 p-4 bg-[#353534] text-white text-center rounded-xl hover:bg-[#454544] transition-colors"
+      >
+        Close
+      </button>
+    </div>
+  );
+};
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx
new file mode 100644
index 000000000..683526182
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx
@@ -0,0 +1,72 @@
+import React, { useState } from 'react';
+import type { HomepageApp } from '../../../types/app.types';
+import { useNavigationStore } from '../../../stores/navigationStore';
+import { usePersistenceStore } from '../../../stores/persistenceStore';
+
+interface AppIconProps {
+  app: HomepageApp;
+  isEditMode: boolean;
+  showLabel?: boolean;
+  isFloating?: boolean;
+}
+
+export const AppIcon: React.FC<AppIconProps> = ({ 
+  app, 
+  isEditMode, 
+  showLabel = true, 
+  isFloating = false 
+}) => {
+  const { openApp } = useNavigationStore();
+  const { removeFromHomeScreen } = usePersistenceStore();
+  const [isPressed, setIsPressed] = useState(false);
+
+  const handlePress = () => {
+    if (!isEditMode && (app.path || (app.process && app.publisher))) {
+      openApp(app);
+    }
+  };
+
+  const handleRemove = (e: React.MouseEvent) => {
+    e.stopPropagation();
+    removeFromHomeScreen(app.id);
+  };
+
+  return (
+    <div
+      className={`relative flex flex-col items-center justify-center p-2 rounded-xl cursor-pointer select-none transition-all
+        ${isPressed ? 'scale-95' : 'scale-100'}
+        ${isEditMode && isFloating ? 'animate-wiggle' : ''}
+        ${!isEditMode && isFloating ? 'hover:scale-110' : ''}
+        ${!app.path && !(app.process && app.publisher) && !app.base64_icon ? 'opacity-50' : ''}`}
+      onMouseDown={() => setIsPressed(true)}
+      onMouseUp={() => setIsPressed(false)}
+      onMouseLeave={() => setIsPressed(false)}
+      onClick={handlePress}
+    >
+      {isEditMode && isFloating && (
+        <button
+          onClick={handleRemove}
+          className="absolute -top-2 -right-2 w-6 h-6 bg-red-500 text-white rounded-full flex items-center justify-center text-xs z-10 shadow-lg hover:bg-red-600 transition-colors"
+        >
+          ×
+        </button>
+      )}
+
+      <div className="w-16 h-16 mb-1 rounded-2xl overflow-hidden flex items-center justify-center shadow-lg">
+        {app.base64_icon ? (
+          <img src={app.base64_icon} alt={app.label} className="w-full h-full object-cover" />
+        ) : (
+          <div className="w-full h-full flex items-center justify-center" style={{ backgroundColor: '#004FFF', border: '2px solid #353534' }}>
+            <span className="text-2xl text-white font-bold">{app.label[0]}</span>
+          </div>
+        )}
+      </div>
+
+      {showLabel && (
+        <span className="text-xs text-center max-w-full truncate text-white drop-shadow-md mt-1">
+          {app.label}
+        </span>
+      )}
+    </div>
+  );
+};
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Draggable.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Draggable.tsx
new file mode 100644
index 000000000..8c4f8b232
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Draggable.tsx
@@ -0,0 +1,140 @@
+import React, { useState, useEffect, useRef } from 'react';
+import type { Position } from '../../../types/app.types';
+
+interface DraggableProps {
+  id: string;
+  position: Position;
+  onMove: (position: Position) => void;
+  isEditMode: boolean;
+  children: React.ReactNode;
+  className?: string;
+  enableHtmlDrag?: boolean; // For app icons that need dock functionality
+}
+
+export const Draggable: React.FC<DraggableProps> = ({
+  id,
+  position,
+  onMove,
+  isEditMode,
+  children,
+  className = '',
+  enableHtmlDrag = true
+}) => {
+  const [isDragging, setIsDragging] = useState(false);
+  const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });
+  const elementRef = useRef<HTMLDivElement>(null);
+
+  const handleStart = (clientX: number, clientY: number) => {
+    if (!isEditMode) return;
+    setIsDragging(true);
+    setDragOffset({
+      x: clientX - position.x,
+      y: clientY - position.y,
+    });
+  };
+
+  const handleMove = (clientX: number, clientY: number) => {
+    if (!isDragging) return;
+
+    // Get element dimensions
+    const element = elementRef.current;
+    if (!element) return;
+
+    const rect = element.getBoundingClientRect();
+    const elementWidth = rect.width;
+    const elementHeight = rect.height;
+
+    // Calculate new position with bounds checking
+    // Reserve 120px at the bottom for the dock (dock height + padding)
+    const dockHeight = 120;
+    const newX = Math.max(0, Math.min(window.innerWidth - elementWidth, clientX - dragOffset.x));
+    const newY = Math.max(0, Math.min(window.innerHeight - elementHeight - dockHeight, clientY - dragOffset.y));
+
+    onMove({ x: newX, y: newY });
+  };
+
+  const handleEnd = () => {
+    if (isDragging) {
+      setIsDragging(false);
+      setDragOffset({ x: 0, y: 0 });
+    }
+  };
+
+  useEffect(() => {
+    const handleMouseMove = (e: MouseEvent) => handleMove(e.clientX, e.clientY);
+    const handleTouchMove = (e: TouchEvent) => {
+      e.preventDefault();
+      const touch = e.touches[0];
+      handleMove(touch.clientX, touch.clientY);
+    };
+    const handleMouseUp = (e: MouseEvent) => {
+      e.preventDefault();
+      handleEnd();
+    };
+    const handleTouchEnd = (e: TouchEvent) => {
+      e.preventDefault();
+      handleEnd();
+    };
+
+    if (isDragging) {
+      document.addEventListener('mousemove', handleMouseMove);
+      document.addEventListener('touchmove', handleTouchMove, { passive: false });
+      document.addEventListener('mouseup', handleMouseUp);
+      document.addEventListener('touchend', handleTouchEnd);
+    }
+
+    return () => {
+      document.removeEventListener('mousemove', handleMouseMove);
+      document.removeEventListener('touchmove', handleTouchMove);
+      document.removeEventListener('mouseup', handleMouseUp);
+      document.removeEventListener('touchend', handleTouchEnd);
+    };
+  }, [isDragging, dragOffset, onMove]);
+
+  const handleDragStart = (e: React.DragEvent) => {
+    if (!isEditMode) return;
+    e.dataTransfer.setData('appId', id);
+    e.dataTransfer.effectAllowed = 'move';
+    e.dataTransfer.dropEffect = 'move';
+  };
+
+  const handleDragEnd = () => {
+    // Cleanup if needed
+  };
+
+  return (
+    <div
+      ref={elementRef}
+      className={`absolute ${isDragging ? 'z-50' : ''} ${className}`}
+      style={{
+        left: `${position.x}px`,
+        top: `${position.y}px`,
+        cursor: isEditMode ? 'move' : 'default',
+        touchAction: isEditMode ? 'none' : 'auto',
+        pointerEvents: 'auto',
+        userSelect: 'none',
+        WebkitUserSelect: 'none',
+      }}
+      draggable={isEditMode && enableHtmlDrag}
+      onDragStart={handleDragStart}
+      onDragEnd={handleDragEnd}
+      onMouseDown={(e) => {
+        // Use custom drag for widgets, HTML5 drag for apps
+        if (!enableHtmlDrag && isEditMode) {
+          handleStart(e.clientX, e.clientY);
+        }
+      }}
+      onTouchStart={(e) => {
+        // Only handle touch for widgets (when enableHtmlDrag is false)
+        if (isEditMode && !enableHtmlDrag) {
+          e.preventDefault();
+          e.stopPropagation();
+          const touch = e.touches[0];
+          handleStart(touch.clientX, touch.clientY);
+        }
+      }}
+    >
+      {children}
+    </div>
+  );
+};
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx
new file mode 100644
index 000000000..c4412c55b
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx
@@ -0,0 +1,89 @@
+import React, { useState } from 'react';
+import { useNavigationStore } from '../../../stores/navigationStore';
+
+export const GestureZone: React.FC = () => {
+  const { toggleRecentApps, runningApps, currentAppId, switchToApp } = useNavigationStore();
+  const [touchStart, setTouchStart] = useState<{ x: number; y: number } | null>(null);
+  const [isActive, setIsActive] = useState(false);
+  const [isHovered, setIsHovered] = useState(false);
+
+  // Touch handlers
+  const handleTouchStart = (e: React.TouchEvent) => {
+    const touch = e.touches[0];
+    setTouchStart({ x: touch.clientX, y: touch.clientY });
+    setIsActive(true);
+  };
+
+  const handleTouchMove = (e: React.TouchEvent) => {
+    if (!touchStart) return;
+
+    const touch = e.touches[0];
+    const deltaX = touchStart.x - touch.clientX;
+    const deltaY = touch.clientY - touchStart.y;
+
+    // Swipe left (show recent apps)
+    if (deltaX > 50 && Math.abs(deltaY) < 30) {
+      toggleRecentApps();
+      setTouchStart(null);
+    }
+
+    // Swipe up/down (switch apps)
+    if (Math.abs(deltaY) > 50 && Math.abs(deltaX) < 30) {
+      const currentIndex = runningApps.findIndex(app => app.id === currentAppId);
+      if (currentIndex !== -1) {
+        const newIndex = deltaY > 0
+          ? Math.min(currentIndex + 1, runningApps.length - 1)
+          : Math.max(currentIndex - 1, 0);
+        if (newIndex !== currentIndex) {
+          switchToApp(runningApps[newIndex].id);
+        }
+      }
+      setTouchStart(null);
+    }
+  };
+
+  const handleTouchEnd = () => {
+    setTouchStart(null);
+    setIsActive(false);
+  };
+
+  // Desktop click handler
+  const handleClick = () => {
+    toggleRecentApps();
+  };
+
+  return (
+    <>
+      <div
+        className={`fixed right-0 top-0 w-8 h-full z-40 transition-all cursor-pointer
+          ${isActive ? 'bg-white/20 w-12' : ''}
+          ${isHovered && !isActive ? 'bg-gradient-to-l from-white/10 to-transparent' : ''}`}
+        onTouchStart={handleTouchStart}
+        onTouchMove={handleTouchMove}
+        onTouchEnd={handleTouchEnd}
+        onClick={handleClick}
+        onMouseEnter={() => setIsHovered(true)}
+        onMouseLeave={() => setIsHovered(false)}
+      />
+      {/* Desktop hint */}
+      {isHovered && !isActive && (
+        <div className="fixed right-12 top-1/2 transform -translate-y-1/2 bg-black/90 backdrop-blur text-white px-4 py-3 rounded-lg text-sm pointer-events-none z-50 shadow-xl">
+          <div className="flex items-center gap-2 mb-1">
+            <kbd className="px-2 py-1 bg-white/20 rounded text-xs">Click</kbd>
+            <span>or</span>
+            <kbd className="px-2 py-1 bg-white/20 rounded text-xs">S</kbd>
+            <span>Recent apps</span>
+          </div>
+          <div className="flex items-center gap-2 mb-1">
+            <kbd className="px-2 py-1 bg-white/20 rounded text-xs">A</kbd>
+            <span>All apps</span>
+          </div>
+          <div className="flex items-center gap-2">
+            <kbd className="px-2 py-1 bg-white/20 rounded text-xs">H</kbd>
+            <span>Home</span>
+          </div>
+        </div>
+      )}
+    </>
+  );
+};
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx
new file mode 100644
index 000000000..670852ca6
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx
@@ -0,0 +1,469 @@
+import React, { useMemo, useEffect } from 'react';
+import { useAppStore } from '../../../stores/appStore';
+import { usePersistenceStore } from '../../../stores/persistenceStore';
+import { useNavigationStore } from '../../../stores/navigationStore';
+import { Draggable } from './Draggable';
+import { AppIcon } from './AppIcon';
+import { Widget } from './Widget';
+import type { HomepageApp } from '../../../types/app.types';
+
+export const HomeScreen: React.FC = () => {
+  const { apps } = useAppStore();
+  const { homeScreenApps, dockApps, appPositions, widgetSettings, toggleWidget, moveItem, backgroundImage, setBackgroundImage, addToDock, removeFromDock } = usePersistenceStore();
+  const { isEditMode, setEditMode } = useAppStore();
+  const { toggleAppDrawer } = useNavigationStore();
+  const [draggedAppId, setDraggedAppId] = React.useState<string | null>(null);
+  const [touchDragPosition, setTouchDragPosition] = React.useState<{ x: number; y: number } | null>(null);
+  const [showEditPanels, setShowEditPanels] = React.useState(false);
+
+  const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0];
+    if (file) {
+      const reader = new FileReader();
+      reader.onload = (event) => {
+        const dataUrl = event.target?.result as string;
+        setBackgroundImage(dataUrl);
+      };
+      reader.readAsDataURL(file);
+    }
+  };
+
+  const handleDockDrop = (e: React.DragEvent, index: number) => {
+    e.preventDefault();
+    e.stopPropagation();
+    const appId = e.dataTransfer.getData('appId');
+    if (appId) {
+      // Add to dock at the specified index
+      // The addToDock function handles removing from existing position if needed
+      addToDock(appId, index);
+    }
+  };
+
+  const handleDockDragOver = (e: React.DragEvent) => {
+    e.preventDefault();
+    e.dataTransfer.dropEffect = 'move';
+  };
+
+  // Touch drag handlers for mobile
+  const handleTouchStart = (appId: string) => (e: React.TouchEvent) => {
+    if (!isEditMode) return;
+    e.stopPropagation();
+    setDraggedAppId(appId);
+    const touch = e.touches[0];
+    setTouchDragPosition({ x: touch.clientX, y: touch.clientY });
+  };
+
+  const handleTouchMove = (e: React.TouchEvent) => {
+    if (!draggedAppId || !touchDragPosition) return;
+    e.preventDefault();
+    const touch = e.touches[0];
+    setTouchDragPosition({ x: touch.clientX, y: touch.clientY });
+  };
+
+  const handleTouchEnd = (e: React.TouchEvent) => {
+    if (!draggedAppId || !touchDragPosition) return;
+    
+    const touch = e.changedTouches[0];
+    const element = document.elementFromPoint(touch.clientX, touch.clientY);
+    
+    // Check if dropped on dock area
+    const dockElement = element?.closest('.dock-area');
+    if (dockElement) {
+      // Find which dock slot was targeted
+      const dockSlots = dockElement.querySelectorAll('[data-dock-index]');
+      let targetIndex = dockApps.length;
+      
+      dockSlots.forEach((slot, index) => {
+        const rect = slot.getBoundingClientRect();
+        if (touch.clientX >= rect.left && touch.clientX <= rect.right &&
+            touch.clientY >= rect.top && touch.clientY <= rect.bottom) {
+          targetIndex = index;
+        }
+      });
+      
+      addToDock(draggedAppId, targetIndex);
+    } else {
+      // If not dropped on dock, just move the app to the new position
+      const dockHeight = 120;
+      const maxY = window.innerHeight - 80 - dockHeight;
+      moveItem(draggedAppId, { 
+        x: touch.clientX - 40, 
+        y: Math.min(touch.clientY - 40, maxY) 
+      });
+    }
+    
+    setDraggedAppId(null);
+    setTouchDragPosition(null);
+  };
+
+  // Handle window resize to keep apps on screen
+  useEffect(() => {
+    const handleResize = () => {
+      const windowWidth = window.innerWidth;
+      const windowHeight = window.innerHeight;
+
+      // Check and reposition apps
+      Object.entries(appPositions).forEach(([appId, position]) => {
+        let needsUpdate = false;
+        let newX = position.x;
+        let newY = position.y;
+
+        // Assuming app icons are roughly 80px wide/tall (including padding)
+        const appSize = 80;
+        const dockHeight = 120; // Reserve space for dock
+
+        if (position.x + appSize > windowWidth) {
+          newX = Math.max(0, windowWidth - appSize);
+          needsUpdate = true;
+        }
+
+        if (position.y + appSize > windowHeight - dockHeight) {
+          newY = Math.max(0, windowHeight - appSize - dockHeight);
+          needsUpdate = true;
+        }
+
+        if (needsUpdate) {
+          moveItem(appId, { x: newX, y: newY });
+        }
+      });
+
+      // Check and reposition widgets
+      Object.entries(widgetSettings).forEach(([appId, settings]) => {
+        if (settings.position && settings.size) {
+          let needsUpdate = false;
+          let newX = settings.position.x;
+          let newY = settings.position.y;
+
+          if (settings.position.x + settings.size.width > windowWidth) {
+            newX = Math.max(0, windowWidth - settings.size.width);
+            needsUpdate = true;
+          }
+
+          if (settings.position.y + settings.size.height > windowHeight) {
+            newY = Math.max(0, windowHeight - settings.size.height);
+            needsUpdate = true;
+          }
+
+          if (needsUpdate) {
+            usePersistenceStore.getState().setWidgetPosition(appId, { x: newX, y: newY });
+          }
+        }
+      });
+    };
+
+    window.addEventListener('resize', handleResize);
+    return () => window.removeEventListener('resize', handleResize);
+  }, [appPositions, widgetSettings, moveItem]);
+
+  const homeApps = useMemo(() => {
+    return apps.filter(app => homeScreenApps.includes(app.id));
+  }, [apps, homeScreenApps]);
+
+  const widgetApps = useMemo(() => {
+    return homeApps.filter(app => app.widget && !widgetSettings[app.id]?.hide);
+  }, [homeApps, widgetSettings]);
+
+  // Get actual dock app objects from IDs
+  const dockAppsList = useMemo(() => {
+    return dockApps
+      .map(id => apps.find(app => app.id === id))
+      .filter(Boolean) as HomepageApp[];
+  }, [apps, dockApps]);
+
+  // Floating apps are all home apps that aren't in the dock
+  const floatingApps = useMemo(() => {
+    return homeApps.filter(app => !dockApps.includes(app.id));
+  }, [homeApps, dockApps]);
+
+  return (
+    <div
+      className="h-full w-full relative overflow-hidden"
+      style={{
+        backgroundColor: backgroundImage ? 'transparent' : '#353534',
+        backgroundImage: backgroundImage ? `url(${backgroundImage})` : 'none',
+        backgroundSize: 'cover',
+        backgroundPosition: 'center',
+        backgroundRepeat: 'no-repeat',
+        touchAction: 'none'
+      }}
+    >
+      {/* Background overlay for better text readability */}
+      {backgroundImage && (
+        <div className="absolute inset-0 bg-black/20" />
+      )}
+
+      {/* Content */}
+      <div
+        className="relative z-10 h-full"
+        onDragOver={(e) => {
+          e.preventDefault();
+          e.dataTransfer.dropEffect = 'move';
+        }}
+        onDrop={(e) => {
+          e.preventDefault();
+          const appId = e.dataTransfer.getData('appId');
+          // Only handle drops from dock apps or if dropping outside dock area
+          const isDroppingOnDock = (e.target as HTMLElement).closest('.dock-area');
+          if (appId && !isDroppingOnDock) {
+            if (dockApps.includes(appId)) {
+              removeFromDock(appId);
+            }
+            // Ensure dropped app doesn't go behind dock
+            const dockHeight = 120;
+            const maxY = window.innerHeight - 80 - dockHeight; // 80 is app icon height
+            moveItem(appId, { 
+              x: e.clientX - 40, 
+              y: Math.min(e.clientY - 40, maxY) 
+            });
+          }
+        }}
+        onTouchMove={(e) => {
+          const touch = e.touches[0];
+          const element = document.elementFromPoint(touch.clientX, touch.clientY);
+          if (element?.closest('.dock-area')) {
+            e.preventDefault();
+          }
+        }}
+      >
+        {/* Floating apps on canvas */}
+        {floatingApps.map(app => {
+          const position = appPositions[app.id] || {
+            x: Math.min(Math.random() * (window.innerWidth - 100), window.innerWidth - 80),
+            y: Math.min(window.innerHeight - 200 - Math.random() * 100, window.innerHeight - 80)
+          };
+
+          return (
+            <Draggable
+              key={app.id}
+              id={app.id}
+              position={position}
+              onMove={(pos) => moveItem(app.id, pos)}
+              isEditMode={isEditMode}
+            >
+              <div
+                onTouchStart={handleTouchStart(app.id)}
+                onTouchMove={handleTouchMove}
+                onTouchEnd={handleTouchEnd}
+              >
+                <AppIcon app={app} isEditMode={isEditMode} isFloating={true} />
+              </div>
+            </Draggable>
+          );
+        })}
+
+        {/* Widgets */}
+        {widgetApps.map(app => (
+          <Widget key={app.id} app={app} />
+        ))}
+
+        {/* Dock at bottom */}
+        <div
+          className="dock-area absolute bottom-4 left-1/2 transform -translate-x-1/2"
+          onDragOver={handleDockDragOver}
+          onDrop={(e) => handleDockDrop(e, dockAppsList.length)}
+        >
+          <div className="bg-black/60 backdrop-blur-xl rounded-3xl p-3 flex items-center gap-2 shadow-2xl border border-white/20">
+            {/* Dock slots */}
+            {Array.from({ length: 4 }).map((_, index) => {
+              const app = dockAppsList[index];
+              return (
+                <div
+                  key={`slot-${index}`}
+                  data-dock-index={index}
+                  className="w-16 h-16 relative"
+                  onDragOver={handleDockDragOver}
+                  onDrop={(e) => {
+                    e.stopPropagation();
+                    handleDockDrop(e, index);
+                  }}
+                >
+                  {app ? (
+                    isEditMode ? (
+                      <div
+                        draggable
+                        onDragStart={(e) => {
+                          e.dataTransfer.setData('appId', app.id);
+                          e.dataTransfer.effectAllowed = 'move';
+                        }}
+                        onDragEnd={() => {
+                          // If dropped outside, it's handled by floating area
+                        }}
+                        onTouchStart={handleTouchStart(app.id)}
+                        onTouchMove={handleTouchMove}
+                        onTouchEnd={(e) => {
+                          if (!draggedAppId || !touchDragPosition) return;
+                          
+                          const touch = e.changedTouches[0];
+                          const element = document.elementFromPoint(touch.clientX, touch.clientY);
+                          
+                          // If not dropped on dock, remove from dock
+                          if (!element?.closest('.dock-area')) {
+                            removeFromDock(app.id);
+                            // Place at drop position
+                            const dockHeight = 120;
+                            const maxY = window.innerHeight - 80 - dockHeight;
+                            moveItem(app.id, { 
+                              x: touch.clientX - 40, 
+                              y: Math.min(touch.clientY - 40, maxY) 
+                            });
+                          }
+                          
+                          setDraggedAppId(null);
+                          setTouchDragPosition(null);
+                        }}
+                      >
+                        <AppIcon app={app} isEditMode={false} showLabel={false} />
+                      </div>
+                    ) : (
+                      <AppIcon app={app} isEditMode={false} showLabel={false} />
+                    )
+                  ) : (
+                    <div className="w-full h-full border-2 border-dashed border-white/20 rounded-2xl transition-all hover:border-white/40 hover:bg-white/5" />
+                  )}
+                </div>
+              );
+            })}
+            <div className="w-px h-12 bg-white/20 mx-1" />
+            <button
+              onClick={toggleAppDrawer}
+              className="w-16 h-16 bg-gradient-to-br from-gray-700 to-gray-800 backdrop-blur rounded-2xl flex items-center justify-center text-white text-2xl hover:from-gray-600 hover:to-gray-700 transition-all shadow-lg"
+            >
+              ⊞
+            </button>
+          </div>
+        </div>
+
+        {/* Touch drag preview */}
+        {draggedAppId && touchDragPosition && (
+          <div
+            className="fixed z-50 pointer-events-none opacity-75"
+            style={{
+              left: touchDragPosition.x - 40,
+              top: touchDragPosition.y - 40,
+            }}
+          >
+            <AppIcon 
+              app={apps.find(a => a.id === draggedAppId)!} 
+              isEditMode={false} 
+              showLabel={false} 
+            />
+          </div>
+        )}
+
+        {/* Edit mode toggle and widget settings */}
+        <div className="absolute top-4 right-4 flex flex-col items-end gap-2">
+          {!isEditMode && (
+            <button
+              onClick={() => setEditMode(true)}
+              className="px-4 py-2 bg-white/10 backdrop-blur-xl rounded-full text-white text-sm font-medium hover:bg-white/20 transition-all shadow-lg border border-white/20"
+            >
+              Edit
+            </button>
+          )}
+
+          {isEditMode && (
+            <div className="flex flex-col items-end gap-2">
+              <div className="flex items-center gap-2">
+                <button
+                  onClick={() => setShowEditPanels(!showEditPanels)}
+                  className="w-10 h-10 bg-white/10 backdrop-blur-xl rounded-full text-white hover:bg-white/20 transition-all shadow-lg border border-white/20 flex items-center justify-center"
+                  title="Settings"
+                >
+                  ⚙️
+                </button>
+                <button
+                  onClick={() => {
+                    setEditMode(false);
+                    setShowEditPanels(false);
+                  }}
+                  className="px-4 py-2 bg-gradient-to-r from-gray-600 to-gray-700 rounded-full text-white text-sm font-medium hover:shadow-lg transition-all shadow-lg"
+                >
+                  Done
+                </button>
+              </div>
+              
+              {showEditPanels && (
+                <div className="flex items-start gap-2">
+                  {/* Background Settings */}
+                  <div className="bg-black/80 backdrop-blur-xl rounded-2xl p-4 shadow-2xl border border-white/20">
+                <h3 className="text-white text-sm font-semibold mb-3">Background</h3>
+                <div className="space-y-3">
+                  <div>
+                    <label className="text-white/80 text-xs">Upload Image:</label>
+                    <input
+                      type="file"
+                      accept="image/*"
+                      onChange={handleImageUpload}
+                      className="hidden"
+                      id="background-upload"
+                    />
+                    <label
+                      htmlFor="background-upload"
+                      className="mt-1 w-full px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white text-sm cursor-pointer hover:bg-white/20 transition-all flex items-center justify-center"
+                    >
+                      Choose Image
+                    </label>
+                  </div>
+                  <div className="text-white/60 text-xs text-center">OR</div>
+                  <div>
+                    <label className="text-white/80 text-xs">Image URL:</label>
+                    <input
+                      type="text"
+                      value={backgroundImage && !backgroundImage.startsWith('data:') ? backgroundImage : ''}
+                      onChange={(e) => setBackgroundImage(e.target.value || null)}
+                      placeholder="Enter image URL"
+                      className="w-full mt-1 px-3 py-2 bg-white/10 border border-white/20 rounded-lg text-white text-sm placeholder-white/40 focus:outline-none focus:border-white/40"
+                    />
+                  </div>
+                  {backgroundImage && (
+                    <button
+                      onClick={() => setBackgroundImage(null)}
+                      className="w-full px-3 py-1.5 bg-red-500/30 hover:bg-red-500/50 rounded-lg text-white text-sm font-medium transition-all"
+                    >
+                      Remove Background
+                    </button>
+                  )}
+                </div>
+              </div>
+              <div className="bg-black/80 backdrop-blur-xl rounded-2xl p-4 max-w-xs shadow-2xl border border-white/20">
+                <h3 className="text-white text-sm font-semibold mb-3">Widget Manager</h3>
+                <div className="space-y-2 max-h-64 overflow-y-auto">
+                  {homeApps.filter(app => app.widget).map(app => (
+                    <div key={app.id} className="flex items-center justify-between text-white/80 text-sm p-2 rounded-lg hover:bg-white/10 transition-colors">
+                      <span>{app.label}</span>
+                      <button
+                        onClick={() => toggleWidget(app.id)}
+                        className={`px-3 py-1 rounded-full text-xs font-medium transition-all ${
+                          widgetSettings[app.id]?.hide
+                            ? 'bg-white/10 hover:bg-white/20'
+                            : 'bg-gray-600/50 hover:bg-gray-600/70'
+                        }`}
+                      >
+                        {widgetSettings[app.id]?.hide ? 'Show' : 'Hide'}
+                      </button>
+                    </div>
+                  ))}
+                  {homeApps.filter(app => app.widget).length === 0 && (
+                    <p className="text-white/50 text-sm text-center py-4">No apps with widgets on home screen</p>
+                  )}
+                </div>
+              </div>
+                </div>
+              )}
+            </div>
+          )}
+        </div>
+
+        {/* Desktop hint */}
+        <div className="hidden md:block absolute bottom-32 left-4 text-white/30 text-xs bg-black/50 backdrop-blur rounded-lg px-3 py-2">
+          <div className="flex items-center gap-4">
+            <span><kbd className="px-2 py-1 bg-white/10 rounded text-xs">A</kbd> All apps</span>
+            <span><kbd className="px-2 py-1 bg-white/10 rounded text-xs">S</kbd> Recent apps</span>
+            <span><kbd className="px-2 py-1 bg-white/10 rounded text-xs">H</kbd> Home</span>
+            <span><kbd className="px-2 py-1 bg-white/10 rounded text-xs">1-9</kbd> Switch apps</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+};
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx
new file mode 100644
index 000000000..de739565d
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx
@@ -0,0 +1,83 @@
+import React from 'react';
+import { useNavigationStore } from '../../../stores/navigationStore';
+
+export const RecentApps: React.FC = () => {
+  const { runningApps, isRecentAppsOpen, switchToApp, closeApp, toggleRecentApps, closeAllOverlays } = useNavigationStore();
+
+  if (!isRecentAppsOpen) return null;
+
+  return (
+    <div className="fixed inset-0 bg-gradient-to-b from-gray-900/98 to-black/98 backdrop-blur-xl z-50 flex items-center justify-center">
+      {runningApps.length === 0 ? (
+        <div className="text-center">
+          <div className="text-6xl mb-4 text-white/30">📱</div>
+          <h2 className="text-xl text-white/70 mb-2">No running apps</h2>
+          <p className="text-white/50 mb-8">Open an app to see it here</p>
+          <button
+            onClick={closeAllOverlays}
+            className="px-6 py-3 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full text-white font-medium hover:shadow-lg transition-all transform hover:scale-105"
+          >
+            🏠 Back to Home
+          </button>
+        </div>
+      ) : (
+        <>
+          <div className="w-full max-w-6xl h-[70vh] overflow-x-auto">
+            <div className="flex gap-4 p-4 h-full items-center justify-center flex-wrap">
+              {runningApps.map(app => (
+                <div
+                  key={app.id}
+                  className="relative flex-shrink-0 w-72 h-96 bg-gradient-to-b from-gray-800 to-gray-900 rounded-3xl overflow-hidden cursor-pointer group transform transition-all hover:scale-105 hover:shadow-2xl"
+                  onClick={() => switchToApp(app.id)}
+                >
+                  <div className="p-4 bg-gradient-to-r from-blue-500/20 to-purple-500/20 flex items-center justify-between">
+                    <div className="flex items-center gap-3">
+                      {app.base64_icon ? (
+                        <img src={app.base64_icon} alt={app.label} className="w-10 h-10 rounded-xl" />
+                      ) : (
+                        <div className="w-10 h-10 rounded-xl bg-gradient-to-br from-blue-400 to-blue-600 flex items-center justify-center text-white font-bold">
+                          {app.label[0]}
+                        </div>
+                      )}
+                      <span className="text-white font-medium">{app.label}</span>
+                    </div>
+                    <button
+                      onClick={(e) => {
+                        e.stopPropagation();
+                        closeApp(app.id);
+                      }}
+                      className="text-white/50 hover:text-white transition-colors text-xl"
+                    >
+                      ×
+                    </button>
+                  </div>
+
+                  <div className="p-8 text-white/50 text-center flex flex-col items-center justify-center h-full">
+                    <div className="text-8xl mb-4 opacity-20">⧉</div>
+                    <p className="text-lg">App Preview</p>
+                    <p className="text-sm mt-2 opacity-50">Click to switch</p>
+                  </div>
+                </div>
+              ))}
+            </div>
+          </div>
+
+          <div className="absolute bottom-8 left-1/2 transform -translate-x-1/2 flex gap-4">
+            <button
+              onClick={closeAllOverlays}
+              className="px-6 py-3 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full text-white font-medium hover:shadow-lg transition-all transform hover:scale-105"
+            >
+              🏠 Home
+            </button>
+            <button
+              onClick={toggleRecentApps}
+              className="px-6 py-3 bg-white/10 backdrop-blur rounded-full text-white hover:bg-white/20 transition-all"
+            >
+              Close
+            </button>
+          </div>
+        </>
+      )}
+    </div>
+  );
+};
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx
new file mode 100644
index 000000000..730cbe812
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx
@@ -0,0 +1,158 @@
+import React, { useState, useRef } from 'react';
+import type { HomepageApp } from '../../../types/app.types';
+import { usePersistenceStore } from '../../../stores/persistenceStore';
+import { useAppStore } from '../../../stores/appStore';
+import { Draggable } from './Draggable';
+
+interface WidgetProps {
+  app: HomepageApp;
+}
+
+export const Widget: React.FC<WidgetProps> = ({ app }) => {
+  const { toggleWidget, widgetSettings, setWidgetPosition, setWidgetSize } = usePersistenceStore();
+  const { isEditMode } = useAppStore();
+  const [isLoading, setIsLoading] = useState(true);
+  const [hasError, setHasError] = useState(false);
+  const [isResizing, setIsResizing] = useState(false);
+  const resizeRef = useRef<HTMLDivElement>(null);
+
+  const settings = widgetSettings[app.id] || {};
+  if (settings.hide) return null;
+
+  const position = settings.position || { x: 50, y: 50 };
+  const size = settings.size || { width: 300, height: 200 };
+
+  // Widgets can either have widget HTML content or be loaded from their app URL
+  const isHtmlWidget = app.widget && app.widget !== 'true' && app.widget.includes('<');
+
+  const handleError = () => {
+    setHasError(true);
+    setIsLoading(false);
+  };
+
+  const handleResize = (e: React.MouseEvent | React.TouchEvent) => {
+    e.preventDefault();
+    e.stopPropagation();
+    if (!isEditMode) return;
+
+    const isTouch = 'touches' in e;
+    const startX = isTouch ? (e as React.TouchEvent).touches[0].clientX : (e as React.MouseEvent).clientX;
+    const startY = isTouch ? (e as React.TouchEvent).touches[0].clientY : (e as React.MouseEvent).clientY;
+    const startWidth = size.width;
+    const startHeight = size.height;
+
+    const handleMove = (clientX: number, clientY: number) => {
+      // Calculate new size with minimum constraints
+      const newWidth = Math.max(200, startWidth + clientX - startX);
+      const newHeight = Math.max(150, startHeight + clientY - startY);
+
+      // Ensure widget doesn't extend beyond screen boundaries
+      const maxWidth = window.innerWidth - position.x;
+      const maxHeight = window.innerHeight - position.y;
+
+      const constrainedWidth = Math.min(newWidth, maxWidth);
+      const constrainedHeight = Math.min(newHeight, maxHeight);
+
+      setWidgetSize(app.id, { width: constrainedWidth, height: constrainedHeight });
+    };
+
+    const handleMouseMove = (e: MouseEvent) => handleMove(e.clientX, e.clientY);
+    const handleTouchMove = (e: TouchEvent) => {
+      e.preventDefault();
+      handleMove(e.touches[0].clientX, e.touches[0].clientY);
+    };
+
+    const handleEnd = () => {
+      document.removeEventListener('mousemove', handleMouseMove);
+      document.removeEventListener('touchmove', handleTouchMove);
+      document.removeEventListener('mouseup', handleEnd);
+      document.removeEventListener('touchend', handleEnd);
+      setIsResizing(false);
+    };
+
+    setIsResizing(true);
+    document.addEventListener('mousemove', handleMouseMove);
+    document.addEventListener('touchmove', handleTouchMove, { passive: false });
+    document.addEventListener('mouseup', handleEnd);
+    document.addEventListener('touchend', handleEnd);
+  };
+
+  return (
+    <Draggable
+      id={`widget-${app.id}`}
+      position={position}
+      onMove={(pos) => setWidgetPosition(app.id, pos)}
+      isEditMode={isEditMode}
+      enableHtmlDrag={false}
+    >
+      <div
+        className={`bg-black/80 backdrop-blur-xl rounded-2xl overflow-hidden shadow-2xl border border-white/20
+          ${isEditMode ? 'ring-2 ring-blue-400' : ''}
+          ${isResizing ? 'pointer-events-none' : ''}`}
+        style={{ width: `${size.width}px`, height: `${size.height}px` }}
+      >
+        <div className="flex items-center justify-between bg-gradient-to-r from-blue-500/20 to-purple-500/20 px-3 py-2 border-b border-white/10">
+          <span className="text-white/90 text-sm font-medium">{app.label}</span>
+          {isEditMode && (
+            <button
+              onClick={(e) => {
+                e.stopPropagation();
+                toggleWidget(app.id);
+              }}
+              className="w-6 h-6 bg-red-500 text-white rounded-md flex items-center justify-center text-sm hover:bg-red-600 transition-colors"
+            >
+              ×
+            </button>
+          )}
+        </div>
+
+        <div className="relative w-full h-[calc(100%-40px)]">
+          {isLoading && !isHtmlWidget && !hasError && (
+            <div className="absolute inset-0 flex flex-col items-center justify-center bg-black/50">
+              <div className="text-white/70 animate-pulse">
+                <div className="w-8 h-8 border-2 border-white/30 border-t-white/70 rounded-full animate-spin mb-2"></div>
+                <div className="text-sm">Loading...</div>
+              </div>
+            </div>
+          )}
+
+          {hasError ? (
+            <div className="flex flex-col items-center justify-center h-full text-white/50 text-center p-4">
+              <div className="text-3xl mb-2">⚠️</div>
+              <div className="text-sm">Failed to load widget</div>
+            </div>
+          ) : isHtmlWidget ? (
+            <iframe
+              srcDoc={app.widget}
+              className="w-full h-full bg-white"
+              sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-modals"
+              onLoad={() => setIsLoading(false)}
+              onError={handleError}
+            />
+          ) : (
+            <iframe
+              src={app.path || `/app:${app.process}:${app.publisher}.os/`}
+              className="w-full h-full bg-white"
+              onLoad={() => setIsLoading(false)}
+              onError={handleError}
+              // Enhanced permissions for CORS
+              allow="accelerometer; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; usb; xr-spatial-tracking"
+              // Minimal sandbox for widget functionality
+              sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-modals allow-downloads allow-presentation allow-top-navigation-by-user-activation"
+            />
+          )}
+        </div>
+
+        {isEditMode && (
+          <div
+            ref={resizeRef}
+            className="absolute bottom-0 right-0 w-6 h-6 bg-blue-400 cursor-se-resize rounded-tl-lg touch-action-none"
+            onMouseDown={handleResize}
+            onTouchStart={handleResize}
+            style={{ touchAction: 'none' }}
+          />
+        )}
+      </div>
+    </Draggable>
+  );
+};
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx
new file mode 100644
index 000000000..1a631bafd
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx
@@ -0,0 +1,128 @@
+import { useState, useEffect } from 'react';
+import { useAppStore } from '../../stores/appStore';
+import { useNavigationStore } from '../../stores/navigationStore';
+import { HomeScreen } from './components/HomeScreen';
+import { AppContainer } from './components/AppContainer';
+import { AppDrawer } from './components/AppDrawer';
+import { RecentApps } from './components/RecentApps';
+import { GestureZone } from './components/GestureZone';
+import PWAUpdateNotification from '../PWAUpdateNotification';
+import PWAInstallPrompt from '../PWAInstallPrompt';
+import './styles/animations.css';
+
+export default function AndroidHomescreen() {
+  const { setApps } = useAppStore();
+  const {
+    runningApps,
+    currentAppId,
+    isAppDrawerOpen,
+    isRecentAppsOpen,
+    toggleRecentApps,
+    switchToApp,
+    toggleAppDrawer,
+    closeAllOverlays
+  } = useNavigationStore();
+  const [loading, setLoading] = useState(true);
+
+  // Keyboard shortcuts for desktop
+  useEffect(() => {
+    const handleKeyPress = (e: KeyboardEvent) => {
+      // Ignore if user is typing in an input
+      if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
+
+      // Single key shortcuts
+      switch(e.key.toLowerCase()) {
+        case 'a':
+          e.preventDefault();
+          if (!isAppDrawerOpen) toggleAppDrawer();
+          break;
+        case 's':
+          e.preventDefault();
+          if (!isRecentAppsOpen) toggleRecentApps();
+          break;
+        case 'h':
+          e.preventDefault();
+          closeAllOverlays();
+          break;
+        case 'escape':
+          e.preventDefault();
+          closeAllOverlays();
+          break;
+      }
+
+      // Number keys to switch apps
+      if (e.key >= '1' && e.key <= '9') {
+        const index = parseInt(e.key) - 1;
+        if (runningApps[index]) {
+          e.preventDefault();
+          switchToApp(runningApps[index].id);
+        }
+      }
+    };
+
+    window.addEventListener('keydown', handleKeyPress);
+    return () => window.removeEventListener('keydown', handleKeyPress);
+  }, [runningApps, isRecentAppsOpen, isAppDrawerOpen, toggleRecentApps, toggleAppDrawer, switchToApp, closeAllOverlays]);
+
+  // Fetch apps from backend
+  useEffect(() => {
+    fetch('/apps', { credentials: 'include' })
+      .then(res => res.json())
+      .then(data => {
+        setApps(data);
+        setLoading(false);
+      })
+      .catch((error) => {
+        console.warn('Failed to fetch apps from backend:', error);
+        // Fallback demo apps for development
+        setApps([
+          { id: '1', process: 'settings', package_name: 'settings', publisher: 'sys', path: '/app:settings:sys.os/', label: 'Settings', order: 1, favorite: true },
+          { id: '2', process: 'files', package_name: 'files', publisher: 'sys', path: '/app:files:sys.os/', label: 'Files', order: 2, favorite: false },
+          { id: '3', process: 'terminal', package_name: 'terminal', publisher: 'sys', path: '/app:terminal:sys.os/', label: 'Terminal', order: 3, favorite: false },
+          { id: '4', process: 'browser', package_name: 'browser', publisher: 'sys', path: '/app:browser:sys.os/', label: 'Browser', order: 4, favorite: true },
+          { id: '5', process: 'app-store', package_name: 'app-store', publisher: 'sys', path: '/main:app-store:sys/', label: 'App Store', order: 5, favorite: false, widget: 'true' },
+        ]);
+        setLoading(false);
+      });
+  }, [setApps]);
+
+  if (loading) {
+    return (
+      <div className="fixed inset-0 bg-gradient-to-br from-gray-900 to-black flex items-center justify-center">
+        <div className="text-center">
+          <div className="w-16 h-16 border-4 border-gray-700 border-t-blue-500 rounded-full animate-spin mb-4"></div>
+          <div className="text-gray-300 text-xl">Loading Hyperware...</div>
+        </div>
+      </div>
+    );
+  }
+
+  return (
+    <div className="fixed inset-0 overflow-hidden" style={{ touchAction: 'none' }}>
+      {/* Home Screen */}
+      <HomeScreen />
+
+      {/* Running Apps */}
+      {runningApps.map(app => (
+        <AppContainer
+          key={app.id}
+          app={app}
+          isVisible={currentAppId === app.id && !isAppDrawerOpen && !isRecentAppsOpen}
+        />
+      ))}
+
+      {/* Overlays */}
+      <AppDrawer />
+      <RecentApps />
+
+      {/* Gesture Zone */}
+      <GestureZone />
+
+      {/* PWA Update Notification */}
+      <PWAUpdateNotification />
+
+      {/* PWA Install Prompt */}
+      <PWAInstallPrompt />
+    </div>
+  );
+}
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/styles/animations.css b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/styles/animations.css
new file mode 100644
index 000000000..12cf2611f
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/styles/animations.css
@@ -0,0 +1,23 @@
+@keyframes wiggle {
+  0%, 100% { transform: rotate(-3deg); }
+  50% { transform: rotate(3deg); }
+}
+
+.animate-wiggle {
+  animation: wiggle 0.3s ease-in-out infinite;
+}
+
+@keyframes slide-down {
+  from {
+    transform: translateY(-100%);
+    opacity: 0;
+  }
+  to {
+    transform: translateY(0);
+    opacity: 1;
+  }
+}
+
+.animate-slide-down {
+  animation: slide-down 0.3s ease-out;
+}
diff --git a/hyperdrive/packages/homepage/ui/src/components/AppDisplay.tsx b/hyperdrive/packages/homepage/ui/src/components/AppDisplay.tsx
deleted file mode 100644
index fdc3295c7..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/AppDisplay.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { HomepageApp } from "../store/homepageStore";
-
-interface AppDisplayProps {
-  app?: HomepageApp;
-}
-
-const AppDisplay: React.FC<AppDisplayProps> = ({ app }) => {
-  return (
-    <a
-      id={app?.package_name}
-      href={app?.path || undefined}
-      className="p-2 flex gap-2 items-center"
-      title={app?.label}
-      style={
-        !app?.path
-          ? {
-            pointerEvents: "none",
-            textDecoration: "none !important",
-            filter: "grayscale(100%)",
-          }
-          : {
-            touchAction: "manipulation",
-            WebkitTapHighlightColor: "transparent",
-          }
-      }
-    >
-      {app?.base64_icon ? (
-        <img className="w-8 h-8 object-cover rounded-lg" src={app.base64_icon} />
-      ) : (
-        <img className="w-8 h-8 object-cover rounded-lg" src="/h-green.svg" />
-      )}
-      <h6 className="text-white">{app?.label || app?.package_name}</h6>
-    </a>
-  );
-};
-
-export default AppDisplay;
diff --git a/hyperdrive/packages/homepage/ui/src/components/HyperwareLogo.tsx b/hyperdrive/packages/homepage/ui/src/components/HyperwareLogo.tsx
deleted file mode 100644
index bd0d7de99..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/HyperwareLogo.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import type { SVGProps } from "react";
-// <defs>
-//   <style>
-//     @media (prefers-color-scheme: dark) {
-//       .cls-1 {
-//         fill: #dcff71;
-//       }
-//     }
-//     @media (prefers-color-scheme: light) {
-//       .cls-1 {
-//         fill: #004fff;
-//       }
-//     }
-//   </style>
-// </defs>
-const SvgHyperwareSmall = (props: SVGProps<SVGSVGElement>) => {
-  const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
-  const fillStyle = isDark ? '#dcff71' : '#004fff';
-
-  return (
-    <svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 622.27 595.09" {...props} style={{ ...props.style }}>
-      <g id="Capa_1" data-name="Capa 1">
-        <g>
-          <g>
-            <g>
-              <path style={{ fill: fillStyle }} d="M99.56,188.21L0,476.27l93.56.03c10.8,0,20.4-6.84,23.93-17.05l53.59-155.07c3.79-10.97,1.73-23.11-5.45-32.22l-66.06-83.76Z" />
-              <path style={{ fill: fillStyle }} d="M420.78,118.82l-30.14,87.1c-3.74,10.8-13.91,18.04-25.34,18.04h-70.48c-10.46,0-20.34-4.76-26.81-12.97l-72.67-92.17h225.44Z" />
-            </g>
-            <path style={{ fill: fillStyle }} d="M101.63,0l-42.74,123.61c-1.85,5.35-.99,11.28,2.3,15.93l38.37,48.67,17.69-51.16c3.77-10.91,14.05-18.23,25.59-18.23h52.5L101.63,0Z" />
-          </g>
-          <g>
-            <g>
-              <path style={{ fill: fillStyle }} d="M522.71,406.88l99.56-288.06-93.56-.03c-10.8,0-20.4,6.84-23.93,17.05l-53.59,155.07c-3.79,10.97-1.73,23.11,5.45,32.22l66.06,83.76Z" />
-              <path style={{ fill: fillStyle }} d="M201.49,476.27l30.14-87.1c3.74-10.8,13.91-18.04,25.34-18.04h70.48c10.46,0,20.34,4.76,26.81,12.97l72.67,92.17h-225.44Z" />
-            </g>
-            <path style={{ fill: fillStyle }} d="M520.64,595.09l42.74-123.61c1.85-5.35.99-11.28-2.3-15.93l-38.37-48.67-17.69,51.16c-3.77,10.91-14.05,18.23-25.59,18.23h-52.5l93.71,118.82Z" />
-          </g>
-        </g>
-      </g>
-    </svg>
-  );
-};
-
-export default SvgHyperwareSmall;
-
diff --git a/hyperdrive/packages/homepage/ui/src/components/Modal.tsx b/hyperdrive/packages/homepage/ui/src/components/Modal.tsx
deleted file mode 100644
index b85d18d22..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/Modal.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { FaX } from "react-icons/fa6"
-import { useEffect } from 'react';
-import classNames from "classnames";
-
-interface Props extends React.HTMLAttributes<HTMLDivElement> {
-  title: string
-  onClose: () => void
-  outerClassName?: string
-  innerClassName?: string
-}
-
-export const Modal: React.FC<Props> = ({ title, onClose, children, outerClassName, innerClassName }) => {
-  useEffect(() => {
-    const handleKeyDown = (event: KeyboardEvent) => {
-      if (event.key === 'Escape') {
-        onClose();
-      }
-    };
-
-    window.addEventListener('keydown', handleKeyDown);
-
-    return () => {
-      window.removeEventListener('keydown', handleKeyDown);
-    };
-  }, [onClose]);
-
-  return (
-    <div
-      className={classNames(`
-        fixed top-0 left-0 w-screen h-screen
-        flex flex-col items-center justify-center
-        bg-black/10 backdrop-blur-sm
-        z-50
-      `, outerClassName)}
-    >
-      <div
-        className={classNames(`
-          flex flex-col items-center self-center gap-4
-          bg-white dark:bg-black 
-          rounded-xl p-4 
-          w-screen md:w-fit
-          overflow-y-auto
-          max-h-[90vh]
-        `, innerClassName)}
-      >
-        <div className="flex items-center justify-between gap-2">
-          <h2>{title}</h2>
-          <button
-            className="icon"
-            onClick={onClose}
-          >
-            <FaX />
-          </button>
-        </div>
-        {children}
-      </div>
-    </div>
-  )
-}
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/PWAInstallPrompt.tsx b/hyperdrive/packages/homepage/ui/src/components/PWAInstallPrompt.tsx
new file mode 100644
index 000000000..ab37f9c2d
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/PWAInstallPrompt.tsx
@@ -0,0 +1,97 @@
+import React, { useEffect, useState } from 'react';
+
+interface BeforeInstallPromptEvent extends Event {
+  prompt: () => Promise<void>;
+  userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>;
+}
+
+const PWAInstallPrompt: React.FC = () => {
+  const [installPrompt, setInstallPrompt] = useState<BeforeInstallPromptEvent | null>(null);
+  const [showPrompt, setShowPrompt] = useState(false);
+
+  useEffect(() => {
+    const handleBeforeInstallPrompt = (e: Event) => {
+      // Prevent the default browser install prompt
+      e.preventDefault();
+      // Store the event for later use
+      setInstallPrompt(e as BeforeInstallPromptEvent);
+
+      // Show our custom prompt after a delay
+      setTimeout(() => {
+        setShowPrompt(true);
+      }, 2000);
+    };
+
+    window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt);
+
+    // Check if app is already installed
+    if (window.matchMedia('(display-mode: standalone)').matches) {
+      console.log('App is already installed');
+    }
+
+    return () => {
+      window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt);
+    };
+  }, []);
+
+  const handleInstall = async () => {
+    if (!installPrompt) return;
+
+    // Show the browser's install prompt
+    await installPrompt.prompt();
+
+    // Wait for the user's response
+    const { outcome } = await installPrompt.userChoice;
+    console.log(`User ${outcome} the install prompt`);
+
+    // Clear the prompt
+    setInstallPrompt(null);
+    setShowPrompt(false);
+  };
+
+  const handleDismiss = () => {
+    setShowPrompt(false);
+    // Show again after 7 days
+    const nextPromptTime = Date.now() + (7 * 24 * 60 * 60 * 1000);
+    localStorage.setItem('pwa-prompt-dismissed', nextPromptTime.toString());
+  };
+
+  // Check if prompt was previously dismissed
+  useEffect(() => {
+    const dismissedUntil = localStorage.getItem('pwa-prompt-dismissed');
+    if (dismissedUntil && Date.now() < parseInt(dismissedUntil)) {
+      setShowPrompt(false);
+    }
+  }, []);
+
+  if (!showPrompt || !installPrompt) return null;
+
+  return (
+    <div className="fixed top-4 left-4 right-4 bg-black/90 text-green-400 p-4 rounded-lg shadow-lg z-50 max-w-md mx-auto animate-slide-down">
+      <div className="flex items-start gap-3">
+        <div className="flex-1">
+          <h3 className="font-semibold mb-1">Install Hyperdrive</h3>
+          <p className="text-sm text-gray-300">
+            Add to your home screen for the best experience
+          </p>
+        </div>
+        <div className="flex gap-2">
+          <button
+            onClick={handleDismiss}
+            className="px-3 py-1 text-xs bg-gray-700 hover:bg-gray-600 rounded transition-colors"
+          >
+            Not now
+          </button>
+          <button
+            onClick={handleInstall}
+            className="px-3 py-1 text-xs bg-green-600 hover:bg-green-500 rounded transition-colors"
+          >
+            Install
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default PWAInstallPrompt;
diff --git a/hyperdrive/packages/homepage/ui/src/components/PWAUpdateNotification.tsx b/hyperdrive/packages/homepage/ui/src/components/PWAUpdateNotification.tsx
new file mode 100644
index 000000000..487309fa7
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/components/PWAUpdateNotification.tsx
@@ -0,0 +1,69 @@
+import React, { useEffect, useState } from 'react';
+
+const PWAUpdateNotification: React.FC = () => {
+  const [showUpdate, setShowUpdate] = useState(false);
+  const [registration, setRegistration] = useState<ServiceWorkerRegistration | null>(null);
+
+  useEffect(() => {
+    if ('serviceWorker' in navigator) {
+      navigator.serviceWorker.ready.then((reg) => {
+        setRegistration(reg);
+
+        // Listen for updates
+        reg.addEventListener('updatefound', () => {
+          const newWorker = reg.installing;
+          if (newWorker) {
+            newWorker.addEventListener('statechange', () => {
+              if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
+                // New content is available
+                setShowUpdate(true);
+              }
+            });
+          }
+        });
+      });
+
+      // Listen for controller change
+      let refreshing = false;
+      navigator.serviceWorker.addEventListener('controllerchange', () => {
+        if (!refreshing) {
+          refreshing = true;
+          window.location.reload();
+        }
+      });
+    }
+  }, []);
+
+  const handleUpdate = () => {
+    if (registration?.waiting) {
+      registration.waiting.postMessage({ type: 'SKIP_WAITING' });
+    }
+    setShowUpdate(false);
+  };
+
+  if (!showUpdate) return null;
+
+  return (
+    <div className="fixed bottom-4 left-4 right-4 bg-black/90 text-green-400 p-4 rounded-lg shadow-lg z-50 max-w-md mx-auto">
+      <div className="flex items-center justify-between">
+        <span className="text-sm">A new version is available!</span>
+        <div className="flex gap-2">
+          <button
+            onClick={() => setShowUpdate(false)}
+            className="px-3 py-1 text-xs bg-gray-700 hover:bg-gray-600 rounded transition-colors"
+          >
+            Later
+          </button>
+          <button
+            onClick={handleUpdate}
+            className="px-3 py-1 text-xs bg-green-600 hover:bg-green-500 rounded transition-colors"
+          >
+            Update
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+};
+
+export default PWAUpdateNotification;
diff --git a/hyperdrive/packages/homepage/ui/src/components/Widget.tsx b/hyperdrive/packages/homepage/ui/src/components/Widget.tsx
deleted file mode 100644
index f63fe0f1d..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/Widget.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { useEffect, useState } from "react"
-import usePersistentStore from "../store/persistentStore"
-
-interface WidgetProps {
-  id: string
-  label: string
-  widget: string
-}
-
-const Widget: React.FC<WidgetProps> = ({ id, label, widget }) => {
-  const [_tallScreen, setTallScreen] = useState(window.innerHeight > window.innerWidth)
-  const { toggleWidgetVisibility } = usePersistentStore();
-
-  useEffect(() => {
-    setTallScreen(window.innerHeight > window.innerWidth)
-  }, [window.innerHeight, window.innerWidth])
-
-  useEffect(() => {
-    const hideWidget = () => {
-      toggleWidgetVisibility(id)
-    }
-    document.getElementById(`hide-widget-${id}`)?.addEventListener("click", hideWidget)
-  }, [])
-
-  return <div className="widget">
-    <div className="bottom-bar"><p>{label}</p><p id={`hide-widget-${id}`}>[hide]</p></div>
-    <iframe srcDoc={widget} />
-  </div>
-}
-
-export default Widget
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/Widgets.tsx b/hyperdrive/packages/homepage/ui/src/components/Widgets.tsx
deleted file mode 100644
index df99dc813..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/Widgets.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import useHomepageStore, { HomepageApp } from "../store/homepageStore"
-import Widget from "./Widget"
-import usePersistentStore from "../store/persistentStore"
-import { useEffect, useState } from "react"
-
-const Widgets = () => {
-  const { apps } = useHomepageStore()
-  const { widgetSettings, widgetOrder, setWidgetOrder } = usePersistentStore();
-  const [orderedWidgets, setOrderedWidgets] = useState<HomepageApp[]>([]);
-
-  const [draggedIndex, setDraggedIndex] = useState<number | null>(null);
-  const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);
-
-  useEffect(() => {
-    const visibleWidgets = apps.filter((app) => app.widget && !widgetSettings[app.id]?.hide);
-    const orderedVisibleWidgets = visibleWidgets.sort((a, b) => {
-      return widgetOrder.indexOf(a.id) - widgetOrder.indexOf(b.id);
-    });
-    setOrderedWidgets(orderedVisibleWidgets);
-  }, [apps, widgetSettings, widgetOrder]);
-
-  const handleDragStart = (e: React.DragEvent, index: number) => {
-    e.dataTransfer.setData("text/plain", index.toString());
-    setDraggedIndex(index);
-  };
-
-  const handleDragOver = (e: React.DragEvent, index: number) => {
-    e.preventDefault();
-    setDragOverIndex(index);
-  };
-
-  const handleDragEnd = () => {
-    setDraggedIndex(null);
-    setDragOverIndex(null);
-  };
-
-  const handleDrop = (e: React.DragEvent, dropIndex: number) => {
-    e.preventDefault();
-    const dragIndex = parseInt(e.dataTransfer.getData("text/plain"), 10);
-    if (dragIndex === dropIndex) return;
-
-    const newSortedWidgets = [...orderedWidgets];
-    const [movedWidget] = newSortedWidgets.splice(dragIndex, 1);
-    newSortedWidgets.splice(dropIndex, 0, movedWidget);
-
-    const newWidgetOrder = newSortedWidgets.map((wid) => wid.id);
-    setWidgetOrder(newWidgetOrder);
-    handleDragEnd();
-  };
-
-  return (
-    <div
-      className="
-        bg-white dark:bg-black
-        border border-solid border-1 border-black dark:border-white
-        grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3
-        p-0
-        max-w-screen 
-        mx-auto my-0
-        overflow-x-hidden
-      "
-    >
-      {orderedWidgets.map((wid, index) => (
-        <div
-          key={wid.id}
-          draggable
-          onDragStart={(e) => handleDragStart(e, index)}
-          onDragOver={(e) => handleDragOver(e, index)}
-          onDragEnd={handleDragEnd}
-          onDrop={(e) => handleDrop(e, index)}
-          className={`widget-wrapper ${draggedIndex === index ? "dragging" : ""
-            } ${dragOverIndex === index ? "drag-over" : ""}`}
-        >
-          <Widget
-            id={wid.id}
-            label={wid.label}
-            widget={wid.widget!}
-          />
-          <div className="drag-handle">⋮⋮</div>
-        </div>
-      ))}
-    </div>
-  );
-}
-
-export default Widgets
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/components/WidgetsSettingsModal.tsx b/hyperdrive/packages/homepage/ui/src/components/WidgetsSettingsModal.tsx
deleted file mode 100644
index 36552084f..000000000
--- a/hyperdrive/packages/homepage/ui/src/components/WidgetsSettingsModal.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import useHomepageStore from "../store/homepageStore"
-import { Modal } from "./Modal"
-import usePersistentStore from "../store/persistentStore"
-import { FaCheck, FaRegSquare } from "react-icons/fa6"
-
-const WidgetsSettingsModal = () => {
-  const { apps, setShowWidgetsSettings } = useHomepageStore()
-  const { widgetSettings, toggleWidgetVisibility } = usePersistentStore()
-
-  return <Modal
-    title='Widget Settings'
-    onClose={() => setShowWidgetsSettings(false)}
-  >
-    {apps.filter((app) => app.widget).map((app) => {
-      return (
-        <div className="
-          rounded-full 
-          border border-solid border-black/5 dark:border-white/5 
-          p-2 
-          flex items-center justify-between gap-2 self-stretch
-        ">
-          <h4>{app.label}</h4>
-          <button
-            className="icon"
-            onClick={() => toggleWidgetVisibility(app.id)}
-          >
-            {widgetSettings[app.id]?.hide ? <FaRegSquare /> : <FaCheck />}
-          </button>
-        </div>
-      );
-    })}
-    <button onClick={() => window.location.href = '/settings:settings:sys'}>
-      System settings
-    </button>
-  </Modal>
-}
-
-export default WidgetsSettingsModal
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/main.tsx b/hyperdrive/packages/homepage/ui/src/main.tsx
index 1b7e15d75..5dcf23c4c 100644
--- a/hyperdrive/packages/homepage/ui/src/main.tsx
+++ b/hyperdrive/packages/homepage/ui/src/main.tsx
@@ -1,11 +1,29 @@
 import React from 'react'
 import ReactDOM from 'react-dom/client'
-import Homepage from './pages/Homepage.tsx'
+import AndroidHomescreen from './pages/AndroidHomescreen.tsx'
 import './index.css'
 import 'uno.css'
 
+// Register service worker for PWA
+if ('serviceWorker' in navigator) {
+  window.addEventListener('load', () => {
+    navigator.serviceWorker.register('/sw.js')
+      .then((registration) => {
+        console.log('SW registered:', registration);
+
+        // Check for updates periodically
+        setInterval(() => {
+          registration.update();
+        }, 60 * 60 * 1000); // Check every hour
+      })
+      .catch((error) => {
+        console.log('SW registration failed:', error);
+      });
+  });
+}
+
 ReactDOM.createRoot(document.getElementById('root')!).render(
   <React.StrictMode>
-    <Homepage />
+    <AndroidHomescreen />
   </React.StrictMode>,
 )
diff --git a/hyperdrive/packages/homepage/ui/src/pages/AndroidHomescreen.tsx b/hyperdrive/packages/homepage/ui/src/pages/AndroidHomescreen.tsx
new file mode 100644
index 000000000..7f092af05
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/pages/AndroidHomescreen.tsx
@@ -0,0 +1 @@
+export { default } from '../components/AndroidHomescreen';
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/pages/Homepage.tsx b/hyperdrive/packages/homepage/ui/src/pages/Homepage.tsx
deleted file mode 100644
index 0e39b763e..000000000
--- a/hyperdrive/packages/homepage/ui/src/pages/Homepage.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { useEffect, useState } from "react";
-import HyperwareLogo from "../components/HyperwareLogo";
-import useHomepageStore from "../store/homepageStore";
-import AllApps from "../components/AllApps";
-import Widgets from "../components/Widgets";
-import WidgetsSettingsModal from "../components/WidgetsSettingsModal";
-
-function Homepage() {
-  const [our, setOur] = useState("");
-  const [version, setVersion] = useState("");
-  const { setApps, showWidgetsSettings, setShowWidgetsSettings } =
-    useHomepageStore();
-
-  const getAppPathsAndIcons = () => {
-    Promise.all([
-      fetch("/apps", { credentials: "include" })
-        .then((res) => res.json())
-        .catch(() => []),
-      fetch("/version", { credentials: "include" })
-        .then((res) => res.text())
-        .catch(() => ""),
-    ]).then(([appsData, version]) => {
-      setVersion(version);
-      setApps(appsData);
-    });
-  };
-
-  useEffect(() => {
-    getAppPathsAndIcons();
-  }, [our]);
-
-  useEffect(() => {
-    fetch("/our", { credentials: "include" })
-      .then((res) => res.text())
-      .then((data) => {
-        if (data.match(/^[a-zA-Z0-9\-\.]+\.[a-zA-Z]+$/)) {
-          setOur(data);
-        }
-      });
-  }, [our]);
-
-  return (
-    <div
-      className="
-        homepage
-        flex flex-col md:flex-row place-items-center place-content-center
-        md:h-screen w-screen
-        overflow-y-auto overflow-x-hidden
-      "
-    >
-      <div className="max-w-screen w-full lg:w-fit">
-        <header>
-          <HyperwareLogo style={{ marginRight: '10px', maxWidth: 64 }} />
-          <h2>
-            {new Date().getHours() < 4
-              ? "Good evening" // midnight to 4am
-              : new Date().getHours() < 12
-                ? "Good morning" // 4am to 11am
-                : new Date().getHours() < 18
-                  ? "Good afternoon" // 12pm to 5pm
-                  : "Good evening" // 5pm to midnight
-            }, {our}
-          </h2>
-          <a
-            href="https://github.com/hyperware-ai/hyperdrive/releases"
-            target="_blank"
-          >
-            [hyperware v{version}]
-          </a>
-          <a
-            href="#"
-            onClick={(e) => {
-              e.preventDefault();
-              setShowWidgetsSettings(true);
-            }}
-          >
-            [⚙]
-          </a>
-        </header>
-
-
-        <Widgets />
-        <footer>
-          <AllApps />
-        </footer>
-        {showWidgetsSettings && <WidgetsSettingsModal />}
-      </div>
-    </ div>
-  );
-}
-
-export default Homepage;
diff --git a/hyperdrive/packages/homepage/ui/src/store/homepageStore.ts b/hyperdrive/packages/homepage/ui/src/store/homepageStore.ts
deleted file mode 100644
index b4cb70b10..000000000
--- a/hyperdrive/packages/homepage/ui/src/store/homepageStore.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { create } from 'zustand'
-import { persist, createJSONStorage } from 'zustand/middleware'
-
-export interface HomepageApp {
-  id: string,
-  process: string,
-  package_name: string,
-  publisher: string,
-  path?: string
-  label: string,
-  base64_icon?: string,
-  widget?: string
-  order: number
-  favorite: boolean
-}
-
-export interface HomepageStore {
-  get: () => HomepageStore
-  set: (partial: HomepageStore | Partial<HomepageStore>) => void
-
-  apps: HomepageApp[]
-  setApps: (apps: HomepageApp[]) => void
-  showWidgetsSettings: boolean
-  setShowWidgetsSettings: (showWidgetsSettings: boolean) => void
-}
-
-const useHomepageStore = create<HomepageStore>()(
-  persist(
-    (set, get) => ({
-      get,
-      set,
-      apps: [],
-      setApps: (apps: HomepageApp[]) => set({ apps }),
-      showWidgetsSettings: false,
-      setShowWidgetsSettings: (showWidgetsSettings: boolean) => set({ showWidgetsSettings }),
-    }),
-    {
-      name: 'homepage_store', // unique name
-      storage: createJSONStorage(() => sessionStorage), // (optional) by default, 'localStorage' is used
-    }
-  )
-)
-
-export default useHomepageStore
diff --git a/hyperdrive/packages/homepage/ui/src/store/persistentStore.ts b/hyperdrive/packages/homepage/ui/src/store/persistentStore.ts
deleted file mode 100644
index 7e3e0cc69..000000000
--- a/hyperdrive/packages/homepage/ui/src/store/persistentStore.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { create } from 'zustand';
-import { createJSONStorage, persist } from 'zustand/middleware';
-
-export interface PersistentStore {
-  get: () => PersistentStore
-  set: (state: PersistentStore | Partial<PersistentStore>) => void
-  widgetSettings: {
-    [key: string]: {
-      hide?: boolean,
-      size?: 'small' | 'large',
-    }
-  }
-  setWidgetSettings: (widgetSettings: PersistentStore['widgetSettings']) => void
-  toggleWidgetVisibility: (package_id: string) => void
-  setWidgetSize: (package_id: string, size: 'small' | 'large') => void,
-  widgetOrder: string[]
-  setWidgetOrder: (widgetOrder: string[]) => void
-  appOrder: string[]
-  setAppOrder: (appOrder: string[]) => void
-}
-
-const usePersistentStore = create<PersistentStore>()(
-  persist(
-    (set, get) => ({
-      get,
-      set,
-      widgetSettings: {},
-      setWidgetSettings: (widgetSettings: PersistentStore['widgetSettings']) => set({ widgetSettings }),
-      toggleWidgetVisibility: (package_id: string) => {
-        const { widgetSettings } = get()
-        set({
-          widgetSettings: {
-            ...widgetSettings,
-            [package_id]: {
-              ...widgetSettings[package_id],
-              hide: !widgetSettings[package_id]?.hide
-            }
-          }
-        })
-      },
-      setWidgetSize: (package_id: string, size: 'small' | 'large') => {
-        const { widgetSettings } = get()
-        set({
-          widgetSettings: {
-            ...widgetSettings,
-            [package_id]: {
-              ...widgetSettings[package_id],
-              size
-            }
-          }
-        })
-      },
-      widgetOrder: [],
-      setWidgetOrder: (widgetOrder: string[]) => set({ widgetOrder }),
-      appOrder: [],
-      setAppOrder: (appOrder: string[]) => set({ appOrder }),
-    }),
-    {
-      name: 'homepage_persistent_store', // unique name for the store
-      storage: createJSONStorage(() => localStorage),
-    }
-  )
-);
-
-export default usePersistentStore;
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/stores/appStore.ts b/hyperdrive/packages/homepage/ui/src/stores/appStore.ts
new file mode 100644
index 000000000..29abdf777
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/stores/appStore.ts
@@ -0,0 +1,16 @@
+import { create } from 'zustand';
+import type { HomepageApp } from '../types/app.types';
+
+interface AppStore {
+  apps: HomepageApp[];
+  setApps: (apps: HomepageApp[]) => void;
+  isEditMode: boolean;
+  setEditMode: (mode: boolean) => void;
+}
+
+export const useAppStore = create<AppStore>((set) => ({
+  apps: [],
+  setApps: (apps) => set({ apps }),
+  isEditMode: false,
+  setEditMode: (isEditMode) => set({ isEditMode }),
+}));
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts
new file mode 100644
index 000000000..bd89d8148
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts
@@ -0,0 +1,151 @@
+import { create } from 'zustand';
+import type { HomepageApp, RunningApp } from '../types/app.types';
+
+interface NavigationStore {
+  runningApps: RunningApp[];
+  currentAppId: string | null;
+  isAppDrawerOpen: boolean;
+  isRecentAppsOpen: boolean;
+
+  openApp: (app: HomepageApp) => void;
+  closeApp: (appId: string) => void;
+  switchToApp: (appId: string) => void;
+  toggleAppDrawer: () => void;
+  toggleRecentApps: () => void;
+  closeAllOverlays: () => void;
+}
+
+export const useNavigationStore = create<NavigationStore>((set, get) => ({
+  runningApps: [],
+  currentAppId: null,
+  isAppDrawerOpen: false,
+  isRecentAppsOpen: false,
+
+  openApp: async (app) => {
+    console.log('openApp called with:', app);
+
+    // Don't open apps without a valid path
+    if (!app.path && !app.process && !app.publisher) {
+      console.warn(`Cannot open app ${app.label}: No valid path`);
+      return;
+    }
+
+    // Check if we need to open in a new tab (localhost with secure subdomain)
+    const currentHost = window.location.host;
+    const isLocalhost = currentHost.includes("localhost");
+
+    if (isLocalhost && app.process && app.publisher) {
+      const generateSubdomain = (process: string, publisher: string) => {
+        return `${process}-${publisher}`.toLowerCase()
+          .split('')
+          .map(c => c.match(/[a-zA-Z0-9]/) ? c : '-')
+          .join('');
+      };
+
+      const expectedSubdomain = generateSubdomain(app.package_name, app.publisher);
+      const needsSubdomain = !currentHost.startsWith(expectedSubdomain);
+
+      if (needsSubdomain) {
+        // Check if this app requires a secure subdomain by testing for redirect
+        const appUrl = app.path || `/app:${app.process}:${app.publisher}.os/`;
+
+        try {
+          // Create AbortController for 0.1 second timeout
+          const controller = new AbortController();
+          const timeoutId = setTimeout(() => controller.abort(), 100);
+
+          // Use fetch with redirect: 'manual' to detect redirects without following them
+          const response = await fetch(appUrl, {
+            method: 'HEAD',
+            redirect: 'manual',
+            signal: controller.signal
+          });
+
+          // Clear the timeout if fetch completes
+          clearTimeout(timeoutId);
+
+          // If we get a 307 redirect, this is a secure subdomain app
+          const isSecureSubdomainApp = response.type === 'opaqueredirect';
+
+          console.log('Subdomain check:', {
+            app: app.label,
+            type: response.type,
+            isSecureSubdomainApp
+          });
+
+          if (isSecureSubdomainApp) {
+            // Open in new tab for localhost secure subdomain apps
+            const protocol = window.location.protocol;
+            const port = window.location.port ? `:${window.location.port}` : '';
+
+            // Fix: Extract just the hostname without port for localhost
+            const hostname = currentHost.split(':')[0]; // 'localhost' from 'localhost:3000'
+            const baseDomain = hostname; // For localhost, we just use 'localhost'
+
+            const subdomainUrl = `${protocol}//${expectedSubdomain}.${baseDomain}${port}${appUrl}`;
+
+            // Debug logging
+            console.log('Opening secure subdomain app in new tab:', {
+              app: app.label,
+              currentHost,
+              hostname,
+              baseDomain,
+              expectedSubdomain,
+              subdomainUrl,
+              protocol,
+              port
+            });
+
+            const newWindow = window.open(subdomainUrl, '_blank');
+            console.log('window.open result:', newWindow);
+
+            if (!newWindow) {
+              console.error('Failed to open new window - possibly blocked by popup blocker');
+            }
+
+            // Close overlays to return to homepage
+            set({ isAppDrawerOpen: false, isRecentAppsOpen: false });
+            return;
+          }
+          // If not a secure subdomain app, continue with normal iframe behavior
+        } catch (error) {
+          console.error('Error checking for secure subdomain:', error);
+          // On error, continue with normal iframe behavior
+        }
+      }
+    }
+
+    // Normal iframe behavior for non-localhost or same-subdomain apps
+    const { runningApps } = get();
+    const existingApp = runningApps.find(a => a.id === app.id);
+
+    if (existingApp) {
+      set({ currentAppId: app.id, isAppDrawerOpen: false, isRecentAppsOpen: false });
+    } else {
+      set({
+        runningApps: [...runningApps, { ...app, openedAt: Date.now() }],
+        currentAppId: app.id,
+        isAppDrawerOpen: false,
+        isRecentAppsOpen: false,
+      });
+    }
+  },
+
+  closeApp: (appId) => {
+    const { runningApps, currentAppId } = get();
+    const newRunningApps = runningApps.filter(app => app.id !== appId);
+    const newCurrentApp = currentAppId === appId
+      ? (newRunningApps.length > 0 ? newRunningApps[newRunningApps.length - 1].id : null)
+      : currentAppId;
+
+    set({
+      runningApps: newRunningApps,
+      currentAppId: newCurrentApp,
+    });
+  },
+
+  switchToApp: (appId) => set({ currentAppId: appId, isRecentAppsOpen: false }),
+  toggleAppDrawer: () => set((state) => ({ isAppDrawerOpen: !state.isAppDrawerOpen, isRecentAppsOpen: false })),
+  toggleRecentApps: () => set((state) => ({ isRecentAppsOpen: !state.isRecentAppsOpen, isAppDrawerOpen: false })),
+  closeAllOverlays: () => set({ isAppDrawerOpen: false, isRecentAppsOpen: false, currentAppId: null }),
+}));
diff --git a/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts
new file mode 100644
index 000000000..399056471
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts
@@ -0,0 +1,143 @@
+import { create } from 'zustand';
+import { persist, createJSONStorage } from 'zustand/middleware';
+import type { Position, Size } from '../types/app.types';
+
+interface PersistenceStore {
+  homeScreenApps: string[];
+  dockApps: string[];
+  appPositions: { [key: string]: Position };
+  widgetSettings: { [key: string]: { hide?: boolean; position?: Position; size?: Size } };
+  backgroundImage: string | null;
+
+  addToHomeScreen: (appId: string) => void;
+  removeFromHomeScreen: (appId: string) => void;
+  addToDock: (appId: string, index?: number) => void;
+  removeFromDock: (appId: string) => void;
+  moveItem: (appId: string, position: Position) => void;
+  toggleWidget: (appId: string) => void;
+  setWidgetPosition: (appId: string, position: Position) => void;
+  setWidgetSize: (appId: string, size: Size) => void;
+  setBackgroundImage: (imageUrl: string | null) => void;
+}
+
+export const usePersistenceStore = create<PersistenceStore>()(
+  persist(
+    (set) => ({
+      homeScreenApps: [],
+      dockApps: [],
+      appPositions: {},
+      widgetSettings: {},
+      backgroundImage: null,
+
+      addToHomeScreen: (appId) => {
+        set((state) => ({
+          homeScreenApps: [...state.homeScreenApps, appId],
+          // Default position for apps at bottom of screen
+          appPositions: {
+            ...state.appPositions,
+            [appId]: {
+              x: Math.min(Math.random() * (window.innerWidth - 100), window.innerWidth - 80),
+              y: Math.min(window.innerHeight - 200 - Math.random() * 100, window.innerHeight - 80)
+            }
+          },
+        }));
+      },
+
+      removeFromHomeScreen: (appId) => {
+        set((state) => {
+          const newPositions = { ...state.appPositions };
+          delete newPositions[appId];
+          return {
+            homeScreenApps: state.homeScreenApps.filter(id => id !== appId),
+            appPositions: newPositions,
+          };
+        });
+      },
+
+      moveItem: (appId, position) => {
+        set((state) => ({
+          appPositions: { ...state.appPositions, [appId]: position },
+        }));
+      },
+
+      toggleWidget: (appId) => {
+        set((state) => ({
+          widgetSettings: {
+            ...state.widgetSettings,
+            [appId]: {
+              ...state.widgetSettings[appId],
+              hide: !state.widgetSettings[appId]?.hide,
+              // Default position for widgets at top of screen
+              position: state.widgetSettings[appId]?.position || {
+                x: Math.min(Math.random() * (window.innerWidth - 300), window.innerWidth - 300),
+                y: Math.min(50 + Math.random() * 100, window.innerHeight - 200)
+              },
+              // Default size
+              size: state.widgetSettings[appId]?.size || { width: 300, height: 200 }
+            },
+          },
+        }));
+      },
+
+      setWidgetPosition: (appId, position) => {
+        set((state) => ({
+          widgetSettings: {
+            ...state.widgetSettings,
+            [appId]: {
+              ...state.widgetSettings[appId],
+              position,
+            },
+          },
+        }));
+      },
+
+      setWidgetSize: (appId, size) => {
+        set((state) => ({
+          widgetSettings: {
+            ...state.widgetSettings,
+            [appId]: {
+              ...state.widgetSettings[appId],
+              size,
+            },
+          },
+        }));
+      },
+
+      setBackgroundImage: (imageUrl) => {
+        set({ backgroundImage: imageUrl });
+      },
+
+      addToDock: (appId, index) => {
+        set((state) => {
+          const newDockApps = [...state.dockApps];
+          // Remove from dock if already there
+          const existingIndex = newDockApps.indexOf(appId);
+          if (existingIndex !== -1) {
+            newDockApps.splice(existingIndex, 1);
+          }
+          // Add at specific index or at end
+          if (index !== undefined && index >= 0 && index <= newDockApps.length) {
+            newDockApps.splice(index, 0, appId);
+          } else {
+            newDockApps.push(appId);
+          }
+          // Limit dock to 4 apps
+          if (newDockApps.length > 4) {
+            newDockApps.length = 4;
+          }
+          return { dockApps: newDockApps };
+        });
+      },
+
+      removeFromDock: (appId) => {
+        set((state) => ({
+          dockApps: state.dockApps.filter(id => id !== appId)
+        }));
+      },
+    }),
+    {
+      name: 'android-homescreen-store',
+      storage: createJSONStorage(() => localStorage),
+    }
+  )
+);
\ No newline at end of file
diff --git a/hyperdrive/packages/homepage/ui/src/types/app.types.ts b/hyperdrive/packages/homepage/ui/src/types/app.types.ts
new file mode 100644
index 000000000..69ffa7c54
--- /dev/null
+++ b/hyperdrive/packages/homepage/ui/src/types/app.types.ts
@@ -0,0 +1,26 @@
+export interface HomepageApp {
+  id: string;
+  process: string;
+  package_name: string;
+  publisher: string;
+  path?: string;
+  label: string;
+  base64_icon?: string;
+  widget?: string;
+  order: number;
+  favorite: boolean;
+}
+
+export interface RunningApp extends HomepageApp {
+  openedAt: number;
+}
+
+export interface Position {
+  x: number;
+  y: number;
+}
+
+export interface Size {
+  width: number;
+  height: number;
+}
\ No newline at end of file
diff --git a/hyperdrive/packages/hypermap-cacher/Cargo.lock b/hyperdrive/packages/hypermap-cacher/Cargo.lock
index 02f0971e3..f058f2674 100644
--- a/hyperdrive/packages/hypermap-cacher/Cargo.lock
+++ b/hyperdrive/packages/hypermap-cacher/Cargo.lock
@@ -1483,9 +1483,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1645,9 +1642,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1925,10 +1921,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -3034,15 +3030,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58b69356da67e2fc1f542c71ea7e654a361a79c938e4424392ecf4fa065d2193"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3651,39 +3638,34 @@ dependencies = [
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.3",
  "indexmap",
  "semver 1.0.26",
 ]
@@ -3970,19 +3952,19 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
- "wit-bindgen-rt 0.36.0",
+ "wit-bindgen-rt 0.42.1",
  "wit-bindgen-rust-macro",
 ]
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3991,27 +3973,29 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
 dependencies = [
  "bitflags",
 ]
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.39.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -4025,9 +4009,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -4040,9 +4024,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -4059,9 +4043,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/Cargo.toml b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/Cargo.toml
index 10c3c7bad..5adf9cda7 100644
--- a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/Cargo.toml
+++ b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/Cargo.toml
@@ -4,6 +4,9 @@ version = "0.1.0"
 edition = "2021"
 publish = false
 
+[features]
+simulation-mode = ["hyperware_process_lib/simulation-mode"]
+
 [dependencies]
 anyhow = "1.0"
 alloy-primitives = "0.8.15"
@@ -15,13 +18,13 @@ alloy = { version = "0.8.1", features = [
 ] }
 chrono = "0.4.41"
 hex = "0.4.3"
-hyperware_process_lib = { version = "1.2.0", features = ["logging"] }
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719", features = ["logging"] }
 process_macros = "0.1.0"
 rand = "0.8"
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs
index ac9985c3a..4257c21d4 100644
--- a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs
+++ b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs
@@ -36,7 +36,10 @@ const MAX_LOG_RETRIES: u8 = 3;
 const RETRY_DELAY_S: u64 = 10;
 const LOG_ITERATION_DELAY_MS: u64 = 200;
 
+#[cfg(not(feature = "simulation-mode"))]
 const DEFAULT_NODES: &[&str] = &["nick.hypr", "nick1udwig.os"];
+#[cfg(feature = "simulation-mode")]
+const DEFAULT_NODES: &[&str] = &["fake.os"];
 
 // Internal representation of LogsMetadata, similar to WIT but for Rust logic.
 #[derive(Serialize, Deserialize, Debug, Clone)]
diff --git a/hyperdrive/packages/hypermap-cacher/reset-cache/Cargo.toml b/hyperdrive/packages/hypermap-cacher/reset-cache/Cargo.toml
index 2e8767af3..d7685818c 100644
--- a/hyperdrive/packages/hypermap-cacher/reset-cache/Cargo.toml
+++ b/hyperdrive/packages/hypermap-cacher/reset-cache/Cargo.toml
@@ -5,11 +5,11 @@ edition = "2021"
 publish = false
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hypermap-cacher/set-nodes/Cargo.toml b/hyperdrive/packages/hypermap-cacher/set-nodes/Cargo.toml
index ff8d23f8f..3574feb91 100644
--- a/hyperdrive/packages/hypermap-cacher/set-nodes/Cargo.toml
+++ b/hyperdrive/packages/hypermap-cacher/set-nodes/Cargo.toml
@@ -5,11 +5,11 @@ edition = "2021"
 publish = false
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hypermap-cacher/start-providing/Cargo.toml b/hyperdrive/packages/hypermap-cacher/start-providing/Cargo.toml
index 3a9214964..70c19573d 100644
--- a/hyperdrive/packages/hypermap-cacher/start-providing/Cargo.toml
+++ b/hyperdrive/packages/hypermap-cacher/start-providing/Cargo.toml
@@ -5,11 +5,11 @@ edition = "2021"
 publish = false
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/hypermap-cacher/stop-providing/Cargo.toml b/hyperdrive/packages/hypermap-cacher/stop-providing/Cargo.toml
index afb8ba956..b4c2c963c 100644
--- a/hyperdrive/packages/hypermap-cacher/stop-providing/Cargo.toml
+++ b/hyperdrive/packages/hypermap-cacher/stop-providing/Cargo.toml
@@ -5,11 +5,11 @@ edition = "2021"
 publish = false
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/settings/Cargo.lock b/hyperdrive/packages/settings/Cargo.lock
index cdf479e50..bbed678bf 100644
--- a/hyperdrive/packages/settings/Cargo.lock
+++ b/hyperdrive/packages/settings/Cargo.lock
@@ -1364,9 +1364,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1512,9 +1509,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1790,10 +1786,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2764,15 +2760,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3288,39 +3275,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3472,9 +3454,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3482,9 +3464,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3493,18 +3475,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3518,9 +3502,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3533,9 +3517,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3552,9 +3536,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/settings/settings/Cargo.toml b/hyperdrive/packages/settings/settings/Cargo.toml
index f136481a3..0ea82deae 100644
--- a/hyperdrive/packages/settings/settings/Cargo.toml
+++ b/hyperdrive/packages/settings/settings/Cargo.toml
@@ -9,12 +9,12 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 base64 = "0.22.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rmp-serde = "1.2.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 url = "*"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/settings/ui/src/index.css b/hyperdrive/packages/settings/ui/src/index.css
index 1e5588055..3a6667bb0 100644
--- a/hyperdrive/packages/settings/ui/src/index.css
+++ b/hyperdrive/packages/settings/ui/src/index.css
@@ -8,7 +8,7 @@ h6,
 p,
 a,
 li {
-    font-family: 'Space Grotesk', monospace;
+    font-family: 'Neue Haas Grotesk', monospace;
 }
 
 /* Layout */
diff --git a/hyperdrive/packages/sign/Cargo.lock b/hyperdrive/packages/sign/Cargo.lock
index fad4a2f94..97d4b3139 100644
--- a/hyperdrive/packages/sign/Cargo.lock
+++ b/hyperdrive/packages/sign/Cargo.lock
@@ -1454,9 +1454,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1596,9 +1593,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1884,10 +1880,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2936,15 +2932,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58b69356da67e2fc1f542c71ea7e654a361a79c938e4424392ecf4fa065d2193"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3537,39 +3524,34 @@ dependencies = [
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.26",
 ]
@@ -3812,19 +3794,19 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
- "wit-bindgen-rt 0.36.0",
+ "wit-bindgen-rt 0.42.1",
  "wit-bindgen-rust-macro",
 ]
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3842,18 +3824,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3867,9 +3851,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3882,9 +3866,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3901,9 +3885,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.1"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/sign/sign/Cargo.toml b/hyperdrive/packages/sign/sign/Cargo.toml
index 0db3a3110..8201ecb3e 100644
--- a/hyperdrive/packages/sign/sign/Cargo.toml
+++ b/hyperdrive/packages/sign/sign/Cargo.toml
@@ -8,12 +8,12 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0.97"
-hyperware_process_lib = { version = "1.2.0", features = ["logging"] }
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719", features = ["logging"] }
 process_macros = "0.1"
 rmp-serde = "1.3.0"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/Cargo.lock b/hyperdrive/packages/terminal/Cargo.lock
index ef7d1a2ed..3b16b56f8 100644
--- a/hyperdrive/packages/terminal/Cargo.lock
+++ b/hyperdrive/packages/terminal/Cargo.lock
@@ -1476,9 +1476,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1654,9 +1651,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1949,10 +1945,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2952,15 +2948,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3514,39 +3501,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3698,9 +3680,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3708,9 +3690,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3719,18 +3701,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3744,9 +3728,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3759,9 +3743,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3778,9 +3762,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/terminal/alias/Cargo.toml b/hyperdrive/packages/terminal/alias/Cargo.toml
index 15c852151..d4fe022e7 100644
--- a/hyperdrive/packages/terminal/alias/Cargo.toml
+++ b/hyperdrive/packages/terminal/alias/Cargo.toml
@@ -8,10 +8,10 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/cat/Cargo.toml b/hyperdrive/packages/terminal/cat/Cargo.toml
index f63537aa9..b40cd23f5 100644
--- a/hyperdrive/packages/terminal/cat/Cargo.toml
+++ b/hyperdrive/packages/terminal/cat/Cargo.toml
@@ -8,10 +8,10 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/echo/Cargo.toml b/hyperdrive/packages/terminal/echo/Cargo.toml
index ecb7b533b..fa47c8394 100644
--- a/hyperdrive/packages/terminal/echo/Cargo.toml
+++ b/hyperdrive/packages/terminal/echo/Cargo.toml
@@ -7,8 +7,8 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
-wit-bindgen = "0.36.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/help/Cargo.toml b/hyperdrive/packages/terminal/help/Cargo.toml
index e694b5dc7..17a25d3b6 100644
--- a/hyperdrive/packages/terminal/help/Cargo.toml
+++ b/hyperdrive/packages/terminal/help/Cargo.toml
@@ -7,8 +7,8 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
-wit-bindgen = "0.36.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/hfetch/Cargo.toml b/hyperdrive/packages/terminal/hfetch/Cargo.toml
index 168545a97..e1ff2c421 100644
--- a/hyperdrive/packages/terminal/hfetch/Cargo.toml
+++ b/hyperdrive/packages/terminal/hfetch/Cargo.toml
@@ -8,11 +8,11 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/hi/Cargo.toml b/hyperdrive/packages/terminal/hi/Cargo.toml
index dc15aebbe..b051bf0a8 100644
--- a/hyperdrive/packages/terminal/hi/Cargo.toml
+++ b/hyperdrive/packages/terminal/hi/Cargo.toml
@@ -7,10 +7,10 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/kill/Cargo.toml b/hyperdrive/packages/terminal/kill/Cargo.toml
index 0d7f382f5..0e4cf8996 100644
--- a/hyperdrive/packages/terminal/kill/Cargo.toml
+++ b/hyperdrive/packages/terminal/kill/Cargo.toml
@@ -8,10 +8,10 @@ simulation-mode = []
 
 [dependencies]
 anyhow = "1.0"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/m/Cargo.toml b/hyperdrive/packages/terminal/m/Cargo.toml
index bc62d159a..cdbb9d237 100644
--- a/hyperdrive/packages/terminal/m/Cargo.toml
+++ b/hyperdrive/packages/terminal/m/Cargo.toml
@@ -9,11 +9,11 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 clap = "4.4"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 regex = "1.10.3"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/net-diagnostics/Cargo.toml b/hyperdrive/packages/terminal/net-diagnostics/Cargo.toml
index c8adb08a3..4f410dae3 100644
--- a/hyperdrive/packages/terminal/net-diagnostics/Cargo.toml
+++ b/hyperdrive/packages/terminal/net-diagnostics/Cargo.toml
@@ -7,10 +7,10 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/peer/Cargo.toml b/hyperdrive/packages/terminal/peer/Cargo.toml
index 74457b0b4..fd101a658 100644
--- a/hyperdrive/packages/terminal/peer/Cargo.toml
+++ b/hyperdrive/packages/terminal/peer/Cargo.toml
@@ -7,10 +7,10 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/peers/Cargo.toml b/hyperdrive/packages/terminal/peers/Cargo.toml
index 8fe5a22a0..472be589b 100644
--- a/hyperdrive/packages/terminal/peers/Cargo.toml
+++ b/hyperdrive/packages/terminal/peers/Cargo.toml
@@ -7,10 +7,10 @@ edition = "2021"
 simulation-mode = []
 
 [dependencies]
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rmp-serde = "1.1.2"
 serde = { version = "1.0", features = ["derive"] }
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/terminal/Cargo.toml b/hyperdrive/packages/terminal/terminal/Cargo.toml
index cb2639484..4711f4d57 100644
--- a/hyperdrive/packages/terminal/terminal/Cargo.toml
+++ b/hyperdrive/packages/terminal/terminal/Cargo.toml
@@ -9,12 +9,12 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 rand = "0.8"
 regex = "1.10.3"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/terminal/top/Cargo.toml b/hyperdrive/packages/terminal/top/Cargo.toml
index e3f30f405..9dec61d44 100644
--- a/hyperdrive/packages/terminal/top/Cargo.toml
+++ b/hyperdrive/packages/terminal/top/Cargo.toml
@@ -9,10 +9,10 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 clap = "4.4"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/packages/tester/Cargo.lock b/hyperdrive/packages/tester/Cargo.lock
index ad65f9246..944927624 100644
--- a/hyperdrive/packages/tester/Cargo.lock
+++ b/hyperdrive/packages/tester/Cargo.lock
@@ -1364,9 +1364,6 @@ name = "hashbrown"
 version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash",
-]
 
 [[package]]
 name = "hashbrown"
@@ -1512,9 +1509,8 @@ dependencies = [
 
 [[package]]
 name = "hyperware_process_lib"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dd471dfac43943b314200b4943f38c4b08337103840e2192cfb5dc9b1bea5"
+version = "2.0.0"
+source = "git+https://github.com/hyperware-ai/process_lib?rev=8dc6719#8dc67196d448b1d74b812489dee81c75dd3e21b8"
 dependencies = [
  "alloy",
  "alloy-primitives",
@@ -1790,10 +1786,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
-name = "leb128"
-version = "0.2.5"
+name = "leb128fmt"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
 
 [[package]]
 name = "libc"
@@ -2760,15 +2756,6 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
-[[package]]
-name = "spdx"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bae30cc7bfe3656d60ee99bf6836f472b0c53dddcbf335e253329abb16e535a2"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "spki"
 version = "0.7.3"
@@ -3298,39 +3285,34 @@ checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
 
 [[package]]
 name = "wasm-encoder"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebf48234b389415b226a4daef6562933d38c7b28a8b8f64c5c4130dad1561ab7"
+checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
 dependencies = [
- "leb128",
+ "leb128fmt",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasm-metadata"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f3e5f5920c5abfc45573c89b07b38efdaae1515ef86f83dad12d60e50ecd62b"
+checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
 dependencies = [
  "anyhow",
  "indexmap",
- "serde",
- "serde_derive",
- "serde_json",
- "spdx",
  "wasm-encoder",
  "wasmparser",
 ]
 
 [[package]]
 name = "wasmparser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e246c2772ce3ebc83f89a2d4487ac5794cad6c309b2071818a88c7db7c36d87b"
+checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
 dependencies = [
- "ahash",
  "bitflags",
- "hashbrown 0.14.5",
+ "hashbrown 0.15.2",
  "indexmap",
  "semver 1.0.24",
 ]
@@ -3482,9 +3464,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3"
+checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
 dependencies = [
  "wit-bindgen-rt",
  "wit-bindgen-rust-macro",
@@ -3492,9 +3474,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-core"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172"
+checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
 dependencies = [
  "anyhow",
  "heck",
@@ -3503,18 +3485,20 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rt"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea"
+checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
 dependencies = [
  "bitflags",
+ "futures",
+ "once_cell",
 ]
 
 [[package]]
 name = "wit-bindgen-rust"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697"
+checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
 dependencies = [
  "anyhow",
  "heck",
@@ -3528,9 +3512,9 @@ dependencies = [
 
 [[package]]
 name = "wit-bindgen-rust-macro"
-version = "0.36.0"
+version = "0.42.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc"
+checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
 dependencies = [
  "anyhow",
  "prettyplease",
@@ -3543,9 +3527,9 @@ dependencies = [
 
 [[package]]
 name = "wit-component"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73ccedf54cc65f287da268d64d2bf4f7530d2cfb2296ffbe3ad5f65567e4cf53"
+checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
 dependencies = [
  "anyhow",
  "bitflags",
@@ -3562,9 +3546,9 @@ dependencies = [
 
 [[package]]
 name = "wit-parser"
-version = "0.220.0"
+version = "0.230.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b7117ce3adc0b4354b46dc1cf3190b00b333e65243d244c613ffcc58bdec84d"
+checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
 dependencies = [
  "anyhow",
  "id-arena",
diff --git a/hyperdrive/packages/tester/tester/Cargo.toml b/hyperdrive/packages/tester/tester/Cargo.toml
index 85a430763..d507f2f4f 100644
--- a/hyperdrive/packages/tester/tester/Cargo.toml
+++ b/hyperdrive/packages/tester/tester/Cargo.toml
@@ -9,12 +9,12 @@ simulation-mode = []
 [dependencies]
 anyhow = "1.0"
 bincode = "1.3.3"
-hyperware_process_lib = "1.2.0"
+hyperware_process_lib = { git = "https://github.com/hyperware-ai/process_lib", rev = "8dc6719" }
 process_macros = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 thiserror = "1.0"
-wit-bindgen = "0.36.0"
+wit-bindgen = "0.42.1"
 
 [lib]
 crate-type = ["cdylib"]
diff --git a/hyperdrive/src/http/login.html b/hyperdrive/src/http/login.html
index e77d2e69e..548e7c126 100644
--- a/hyperdrive/src/http/login.html
+++ b/hyperdrive/src/http/login.html
@@ -41,7 +41,7 @@
 <body>
   <noscript>Enable javascript, I abjure thee!</noscript>
   <div id="root">
-    <div id="signup-page" class="flex flex-col place-items-center place-content-center h-screen font-sans">
+    <div id="signup-page" class="flex flex-col place-items-center place-content-center h-screen prose">
       <div id="home-form-header" class="flex flex-col place-content-center place-items-center"
         style="gap: 24px; margin: 32px 0 56px; width: 64px; height: 64px;">
         <svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 622.27 595.09">
@@ -205,4 +205,4 @@ <h3>Logging in...</h3>
   </script>
 </body>
 
-</html>
+</html>
\ No newline at end of file
diff --git a/hyperdrive/src/http/server.rs b/hyperdrive/src/http/server.rs
index d6ec42693..5bdd215b5 100644
--- a/hyperdrive/src/http/server.rs
+++ b/hyperdrive/src/http/server.rs
@@ -15,7 +15,11 @@ use lib::types::core::{
 };
 use route_recognizer::Router;
 use sha2::{Digest, Sha256};
-use std::{collections::HashMap, net::SocketAddr, sync::Arc};
+use std::{
+    collections::{HashMap, HashSet},
+    net::SocketAddr,
+    sync::Arc,
+};
 use tokio::sync::RwLock;
 use warp::{
     http::{
@@ -49,6 +53,7 @@ type WebSocketSender = tokio::sync::mpsc::Sender<warp::ws::Message>;
 
 type PathBindings = Arc<RwLock<Router<BoundPath>>>;
 type WsPathBindings = Arc<RwLock<Router<BoundWsPath>>>;
+type SecureSubdomains = Arc<RwLock<HashSet<String>>>;
 
 struct BoundPath {
     pub app: Option<ProcessId>, // if None, path has been unbound
@@ -182,6 +187,7 @@ pub async fn http_server(
     mut recv_in_server: MessageReceiver,
     send_to_loop: MessageSender,
     print_tx: PrintSender,
+    expose_local: bool,
 ) -> anyhow::Result<()> {
     let http_response_senders: HttpResponseSenders = Arc::new(DashMap::new());
     let ws_senders: WebSocketSenders = Arc::new(DashMap::new());
@@ -203,6 +209,7 @@ pub async fn http_server(
 
     let path_bindings: PathBindings = Arc::new(RwLock::new(bindings_map));
     let ws_path_bindings: WsPathBindings = Arc::new(RwLock::new(Router::new()));
+    let secure_subdomains: SecureSubdomains = Arc::new(RwLock::new(HashSet::new()));
 
     tokio::spawn(serve(
         Arc::new(our_name),
@@ -211,10 +218,12 @@ pub async fn http_server(
         path_bindings.clone(),
         ws_path_bindings.clone(),
         ws_senders.clone(),
+        secure_subdomains.clone(),
         Arc::new(encoded_keyfile),
         Arc::new(jwt_secret_bytes),
         send_to_loop.clone(),
         print_tx.clone(),
+        expose_local,
     ));
 
     while let Some(km) = recv_in_server.recv().await {
@@ -224,6 +233,7 @@ pub async fn http_server(
             path_bindings.clone(),
             ws_path_bindings.clone(),
             ws_senders.clone(),
+            secure_subdomains.clone(),
             send_to_loop.clone(),
             print_tx.clone(),
         )
@@ -241,10 +251,12 @@ async fn serve(
     path_bindings: PathBindings,
     ws_path_bindings: WsPathBindings,
     ws_senders: WebSocketSenders,
+    secure_subdomains: SecureSubdomains,
     encoded_keyfile: Arc<Vec<u8>>,
     jwt_secret_bytes: Arc<Vec<u8>>,
     send_to_loop: MessageSender,
     print_tx: PrintSender,
+    expose_local: bool,
 ) {
     // filter to receive websockets
     let cloned_our = our.clone();
@@ -262,6 +274,7 @@ async fn serve(
         .and(warp::any().map(move || ws_path_bindings.clone()))
         .and(warp::any().map(move || cloned_msg_tx.clone()))
         .and(warp::any().map(move || cloned_print_tx.clone()))
+        .and(warp::any().map(move || expose_local.clone()))
         .and_then(ws_handler);
 
     #[cfg(feature = "simulation-mode")]
@@ -303,10 +316,12 @@ async fn serve(
         .and(warp::any().map(move || our.clone()))
         .and(warp::any().map(move || http_response_senders.clone()))
         .and(warp::any().map(move || path_bindings.clone()))
+        .and(warp::any().map(move || secure_subdomains.clone()))
         .and(warp::any().map(move || jwt_secret_bytes.clone()))
         .and(warp::any().map(move || send_to_loop.clone()))
         .and(warp::any().map(move || print_tx.clone()))
         .and(warp::any().map(move || login_html.clone()))
+        .and(warp::any().map(move || expose_local.clone()))
         .and_then(http_handler);
 
     let filter_with_ws = ws_route.or(login).or(filter);
@@ -343,12 +358,18 @@ async fn login_handler(
 
     println!("login_handler: got info {info:?}\r");
 
+    let is_localhost = host
+        .as_ref()
+        .unwrap_or(&warp::host::Authority::from_static("localhost"))
+        .host()
+        .contains("localhost");
+
     match keygen::decode_keyfile(&encoded_keyfile, &info.password_hash) {
         Ok(keyfile) => {
             let token = match keygen::generate_jwt(
                 &keyfile.jwt_secret_bytes,
                 our.as_ref(),
-                &info.subdomain,
+                if is_localhost { &info.subdomain } else { &None },
             ) {
                 Some(token) => token,
                 None => {
@@ -371,7 +392,10 @@ async fn login_handler(
             };
 
             let cookie = match info.subdomain.unwrap_or_default().as_str() {
-                "" => format!("hyperware-auth_{our}={token};"),
+                "" => format!(
+                    "hyperware-auth_{our}={token}; domain=.{};",
+                    host.as_ref().unwrap().host()
+                ),
                 subdomain => {
                     // enforce that subdomain string only contains a-z, 0-9, ., :, and -
                     let subdomain = subdomain
@@ -446,6 +470,7 @@ async fn ws_handler(
     ws_path_bindings: WsPathBindings,
     send_to_loop: MessageSender,
     print_tx: PrintSender,
+    expose_local: bool,
 ) -> Result<impl warp::Reply, warp::Rejection> {
     let original_path = utils::normalize_path(path.as_str());
     Printout::new(
@@ -482,6 +507,12 @@ async fn ws_handler(
         return Err(warp::reject::not_found());
     };
 
+    let is_localhost = host
+        .as_ref()
+        .unwrap_or(&warp::host::Authority::from_static("localhost"))
+        .host()
+        .contains("localhost");
+
     if bound_path.authenticated {
         let Some(auth_token) = serialized_headers.get("cookie") else {
             return Err(warp::reject::not_found());
@@ -496,10 +527,20 @@ async fn ws_handler(
             // parse out subdomain from host (there can only be one)
             let request_subdomain = host.host().split('.').next().unwrap_or("");
             if request_subdomain != subdomain
-                || !utils::auth_token_valid(&our, Some(&app), auth_token, &jwt_secret_bytes)
+                || !utils::auth_token_valid(
+                    &our,
+                    if is_localhost { Some(&app) } else { None },
+                    auth_token,
+                    &jwt_secret_bytes,
+                )
             {
                 return Err(warp::reject::not_found());
             }
+
+            let expected_subdomain = utils::generate_secure_subdomain(&app);
+            if subdomain != &expected_subdomain {
+                return Err(warp::reject::not_found());
+            }
         } else {
             if !utils::auth_token_valid(&our, None, auth_token, &jwt_secret_bytes) {
                 return Err(warp::reject::not_found());
@@ -511,7 +552,9 @@ async fn ws_handler(
         .map(|addr| addr.ip().is_loopback())
         .unwrap_or(false);
 
-    if bound_path.extension && !is_local {
+    let is_behind_reverse_proxy = utils::is_behind_reverse_proxy(&headers);
+
+    if bound_path.extension && (!is_local || is_behind_reverse_proxy || !expose_local) {
         return Err(warp::reject::reject());
     }
 
@@ -555,10 +598,12 @@ async fn http_handler(
     our: Arc<String>,
     http_response_senders: HttpResponseSenders,
     path_bindings: PathBindings,
+    secure_subdomains: SecureSubdomains,
     jwt_secret_bytes: Arc<Vec<u8>>,
     send_to_loop: MessageSender,
     print_tx: PrintSender,
     login_html: Arc<String>,
+    expose_local: bool,
 ) -> Result<impl warp::Reply, warp::Rejection> {
     let original_path = utils::normalize_path(path.as_str());
     let base_path = original_path.split('/').skip(1).next().unwrap_or("");
@@ -599,6 +644,8 @@ async fn http_handler(
 
     let host = host.unwrap_or(warp::host::Authority::from_static("localhost"));
 
+    let is_localhost = host.as_ref().contains("localhost");
+
     if bound_path.authenticated {
         if let Some(ref subdomain) = bound_path.secure_subdomain {
             let request_subdomain = host.host().split('.').next().unwrap_or("");
@@ -640,9 +687,19 @@ async fn http_handler(
                     .body(vec![])
                     .into_response());
             }
+
+            let expected_subdomain = utils::generate_secure_subdomain(&app);
+            if subdomain != &expected_subdomain {
+                return Ok(warp::reply::with_status(
+                    "secure subdomain can only serve its associated package",
+                    StatusCode::FORBIDDEN,
+                )
+                .into_response());
+            }
+
             if !utils::auth_token_valid(
                 &our,
-                Some(&app),
+                if is_localhost { Some(&app) } else { None },
                 serialized_headers.get("cookie").unwrap_or(&"".to_string()),
                 &jwt_secret_bytes,
             ) {
@@ -653,6 +710,23 @@ async fn http_handler(
                     .into_response());
             }
         } else {
+            // Check if the request is coming through a secure subdomain
+            let request_subdomain = host.host().split('.').next().unwrap_or("");
+            if !request_subdomain.is_empty() {
+                let secure_subdomains = secure_subdomains.read().await;
+                if secure_subdomains.contains(request_subdomain) {
+                    // This is a request to a secure subdomain, so enforce package restriction
+                    let expected_subdomain = utils::generate_secure_subdomain(&app);
+                    if request_subdomain != expected_subdomain {
+                        return Ok(warp::reply::with_status(
+                            "secure subdomain can only serve its associated package",
+                            StatusCode::FORBIDDEN,
+                        )
+                        .into_response());
+                    }
+                }
+            }
+
             if !utils::auth_token_valid(
                 &our,
                 None,
@@ -672,7 +746,9 @@ async fn http_handler(
         .map(|addr| addr.ip().is_loopback())
         .unwrap_or(false);
 
-    if bound_path.local_only && !is_local {
+    let is_behind_reverse_proxy = utils::is_behind_reverse_proxy(&headers);
+
+    if bound_path.local_only && (!is_local || is_behind_reverse_proxy || !expose_local) {
         return Ok(warp::reply::with_status(vec![], StatusCode::FORBIDDEN).into_response());
     }
 
@@ -1111,6 +1187,7 @@ async fn handle_app_message(
     path_bindings: PathBindings,
     ws_path_bindings: WsPathBindings,
     ws_senders: WebSocketSenders,
+    secure_subdomains: SecureSubdomains,
     send_to_loop: MessageSender,
     print_tx: PrintSender,
 ) {
@@ -1265,6 +1342,15 @@ async fn handle_app_message(
                     }
                     let path = utils::format_path_with_process(&km.source.process, &path);
                     let subdomain = utils::generate_secure_subdomain(&km.source.process);
+
+                    // Add subdomain to the set of secure subdomains
+                    //
+                    // In block to drop write lock ASAP
+                    {
+                        let mut secure_subs = secure_subdomains.write().await;
+                        secure_subs.insert(subdomain.clone());
+                    }
+
                     let mut path_bindings = path_bindings.write().await;
                     Printout::new(
                         3,
@@ -1369,6 +1455,15 @@ async fn handle_app_message(
                     }
                     let path = utils::format_path_with_process(&km.source.process, &path);
                     let subdomain = utils::generate_secure_subdomain(&km.source.process);
+
+                    // Add subdomain to the set of secure subdomains
+                    //
+                    // In block to drop write lock ASAP
+                    {
+                        let mut secure_subs = secure_subdomains.write().await;
+                        secure_subs.insert(subdomain.clone());
+                    }
+
                     let mut ws_path_bindings = ws_path_bindings.write().await;
                     ws_path_bindings.add(
                         &path,
diff --git a/hyperdrive/src/http/utils.rs b/hyperdrive/src/http/utils.rs
index 16f77649a..ebfe22f07 100644
--- a/hyperdrive/src/http/utils.rs
+++ b/hyperdrive/src/http/utils.rs
@@ -7,6 +7,13 @@ use std::collections::HashMap;
 use tokio::net::TcpListener;
 use warp::http::{header::HeaderName, header::HeaderValue, HeaderMap};
 
+const REVERSE_PROXY_HEADERS: &[&str; 4] = &[
+    "x-forwarded-for",
+    "x-forwarded-proto",
+    "x-forwarded-host",
+    "x-real-ip",
+];
+
 #[derive(Serialize, Deserialize)]
 pub struct RpcMessage {
     pub node: Option<String>,
@@ -142,3 +149,12 @@ pub async fn is_port_available(bind_addr: &str) -> Option<TcpListener> {
 pub fn _binary_encoded_string_to_bytes(s: &str) -> Vec<u8> {
     s.chars().map(|c| c as u8).collect()
 }
+
+pub fn is_behind_reverse_proxy(headers: &warp::http::HeaderMap) -> bool {
+    for reverse_proxy_header in REVERSE_PROXY_HEADERS {
+        if headers.contains_key(*reverse_proxy_header) {
+            return true;
+        }
+    }
+    return false;
+}
diff --git a/hyperdrive/src/kernel/mod.rs b/hyperdrive/src/kernel/mod.rs
index a86a43297..0b0a2da11 100644
--- a/hyperdrive/src/kernel/mod.rs
+++ b/hyperdrive/src/kernel/mod.rs
@@ -626,7 +626,6 @@ pub async fn kernel(
     default_pki_entries: Vec<t::HnsUpdate>,
 ) -> anyhow::Result<()> {
     let mut config = Config::new();
-    config.cache_config_load_default().unwrap();
     config.wasm_backtrace_details(WasmBacktraceDetails::Enable);
     config.wasm_component_model(true);
     config.async_support(true);
diff --git a/hyperdrive/src/kernel/process.rs b/hyperdrive/src/kernel/process.rs
index 61ddeb975..9bc4b567c 100644
--- a/hyperdrive/src/kernel/process.rs
+++ b/hyperdrive/src/kernel/process.rs
@@ -11,7 +11,8 @@ use wasmtime::{
     Engine, Store,
 };
 use wasmtime_wasi::{
-    pipe::MemoryOutputPipe, DirPerms, FilePerms, WasiCtx, WasiCtxBuilder, WasiView,
+    p2::{pipe::MemoryOutputPipe, IoView, WasiCtx, WasiCtxBuilder, WasiView},
+    DirPerms, FilePerms,
 };
 
 use super::RestartBackoff;
@@ -62,10 +63,13 @@ pub struct ProcessWasiV1 {
     wasi: WasiCtx,
 }
 
-impl WasiView for ProcessWasiV1 {
+impl IoView for ProcessWasiV1 {
     fn table(&mut self) -> &mut Table {
         &mut self.table
     }
+}
+
+impl WasiView for ProcessWasiV1 {
     fn ctx(&mut self) -> &mut WasiCtx {
         &mut self.wasi
     }
@@ -129,7 +133,7 @@ async fn make_component_v1(
     let mut linker = Linker::new(&engine);
     ProcessV1::add_to_linker(&mut linker, |state: &mut ProcessWasiV1| state).unwrap();
     let (table, wasi, wasi_stderr) = make_table_and_wasi(home_directory_path, &process_state).await;
-    wasmtime_wasi::add_to_linker_async(&mut linker).unwrap();
+    wasmtime_wasi::p2::add_to_linker_async(&mut linker).unwrap();
 
     let our_process_id = process_state.metadata.our.process.clone();
     let send_to_terminal = process_state.send_to_terminal.clone();
diff --git a/hyperdrive/src/kernel/standard_host_v1.rs b/hyperdrive/src/kernel/standard_host_v1.rs
index 22064a70a..a4d746425 100644
--- a/hyperdrive/src/kernel/standard_host_v1.rs
+++ b/hyperdrive/src/kernel/standard_host_v1.rs
@@ -458,7 +458,6 @@ async fn send_and_await_response(
 ///
 /// create the process API. this is where the functions that a process can use live.
 ///
-#[async_trait::async_trait]
 impl StandardHost for process::ProcessWasiV1 {
     //
     // system utils:
diff --git a/hyperdrive/src/main.rs b/hyperdrive/src/main.rs
index 3c02dcc3c..e1b0febeb 100644
--- a/hyperdrive/src/main.rs
+++ b/hyperdrive/src/main.rs
@@ -106,6 +106,8 @@ async fn main() {
             .expect("failed to parse given --process-verbosity. Must be JSON Object with keys `ProcessId`s and values either `{\"U8\": <verbosity>}` or `\"Muted\"`")
     };
 
+    let expose_local = *matches.get_one::<bool>("expose-local").unwrap();
+
     #[cfg(feature = "simulation-mode")]
     let (fake_node_name, fakechain_port) = (
         matches.get_one::<String>("fake-node-name"),
@@ -458,6 +460,7 @@ async fn main() {
         http_server_receiver,
         kernel_message_sender.clone(),
         print_sender.clone(),
+        expose_local,
     ));
     tasks.spawn(http::client::http_client(
         our.name.clone(),
@@ -784,6 +787,10 @@ fn build_command() -> Command {
         .arg(
             arg!(--"process-verbosity" <JSON_STRING> "ProcessId: verbosity JSON object")
                 .default_value("")
+        )
+        .arg(
+            arg!(--"expose-local" <EXPOSE_LOCAL> "Expose local-only and RPC endpoints. WARNING: If behind a reverse proxy, ensure proxy is set to put `x-forwarded-for` headers or this will allow your node to be controlled remotely without authentication! (caddy adds these headers by default and so is strongly recommended)")
+                .action(clap::ArgAction::SetTrue),
         );
 
     #[cfg(feature = "simulation-mode")]
diff --git a/hyperdrive/src/net/mod.rs b/hyperdrive/src/net/mod.rs
index 94ab4c46e..c55e0c94e 100644
--- a/hyperdrive/src/net/mod.rs
+++ b/hyperdrive/src/net/mod.rs
@@ -9,7 +9,12 @@ use types::{
     ActivePassthroughs, IdentityExt, NetData, OnchainPKI, Peers, PendingPassthroughs, TCP_PROTOCOL,
     WS_PROTOCOL,
 };
-use {dashmap::DashMap, ring::signature::{Ed25519KeyPair, KeyPair}, std::sync::Arc, tokio::task::JoinSet};
+use {
+    dashmap::DashMap,
+    ring::signature::{Ed25519KeyPair, KeyPair},
+    std::sync::Arc,
+    tokio::task::JoinSet,
+};
 
 mod connect;
 mod indirect;
@@ -302,7 +307,11 @@ async fn handle_local_request(
                     .concat();
                     (
                         NetResponse::Verified(utils::validate_signature(
-                            &from.node, &signature, &message, &data.pki, ext.keypair.public_key().as_ref().to_vec(),
+                            &from.node,
+                            &signature,
+                            &message,
+                            &data.pki,
+                            ext.keypair.public_key().as_ref().to_vec(),
                         )),
                         None,
                     )
diff --git a/hyperdrive/src/net/utils.rs b/hyperdrive/src/net/utils.rs
index e80dac4e0..0a3678ec3 100644
--- a/hyperdrive/src/net/utils.rs
+++ b/hyperdrive/src/net/utils.rs
@@ -270,7 +270,13 @@ pub fn ingest_log(log: HnsUpdate, pki: &OnchainPKI) {
     );
 }
 
-pub fn validate_signature(from: &str, signature: &[u8], message: &[u8], pki: &OnchainPKI, our_key: Vec<u8>) -> bool {
+pub fn validate_signature(
+    from: &str,
+    signature: &[u8],
+    message: &[u8],
+    pki: &OnchainPKI,
+    our_key: Vec<u8>,
+) -> bool {
     if let Some(peer_id) = pki.get(from) {
         let their_networking_key = signature::UnparsedPublicKey::new(
             &signature::ED25519,
@@ -278,10 +284,7 @@ pub fn validate_signature(from: &str, signature: &[u8], message: &[u8], pki: &On
         );
         their_networking_key.verify(message, signature).is_ok()
     } else {
-        let our_key = signature::UnparsedPublicKey::new(
-            &signature::ED25519,
-            our_key,
-        );
+        let our_key = signature::UnparsedPublicKey::new(&signature::ED25519, our_key);
         our_key.verify(message, signature).is_ok()
     }
 }
diff --git a/hyperdrive/src/terminal/utils.rs b/hyperdrive/src/terminal/utils.rs
index 31f133b14..18dbdf44a 100644
--- a/hyperdrive/src/terminal/utils.rs
+++ b/hyperdrive/src/terminal/utils.rs
@@ -61,53 +61,55 @@ pub fn splash(
   ███    ███   ███   ███   ███          ███    ███   ███    ███  ███   ▄███   ███    ███  ███    ███  ███   ███    ███
   ███    █▀     ▀█████▀   ▄████▀        ██████████   ███     ▀█  ████████▀    ███     ▀█  █▀      ▀████▀    ██████████
 
-@@@@@@@@@@@=:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@
-@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@%%**++=========++*#%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*=------------------------=+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*----------------------------------#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@%#=----------------------------------=----*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@%+---------------------------------------===--+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@#=-------------------------------------------=++-=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@%%@@@@%=---------------------------------------------=+++--+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@#------------------------------------------------=+**=-=%@@@@@@@@@@@@@@@@@@@@@@@@@@+*@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@*------------------------------------------------=======--+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@*-----------------------------------------------===+++++==+=-*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=%@@@@
-@@@@@@@@@@@@@@@@@#-----------------------------------------------=======--------=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@%=----------------------------------------------+##--------------%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@#----------------------------------------------+=++*=--=====+---*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@=---------------------------------------=+=-===+-+=#*+====+=---+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@%--------------------------------------=+=====--+-+-=#+=--------*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@%---------------------------------------=**++===+=*=-*+==-------*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@%-----------------------------------------=+**++#=-*-+*==--------+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@=-----------------------------------=+=---===+#++=++++++===-------#@@@@@@#*@@@@@@@@@@@@@@@@@@@@@@%@@@@
-@@@@@@@@@@@@@@@@+-----------------------------------=====----=#=#*=++*+==+====-----#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@#=-----------------------------------+*+=====-*%###+#%+=======-----=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@%==-----------------------------=*+==-------=**#*%@%**=-===+++=-----+%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@*-+---=+-----=------+=-----=*=------=+*+=----=##+=+#+++-==++===----=*=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@+*@%+--=+----==----=+=----=++----==++=--=++*+=--=++**+****=========---=#=-#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@*++---==----=+=---=++=---=+++---+*++==+*+++=-=+++++++==+++=====----#*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@+--+=----+=---=*+=--=**=---+*+=-=*#+=-----===+=+****---+*+++++=---*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@%++---=*=--=*+---=*+---=*#=-=*#+--+#*=++---*+*=----==----+*++++---=%@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@
-@#:+%@@@@@@@@@@@@@@@%=-++---+*---=*+---+#*==+#+==+#*++#%@=-----+*#+=---#*+=----+*+----%@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@
-@@%%@@@@%%@@@@@@@@@@@%*=-=++--=*+--=+*+=+**+-=**+=*#*=+*=-------=#+++==++==-----=+----#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@%=+@@@@@@@@@@@@%**=-=++=-=**=-+*++*+++++====++=-+*+=------+*+++=-*+=-----------=@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@*=#=--+*=-+#+=++=-----------**+--=**=----=%---=-+*=------------%@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@%-=*+--**--*+-=*=----------=++#+---+-----=#-----*+------------*@@@@*-%@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@%+-+*=-+#-=+=-=++----------+++**=-===----#+=---*=------------=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@%*-====+=-=+=---=----------++=+++=-=----+*+=--+=-------------#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@%%@@@@@@@@@@@@@@@@@@@@@@*=+++-+=+--++=-------------*=-+*+=------#+=--++-------------+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*==***-=+=--++=--------=--=%=-=**=-----+*++-+#+=-----------=#@@@@@@@%@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*%+-+#*--++----=-------==---#*----+=---=*====*#*=-----------=%@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=*+=+=+=-=+*=---------+=---=++*+-------*+---=#***==+-=------*@@@@@@@@@@@@@@@@@@@@@@@%%@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+=+**+-++=-===--------===---*==++=-----+*+----+#%%%*==+==+=-*@@@@@@@@@@@@@@@@@@@@@@@**@@
-@@@%@@@@@@@@@*=@@@@@@@@@@@@@%#*=-=**=-++--==---------=+=--=*=-++=-----#+-----=+=+*+=*+=++*%@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@%%@@@@@@@@@@@@@%=-+**#=+=-=+=-----------===---+*=--++=---*+------+*+##=+#+=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@##+--+*====----==---------------#*=--=+---=#=-----+%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@%*-=+*#*+=--===---=---------------%*+===----#+==--=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+                    HWH
+                   WHWHW
+                   HWHWHWH
+                  WHWHWHWHWH
+                 WHWHWHWHWHWH
+                WHWHWHWHWHWHWHW
+               HWHWHWHWHWHWHWHWHW
+              HWHWHWHWHWHWHWHWHWHWH
+              WHWHWHWHWHWHWHWHWHWHWH
+             WHWHWHWHWHWHWHWHWHWHWHWHW
+            HWHWHWHWHWHWHW            HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHW               HWHWHWHWHWHWHWHWHWHWHW
+             HWHWHWHWHWH                WHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHW               HWHWHWHWHWHWHWHWHWHWHW
+              HWHWHWHWHW                   HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH               WHWHWHWHWHWHWHWHWHWHWH
+                WHWHWHW                     HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH                WHWHWHWHWHWHWHWHWHWHWH
+                  WHW                        HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH                WHWHWHWHWHWHWHWHWHWHWH
+                   WH                           WHWHWHWHWHWHWHWHWHWHWHWHWHWH               WHWHWHWHWHWHWHWHWHWHWH
+                   WHWH                           WHWHWHWHWHWHWHWHWHWHWHWHW                HWHWHWHWHWHWHWHWHWHWH
+                   WHWHWH                          WHWHWHWHWHWHWHWHWHWHWHW                HWHWHWHWHWHWHWHWHWHWHW
+                  HWHWHWHW                             HWHWHWHWHWHWHWHW                  HWHWHWHWHWHWHWHWHWHWHW
+                HWHWHWHWHWHW                                                            HWHWHWHWHWHWHWHWHWHWHW
+                HWHWHWHWHWHWHW                                                          HWHWHWHWHWHWHWHWHWHWHW
+               HWHWHWHWHWHWHWHW                                                        HWHWHWHWHWHWHWHWHWHWH
+              WHWHWHWHWHWHWHWHWHW                                                     HWHWHWHWHWHWHWHWHWHWH
+              WHWHWHWHWHWHWHWHWHWH                                                   WHWHWHWHWHWHWHWHWHWHWH
+             WHWHWHWHWHWHWHWHWHWHW                                                   HWHWHWHWHWHWHWHWHWHWH
+            WHWHWHWHWHWHWHWHWHWHWH                                                   WHWHWHWHWHWHWHWHWHWH
+            WHWHWHWHWHWHWHWHWHWHW                                                     HWHWHWHWHWHWHWHWHWH
+           WHWHWHWHWHWHWHWHWHWHW                                                        HWHWHWHWHWHWHWHW
+         HWHWHWHWHWHWHWHWHWHWHW                                                          HWHWHWHWHWHWHW
+         HWHWHWHWHWHWHWHWHWHWHW                                                            HWHWHWHWHWH
+        WHWHWHWHWHWHWHWHWHWHWH                  WHWHWHWHWHWHWHWH                             WHWHWHWH
+       WHWHWHWHWHWHWHWHWHWHWH                WHWHWHWHWHWHWHWHWHWHWHW                          HWHWHW
+       HWHWHWHWHWHWHWHWHWHWH                WHWHWHWHWHWHWHWHWHWHWHWHW                           HWHW
+      HWHWHWHWHWHWHWHWHWHWHW               HWHWHWHWHWHWHWHWHWHWHWHWHWHW                           HW
+     HWHWHWHWHWHWHWHWHWHWHW                HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH                        WHW
+    HWHWHWHWHWHWHWHWHWHWHW                HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH                     WHWHWHW
+    HWHWHWHWHWHWHWHWHWHWHW               HWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH                   WHWHWHWHWH
+   WHWHWHWHWHWHWHWHWHWHWH               WHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHW                HWHWHWHWHWH
+  WHWHWHWHWHWHWHWHWHWHWH               WHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWHWH            WHWHWHWHWHWHWH
+                                                                                 WHWHWHWHWHWHWHWHWHWHWHWHW
+                                                                                   HWHWHWHWHWHWHWHWHWHWHW
+                                                                                    HWHWHWHWHWHWHWHWHWHWH
+                                                                                      WHWHWHWHWHWHWHWHWH
+                                                                                        WHWHWHWHWHWHWHW
+                                                                                          HWHWHWHWHWHW
+                                                                                           HWHWHWHWHW
+                                                                                             HWHWHWH
+                                                                                               WHWHW
+                                                                                                HWH
 
  {} ({})
  runtime version {}
@@ -155,6 +157,32 @@ pub fn splash(
     ███   ▄███   ███    ███  ███    ███  ███   ███    ███
     ████████▀    ███     ▀█  █▀      ▀████▀    ██████████
 
+          HW
+         HWHWHW
+        HWHWHWHW
+       HWHWHWHWHWH
+      WHWHWHWHWHWHWH
+      WHWHWHWH      WHWHWHWHWHWHWHWHWHWHWH        WHWHWHWHWHW
+       HWHWH          WHWHWHWHWHWHWHWHWHW        HWHWHWHWHWHW
+         HWH           WHWHWHWHWHWHWHWHW        HWHWHWHWHWHW
+         HWH              WHWHWHWHWHWHW        HWHWHWHWHWH
+         WHWHWH                               WHWHWHWHWHWH
+        WHWHWHWH                             WHWHWHWHWHWH
+       WHWHWHWHWH                            WHWHWHWHWHW
+      HWHWHWHWHWHW                          HWHWHWHWHWHW
+      HWHWHWHWHWH                            WHWHWHWHWH
+     WHWHWHWHWHWH                             WHWHWHWH
+    WHWHWHWHWHWH                               WHWHWH
+    WHWHWHWHWHW        HWHWHWHWHWHWH              WHW
+  HWHWHWHWHWHW        HWHWHWHWHWHWHWHWH           WHW
+ HWHWHWHWHWHW        HWHWHWHWHWHWHWHWHWH          WHWHW
+ HWHWHWHWHWH        WHWHWHWHWHWHWHWHWHWHWH      WHWHWHWH
+                                          WHWHWHWHWHWHWH
+                                            WHWHWHWHWHW
+                                              HWHWHWHW
+                                               HWHWHW
+                                                  HW
+
  {} ({})
  version {}
  a general purpose sovereign cloud computer
diff --git a/lib/Cargo.toml b/lib/Cargo.toml
index 5bb7c5b93..e2acb42ca 100644
--- a/lib/Cargo.toml
+++ b/lib/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "lib"
 authors = ["Sybil Technologies AG"]
-version = "1.3.0"
+version = "1.3.1"
 edition = "2021"
 description = "A general-purpose sovereign cloud computing platform"
 homepage = "https://hyperware.ai"
@@ -32,4 +32,4 @@ serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 thiserror = "1.0"
 tokio = { version = "1.28", features = ["sync"] }
-wasmtime = { version = "27.0.0", features = ["component-model"] }
+wasmtime = { version = "33.0.0", features = ["component-model"] }
diff --git a/scripts/build-packages/Cargo.toml b/scripts/build-packages/Cargo.toml
index c964b41d5..07f9ebf9b 100644
--- a/scripts/build-packages/Cargo.toml
+++ b/scripts/build-packages/Cargo.toml
@@ -7,7 +7,7 @@ edition = "2021"
 anyhow = "1.0.71"
 clap = "4"
 fs-err = "2.11"
-kit = { git = "https://github.com/hyperware-ai/kit", rev = "12a4fde" }
+kit = { git = "https://github.com/hyperware-ai/kit", rev = "7ec84b7" }
 serde_json = "1"
 tokio = "1.28"
 walkdir = "2.4"
