Blog of Raivo Laanemets

Stories about web development, consulting and personal computers.

Open Source Projects

These are my Open Source projects. You can find source code for them on my GitHub account.

Project wizard

A dialog system with questions and yes/no and selection answers. I built it to learn about the React framework. The application can be used online from The set of questions is structured as a tree data structure that is supposed to ask questions "intelligently". It only asks certain top-level questions and then proceeds to ask only those questions that make sense by previous answers.

Node.js and SWI-Prolog interface

I consolidated a number of forks of the existing Node.js and SWI-Prolog language bridge, merged different features of them and published on the NPM registry.

As I was not satisfied with technical constraints of the native addon based language bridge, I created another one that works over standard IO.

Dataline line graph library

Simplest single-line chart library. Draws the chart using the HTML5 canvas. I built it as I needed something fully responive that I can easily drop into any project that needs simple line charts.

DOM-EEE: a library for scraping web page data

DOM-EEE is a small Open-Source declarative portable library for extracting data from web pages. I wrote it to simplify development of web scrapers. The library can be used in many JavaScript environments: browsers (userscripts), PhantomJS, Node.js (through Cheerio or jsdom).

Photo gallery generator. I did not find gallery generator that satisfied all my needs and I had to build my own. This one supports nested albums, incremental building, metadata in JSON, custom templates (EJS) and generates gallery output into a separate directory tree from the source directories. It is built as a Node.js command-line application and uses ImageMagick to generate thumbnails.


Journaled in-memory JSON database for PhantomJS. The data file format is compatible with Node.js package dirty. The library simplifies development of web scraping code by not requiring external database in projects where it is not needed.

AVR-based PC cooling

AVR MCU-based cooling system for PC. The project includes a firmware for AVR and a setup/configuration utility for PC. Built for evaluating an AVR MCU and the avr-gcc compiler. Also done for fun. Deployed to provide silent cooling for my main computer.


A Markdown parser for SWI-Prolog. Installable as a pack.


An in-memory document-based transactional database for SWI-Prolog. Used as the database in the Blog-Core project. Installable as a pack.


Sorts list of dicts by a key in dict. Installable as a pack. Recent SWI-Prolog releases contain the sort/4 predicate which obsoletes the library.


HTTP router for SWI-Prolog. Uses path expressions (like post/show/Slug) containing logical variables to denote URL paths. Simplifies web application development in Prolog. Installable as a pack.


A data structure validation library for SWI-Prolog. Inspired by JSON-Schema but also includes support for Prolog terms. Installable as a pack.


An HTML templating library for SWI-Prolog. Installable as a pack.

Blog-Core framework

Blogging/CMS framework for SWI-Prolog. This blog is built using it.


Attempt to document the offline database synchronization system developed for the FitSmarty project. The code sets up a MySQL database and two SQLite databases. Then runs random operations in them, synchronizes, and checks consistency. The code is very verbose but works.


Node.js binding for the RapidXML parser for very fast newsfeed parsing.


Personal web-based replacement for Google Reader and other feed readers. It tracks seen/read/important state of articles and is built for high performance. Scales well beyond 500 feeds that the most other feed readers struggle with.

Prolog to JS transpiler

Proof-of-concept source-to-source Prolog to JS compiler. Includes a translator written in Prolog and a small runtime (200 loc) written in JavaScript. It can run simpler programs, like the queens benchmark.

The Estimator

The Estimator is an application for estimating the time that a project takes. It divides the project into components and components into tasks. The tasks are estimated to take min to max hours. The app then calculates total min to max hours for the whole project.

The application was built to evaluate the KnockoutJS and Bootstrap frameworks.

LLJ - Logic Language for JVM

LLJ is a Prolog-like logic language for running on JVM. It allows close integration with Java libraries. The source code is extensively commented and covered with a high number of test cases. At the time of release it was faster and more memory efficient than many other Prolog implementations on JVM.

  • Java
  • Prolog
  • Maven
  • JUnit