diff --git a/storage/utility/NDF.go b/storage/utility/NDF.go
index c01485f26856e0ad111dab4614992045d7d585e4..3c5f9b9d48bb2fe6fc55bb07221f12d8add79538 100644
--- a/storage/utility/NDF.go
+++ b/storage/utility/NDF.go
@@ -5,6 +5,9 @@
 // LICENSE file.                                                              //
 ////////////////////////////////////////////////////////////////////////////////
 
+// This file is compiled for all architectures except WebAssembly.
+//go:build !js || !wasm
+
 package utility
 
 import (
diff --git a/storage/utility/NDF_js.go b/storage/utility/NDF_js.go
new file mode 100644
index 0000000000000000000000000000000000000000..f958bd350143e6773e5aaf5f35ee495c46bce04c
--- /dev/null
+++ b/storage/utility/NDF_js.go
@@ -0,0 +1,40 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright © 2022 xx foundation                                             //
+//                                                                            //
+// Use of this source code is governed by a license that can be found in the  //
+// LICENSE file.                                                              //
+////////////////////////////////////////////////////////////////////////////////
+
+package utility
+
+import (
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/xx_network/primitives/ndf"
+	"os"
+	"syscall/js"
+)
+
+const NdfStorageKeyNamePrefix = "ndfStorageKey/"
+
+var localStorage = js.Global().Get("localStorage")
+
+func LoadNDF(_ *versioned.KV, key string) (*ndf.NetworkDefinition, error) {
+	keyValue := localStorage.Call("getItem", NdfStorageKeyNamePrefix+key)
+	if keyValue.IsNull() {
+		return nil, os.ErrNotExist
+	}
+
+	return ndf.Unmarshal([]byte(keyValue.String()))
+}
+
+func SaveNDF(_ *versioned.KV, key string, ndf *ndf.NetworkDefinition) error {
+	marshaled, err := ndf.Marshal()
+	if err != nil {
+		return err
+	}
+
+	localStorage.Call("setItem",
+		NdfStorageKeyNamePrefix+key, string(marshaled))
+
+	return nil
+}