diff --git a/README.md b/README.md
index c0b56503d1f0f4e6668b2a7f0b17984e1e4ac427..b9132e62198a1d7c14f53c6614c9db610f430a5d 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Cuttlefish
 
-Cuttlefish is a modular browser computing system and a member of [the squidworks project](https://gitlab.cba.mit.edu/squidworks/squidworks) to develop a distributed dataflow computing protocol. It is modular code wrapped in dataflow descriptors and handles that allow rapid assembly of computing applications (programs!). Cuttlefish also serves as the eyes into remote dataflow sytems - meaning we can use it as a tool to assemble big networks of computers, all using the same dataflow assumptions - to build, use, update, and discover distributed programs.
+Cuttlefish is a modular browser computing system and a member of [the squidworks project](https://gitlab.cba.mit.edu/squidworks/squidworks), an effort to develop a distributed dataflow computing protocol. Here, modular code is wrapped in dataflow descriptors and handles that allow rapid assembly of computing applications (programs!). Cuttlefish also serves as the eyes into remote dataflow sytems - meaning we can use it as a tool to assemble big networks of computers, all using the same dataflow assumptions - to build, use, update, and discover distributed programs.
 
 ![img](doc/2019-07-21-l1.png)
 
diff --git a/hunks/data/log_objects.js b/hunks/data/log_objects.js
index a61b01b706f04203469369fe6b439415525d3042..4c2936732aa5e8f622bc0a02c434f643fae7522e 100644
--- a/hunks/data/log_objects.js
+++ b/hunks/data/log_objects.js
@@ -10,12 +10,10 @@ export default function ObjectLogger() {
   Hunkify(this)
 
   // hmm...
-  let tolog = new Input('reference', 'tolog', this)
-  this.inputs.push(tolog)
+  let tolog = this.input('reference', 'tolog')
 
-  let prefix = new State('string', 'prefix', 'LOG:')
-  let logToConsole = new State('boolean', 'console', true)
-  this.states.push(prefix, logToConsole)
+  let prefix = this.state('string', 'prefix', 'LOG:')
+  let logToConsole = this.state('boolean', 'console', true)
 
   this.dom = {}
 
diff --git a/hunks/data/logger.js b/hunks/data/logger.js
index c1e6f3ae4918119cdf9d09ec4a6201d1596bf824..82184318bbcb69418fae7797f15dfebc83febe3e 100644
--- a/hunks/data/logger.js
+++ b/hunks/data/logger.js
@@ -40,6 +40,9 @@ export default function ReferenceLogger() {
         stringRep = raw.join(', ')
       } else if (typeof raw === "boolean") {
         stringRep = raw.toString()
+      } else {
+        // let js do w/e witchcraft it chooses 
+        stringRep = raw
       }
       $(this.dom).children('.txt').html(stringRep)
       if (logToConsole.value === true) {
diff --git a/hunks/template.js b/hunks/template.js
index 64344011c00122bdea45ae61edab113c08bc3a50..f814219ee43ad9c8388a4adf7a7abb3aa70a652e 100644
--- a/hunks/template.js
+++ b/hunks/template.js
@@ -12,51 +12,48 @@ import {
   State
 } from './hunks.js'
 
-function Name() {
+// our function name actually doesn't matter: hunks in js are named by their
+// location on disk
+export default function Name() {
   // this fn attaches handles to our function-object,
   Hunkify(this)
 
-  // inputs, outputs, and state are objects. they have a type (string identifier)
-  // see 'typeset.js'
-  // a name (doesn't have to be unique), and we pass them a handle to ourselves...
-  let inA = new Input('number', 'name', this)
-  // inputs, outputs and state are all kept locally in these arrays,
-  // if we don't include them here, the manager will have a hard time finding them ...
-  this.inputs.push(inA)
+  // inputs, outputs, and state are objects.
+  // they each have a type and a name
+  let inA = this.input('string', 'quiet')
+  let outB = this.output('string', 'loud')
 
-  let outB = new Output('number', 'name', this)
-  this.outputs.push(outB)
-
-  let stateItem = new State('string', 'name', 'startupValue')
-  this.states.push(stateItem)
+  // states take another argument: their default startup value
+  let stateItem = this.state('string', 'exclaim', '!')
 
   // State items also have change handlers,
   stateItem.onChange = (value) => {
-    // at this point, something external (probably a human)
-    // has requested that we change this state variable,
+    // at this point, a request to update this state item to the provided value
+    // has been made
     console.log('requests:', value)
     // we can reject that, by doing nothing here, or we can
     stateItem.set(value)
+    // or compute on it, set limits, etc
   }
 
   // hunks can choose to- or not- have init code.
-  // at init, the module has been loaded and state variables have been
+  // at init, the module has been loaded into the JS engine and state variables have been
   // recalled from any program save - so this is a good point
   // to check any of those, and setup accordingly ...
   this.init = () => {
     this.log('hello template world')
   }
 
+  // there are no rules within this closure, local functions, data, etc...
   let internalVariable = 'local globals'
-
-  function internalFunc(data) {
-    // scoped function, not accessible externally
-    // do work,
-    return (data)
+  function internalFunc(str) {
+    let caps = str.toUpperCase()
+    caps += stateItem.value
+    return (caps)
   }
 
   // to divide time between hunks, each has a loop function
-  // this is the hunks' runtime: a manager calls this once-per-round
+  // this is the hunks' runtime, and is called repeatedly, as the process runs
   // here is where we check inputs, put to outputs, do work, etc
   this.loop = () => {
     // typically we check inputs and outputs first,
@@ -69,6 +66,3 @@ function Name() {
     }
   }
 }
-
-// the hunk is also an ES6 module, this is how we export those:
-export default Name
diff --git a/save/contexts/cuttlefish/template-example.json b/save/contexts/cuttlefish/template-example.json
new file mode 100644
index 0000000000000000000000000000000000000000..1852ceb0ae27cf526f9c5b0a272fb8b7836c9eb3
--- /dev/null
+++ b/save/contexts/cuttlefish/template-example.json
@@ -0,0 +1,117 @@
+{
+  "interpreterName": "cuttlefish",
+  "interpreterVersion": "v0.1",
+  "hunks": [
+    {
+      "type": "manager",
+      "name": "nrol",
+      "inputs": [
+        {
+          "name": "msgs",
+          "type": "byteArray"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "msgs",
+          "type": "byteArray",
+          "connections": [
+            {
+              "inHunkIndex": "1",
+              "inHunkInput": "0"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "type": "view",
+      "name": "tlview",
+      "inputs": [
+        {
+          "name": "msgs",
+          "type": "byteArray"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "msgs",
+          "type": "byteArray",
+          "connections": [
+            {
+              "inHunkIndex": "0",
+              "inHunkInput": "0"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "type": "template",
+      "name": "template_2",
+      "inputs": [
+        {
+          "name": "quiet",
+          "type": "string"
+        }
+      ],
+      "outputs": [
+        {
+          "name": "loud",
+          "type": "string",
+          "connections": [
+            {
+              "inHunkIndex": "4",
+              "inHunkInput": "0"
+            }
+          ]
+        }
+      ],
+      "states": [
+        {
+          "name": "exclaim",
+          "type": "string",
+          "value": "!"
+        }
+      ]
+    },
+    {
+      "type": "interface/string",
+      "name": "interface/string_3",
+      "outputs": [
+        {
+          "name": "string",
+          "type": "string",
+          "connections": [
+            {
+              "inHunkIndex": "2",
+              "inHunkInput": "0"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "type": "data/logger",
+      "name": "data/logger_5",
+      "inputs": [
+        {
+          "name": "tolog",
+          "type": "reference"
+        }
+      ],
+      "states": [
+        {
+          "name": "prefix",
+          "type": "string",
+          "value": "LOG:"
+        },
+        {
+          "name": "console",
+          "type": "boolean",
+          "value": "true"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/typeset.js b/typeset.js
index d9f2b130b9813bd47ec00255f31b44a6c1490844..a41959e98b65b153d56c3114857dc29f21980681 100644
--- a/typeset.js
+++ b/typeset.js
@@ -226,6 +226,9 @@ const TSET = [
         } else {
           return false
         }
+      },
+      reference: function(str){
+        return str
       }
     }
   }, {