Writing a Simple yet Performant HTTP/1.1 Server in Zig 0.16

If you’ve written network code in earlier versions of Zig or in C, then the patterns here will feel familiar. This post walks through building a minimal HTTP/1.1 server using nothing but the Zig standard library. The full source code for this blog post is available as a self-contained main.zig and main-async.zig with no external dependencies other than the Zig 0.16 standard library on GitHub. A Brief History of I/O In Zig Zig 0.15.1 - “Writergate”: All existing std.io readers and writers were deprecated in favor of the new std.Io.Reader and std.Io.Writer. These are non-generic structs that hold both a vtable pointer and buffer. The buffer lives in the interface and not in the implementation. ...

April 21, 2026 · 5 min

Reverse Engineering MuseScore's MuseSampler Library

MuseScore Studio 4 on Void Linux (and other non-systemd distributions) fails to initialize its audio sampling engine, MuseSampler, with the following error: MuseSamplerLibHandler::init | Could not init lib MuseSamplerResolver::init | Could not init MuseSampler: /home/<username>/.local/share/MuseSampler/lib/libMuseSamplerCoreLib.so, version: 0.105.1 MuseScore launches and the UI works fine, but all MuseSounds instruments are unavailable. The same AppImage with the same MuseSounds installation works perfectly on Fedora Linux. This post documents the full investigation, including reverse engineering the closed-source libMuseSamplerCoreLib.so, and the fix. ...

April 5, 2026 · 5 min

Writing my first Neovim plugin

jujutsu.nvim This morning I got tired of context-switching and decided to do something about it. The result: my first Neovim plugin, written in Lua - jujutsu.nvim . A Bit of Background I recently migrated from Git to Jujutsu (jj), and honestly, it’s been a breath of fresh air. If you haven’t tried it, jj is a modern version control system that’s thoughtfully designed and surprisingly ergonomic once it clicks. The workflow shift was smooth, but there was one rough edge: I lost the nice integration and developer experience of my old Neovim setup. Previously I used lazygit.nvim, which pops open a floating terminal running the lazygit TUI right inside Neovim. It’s seamless - one keymap, full VCS access, dismiss and you’re back to your code. With jj, I found myself reaching for a separate terminal window, a tmux pane, or alt-tabbing to run jj commands or launch jjui. It worked, but for something that I do a dozen times a day it felt like unnecessary friction. ...

March 8, 2026 · 2 min

Conway's Game of Life in Zig: A Weekend Project

This weekend I built Conway’s Game of Life in Zig with two build targets: a native terminal application and a WebAssembly module powering a React frontend. What started as an excuse to write more Zig turned into an interesting exercise in designing shared code across very different runtime environments. The full source is available at https://github.com/doprz/zig_life Why Zig? I’ve been drawn to Zig for its explicit memory management, lack of hidden control flow, and first-class WASM support. Building a cellular automaton felt like the right level of complexity; simple enough to finish in a weekend, complex enough to exercise the language’s strengths. ...

January 10, 2026 · 10 min

Managing Multiple Git Configurations

If you’re like most developers, you probably work on multiple projects across different contexts. Maybe you contribute to open source projects with your personal email, work on company projects with your work email, and maintain client projects with yet another identity. Manually switching git configurations between projects is tedious and error-prone. Fortunately, Git has a powerful feature that solves this problem elegantly: conditional includes with includeIf. The Problem Consider this common scenario: You’ve just finished committing some personal project code, then switch to your work repository and make a commit. Hours later, you realize with horror that your personal email is now in your company’s git history. This can happen especially as development setups and projects increase in complexity over time. On-call all nighters don’t help either and it’s an easy mistake to make. ...

January 5, 2026 · 6 min

wlgif - A lightweight screen recorder for Wayland that captures regions as GIFs

Some of the best projects stem from real frustrations. I’ve personally struggled with creating small GIFs for project documentation on Wayland - no existing solution worked well. My workaround? Screen record with OBS, manually convert with ffmpeg. Time-consuming, janky, and frustrating. wlgif demo showcasing rs-cube and minecraft_tunnel So I built wlgif - a lightweight screen recorder for Wayland that captures regions as GIFs. What used to take several minutes now takes less than 10 seconds. ...

January 4, 2026 · 2 min

CVE-2025-55182 (React2Shell): Remote Code Execution in React Server Components (10.0 CRITICAL)

React Server Components introduced a powerful paradigm for building web applications—server-side logic that seamlessly integrates with client-side React. Unfortunately, a critical vulnerability in how React serializes and deserializes data between client and server has exposed applications to unauthenticated remote code execution. In this blog post, I’ll break down CVE-2025-55182 and demonstrate how an attacker can achieve arbitrary command execution on a vulnerable Next.js server. What’s Affected Any application using React Server Functions (commonly called Server Actions in Next.js) prior to the patch is vulnerable. This includes the majority of modern Next.js applications that use the "use server" directive. ...

December 9, 2025 · 4 min

Best Development Environment/Workflow

People often ask me: “What’s the best tech stack?” or “Why Neovim over VSCode?” The truth is, there’s no universal “best” - only what works best for you. My journey: Windows with Notepad++ → Sublime → VSCode (where I was comfortable for years) → Linux + Neovim(best decision I made). Then the real exploration began. I’ve tried Debian-based distros, RHEL/Fedora, CentOS/Rocky, Arch, Void, OpenSUSE, BSDs, macOS, and NixOS. Window managers and DEs: i3, awesomewm, bspwm, dwm, Hyprland, niri, GNOME, KDE, Cinnamon, MATE, XFCE. ...

December 1, 2025 · 2 min

Boost Your Productivity With These Essential Vim Keymaps

After years of modifying my Neovim configuration, I’ve settled on a set of keymaps that I simply can’t live without. These aren’t flashy or complex but they’re practical quality-of-life (qol) improvements that fix some of Vim’s rough edges and make daily editing smoother. Note: These keymaps are written in Lua. If you’re using Vim with vimscript, you can easily convert these using the equivalent nnoremap, inoremap, vnoremap, and xnoremap commands. ...

December 1, 2025 · 4 min