Hello there!

Degoogle: Swapping Analytics for Fathom for visitor statistics

I’ve resolved to become more privacy conscious during 2020. I’m going to do this mainly by decreasing or eliminating my use of Google products. This post is the first of what is to become a series were I explore both free and paid-for alternatives to the suite of online products that Google offers.

First up we are going to look for a replacement for Google Analytics. Analytics is a tool that offers statistics and insights into what your visitors are doing on your websites. By some accounts more than 50 % of all websites use Analytics – a literal treasure trove of data about what people are doing on the internet given away by site owners to a mega-corporation for free.

Let’s see if we can find something else.

Celebrating 10 million downloads for Jayson

Just posting a quick headsup that my open-source node.js library Jayson this month reached a cumulative 10 million downloads in its 8 years of existence.

Jayson is a library that enables easy setup of a JSON-RPC client and server in node. I wrote it for internal use at a previous job eight years ago. Today it is the number one tool for JSON-RPC implementations in node, and at the time of writing gets approximately 500 000 downloads/month.

Broadcasting row updates with PostgreSQL triggers

Here’s some SQL that might be useful if you are working on an application that is backed by PostgreSQL. I’m going to show you how to get the set of changed columns inside of a UPDATE trigger handler that can then be used to send out a NOTIFY. This notification could then be picked up with a PostgreSQL LISTEN and easily passed on to browsers connected to your application via a web socket. This allows your clients to stay updated of any changes to any rows without resorting to inefficient polling.

Simple shell script replacing Pingdom for checking domain health

Pingdom is a service that automatically checks the health of your domains. It returns up/down information, response times, status codes and more. If something goes wrong it sends you notifications. Here I’d like to show a simple shell script that I’ve been using that replicates some of that functionality and notifies by email when something goes wrong.

Part 1: How to architect a medium sized node.js web application

This is the first in a two part series of how to architect a medium-sized node.js web application. It is designed for testability and long-term maintainability. Part 1 is going to be a high level overview of the directory structure and how it fits together. In part 2 (not yet finished) we’re going to look into some specific highlights of the architecture.

Manual Stripe invoicing for the glorious benefit of your business customers

Stripe is a great service — it enables you to easily start accepting card payments in a multitude if currencies. But Stripe lacks good support for one feature that is important for many business customers: manual invoicing. In this short article I will show you how I tackled this problem as part of my work with Linknow.

Six lessons learnt while using Microsoft Graph

As part of my work with Linknow the last few months I’ve been working extensively with Microsoft Graph, which is an API for accessing data from Azure, and other Microsoft services. Here’s a list of some of the things I’ve learned.

The future is now: trying out GraphQL and AWS Lambda

Lately I’ve been trying out some new technologies that may change web development. The GraphQL query language combined with a serverless architecture enabled by Lambda form a wonderful combination that makes the work of developing an API and managing a server obsolete. Or does it? Let’s have a peek into the future!

Creating swap space on Ubuntu

Here’s a quick intro to swap space and how you can create new swap space on Ubuntu 16.04. It will most likely work verbatim on other Ubuntu versions, as well as other distributions of GNU/Linux too.

User authorization with React/Redux

Here’s the problem. You want to prevent access to parts of your app for users that are not logged in, and additionally you want to prevent logged in users without the right role or access level (non-admins typically) from accessing yet more parts of your app.