I'm excited to annouce the alpha release of flowctl , an open source and modern self-service workflow execution platform. flowctl dashboard With flowctl, you can define complex workflows as simple actions that can be triggered by users with custom inputs. These flows can be run locally on the server or on remote nodes via SSH. Actions can use different executors . It could be a simple…
There are frequent power cuts where I live which make it difficult to run a home server with a decent uptime. I do have a UPS, but it doesn't have any smart features. Whenever there is a power cut, I have to manually shut down my home server. This is only possible when I am home because I have completely locked down SSH access. I could get a smart UPS but those are very expensive. I just…
I like to use virtual machines to test new software or to host services in my homelab. I even use a Windows virtual machine to play games. It can get quite tedious to create a VM and install the OS every time. So I have been looking at building pre-packaged images with all the necessary tools and configuration baked in. I have been wanting to experiment with Packer, but I didn't have a use…
I am currently in the process of upgrading my home lab and home network. I thought this would be a good opportunity to have a Steam Link setup to play games on the TV. I have been a PC gamer for a long time and wanted to get a feel for couch gaming before considering getting any consoles. Steam Link allows you to stream games on your local network. The technology is very similar to cloud game…
TLS certificates are an important security tool for both, services accessible over the internet and services hosted locally in a home lab. If you are just starting out, self-signed certificates can be a very good option. If you own the domain, you could get valid TLS certificates. Using the dnsChallenge option in Traefik, you can do it without having to expose any services to the internet. Here I…
In one of my recent projects, I had to run some long-running jobs based on the user request. So, I started reading about job queues and how they are implemented. Here I have collected some of my findings and experiments. Project Setup I built a simple worker node in Go that reads from a queue on Redis. 1 if worker { 2 host , _ := os . Hostname ( ) 3 log . Println ( " Starting worker " , host ) 4…
Introduction I got an Ender 3 V2 a few months back. I wanted to have access to a 3D printer since I was in high school but they were too costly and not readily available in India. Also, it was difficult to justify why an 8th grade student needs an additive manufacturing machine. In the past few years, 3D printers have become more reliable and cheap, and now was a perfect time to get one. I printed…
Recently I was in a situation where I had to share some files containing sensitive data and it had me wondering whether a standalone encrypted file can be created which can be decrypted without any external software. This could be a convenient way to share data securely. So I built a tool to do just that, kind of. Suitcase CLI tool Implementation Go 1.16 introduced an interesting feature, the…
I recently signed up for a free AWS account and was quite surprised at the number of services that were being offered. I didn't want to waste this opportunity and decided to build a small project to make use of it. I have been exploring geminispace quite a lot lately and thought it would be a good project to build a search engine for it. Gemini Gemini is a new application layer protocol, a…
Why a home server? I have lately been shifting to more privacy-conscious solutions wherever possible. I switched to a degoogled ROM on my phone and deleted my Gmail account and moved my email to Tutanota under a custom domain. There are many good SaaS offerings available for free but they are not the most privacy-friendly so I had to find alternatives or selfhost. I had tried to selfhost in the…
Filesystem in Userspace or FUSE allows us to create filesystems without the need to modify the kernel. A fuse filesystem runs in the userspace while the kernel takes care of routing the filesystem calls to the fuse implementation. Say, for example, a user wants to delete a file in the fuse filesystem, they would issue a system call and the fuse kernel module would route that call to the fuse…
I recently came across an excellent book by Daniel Shiffman called Nature of Code where he discusses the mathematics and code behind simulating natural phenomena. There is this one particular chapter about Particle Systems that intrigued me where he introduces a very compelling smoke simulation using a very basic physics engine and some particles, all written from scratch! I knew I had to give it…
Source - Wikipedia OAuth 2.0 (referred to as OAuth from now on) is an open standard for secure access delegation and it provides mechanisms for clients to obtain access to resources on a server on behalf of the user. To achieve this OAuth uses access tokens. An access token, simply put, is a string representing the granted permissions. The permissions represented in the access token are called…
Obliwonk Obliwonk is a slightly over-engineered profile README updater. Profile README is a really cool feature that allows you to add a README to your GitHub profile. It has already become a heavily used feature. To create one for yourself, you simply create a repository with your username as the repo name and add a README to it. Now, it is fun to have a profile README, but having it self update…
I don't know what it is with interpreters and compilers that I always try to build one without ever completing it. I get very excited to build a new programming language or just to play around with an existing esoteric language which has led to me having a couple of different lexers and partially completed parsers and code generators. This time, I wanted to finally build something that…
Introduction Brainfuck is a turing-complete, esoteric programming language created by Urban Muller in 1993. It consists of only 8 language commands Character Meaning > increment the data pointer (to point to the next cell to the right). < decrement the data pointer (to point to the next cell to the left). + increment (increase by one) the byte at the data pointer. - decrement (decrease by one) the…