Eamonn's Side Projects

Some programming projects I've built over the years for my own amusement, and maybe yours.

Almond Bread reflects my fascination for the Mandelbrot set. I built an interactive explorer to find interesting parts of the set zooming way down deep. I also added ways to capture images and zooming videos.

Video Time Warp is an attempt to reproduce an interactive exhibit I saw at the Museum of Fine Arts, Houston. When you view it at Video Time Warp you will need to give permission for your browser to use your camera. (Don't worry, no camera data leaves your browser.) Try moving around in front of the camera.

Warp is a many-body gravitational simulation that runs in your browser. You can start the simulation with any number of astronomical objects, and you can vary their mass from 10 Jupiters (1% Sun mass) to 10,000 Jupiters (10 Suns). The simulation runs in a cube of sides two AU (i.e. twice the distance from the Earth and the Sun). Because the time scale of motions can vary greatly depending on the masses and how far apart they are, the simulation automatically adjusts the time step to keep the motions slow enough that the simulation remains accurate, while making it fast enough to not be boring to watch. The URL captures the parameters of the simulation so you can bookmark or share any interesting configuration you discover. For example, an initial configuration of 100 objects each 1% of the Sun's mass evolves over a year of simulated time into a small number of large stars with smaller objects in intermittent unstable orbits around them.

flife answers the question: what would a cellular automata look like if you were not restricted to a discrete number of values per cell? This is a floating-point variant of Conway's Game of Life, where the update rule is a continuous-value function rather than a Boolean function. It looks even more like "life" than Conway's version, albeit the kind of life you find on a Petri dish.

Video Gestalt is a new implementation of an invention that I was awarded a patent for when I worked at HP Labs many years ago. I was frustrated that HP never did anything with it, so after the patent expired, I created this new implementation. It is basically a way of summarizing a long video as a short video with many thumbnails of the original video playing in parallel.

Super Sekrit is a website for encoding and decoding secret messages. It uses client-side JavaScript encryption, with no server-side storage. You create a sekrit cirkle, like Not so secret, which you can share securely with someone as the key for encoding and decoding messages. This particular cirkle is "not so secret" because anyone of you reading this can use it to decode messages. For example, if you go to Not so secret, click "Read a Sekrit", and paste in the following message: you will see the decoded message. I built this site way back in around 2013, but surprisingly the site is still up and running. I've no idea if anyone is using it.

tootgeist is a web app that helps make it easier to join the Mastodon social network. The main barrier to people joining is deciding which of the individual Mastodon servers to join. It shows a card for each of the major servers, and for each one it shows images that have been posted recently, and (if you wait a few minutes), a word cloud of what topics those people are posting about. It is worth noting though that no matter what server you join you can generally see and interact with posts from people on other servers in the Mastodon community. The main differences between servers are how they do moderation, that is, what standards they apply to decide to block a user or a server.

Bajel reflects my nostalgia for Makefiles, and missing them when working in an NPM JavaScript development stack. I really liked the model in Makefiles where build targets are files and the timestamps of the files are used to determine what needs to be built. It's a pure-JavaScript implementation and is controlled by build files in JSON, or in various formats that convert to JSON, like YAML and TOML. For power users, you can write the build files in JavaScript for ultimate flexibility.

Maxichrome is a JavaScript library that generates sets of colors that are maximally different from each other according to human perception of colors. This can be useful for picking colors for graphs or coloring maps.

mergi is the source code for the kartoj.com web app. This is a language-learning flashcard system that pairs words in a language with images returned by a Google image search. It uses the spaced-repetition algorithm to present cards in an adaptive way so that you will see the cards you got wrong previously more often.

Classless Tufte CSS is an experiment to bring the elegance of Edward Tufte's style of graphic design to the web, with the simplicity of a pure semantic classless HTML/CSS style. This page is an example of its use, and I encourage you to "view source" this page to see the semantic simplicity of the HTML code. The linked repo gives more details, including credit to the original developers of the repo from which this was adapted. Trying it out with your own pages is easy, especially if you already are using semantic HTML. You just need to add a single line in the header to include the CSS.

Smoothish is a JavaScript library for smoothing time-series data using a least-squares interpolation algorithm that is robust to boundaries and missing data.

Funetik iz u web aplukayshun that kunverts Inglish intoo funetik speling. Yoo kan triy it out yerself at funetik.site . Awlsoe see thu phonate JaavUskript liybreree, which iz eezee too yoos in thu brouzer er u NodeJS server.

ez-html-elements is a JavaScript library for creating HTML elements in a declarative way, similar to a DSL like HAML. This is useful for server-side code generation or static-site generation.

passprint is a small JavaScript utility library to help with debugging of complex function-style code. It allows for easy console logging of intermediate values in expressions.

Funcgo was a reaction to my first exposure to the Go programming language, having previously drunk the functional programming Kool-Aid. I really liked the clean syntax of Go, but I really wanted it to allow for functional programming. So, like any self-respecting computer scientist, I designed my own language with a syntax similar to Go, but with the semantics of Clojure, a dialect of Lisp that runs on the JVM or JavaScript.

Simplest Blog is an example of the rule that every software developer who attempts to blog invariably ends up creating their own blogging platform. This one is probably the fourth one I built over the years, but in this case I wanted to really push the limits of simplicity as far as possible.

hexhistorymap is my latest project, still in progress, to create an interactive world history map where you can scroll back and forwards in history looking at how the world political map has changed over time. To simplify the data gathering, I divided the world into hexagonal tiles (using a scheme devised by Uber). Each tile is about the size of a small European country or US state, so there are unavoidable approximations. The web UI displays an interactive world map and a time chart, together showing the various political entities that controlled each area over the last millennium. As of now (June 2025) the data is still incomplete, with black areas showing areas of missing data.