Skip to content
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Nooron: Globally Scalable Collective Cognition



Until how to deal with old issues from the master repo on BitBucket has been resolved we ask users to create any new issues at:

See this issue about the issues


Nooron is served by NodeJS and being developed in an NVM environment using node v8.9.4

Nooron requires NodeJS > 4.0 for access to ES6 features, specifically Proxy

The scripts devInspect and watchInspect require NodeJS > 6.3 for node --inspect support.

how to prepare for development or production

npm install
bower install

how to run development (so it watches for changed files)

npm run dev
# then surf to http://localhost:9998/
#  The server should restart automatically when needed files change.
#  Adjust the list of watched files in
#  under grunt.initConfig: watch: express: files:

# How to control the amout of logging output
LOG_LEVEL=EMERGENCY npm run dev # 0
LOG_LEVEL=ALERT     npm run dev # 1
LOG_LEVEL=CRITICAL  npm run dev # 2
LOG_LEVEL=ERROR     npm run dev # 3
LOG_LEVEL=WARNING   npm run dev # 4 default
LOG_LEVEL=NOTICE    npm run dev # 5
LOG_LEVEL=INFO      npm run dev # 6
LOG_LEVEL=DEBUG     npm run dev # 7

how to develop FractalPanel

http://localhost:9998/dev/fractalpanel_sandbox.html is a playground for playing with the FractalPanel technology.

http://localhost:9998/tests/fractalpanel.html reloads on every code change and beeps when tests fail. This is good to keep loaded in a tab if you're working with FractalPanel at all. Add your own tests to src/

how to develop HuViz

# use enviroment variables to tell the server where to find the libraries under development
HUVIZ_PATH=path/to/your/dev/version/of/huviz npm run dev
# for example if the huviz directory is beside the libnoo directory...
HUVIZ_PATH=../huviz npm run dev

It might be necessary to keep a tab open where you can manually force the reloading of http://localhost:9998/huviz/huviz.js after you've made a change (and it has rebuilt automatically because you're running the huviz "npm run dev" command in a terminal somewhere). Then do force a full page reload (CMD-SHIFT-R on macOS) to reload the http://localhost:9998/__/whatever url you're doing your testing in.

how to develop email-login

# use enviroment variables to tell the server where to find the libraries under development
EMAILLOGIN_PATH=path/to/your/dev/version/of/email-login npm run dev
# for example if the email-login directory is beside the libnoo directory...
EMAILLOGIN_PATH=../email-login npm run dev

how to develop blossom

# use enviroment variables to tell the server where to find the libraries under development
BLOSSOM_PATH=path/to/your/dev/version/of/PeterKey/blossom/src npm run dev
# for example if the diversus-flower directory is beside the nooron directory...
BLOSSOM_PATH=../blossom/src npm run dev

how to experiment with LAN-local mobile browsers

# use the NOORON_HOSTNAME environment variable to serve from a routed hostname or IP address
NOORON_HOSTNAME= npm run dev # use your actual IP here
# at this point you should be able to surf to the Nooron instance at

how to run the server

(for production only)

npm start

how to run tests

# run the tests once with:
npm test
# or equivalently
npm run test

running tests with different LOG_LEVELS


LOG_LEVEL=WARNING npm run watchTest
LOG_LEVEL=NOTICE npm run watchTest
LOG_LEVEL=INFO npm run watchTest
LOG_LEVEL=DEBUG npm run watchTest

running just some tests

npm run watchTest -- --grep="runs functions"

running tests with different reporters

npm run watchTest -- --reporter=spec
# reporters: dot|min|progress|spec|tap
# See all the reporters at

running tests with screenshots

SCREENSHOTS=1 npm test # SCREENSHOTS envvar triggers selenium screenshots in test/screenshots/

before committing

Run the following command to update results.txt with the latest canonical test output. This command also shows a diff on results.txt so we might notice changes.


Why do this? So that results.txt can be maintained as a log of what test output is looking like. When instituted they were not all passing, so this is a way to track their progress. Notice that here at the outset anyway results.txt looks slightly different every run in one line only.

-  text: 'Please click:\n  http://localhost:31415/email-login/verify/' }
+  text: 'Please click:\n  http://localhost:31415/email-login/verify/' }

If that is the only line where there is a diff then we don't need to bother checking results.txt back into the repo. If there are more changes let's check it in with git commit results.txt -m 'latest results.txt'

how to buid the source docs

npm run buildSrcDocs

how to debug the server

First start a watcher to keep code built.

grunt watchbuild

Then start the server with the --inspect flag, restarting upon rebuild or data changes:

 npm run inspect:server
 # This should start up a 'Developer Tools' window for you pointed at the running server.

 # Now any `debugger` lines in server-side code will be respected and you can
 # interactively add your own breakpoints etc.
 # If the window doesn't come up automatically (something is probably broken or your Chrome is < v60)
 # then visit

 # and click on "Open dedicated DevTools for Node"

Coding Standards

The project follows with the following exceptions.

Calling Functions

When calling functions parenthesis are not optional. In general we try to follow Python aesthetics in this regard to avoid ambiguity and magic.


baz 12
# whose idea was this?


foo(.bar 8
(foo 4).bar 8
# I am agog!

Setting up VHosts

Nooron has a directory called vhosts/ which ought to contain directories named after the FQDNs which Nooron serves. For instance vhosts/ is a symlink to which contains configuration, template and asset resources used by Nooron to host the site

The public directory

Each VHost's public/ directory is mapped onto the served path https://THE.VHOST.FQDN/vhost so, for example a VHost's public/YOUR/PATH/HERE.png file will appear at https://THE.VHOST.FQDN/vhost/YOUR/PATH/HERE.png

The tmpl directory

Each VHost's tmpl/ directory will be searched for templates before Nooron's own views/ directory.

Currenlty the Diversus tmpl/ directory is also served for ALL VHosts at https://THE.VHOST.FQDN/tmpl until templates start being searched for as described above.

VHost clientArgs

Currently, these are all defined in setUpVHostOrRedir() in and are accessible on all visualizations at @rootPanel.clientArgs.vhost_name (for example).

vhost_name = ""
The FQDN of the virtual host eg ``, `` or ``
close_login_panel = false
Causes the login_panel to not show.
suppress_fracpanel_buttons_by_default = false
Turns off the FractalPanel controls globally on a site.
speedOverFeatures = false
Suppresses the loading of some javascript dependencies for vhosts which do not need them.
default_formurla = "subjects(g=nrn:meta_kb)"
Specify the FormURLa which will run by default for the site

Developing a VHost

In the development environment one runs npm run dev as usual but to experience the vhost you must surf to a localhost version of the vhost. For instance, to develop the vhost the developer surfs to the url

For the name to properly resolve, you must modify your /etc/hosts file by adding a name like YOUR.VHOST.FQDN.localhost for for each vhost you would like to develop.

# /etc/hosts       localhost # if you would like to develop or experience locally # if you would like to develop diversus

This should work on any unix-like machine.

Evolution of the Dev Environment

I'm regretting the big Gruntfile and all it's tricky deps. Turns out it is merely adding complexity. Let us follow the fine guidance offered by the following docs on how to move toward a lean npm-based configuration.

Another ambition is to move away from coffeescript in favour of plain old ES6. Some of the steps to accomplish that ought to be coordinated with the move away from Grunt.

The Visualizations

   # Ponderate
   allegations(g=nrn:hours_sample) # columns: subject, predicate, object, graph, id is label
   subjects(g=nrn:hours_sample) # subjects are row, predicates are columns
   evaluations(g=nrn:hours_sample) # lowest level of detail
   timesheet(g=nrn:hours_sample) # WIP does not work yet

   # LeafletJS
   map(points="52.4893,13.3595,green,bowie was here;52.48905,13.36061,red,u-Kleistpark is here")
   map(g:nrn:70sCarsGeo) # display data from graph=nrn:70sCarsGeo

   # HuViz
   graph(g=nrn:foaf20140114) # WIP awkward settings and controls panes; scripts status???

   # Blockly
   makeDiscriminator() # WIP parsing not working, cannot be used as visualation of existing Discriminator
   makeDiscriminator(showAST=1,showCode=1) # turn on debugging aids for the Discrimnator AST and source

   # Vega visualations

   # builtins
   above(...,...) # layout visualizations top to bottom eg. above(map(),print(killroy was above me))
   beside(...,...) # layout visualizations left to right eg. beside(map(),print(killroy was to the left))
   print("whatever is in here gets printed")
   showDiv(the_Name_Of_A_DIV) # displays a div from the containing HTML environment

   beside(above(print(TL),print(BL)),print(MID),above(print(TR),print(BR))) # BL is bugged right now
   # +----+-----+----+
   # | TL |     | TR |
   # +----+ MID +----+
   # | BL |     | BR |
   # +----+-----+----+

   # +----------+---------+---------+
   # | discr()  |         |         |
   # +----------+  map()  | graph() |
   # | bubble() |         |         |
   # +----+-----+---------+---------+
   # at the moment the placement of bubble() is bugged


descriminator, map and foaf graph



Valuable photo archive offered in a map context.




Copyright (C) 2010 Shawn F. Murphy

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see

You can’t perform that action at this time.