diff --git a/files.html b/files.html
index 36f0805869f2f111cefaa533dd8f835ef83010dc..4ee5049980503e5c784d972ffc9a0bf410482438 100644
--- a/files.html
+++ b/files.html
@@ -19,6 +19,7 @@
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/files.js'>files.js</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/mods.js'>mods.js</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/modules.js'>modules.js</a><br>
+<i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node_modules</i><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/printserver.js'>printserver.js</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/programs.js'>programs.js</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./js/serialserver.js'>serialserver.js</a><br>
@@ -57,6 +58,7 @@
 <i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operators</i><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/add'>add</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/blend'>blend</a><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/clearance'>clearance</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/intersect'>intersect</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/morph'>morph</a><br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='./modules/frep/operators/subtract'>subtract</a><br>
diff --git a/modules/frep/operators/clearance b/modules/frep/operators/clearance
new file mode 100755
index 0000000000000000000000000000000000000000..2aa4e8e1dfedc8bcc386b07947af9c275fb73f1d
--- /dev/null
+++ b/modules/frep/operators/clearance
@@ -0,0 +1,138 @@
+//
+// frep clearance
+//
+// Neil Gershenfeld
+// (c) Massachusetts Institute of Technology 2018
+//
+// This work may be reproduced, modified, distributed, performed, and
+// displayed for any purpose, but must acknowledge the mods
+// project. Copyright is retained and must be preserved. The work is
+// provided as is; no warranty is provided, and users accept all
+// liability.
+//
+// closure
+//
+(function(){
+//
+// module globals
+//
+var mod = {}
+//
+// name
+//
+var name = 'frep clearance'
+//
+// initialization
+//
+var init = function() {
+   mod.shape0 = null
+   mod.shape1 = null
+   mod.offset.value = 1
+   mod.fn0.value = ''
+   mod.fn1.value = ''
+   }
+//
+// inputs
+//
+var inputs = {
+   shape0:{type:'',label:'shape 0',
+      event:function(evt){
+         mod.shape0 = evt.detail
+         mod.fn0.value = evt.detail.function
+         outputs.shape.event()
+         }},
+   shape1:{type:'',label:'shape 1',
+      event:function(evt){
+         mod.shape1 = evt.detail
+         mod.fn1.value = evt.detail.function
+         outputs.shape.event()
+         }},
+   clear:{type:'',
+      event:function(evt){
+         mod.shape0 = null
+         mod.shape1 = null
+         mod.fn0.value = ''
+         mod.fn1.value = ''
+         }}}
+//
+// outputs
+//
+var outputs = {
+   shape:{type:'',
+      event:function(){
+         if ((mod.shape0 != null) && (mod.shape1 != null)) {
+            var offset = parseFloat(mod.offset.value)
+            var fn = `Math.min(${mod.shape0.function},-(${offset}+${mod.shape1.function}))`
+            var fn = `Math.max(${fn},${mod.shape1.function})`
+            var variables = mod.shape0.variables
+            var type = mod.shape0.type        
+            var limits = []
+            for (var v = 0; v < mod.shape0.limits.length; ++v) {
+               limits[v] = []
+               if (mod.shape0.limits[v][0] < mod.shape1.limits[v][0])
+                  limits[v][0] = mod.shape0.limits[v][0]
+               else
+                  limits[v][0] = mod.shape1.limits[v][0]
+               if (mod.shape0.limits[v][1] > mod.shape1.limits[v][1])
+                  limits[v][1] = mod.shape0.limits[v][1]
+               else
+                  limits[v][1] = mod.shape1.limits[v][1]
+               }
+            var shape = {function:fn,variables:variables,limits:limits,type:type}
+            mods.output(mod,'shape',shape)}
+            }
+         }}
+//
+// interface
+//
+var interface = function(div){
+   mod.div = div
+   //
+   // offset
+   //
+   div.appendChild(document.createTextNode('offset: '))
+   div.appendChild(document.createElement('br'))
+   var input = document.createElement('input')
+      input.type = 'text'
+      input.size = 6
+      div.appendChild(input)
+      mod.offset = input
+   div.appendChild(document.createElement('br'))
+   //
+   // function 0
+   //
+   div.appendChild(document.createTextNode('function 0: '))
+   div.appendChild(document.createElement('br'))
+   var input = document.createElement('input')
+      input.type = 'text'
+      input.size = 10
+      div.appendChild(input)
+      mod.fn0 = input
+   div.appendChild(document.createElement('br'))
+   //
+   // function 1
+   //
+   div.appendChild(document.createTextNode('function 1: '))
+   div.appendChild(document.createElement('br'))
+   var input = document.createElement('input')
+      input.type = 'text'
+      input.size = 10
+      div.appendChild(input)
+      mod.fn1 = input
+   div.appendChild(document.createElement('br'))
+   }
+//
+// local functions
+//
+;
+//
+// return values
+//
+return ({
+   name:name,
+   init:init,
+   inputs:inputs,
+   outputs:outputs,
+   interface:interface
+   })
+}())
diff --git a/modules/index.js b/modules/index.js
index 017a630c3554fc1f564dc86198d753d3cb5741a0..0b3d100ec3fe5f049b746428e296bea144ce0c2a 100644
--- a/modules/index.js
+++ b/modules/index.js
@@ -28,6 +28,7 @@ module_label('frep')
 module_label('   operators')
 module_menu('      add','modules/frep/operators/add')
 module_menu('      blend','modules/frep/operators/blend')
+module_menu('      clearance','modules/frep/operators/clearance')
 module_menu('      intersect','modules/frep/operators/intersect')
 module_menu('      morph','modules/frep/operators/morph')
 module_menu('      subtract','modules/frep/operators/subtract')