Building AppImages with Nix

It’s been a bit since I’ve written an update on the cryptic nebula project, almost 5 months (since this post, which wasn’t officially part of the blog series but whatever). Since then it’s switched names to “cryptic-net”, and that we would likely use MinIO as our network storage …
Read more...

The Syntax of Ginger

Finally I have a syntax for ginger that I’m happy with. This has actually been a huge roadblock for me up till this point. There’s a bit of a chicken-and-the-egg problem with the syntax: without pinning down the structures underlying the syntax it’s difficult to develop one, but …
Read more...

V4 of Radix, a Golang Redis Driver

Radix is a Go driver for the Redis database. The current stable release is v3, the docs for which can be found here. Over the past year (perhaps longer) I’ve been working on a new version, v4, with the aim of addressing some of the shortcomings of v3 and distilling the API a bit …
Read more...

How to Secure a Webapp

In this post I will be documenting all security hoops that one must jump through in order to consider their webapp secure. This list should not be considered comprehensive, as I might have forgotten something or some new hoop might have appeared since writing. For the context of …
Read more...

Setting Up maddy On A VPS

In the previous post I left off with being blocked by my ISP from sending outbound emails on port 25, effectively forcing me to set up maddy on a virtual private server (VPS) somewhere else. After some research I chose Vultr as my VPS of choice. They apparently don’t block you fr…
Read more...

Visualization 7

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 60; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand canvas element's width to match parent. this.dom.widt…
Read more...

Self-Hosted Email With maddy: A Naive First Attempt

For a long time now I’ve wanted to get off gmail and host my own email domains. I’ve looked into it a few times, but have been discouraged on multiple fronts: Understanding the protocols underlying email isn’t straightforward; it’s an old system, there’s a lot of cruft, l…
Read more...

Visualization 6

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 50; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand canvas element's width to match parent. this.dom.widt…
Read more...

Visualization 5

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 50; const maxNewElsPerTick = 10; const deathThresh = 10; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand can…
Read more...

Visualization 4

This visualization is a conglomeration of ideas from all the previous ones. On each tick up to 20 new pixels are generated. The color of each new pixel is based on the average color of its neighbors, plus some random drift. Each pixel dies after a certain number of ticks, N. A p…
Read more...