UML visualisation for Git repositories (website app).

Understand code quickly: Automatically generate UML class diagrams from source code residing in git repositories. Diagrams automatically update when you push code using git.

point and click

Visit GitUML now, create a free account and begin creating UML diagrams and documentation.

Python to RPN

Check out Python to RPN if you have an old vintage HP Calculator that you want to program in Python!  Impossible?  See also my blog post How I used the Python AST capabilities to build a Python to Rpn converter.

I am pleased to announce the Python to HP42S RPN converter website is online. 

[Image: python_rpn_ui_01.png?raw=1]

You write code in a high level structured language (which happens to be Python 3 syntax), hit a button and RPN is generated. 

[Image: python_rpn_ui_02small.png?raw=1]

You then paste the RPN into Free42 or transfer it to your DM42 (by creating a raw) - and it runs.

  1. Examples:
  2. User Guide:
  3. Canvas for 42S Simulator:
  4. List of HP42S Commands Supported Reference:

The converter supports core Python syntax (which is very powerful), but does not implement the built in Python libraries that you would get in desktop Python. You have to rely on the ability to call HP42S commands from Python to do your work - which of course you can do. Specifically, it has the following capabilities:

  1. Variables
  2. Functions, Multiple functions, nested functions
  3. Parameter passing, receiving return values, multiple return values
  4. if elif else
  5. Comparison operators == != > < >= <=
  6. Booleans True, False and operators not or and
  7. for loops, range(), iteration through lists and dictionary keys
  8. while loops, while…else
  9. continue and break operations in for loops and while loops
  10. Lists and Dictionaries (basic operations only).
  11. Matrices, Pythonic matrix element access syntax [row,col]
  12. NumPy compatible slicing syntax for sub-matrices
  13. Complex numbers using either 42S or Python native syntax
  14. Expressions involving nested brackets
  15. assert
  16. Testing and clearing of flags
  17. Access most HP42S commands as function calls e.g. FIX(2)
  18. Some enhanced functions to make life easier e.g. varmenu() automates and simplifies the generation of MVAR based code.

Online Programmable RPN calculators



Here is the built in Javascript code editor.

Parameters to Javascript functions are taken off the RPN stack. Return values from Javascript functions are pushed onto the RPN stack.



A completely new implementation, also programmable in Javascript. Define interactive UI buttons and sliders.



Jupyter Notebooks

A way of implementing complex calculators incl. scrolling text area UI widgets within Jupyter Notebooks.

Scrolling Textareas

Scrolling Textareas in a Python Jupyter Notebook, allows building a kind of “Calculator Playground”.

Various Jupyter Notebooks at (private)

Gist of the scrolling textarea technique: (public)

Google Colaboratory

A way of implementing UI scrolling regions within Google Colaboratory Notebooks. Google Colaboratory, or “Colab” for short, is a version of Jupyter Notebooks, and allows you to write and execute Python in your browser.

This Colab project is a simpler version of the scrolling text area idea above, and needs to be fleshed out a little more fully to match the native Jupyter notebook functionality above.


Toolback - App Builder

An online programming environment, with low code features. Drag and drop a UI and add scripts directly to components. Generate websites and desktop apps (electron based) with a click of a button.


Toolback is the drag and drop UI builder and online, Low Code, app building IDE.





Preview your app with a key press.


Export to a website or electron app - one click!


Toolback Lite

Toolback-Lite is a lightweight drag and drop UI builder and online app building IDE. The drag and drop is done on a grid rather than using the the complex grapes-js html builder library, which Toolback uses.


Chord Jammer

A midi web app that lets you play chords with 1 finger in the left hand and jam safely in the right hand. As you change chords, the rh notes are filtered so you always play good sounding notes.


MIDI powered by WebMidi.js GUI powered by webaudio-controls Scales powered by tonaljs - A functional music theory library for Javascript.


Sample config

export let project = {
    chords: {
        'C3': {
            lhchord: Em7Chord,
            rhnotes: EmScaleMelodic,
        'D3': {
            lhchord: AmAdd9Chord,
            rhnotes: EmScaleNatural,
        'E3': {
            lhchord: CM9Chord,
            rhnotes: EmScaleNatural,
        'F3': {
            lhchord: BmAdd11ChordInversion1,
            rhnotes: EmScaleNatural,
            rhnotes2: EmScaleHarmonic,
            rhnotes3: EmBlues,

Single finger Chords

With the project config above

  • Play C3 to trigger chord Em7Chord and jam in default scale EmScaleMelodic
  • Play D3 to trigger chord AmAdd9Chord and jam in default scale EmScaleNatural
  • Play E3 to trigger chord CM9Chord and jam in default scale EmScaleNatural
  • Play F3 to trigger chord BmAdd11ChordInversion1 and jam in default scale EmScaleNatural

Jamming notes are G3 to C5 and are filtered to be in the default scale for that chord.

Scale Switching whilst playing

You can switch to e.g. the pentatonic scale for the current chord by pressing D#4. Switch back to the default scale by pressing C#4.

Here is a list of modifier keys and what they do to the rh scale:

  • C#4 default scale, rhnotes in config
  • D#4 rhnotes2 scale in config
  • F#4 rhnotes3 scale in config
  • G#4 transpose rh scale by options.transposeUpAmount semitones
  • A#4 transpose rh scale down by options.transposeDownAmount semitones

You can customise the transposition amounts for a given project via config e.g.

export let project = {
    chords: {...},
    options: {
        transposeUpAmount: 4,
        transposeDownAmount: -2,

Potentially other customisations via config will be supported in the future:

  • Being able to specify which scales to switch to, instead of pentatonic and blues.
  • Being able to change what the modifier keys actually are (unlikely).

Left hand black key modifiers

The octave containing the left hand chord trigger notes will have its black keys used as modifiers. The C# acts as a SHIFT, so

  • C# hold down to engage SHIFT mode
  • D# cmdSetScaleFiltering(false)
  • F# cmdSetScaleFiltering(true)
  • G# transposeChord down a semitone
  • A# transposeChord up a semitone
  • SHIFT D# stopAllNotes()
  • SHIFT F# scaleFilteringModificationSticky toggle
  • SHIFT G# reset chord transpose - todo
  • SHIFT A# reset chord transpose - todo

Config customisations supported

export let project = {
    chords: {...},
    options: {...},

    splitNote: 'C3',         // Where the root note is (see explanation below)
    rhStartOctave: 3,        // To which octave to start mapping notes to


As CTO of Austhink, I technically managed and helped architect Rationale - an argument mapping application, written in C# and .NET. This was done together with a great team of developers and thinkers incl. the CEO Tim van Gelder.


Rationale - the desktop app

Rationale is now available as an online web app at

🎗 Disclaimer: The web version of Rationale was developed by another team, using the source code and design of the desktop Rationale as a base.

Also at Austhink, we developed the online debating and argument mapping website the Hive.


Hive - online debating and argument mapping website

Last modified May 2, 2022: improved chord jammer screnshot (d355a43)