Diagrammata is licensed under the GNU GPL 2.0. You can download the current and previous versions from the links below. Also available is Paul Harrison's original Ghost Diagrams upon which Diagrammata is based.

Change Log

2.2.2 - Current Beta

  • Implemented a routine to create a normalized representation of an entire tileset for the purposes of finding duplicates. This entailed remapping the polar connectors with the unintended but obvious-in-retrospect result that the visual weights of the connectors changed. This suggests a possible feature, i.e., randomized remapping of the active pattern, that may find its way into a future version.
  • Normalized (but without remap) the presets.
  • Added normalization (again, without remapping) to the end of the random generation process.
  • Discovered that debugging had been left on, and the debugging toggle was not being respected. Sheesh. Fixed.
  • Randomized remapping capability has been added; no UI access yet.

2.2.1 - 5 May 2015


  • Eliminated quotes and made commas optional in tileset syntax
  • Eliminated silly replaceAll() function
  • Fixed horizontal rescaling of tile entry field and SVG display on browser window resize
  • Replaced original listContains() implementation with a 4x faster version
  • SVG version of logo
  • Finished conversion of identifiers to camelCase. I know, I know. I hate camelCase, but this is JavaScript, and I hate inconsistent naming conventions more.
  • Figured out and documented options() as a prerequisite for replacing it.
  • Defined connectors table
    • Adapted options() to use connectors table
    • Adapted makeShape() to use connectors table
    • Adapted put() to use connectors table
    • Adapted makeKnottedTileNode() to use connectors table
    • Used connectors table to build values to pass into testCharge tests in randomize()
    • Blank choice in randomize() now uses connectors table
    • Palette construction in randomize() now uses connectors table
  • Doubled number of available polar and nonpolar connectors
  • Visible/invisible toggle on connectors
  • Graphical parameters in connectors table
  • Weight parameter in connectors table
  • stop() now triggers redraw() in anticipation of refresh intervals
  • Implemented maxIter in anticipation of advanced control
  • Implemented maxIter control
  • Clock display option implemented
  • New basic color set
  • testCharge randomization toggle
  • Bug: makeShape() and fixed sides issue
  • Control to choose between 4, 6, or random number of sides during randomization
  • Randomization: set sizes: 0-26 of polar and 0-10 non-polar connectors
  • Randomization: enforcement of anyBad test toggle
  • Randomization: base tile count selector
  • Bug: Knotwork error - Sierpinski Redux - Uncaught TypeError: Cannot read property 'mate' of undefined
  • SVG: force actual save -- https://github.com/eligrey/FileSaver.js
  • SVG: prompt for filename on save
  • Better save links
  • Removed obsolete buttonActivity event handler
  • SVG: prevented timeout on welding
  • Inline help
  • External documentation
  • Added progress bar in modal window during welded SVG generation.


This was the first public-ish release, and I wasn't keeping track of changes before this point, sorry.


  • Under rarely triggered circumstances I haven't managed to isolate yet, the randomization routine enters an endless loop, and the only way to break out of it is to close the browser window. Time constraints and the likelihood that I'm going to completely replace the original author's randomization routines in the next version led me to decide to leave this unresolved in 2.2.1.

Future Plans

Prioritized for 2.2.x

  • Translate final SVG output so that the whole thing is in quadrant IV as close to the origin as possible.
  • Handle resizing of the window during assembly.
  • Option to display a tile grid underlay. This needs to be done in such a way that the export routines can ignore it.
  • Tidy up structurally. Diagrammata is based on Javascript version of Ghost Diagrams, which was an (apparently hasty) port of the original Python version, which was properly structured OO code.
  • New randomization algorithm.
  • Error message on malformed tileset.


  • Save to localStorage, with a generic interface to allow other options later.
  • Themes for end users.
  • Export text representation.
  • Add weights to tiles
  • User-definable stroke and fill styles.
  • (Optional) multi-character connectors.
  • Polyvalent connectors, i.e., polar connectors that can match more than one other connector.
  • Alternate tile designs.
  • Graphical editor for tiles, eventually with some degree of control over their appearance.
  • Optional refresh interval: pattern assembly is slower than it could be due to the overhead of drawing and redrawing tile placements that are later backtracked.
  • Transformation control: optionally apply SVG transformations to the pattern.
  • Arbitrary boundaries: allow the user to specify an arbitrary region in which the pattern can be constructed.
  • Similar to arbitrary boundaries, allow the user to manually pre-place tiles, even if it breaks the connectedness requirement.
  • Chrome app.