diff --git a/Node/forkpi.js b/Node/forkpi.js
new file mode 100644
index 0000000000000000000000000000000000000000..182813268391a8f41f41a18b850d2b0e77b11e96
--- /dev/null
+++ b/Node/forkpi.js
@@ -0,0 +1,26 @@
+//
+// forkpi.js
+// Neil Gershenfeld 12/8/18
+// pi calculation benchmark
+// pi = 3.14159265358979323846
+//
+const points = 1e8
+const { fork } = require('child_process')
+var processes = 1
+var pi = 0
+var results = 0
+var tstart = Date.now()/1000
+const forked = fork('child.js','1')
+forked.on('message',(result) => {
+   pi += result
+   results += 1
+   if (results == processes) {
+      var tend = Date.now()/1000
+      var mflops = (processes*points)*5.0*1e-6/(tend-tstart)
+      console.log('pi: '+pi)
+      console.log('time: '+(tend-tstart).toFixed(1)+'s')
+      console.log('processes: '+processes)
+      console.log('estimated MFlops: '+mflops.toFixed(1))
+      process.exit()
+      }
+   })
diff --git a/Node/forkspi.js b/Node/forkspi.js
new file mode 100644
index 0000000000000000000000000000000000000000..769a8cf85656690d664f5608eb8bd749f8a82af8
--- /dev/null
+++ b/Node/forkspi.js
@@ -0,0 +1,75 @@
+//
+// clusterpi.js
+// Neil Gershenfeld 11/23/18
+// pi calculation benchmark
+// pi = 3.14159265358979323846
+//
+
+
+const points = 1e8
+
+const { fork } = require('child_process');
+
+const forked = fork('child.js');
+
+forked.on('message', (msg) => {
+  console.log('Message from child', msg);
+});
+
+forked.send({ hello: 'world' });
+
+process.on('message', (msg) => {
+  console.log('Message from parent:', msg);
+});
+
+let counter = 0;
+
+setInterval(() => {
+  process.send({ counter: counter++ });
+}, 1000);
+
+function master() {
+   var processes = require('os').cpus().length
+   var tstart = Date.now()/1000
+   for (var i = 0; i < processes; i++)
+      cluster.fork()
+   var index = 0
+   var pi = 0
+   var results = 0
+   for (const id in cluster.workers) {
+      var worker = cluster.workers[id]
+      worker.on('message',(result) => {
+         pi += result
+         results += 1
+         if (results == processes) {
+            var tend = Date.now()/1000
+            var mflops = (processes*points)*5.0*1e-6/(tend-tstart)
+            console.log('pi: '+pi)
+            console.log('time: '+(tend-tstart).toFixed(1)+'s')
+            console.log('processes: '+processes)
+            console.log('estimated MFlops: '+mflops.toFixed(1))
+            process.exit()
+            }
+         })
+      function send(index) {
+         return function() {
+            worker.send(index)
+            }
+         }
+      worker.on('online',send(index))
+      index += 1
+      }
+   }
+function child() { 
+   process.on('message',(index) => {
+      var a = 0.5
+      var b = 0.75
+      var c = 0.25
+      var sum = 0
+      var start = 1+points*index
+      var end = points*(index+1)
+      for (var i = start; i <= end; ++i)
+         sum += a/((i-b)*(i-c))
+      process.send(sum)
+      })
+   }