profile picture

TIL: Things I Learned

Also known as Today I Learned, this is a collection of write-ups on small subjects that don't deserve a full article. They cover different technologies, languages or tools or tricks that I've discovered on my day to day.

Backup headscale using Litestream

February 25, 2023 - 979 words - 5 mins
How we can ensure if something happens to the server running headscale that I can recover the configuration? Always have a backup strategy! This time I tested headscale and Litestream locally, combined with a S3-compatible storage (MinIO) ▶️ Also made a recording of this that you can watch on YouTube… read more

Deploying headscale to for homelab setup

February 19, 2023 - 583 words - 3 mins
This time I took my local headscale setup and deployed to, to allow nodes from different locations to connect into my homelab mesh network. This builds on top of work done in previous TIL, but moves away from local testing using Docker and some VMs to real internetz deployment. ▶️ Also made a … read more

Testing Crystal SQLite3 PRAGMAs usage and some HTTP benchmarks 👨‍🚀🚀

February 11, 2023 - 1317 words - 7 mins
Wanted to test the PRAGMA changes to crystal-sqlite3 and perform some simple HTTP benchmarks, just for fun 😊 This uses the work shown on previous TIL, and the code from [PR #85][pr-85]. ▶️ Similar to previous TIL, I made a recording of this test (and the errors) 💣 here. 1. A simple HTTP app that use… read more

Testing out headscale for a homelab setup

January 29, 2023 - 800 words - 4 mins
Instead of just exposing a single machine to the internet (see previous TIL), I wanted this time to quickly test headscale and see how it operates for a homelab scenario to replace Tailscale. ▶️ I also made a recording of this that you can watch on YouTube here. 1. Run headscale in a controlled envi… read more

Setting SQLite3 PRAGMA's automatically with crystal-sqlite3

January 14, 2023 - 641 words - 4 mins
For a project in Crystal using SQLite3 (crystal-sqlite3), I wanted to automate setting PRAGMAs on the database connection without having to leverage on DB#setup_connection and hardcoding values in my code. So, instead of doing this: require "sqlite3" "sqlite3:file.db" do… read more

Expose home VM to the internet using Fly's Private Network and WireGuard

January 07, 2023 - 512 words - 3 mins
I wanted to host applications on private servers and have them accessible on the internet. But wanted to avoid having to punch holes on internet routers, exposing my home/office IP or having to figure out more complex stuff. With this in mind, thought about using Fly's Private Network (also known as… read more