diff --git a/bin/libbfa.js b/bin/libbfa.js
index 9b21511d71acbddb823293ec8476fa2c7806d2ed..d0bf4832f6d4dc868d467ebfc55f95214a363cc7 100644
--- a/bin/libbfa.js
+++ b/bin/libbfa.js
@@ -100,6 +100,13 @@ module.exports = class Libbfa
                 params: 0
             }]
         });
+        w3.eth.extend({
+            methods: [{
+                name: 'adminpeers',
+                call: 'admin_peers',
+                params: 0
+            }]
+        });
         if ( undefined != process.env.BFAACCOUNT ) {
             w3.eth.defaultAccount  =   this.account;
         }
diff --git a/bin/monitor.js b/bin/monitor.js
new file mode 100755
index 0000000000000000000000000000000000000000..af6a5e1f442a166fa5aba93d37fd111af6c47380
--- /dev/null
+++ b/bin/monitor.js
@@ -0,0 +1,43 @@
+#!/usr/bin/node
+// vim:syntax:filetype=javascript:ai:sm
+// vim:expandtab:backspace=indent,eol,start:softtabstop=4
+
+"use strict"
+
+const   Libbfa      =   require( process.env.BFAHOME + '/bin/libbfa.js');
+
+function    monitor()
+{
+    var bfa         =   new Libbfa();
+    var web3        =   bfa.newweb3();
+    var now         =   new Date();
+    //console.log(web3.eth);
+    web3.eth.adminpeers().then(
+        function(nodelist) {
+            var         peers   =   [];
+            nodelist.forEach(
+                function(node) {
+                    if ( typeof(node.protocols.eth) == 'object' )
+                    {   
+                        var     dir     =   "out";
+                        if ( node.network.inbound )
+                            dir         =   "in";
+                        peers.push( "peer "+dir+": "+node.enode );
+                    }
+                }
+            );
+            console.log(
+                "UTC: " + now.toUTCString() + "\n"
+                + "BFA peers: " + peers.length + "\n"
+                + peers.sort().join("\n")
+            );
+        },
+        function(x)
+        {
+            console.log( x );
+            process.exit(1)
+        }
+    );
+}
+
+monitor();
diff --git a/bin/monitor.sh b/bin/monitor.sh
deleted file mode 100755
index 478e9cbae740d0551e4d888d3afa018265c2dfb7..0000000000000000000000000000000000000000
--- a/bin/monitor.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/bash
-
-if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi
-source ${BFAHOME}/bin/libbfa.sh || exit 1
-ERRTEXT="Monitoring failed"
-
-function json_query
-{
-  local ERRTEXT="Monitoring RPC failed"
-  trap '' ERR
-  json=$( geth_rpc $* )
-  trap errtrap ERR
-}
-
-function json_arraylength
-{
-  jq -r length
-}
-
-json_query admin_peers
-test -n "${json}" || exit 0
-numpeers=$( echo $json | json_arraylength )
-statusfile=$( mktemp )
-cleanup     "${statusfile}"
-chmod 644   "${statusfile}"
-echo -n "time: "                        >   ${statusfile}
-date                                    >>  ${statusfile}
-echo "total-peer-count: ${numpeers}"    >>  ${statusfile}
-peercount=0
-for idx in $( seq 0 $(( $numpeers - 1 )) )
-do
-  eth=$( echo "$json" | jq -r .[$idx].protocols.eth )
-  if [ "$eth" = "handshake" ]
-  then
-    continue
-  fi
-  #echo -n "$idx: "; echo "$eth" | jq -c
-  remoteid=$(
-	echo "$json" |
-	jq -r .[$idx].id
-  )
-  remoteaddress=$(
-	echo "$json" |
-	jq -r .[$idx].network.remoteAddress
-  )
-  remoteip=$(
-	echo "$remoteaddress" |
-	sed 's/:[0-9][0-9]*$//'
-  )
-  # IPv6 has the address surrounded by [ and ] - we strip that away
-  if [ "${remoteip:0:1}" = "[" -a "${remoteip:$((${#remoteip}-1))}" = "]" ]
-  then
-    remoteip="${remoteip:1:$((${#remoteip}-2))}"
-  fi
-  remoteport=$(
-	echo "$remoteaddress" |
-	sed 's/^.*://'
-  )
-  echo "peer: enode://${remoteid}@[${remoteip}]:${remoteport}" >> $statusfile
-  mkdir -p "${BFANETWORKDIR}/lastseen/${remoteid}"
-  if [ -r "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" ]
-  then
-  	storedport=$( cat "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" )
-  	test "${remoteport}" = "${storedport}" &&
-		unset remoteport
-  fi
-  if [ -n "${remoteport}" ]
-  then
-  	echo "${remoteport}" > "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}"
-  else
-  	touch    "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}"
-  fi
-  peercount=$(( $peercount + 1 ))
-done
-echo "valid-peer-count: ${peercount}" >> $statusfile
-mv -f $statusfile ${BFANETWORKDIR}/status