diff --git a/cf.js b/cf.js
index 35c96670d2c2298e142df35ff3d50ab5ff9f1e6d..639fb6111d67fd015b92d279d1225e541deeb8f1 100644
--- a/cf.js
+++ b/cf.js
@@ -2,6 +2,8 @@
 
 const express = require('express')
 const app = express()
+// our fs tools,
+const filesys = require('./filesys.js')
 // will use these to figure where tf we are
 const os = require('os')
 let ifaces = os.networkInterfaces()
@@ -9,10 +11,33 @@ let ifaces = os.networkInterfaces()
 // serve everything: https://expressjs.com/en/resources/middleware/serve-static.html
 app.use(express.static(__dirname))
 // if these don't exist, they get 'nexted' to any other 'middleware' we write
-app.get('/hunklist', (req, res) => {
-  // we would fs/ through our list, and serve that,
-  res.send('the-false-file-list')
+app.get('/fileList', (req, res) => {
+  try{
+    // we would fs/ through our list, and serve that,
+    filesys.getDirTree(req.query.path).then((list) => {
+      // take the query out of the front of the path, and swap all \ for /
+      for(i in list){
+        list[i] = list[i].substring(req.query.path.length + 1)
+        let decomp = list[i].split('\\')
+        let np = ''
+        for(l in decomp){
+          np += `/${decomp[l]}`
+        }
+        // wash of first / items and of file extension,
+        list[i] = np.substring(2, np.indexOf('.'))
+      }
+      res.send(list)
+      // ship up north,
+    }).catch((err) => {
+      res.send(err)
+      // ship err back
+    })
+  } catch (err) {
+    console.log(err)
+    res.send('server-side error retrieving list')
+  }
 })
+
 // we also handle file-saving this way,
 app.put('/save/systems/:file', (req, res) => {
   console.log('put req to ' + req.params.file)
@@ -22,7 +47,7 @@ let port = 8080
 // and listen,
 app.listen(port)
 
-// want to announce our existence,
+// want to announce our existence, this just logs our IPs to the console:
 Object.keys(ifaces).forEach(function(ifname) {
   var alias = 0;
 
diff --git a/filesys.js b/filesys.js
new file mode 100644
index 0000000000000000000000000000000000000000..303217a059e94b6e47ab0b3021161a333303218a
--- /dev/null
+++ b/filesys.js
@@ -0,0 +1,42 @@
+// do file management
+
+const fs = require('fs')
+
+module.exports = {
+  // get a tree: takes the root (relative the process) and returns all branches below,
+  // includes route-to-root in list
+  getDirTree: (dir, debug) => {
+    return new Promise((resolve, reject) => {
+      // items and count,
+      let list = []
+      let count = 0
+      // recursor,
+      let launch = (dir) => {
+        if(debug) console.log('GDT launch at', dir)
+        // just counting actually,
+        count ++
+        fs.readdir(dir, (err, files) => {
+          if(err){
+            reject(err)
+          }
+          count --
+          for (file of files) {
+            if (file.includes('.')) {
+              if(debug) console.log('GDT pushing', `${dir}\\${file}`)
+              list.push(`${dir.substring(__dirname.length)}\\${file}`)
+            } else {
+              launch(`${dir}\\${file}`)
+            }
+          }
+          if(debug) console.log('GDT size', count)
+          if(!count){
+            // we sort,
+            list.sort()
+            resolve(list)
+          }
+        }) // end fs.readdir
+      } // end launch
+      launch(`${__dirname}\\${dir}`)
+    })
+  }
+}
diff --git a/gogetter.js b/gogetter.js
index 3fbcc2fea7e29618db3a65bf112bc072bbfd28ae..f71cf1b6eb8e6e6753c4d3445e58b5d7b63831b5 100644
--- a/gogetter.js
+++ b/gogetter.js
@@ -5,103 +5,15 @@ function GoGetter() {
   this.interpreterName = 'cuttlefish'
   this.interpreterVersion = 'v0.1'
 
-  this.getHunkList = () => {
+  this.recursivePathSearch = (root, debug) => {
     return new Promise((resolve, reject) => {
-      jQuery.get('hunklist', (resp) => {
-        console.log('req for hunklist returns', resp)
+      jQuery.get(`/fileList?path=${root}`, (resp) => {
+        console.log('resp at jq', resp)
+        resolve(resp)
       })
     })
   }
 
-  this.recursivePathSearch = (root, extension, debug) => {
-    return new Promise((resolve, reject) => {
-      let htmlTreeDiver = (response) => {
-        // do we try to pick links out of this plaintext ? like a monkey ?
-        // I suppose we do
-        // header, for names
-        let faceString = '<h1>Index of /' + root
-        if (debug) console.log('GG: facestring', faceString)
-        let hfront = response.indexOf(faceString) + 14
-        let hback = response.indexOf('</h1>')
-        let header = response.slice(hfront, hback)
-        if (debug) console.log('GG: header:', header);
-        let igot = unreturned.indexOf(header)
-        if (debug) console.log('GG: unreturned', unreturned)
-        if (igot != -1) {
-          if(debug) console.log('return success')
-          unreturned.splice(igot, 1)
-        }
-
-        // git those paths (these aren't names, are they?)
-        let paths = response.split('<a href="/' + root)
-        // rm first two, and last ()
-        paths = paths.slice(2) //
-
-        paths.forEach((path, index) => {
-          let end = path.indexOf('"')
-          //if (debug) console.log('GG: path index', index, 'end', end)
-          paths[index] = path.slice(0, end)
-        })
-
-        if(debug) console.log('paths', paths)
-
-        paths.forEach((path, index) => {
-          if(debug) console.log(`GG: path: ${path}`)
-          if (path.includes('?')) {
-            if(debug) console.log('GG: folder', path)
-            let recurse = root + path//.slice(0, path.indexOf('/', 2))
-            //console.log('getting', recurse)
-            let rt = recurse.slice(0, recurse.indexOf('?'))
-            unreturned.push(rt)// + mt)
-            if(debug) console.log(`GG: RECURSE INTO(${recurse})`)
-            jQuery.get(recurse, htmlTreeDiver)
-          } else if (path.includes(extension)) {
-            if(debug) console.log('GG: likely item', path)
-            // secrets are rming .js
-            path = path.slice(0, path.indexOf('.'))
-            if (path === 'hunks' || path === 'manager' || path === 'template' || path.includes('hidden/')) {
-              // don't add these special hunks
-            } else {
-              if(debug) console.log(`GG: returned.push(${path})`)
-              returned.push(path)
-            }
-          }
-        })
-
-        if(debug) console.log('unreturned:', unreturned)
-        if(debug) console.log('returned:', returned)
-
-        if (unreturned.length === 0) {
-          // TODO cull hunks and hidden paths ...
-          // now, writing menu options for each path
-          // sort alphabetically
-          // hacking this to death bc tbd replaced by server side req not string parsing
-          if(extension == '.js'){
-            for(let i in returned){
-              returned[i] = returned[i].slice(1)
-            }
-            for(let i in returned){
-              if(returned[i] === "hunks") returned.splice(i, 1)
-            }
-            for(let i in returned){
-              if(returned[i] === "manager") returned.splice(i, 1)
-            }
-          }
-          returned.sort()
-          if(debug) console.log('GG returns this', JSON.parse(JSON.stringify(returned)))
-          resolve(returned)
-        }
-      }
-
-      let unreturned = new Array()
-      let returned = new Array()
-      let mt = `?mtime=${performance.now()}`
-      if(debug) console.log('GG: kickoff')
-      //unreturned.push(root)// + mt)
-      jQuery.get(root + mt, htmlTreeDiver)
-    })
-  }
-
   // https://github.com/tc39/proposal-dynamic-import
   this.importSource = (url) => {
     // escape characters that are used to delimit the module URL.
diff --git a/hunks/manager.js b/hunks/manager.js
index 05850c2ba166c1a1aec690ffb28802577fa71941..06dd4d9a5c5c604baeafd3c6d5c2336d7a8030ea 100644
--- a/hunks/manager.js
+++ b/hunks/manager.js
@@ -46,18 +46,11 @@ function Manager() {
   // for now, managers take callback paths to pipe data back through ?
   let getListOfAvailableComponents = () => {
     return new Promise((resolve, reject) => {
-      gg.getHunkList().then((list) => {
+      gg.recursivePathSearch('hunks').then((list) => {
         resolve(list)
       }).catch((err) => {
         reject(err)
       })
-      /*
-      gg.recursivePathSearch('hunks', '.js').then((list) => {
-        resolve(list)
-      }).catch((err) => {
-        reject(err)
-      })
-      */
     })
   }
 
diff --git a/view/vcontextmenu.js b/view/vcontextmenu.js
index 3181abc501562d1aa937d2de958d4e71cdc0137b..f666d9c2c43b5b9a14030f6246d3af04ce48702f 100644
--- a/view/vcontextmenu.js
+++ b/view/vcontextmenu.js
@@ -138,6 +138,7 @@ function cfContextMenu(evt, view, dt) {
   /* ---------------- LOCAL OPTIONS, for SCOPE ----------------- */
   /* ---------------------------    ---------------------------- */
 
+  /*
   addContextOption(`debug option`, (ce) => {
     jQuery.ajax({
       url: `/save/systems/sysname.json`,
@@ -154,6 +155,7 @@ function cfContextMenu(evt, view, dt) {
       }
     })
   })
+  */
 
   addContextOption(`<i class="em em-twisted_rightwards_arrows"></i> refresh the view`, (ce) => {
     // this actually gets wiped when the first hunk arrives, so
@@ -174,7 +176,6 @@ function cfContextMenu(evt, view, dt) {
 
   // req a new hunk,
   addContextOption('<i class="em em-construction_worker"></i> add a hunk', (ce) => {
-    //vw.msgbox.write('requested a list of hunks...')
     $(ce.target).closest('li').text('requesting a list of hunks...')
     scope.requestListAvail().then((stringlist) => {
       changeContextTitle('load:')
diff --git a/view/vptch.js b/view/vptch.js
index 646982ebc0a199db00a8dd8b5595bfc23df0bb8e..5e3e12245baf79fa38017e22b2f5637796d51a3c 100644
--- a/view/vptch.js
+++ b/view/vptch.js
@@ -190,7 +190,7 @@ function PatchSet(View, MsgBox) {
               if (!existing) {
                 try {
                   //console.log('add conn from', opHunkIndex, opIndex, inHunkIndex, inIndex)
-                  // TODO: sometimes hunks change, and inputs go away ... we need to catch those errs here 
+                  // TODO: sometimes hunks change, and inputs go away ... we need to catch those errs here
                   await view.requestAddLink(opDef, ipDef)
                 } catch (err) {
                   reject(err)