diff --git a/main.go b/main.go
index 5da0d86b431568852c5f5f45cf2c88dc0af8b856..46ad9d8c68bb168132b90fc475532529ae789ae1 100644
--- a/main.go
+++ b/main.go
@@ -141,6 +141,9 @@ func main() {
 	js.Global().Set("GetDefaultE2eFileTransferParams",
 		js.FuncOf(wasm.GetDefaultE2eFileTransferParams))
 
+	// wasm/purge.go
+	js.Global().Set("Purge", js.FuncOf(wasm.Purge))
+
 	// wasm/restlike.go
 	js.Global().Set("RestlikeRequest", js.FuncOf(wasm.RestlikeRequest))
 	js.Global().Set("RestlikeRequestAuth", js.FuncOf(wasm.RestlikeRequestAuth))
diff --git a/wasm/purge.go b/wasm/purge.go
index 25c3664c7dde1b9991abf60df3d3db7d8a38d318..24bbef13b2f311c4a8340e94f9ca57fcdb6b34b3 100644
--- a/wasm/purge.go
+++ b/wasm/purge.go
@@ -7,9 +7,74 @@
 
 package wasm
 
+import (
+	"github.com/hack-pad/go-indexeddb/idb"
+	"github.com/pkg/errors"
+	"gitlab.com/elixxir/xxdk-wasm/creds"
+	"gitlab.com/elixxir/xxdk-wasm/utils"
+	"sync/atomic"
+	"syscall/js"
+)
+
 // NumClientsRunning is an atomic that tracks the current number of Cmix
 // followers that have been started. Every time one is started, this counter
 // must be incremented and every time one is stopped, it must be decremented.
 //
 // This variable is an atomic. Only access it with atomic functions
 var NumClientsRunning uint64
+
+// Purge clears all local storage and indexedDb databases saved by this WASM
+// binary. All Cmix followers must be closed and the user's password is
+// required.
+//
+// Warning: This deletes all storage local to the webpage running this WASM.
+// Only use if you want to destroy everything.
+//
+// Parameters:
+//  - args[0] - Storage directory path (string).
+//  - args[1] - Password used for storage (Uint8Array).
+//
+// Returns:
+//  - Throws a TypeError if the password is incorrect or if not all Cmix
+//    followers have been stopped.
+func Purge(_ js.Value, args []js.Value) interface{} {
+	// Check the password
+	if !creds.VerifyPassword(js.Value{}, []js.Value{args[1]}).(bool) {
+		utils.Throw(utils.TypeError, errors.New("invalid password"))
+		return nil
+	}
+
+	// Verify all Cmix followers are stopped
+	if n := atomic.LoadUint64(&NumClientsRunning); n != 0 {
+		utils.Throw(
+			utils.TypeError, errors.Errorf("%d Cmix followers running", n))
+		return nil
+	}
+
+	// Get all indexedDb database names
+	databaseList, err := utils.GetIndexedDbList()
+	if err != nil {
+		utils.Throw(
+			utils.TypeError, errors.Errorf(
+				"failed to get list of indexedDb database names: %+v", err))
+		return nil
+	}
+
+	// Delete each database
+	for _, dbName := range databaseList {
+		_, err = idb.Global().DeleteDatabase(dbName)
+		if err != nil {
+			utils.Throw(
+				utils.TypeError, errors.Errorf(
+					"failed to delete indexedDb database %q: %+v", dbName, err))
+			return nil
+		}
+	}
+
+	// Clear WASM local storage and EKV
+	ls := utils.GetLocalStorage()
+	ls.ClearWASM()
+	ls.ClearPrefix(args[0].String())
+
+	return nil
+}