The way an idea is connected — is the idea.

Noodle associates the files of a working directory into nested mind-maps and features powerful functions for manipulating the structure of your knowledge base.

Download the latest version!

The project site, https://noodle.franciscogg.site, has all noodly things:


???

What is the best/fundamental/truest representation of information? Turing says everything is a unidimmensional array of binary states. Unix says everything is text. The internet says more specifically html + css + js. Social media offers an audio-visual experience which is sensually immersive and generally does well with our lizard brain. What if it’s all about being able to move between the different representations? But if you want to move between things, you have to map out and change how the things are connected.

-—^^v~^–

On the one hand noodle was motivated by this attempt to represent reality canonically which is related to weird philosophyical stuff. Consider the phrase “structuralist ontology”. If the world were made of a set of indifferentiable entities, where might the structure of reality emerge from? The idea is that the entities that make up reality are only differentiable in the sense that their relative “perspectives” on the rest of reality are different. The roles of the entities in the structure of things is different, nothing about them inherently. The way they associate to the rest of existence is what defines them as themselves.

..//.\\///

On the other hand I was confronted with difficulties around expressing different accounts of reality, agency, and truth. Different perspectives leads to a lot of repetition which might be fine for presenting information to someone coming to it for the first time, but not as a conceptual map. It’s also hard to settle on primitives for certain philosophical concepts, some kind of ground to stand on. You end up in loopy thoughts. For instance when you’re thinking about the nature of axioms, or mechanisms of epistemology where an agent is embedded in the very reality it tries to understand. It seamed that something like noodle could neatly express partially formulated ideas, reduce redundancy, and work with this loopiness rather than be at odds with it.


Project Notes

Interface

It’s a command line interface. I know that alienates a lot of users. Even though the visual feedback is limited, it’s the fastest way to develop a freeform interface. Constraints are good. I can focus on optimizing the prorgram at a functional level. I also believe the terminal is a fundamental and important abstraction level.

Tooling

I started the project using VisualStudio building for Windows for no other reason than that’s what I knew at the time. Since I switched to Linux on my personal machines some time after starting the project I ended up making a commandline tool with CMake and GDB. I’ll likely talk about my big computer-setup-migration in another article.

Managing Scope

The most significant challenge with this project was actually defining it. I knew from the start that I needed something for organizing ideas and that I wanted something that could let me work with graphs, given the philosophical motivations for the project. The original vision was something much closer to MS OneNote in terms of the interface. I wanted EMR pen input to create ink strokes much like in the windows ink API. Those would then be saved as SVG files to represent individual “doodles”. Doodles would then be atomized or grouped together as needed and associated in the knowledge base which I called “noodle”. I also wanted intuitive, physics-based manipulations in the editor. All this quickly became a mission to implement a rendering loop with OpenGL and creating an event system to handle user inputs. Although the interface I was picturing would likely be a lot of fun to use, I realized the core concept of the project is really the multiplex graph as a medium for representing ideas. I deferred the fancy bells and whistles and focused in on the data structure.

Point of Attack

Once I identified the core of the project I had to decide what level I wanted to implement it at. I originally conceptualized noodle to be a canonical representation of information. If I had thought of a way to implement it in hardware, I might have tried it. But instead I considered implementing the project as a new kind of filesystem altogether, then as a service other programs would dynamically interact with. Finally I settled on noodle as metadata in an existing filesystem.

Although tackling a problem at a lower level gives you more control, it’s better to find the quickest path to the functionality you’re looking for by leveraging existing technologies. This might mean compromising on an idealised version of the project. But at least you’ll have a version of it. And you can always make improvements later.

Software Design

When I first designed the multiplex graph I implemented it as a node pool which I used to dynamically build adjacency lists. I realized that although memory usage was extremely efficient, the algorithmic execution was slow which could become a problem with larger knowledge bases. Now the multiplex graph uses C++ unordered maps from the standard library. I have yet to stress test it.

What’s Next?

I’ll definitely be adding and removing features as I use noodle based on what I find useful and fixing problems as they pop up. The UI needs some streamlining and the only way to find out what works best is by using it.

My short term checklist:

  • Replace readline with replxx for compatibility with Linux, Mac, Windows
  • Better colours
  • UI streamlining and bugfixes. This is about reaching parity with the documentation on the project site, adding new useful things, and killing things that don’t work.