Projects

Over the years I've worked on a number of projects, all in the tech sector. Below are a few highlights. I've also released a fair amount of open source software for JavaScript, Node.js and other platforms.

  1. Billberry
  2. Monday Calendar
  3. Rahvaalgatus
  4. JavaScript Libraries
  5. Node.js Modules
  6. Vim Plugins

Billberry

Billberry is an Estonian e-invoice operator founded in the beginning of 2021. It lets smaller Estonian organizations send and receive e-invoices entirely for free, while also providing paid white-label services for online accounting software. Billberry focuses on being the easiest e-invoice operator to automate and integrate with on the market. Its simple HTTP REST-ful API is available for no charge and can be used to easily add e-invoicing into any service, be it a web-shop, web-app or even a utility provider.

The Estonian government made it mandatory to use e-invoices when billing the public sector on July 1st, 2019. Two years later, as of 2021, Billberry is the only operator in Estonia that provides free sending and receiving of actual e-invoices (in the Estonian e-invoice XML standard) from any public or private organization. A few other operators that support billing the public sector for free require recreating (and retyping) invoices using their web forms.

With its basics functional, Billberry is now working towards adding support for sending and receiving invoices from other European countries. If you know European e-invoice operators that would like to exchange invoices with Estonia, please email Billberry!

Monday Calendar

Monday Calendar is a calendar and todo web app and service. Its uniqueness lies in its design — by handling todos and events together, it lets you plan out your day and responsibilities in a single place. Secondly, it has a concept of social or secondary events — things you want to be aware of, but don't consider as part of your daily plan. Those are shown separately, at the bottom of the weekday. Monday Calendar also synchronizes with Google Calendar, Eventbrite and others, so work calendars, shared calendars and ticket purchases show up automatically. It also supports CalDAV, a calendar standard, which allows syncing any compatible desktop or mobile app to Monday Calendar. The iPhone, for example, comes with CalDAV support in its Calendar and Reminders app out of the box.

I first built what became Monday Calendar as a Ruby on Rails todo webapp late 2010. Over the years it has morphed into a full-blown calendar service, was rewritten in JavaScript and today runs on Node.js. Many of my open-source JavaScript libraries and Node.js modules were extracted from it. Its codebase is simple, robust and lacks technical debt.

I think it's got immense potential, but there's work to be done to make it into a successful business.

  • Monday Calendar home page screenshot
  • Monday Calendar week view screenshot
  • Monday Calendar month view screenshot

Rahvaalgatus

Rahvaalgatus is an Estonian non-profit site for creating public initiatives, collecting signatures and sending them to the Estonian parliament (Riigikogu). It's tied to the Estonian Collective Proposal law from 2014 whereby the parliament is required to review any initiative with at least a 1000 signatures. Some have ended up as amendments to legislation, some merely solved local problems. Rahvaalgatus was founded and is run by the Estonian Cooperation Assembly, a non-profit founded in 2007 by the Estonian President.

I took responsibility for the technical side of Rahvaalgatus on May 11, 2016. As is common, it started as a fire-fighting project — it was in a poor state technically due to its single-page app (SPA) architecture, being built on Angular 1. It was laden with general fragility, sub-par performance on mobiles and lack of support for search engines. Rather than tack on more complexity with isomorphic JavaScript (as web developers often do to their own disadvantage), I decided to eventually rewrite Rahvaalgatus as a simple server-side rendered Node.js app. It took about a week during the winter of 2016/2017 and it's been paying dividends ever since.

Being a tax-payer and donation-funded site, Rahvaalgatus' source code was published in Oct 2017.

  • Rahvaalgatus initiative page screenshot
  • Rahvaalgatus initiatives page screenshot
  • Rahvaalgatus video

JavaScript Libraries

All of my 29 JavaScript libraries are written strictly for ECMAScript 5, follow functional and prototypical inheritance principles (something ECMAScript 6 and today's JavaScript community dishonors in my view) and use the Node.js variant of CommonJS as their module system. The latter permits compatibility with all JavaScript tooling since it became popular around 2010. Apart from bundling (for which Browserify is a good option), none of the libraries require transpiling and non-browser specific ones run well under Node.js, too. For Node.js specific projects, see my Node.js modules.

All of the libraries have tests written with my own Must.js.

  • Undersign.js

    Library for creating eIDAS compatible XAdES signatures, incl. support for OCSP, timestamps and ASIC-E. Works with Estonian Id-Card, Mobile-Id and Smart-Id (BDOC), but otherwise generic.Since .
  • SQLate.js

    A tiny tagged template string function library for JavaScript to write SQL safely. Works with Mapbox's SQLite3 library, Brian Carlson's PostgreSQL library and others.Since .
  • J6Pack.js

    Library to render JSX to HTML on the web or on Node.js. Works with Express.js. Minimal with no React dependency.Since .
  • Heaven.js

    A JavaScript library for abstracting databases and resources through Table Data Gateway.Since .
  • HugML.js

    An XML parsing and serializing library based on Google's GDATA and BadgerFish conventions. Supports namespaces.Since .
  • FetchParse.js

    Fetch API mixin to buffer and parse response bodies. Supports media type patterns for content type specific custom parsers.Since .
  • FetchDefaults.js

    Fetch API mixin to set a default base URL and options. Functional and immutable.Since .
  • FetchThrow.js

    JavaScript Fetch API mixin to throw FetchError when the request fails or response has an error.Since .
  • FetchFormify.js

    Fetch API mixin for urlencoding an object and setting Content-Type if unset. Functional and immutable.Since .
  • FetchJsonify.js

    Fetch API mixin for stringifying JSON and setting Content-Type if unset. Functional and immutable.Since .
  • FetchError.js

    A JavaScript library for an error class for use with the Fetch API.Since .
  • JSON Stringify Safe

    Like JSON.stringify, but doesn't throw on circular referencesSince .
  • Standard­Http­Error.js

    Standard HTTP error class for Node.js. Proper serialization, no bloat. Extensible.Since .
  • Internet­Message­Type.js

    Library for JavaScript to parse RFC 822 ARPA Internet Text Messages types and bodies. Works well with InternetMessage.js.Since .
  • CoNext.js

    JavaScript function to use generators for request handlers and middleware. Calls next only if there was an error. Useful for Express routes.Since .
  • SquareBatman.js

    A small JavaScript scheduling algorithm library. Useful for round-robin etc.Since .
  • PromiseDefer.js

    JavaScript Polyfill for Promise.defer. Uses the native ES6 Promise. Supports other Promises/A+ implementations.Since .
  • Internet­Message.js

    Library for JavaScript to parse and stringify RFC 822 ARPA Internet Text Messages. Useful format for messages with headers and body. Similar to HTTP.Since .
  • Oolong.js

    Object utility library for JavaScript. Simple, tasteful and plentiful. Supports inherited properties.Since .
  • LazyObject.js

    JavaScript library to define lazy properties on objects that are initialized once and only when accessed. Also known as a lazy initialization and cached/memoized getters.Since .
  • MediumType.js

    JavaScript library for parsing, stringifying and manipulating media types. Useful for content negotiation. Follows RFC2045, supports quoted parameters, all allowed characters etc.Since .
  • StandardError.js

    Tiny JavaScript library that simplifies subclassing and inheriting from Error while keeping the correct name and stack. Also supports constructing from an object of properties. Saves you from boilerplate.Since .
  • SyslogProtocol.js

    Syslog (RFC 3164) parser. Works with RFC 3339/ISO 8601 timestamps. Since .
  • Element­From­Point.js

    A consistent cross-browser document.elementFromPoint function. Works around idiosyncracies of old WebKits et al.Since .
  • Egal.js

    Strict equality test (like ===) for JavaScript that handles both built-in and custom value objects (those with a valueOf function).Since .
  • Concert.js

    An event library for JavaScript and Node.js that implements the observer pattern (a.k.a publish/subscribe). Similar to Node's EventEmitter and Backbone.Events, but independent, minimal and light-weight.Since .
  • stRange.js

    Range object for JavaScript. Supports exclusive and infinite ranges. Stringifies to PostgreSQL compatible format.Since .
  • DDL.js

    Gets you a JSON Schema from PostgreSQL or SQLite3. Also supports arrays and default values. Use it for introspection or preparing your domain models like with Rails's Active Record.Since .
  • Must.js

    An assertion library for JavaScript and Node.js with a friendly BDD syntax (awesome.must.be.true()). It ships with many expressive matchers and is test runner and framework agnostic. Follows RFC 2119 with its use of MUST.Since .

As time goes on, I expect to open source more JavaScript libraries I've written in the past decade. If you'd like to be notified, your best bet now is to subscribe to my articles via Atom/RSS. Alternatively, you could follow me on GitHub, but I'd like to eventually move away from depending on centralized source code hosting.

Node.js Modules

Like the JavaScript libraries above, my 8 Node.js modules are written mostly in ECMAScript 5, but where absolutely necessary, use a couple of older ECMAScript 6 features (ECMAScript 6 being a moving target, after all). All of the modules should be compatible with Node v4 from 2015 for people that share the aversion of upgrading software unless there's a security or functionality issue that affects them. Some modules (Mitm.js for example) continue to support versions as old as Node v0.10 from 2013.

All of the modules have tests written with my own Must.js.

  • Heaven.js for SQLite

    Heaven.js's Table Data Gateway for SQLite. CRUD API that parses and serializes your models.Since .
  • Flash Fiction.js

    Flash messages middleware for Express/Connect with support for redirects and immediate use. Useful for informational or errors messages. Like Rails's Flash.Since .
  • SeleniumDOM.js

    SeleniumDom.js is a mixin library for Node.js's Selenium WebDriver that adds DOM methods to Selenium's WebDriver and WebElement.Since .
  • Fetch/Off.js

    Fetch API polyfill and facade. Its request and response wrappers can be used separately: use fetch for request yet get back Node's Http.get response (IncomingMessage) for streaming.Since .
  • PgError.js

    An error class for Node.js that parses PostgreSQL's ErrorResponse format and sets human readable field names. Works with node-pg, too.Since .
  • Mitm.js

    Intercept and mock outgoing Node.js network TCP connections and HTTP requests for testing. Intercepts and gives you a Net.Socket, Http.IncomingMessage and Http.ServerResponse to test and respond with. Super useful when testing code that hits remote servers.Since .
  • Syslogh.js

    Log to your system's Syslog from within Node.js. Provides simple native bindings to <syslog.h> and syslog(3). Works on Node v0.10 up to v4 and beyond.Since .
  • Require Guard

    Prevent files and modules being required more than once. Helps with auto-reloaders or test runners that insist.Since .

As time goes on, I expect to open source more Node.js modules I've written in the past decade. If you'd like to be notified, your best bet now is to subscribe to my articles via Atom/RSS. Alternatively, you could follow me on GitHub, but I'd like to eventually move away from depending on centralized source code hosting.

Vim Plugins

Vim is the only editor where you've got to find (or write, in my case) a plugin to be able to close a file intuitively (see Bbye.vim below). In spite of that, I find Vim's modal editing to be superior to any other text editor. Its keybindings have made their way to my spinal cord and made it impossible for me to edit lengthy texts elsewhere. I keep hitting Escape.

  • Node.vim

    Tools and environment to make Vim superb for developing with Node.js. Like Rails.vim for Node.Since .
  • Bbye.vim

    Delete buffers and close files in Vim without closing your windows or messing up your layout. Like Bclose.vim, but rewritten and well maintained.Since .