diff --git a/indexedDb/channels/channelsIndexedDbWorker.js b/indexedDb/channels/channelsIndexedDbWorker.js
index 6126eec5219481dba91e346c4a3db8708bf9c9e4..198ab729d9aaaf12e6ca5e440b62c0812a989b99 100644
--- a/indexedDb/channels/channelsIndexedDbWorker.js
+++ b/indexedDb/channels/channelsIndexedDbWorker.js
@@ -11,6 +11,7 @@ const go = new Go();
 const binPath = 'xxdk-channelsIndexedDkWorker.wasm'
 WebAssembly.instantiateStreaming(fetch(binPath), go.importObject).then((result) => {
     go.run(result.instance);
+    LogLevel(2);
 }).catch((err) => {
     console.error(err);
 });
\ No newline at end of file
diff --git a/indexedDb/channels/main.go b/indexedDb/channels/main.go
index e8f6279809ca10aa0e5f62cc4560708d5effa7d9..f89c42b7f650eb93b7b5c082fffaab26c97ac93d 100644
--- a/indexedDb/channels/main.go
+++ b/indexedDb/channels/main.go
@@ -13,13 +13,25 @@ import (
 	"fmt"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb"
+	"gitlab.com/elixxir/xxdk-wasm/wasm"
+	"syscall/js"
 )
 
+func init() {
+	// Set up Javascript console listener set at level INFO
+	ll := wasm.NewJsConsoleLogListener(jww.LevelInfo)
+	jww.SetLogListeners(ll.Listen)
+	jww.SetStdoutThreshold(jww.LevelFatal + 1)
+}
+
 func main() {
 	fmt.Println("[WW] Starting xxDK WebAssembly Channels Database Worker.")
-	jww.SetStdoutThreshold(jww.LevelDebug)
 	jww.INFO.Print("[WW] Starting xxDK WebAssembly Channels Database Worker.")
 
+	js.Global().Set("LogLevel", js.FuncOf(wasm.LogLevel))
+	js.Global().Set("LogToFile", js.FuncOf(wasm.LogToFile))
+	js.Global().Set("RegisterLogWriter", js.FuncOf(wasm.RegisterLogWriter))
+
 	m := &manager{mh: indexedDb.NewMessageHandler("ChannelsIndexedDbWorker")}
 	m.RegisterHandlers()
 	m.mh.SignalReady()
diff --git a/indexedDb/dm/dmIndexedDbWorker.js b/indexedDb/dm/dmIndexedDbWorker.js
index 100e6acb68a64fcfc3df4c09b6a00efd41937827..6737865412c749a0fcc84ab13ee0389a3728b413 100644
--- a/indexedDb/dm/dmIndexedDbWorker.js
+++ b/indexedDb/dm/dmIndexedDbWorker.js
@@ -11,6 +11,7 @@ const go = new Go();
 const binPath = 'xxdk-dmIndexedDkWorker.wasm'
 WebAssembly.instantiateStreaming(fetch(binPath), go.importObject).then((result) => {
     go.run(result.instance);
+    LogLevel(2);
 }).catch((err) => {
     console.error(err);
 });
\ No newline at end of file
diff --git a/indexedDb/dm/main.go b/indexedDb/dm/main.go
index 6a25027554bbde08ce0b0995f9375261fc3515a6..f6a507b3b46ab832a3a165bbd82136381357f004 100644
--- a/indexedDb/dm/main.go
+++ b/indexedDb/dm/main.go
@@ -13,13 +13,25 @@ import (
 	"fmt"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/xxdk-wasm/indexedDb"
+	"gitlab.com/elixxir/xxdk-wasm/wasm"
+	"syscall/js"
 )
 
+func init() {
+	// Set up Javascript console listener set at level INFO
+	ll := wasm.NewJsConsoleLogListener(jww.LevelInfo)
+	jww.SetLogListeners(ll.Listen)
+	jww.SetStdoutThreshold(jww.LevelFatal + 1)
+}
+
 func main() {
 	fmt.Println("[WW] Starting xxDK WebAssembly DM Database Worker.")
-	jww.SetStdoutThreshold(jww.LevelDebug)
 	jww.INFO.Print("[WW] Starting xxDK WebAssembly DM Database Worker.")
 
+	js.Global().Set("LogLevel", js.FuncOf(wasm.LogLevel))
+	js.Global().Set("LogToFile", js.FuncOf(wasm.LogToFile))
+	js.Global().Set("RegisterLogWriter", js.FuncOf(wasm.RegisterLogWriter))
+
 	m := &manager{mh: indexedDb.NewMessageHandler("DmIndexedDbWorker")}
 	m.RegisterHandlers()
 	m.mh.SignalReady()
diff --git a/indexedDbWorker/worker.go b/indexedDbWorker/worker.go
index d34b09d1a11c98bdb5d9b8e5c13ded563b766181..6151f79995d263741be2bd76670f1a85aabaab4e 100644
--- a/indexedDbWorker/worker.go
+++ b/indexedDbWorker/worker.go
@@ -22,6 +22,9 @@ import (
 // TODO:
 //  1. Fix ID counter
 //  2. Use transfer list when sending
+//  3. Get path to JS file from bindings
+//  4. restructure packages
+//  5. fix tag system
 
 // InitID is the ID for the first item in the handler list. If the list only
 // contains one handler, then this is the ID of that handler. If the list has