Dottler - Manage .env Files Across Git Worktrees
Manage .env files across Git worktrees with Dottler, a local Rust CLI that imports, stores, and dumps project environment variables without a server.
Recent content on Stonecharioteer on Tech
Manage .env files across Git worktrees with Dottler, a local Rust CLI that imports, stores, and dumps project environment variables without a server.
I wrote a small GitHub Action to catch broken Mermaid diagrams in Markdown and standalone diagram files before they land in a repository.
Why Tailscale SSH can log you in when OpenSSH would reject you: tailscaled, ACLs, root privileges, and Unix users.
On building Merrilin in the blind, choosing a hard problem with no promise of money and no light at the end of the tunnel
I never understood how traceroute discovers each hop. Turns out it's a clever TTL trick, and about 80 lines of Rust.
A practical deep dive into Tailscale exit nodes: route changes, traceroute evidence, DERP fallback, trust boundaries, and why this model can be free.
Syncing reading progress across devices sounds simple until you try it. Discovery, sync, and conflict resolution — with and without a cloud.
I've been using only Merrilin to read books since we built it, and I need things to improve constantly.
Your programming books deserve better than monospace blobs. Merrilin renders code beautifully in EPUBs and PDFs now.
I've made some updates to https://github.com/stonecharioteer/goforgo
We built Merrilin, an AI-powered reading app with spoiler-free book companions, live sync, and beautiful themes.
After using Linux for nearly 20 years, I've gotten an M5 Macbook Pro as my daily driver.
My process for learning Data Structures and Algorithms, with some segues into data visualization
I wanted to stop using IP addresses to access my homelab services, and I spent a Friday evening fixing that.
Curated collection of books, papers, and articles for learning distributed systems and performance engineering
Reflections on my career and where I want to go
How I built an application to merge KOReader highlights across devices and publish them.
A tiny Fish function I use at Chatwoot to remind myself which Git branches I touched in the last day.
A Pythonista opens `irb` and looks at all the symbols in Ruby. Or so the joke begins.
Sending a message about why you shouldn't write `for` loops in Ruby.
How to start really getting Ruby, especially blocks.
How does `return` work within blocks, procs and lambda?
How I started learning Ruby and Ruby on Rails in 2025 and what my experience has been like so far.
How I spent my week setting up multi-wan failover on OpenWRT on my Beelink EQI12
After years of living with Linux laptop quirks - battery surprises, broken suspend, useless gestures, and monitor chaos - I partnered with Claude to actually fix these problems instead of just accepting them as "the Linux experience."
Today I learned about watchexec, a cross-platform file watcher that replaced entr in my development workflow with better defaults and intuitive usage patterns for Hugo, Rust, and Go projects.
Using Coding Assistants frees me up to do other things
Small exercises to get you used to reading and writing Go code; Inspired by Rustlings
I finally managed to migrate all the tech content from my older blog(s). My blog went through 2 iterations before this, first using Jekyll and markdown, and then using Sphinx and RestructuredText. Today, I’m back on markdown, using Hugo. Thanks to GenAI, I’ve added admonitions to the PaperMod theme, and I’m able to modify the theme to do whatever I want with Hugo. I don’t…
My journey from XFCE to Qtile, a tiling window manager written entirely in Python, including setup, configuration strategies, and real-world config examples.
I built an interactive tutorial platform for learning internet fundamentals through RFCs, built with AI. Features popup glossary, diagrams, and Python code examples.
June 17, 2025 I was 17 when I failed school for the very first time. I was in the 11th grade and if I’d continued at that school, I’d have failed in 12th, which is a whole lot worse, apparently. I was studying at the Oxford Senior Secondary School (CBSE), and I’d done poorly on all my subjects that year. Primarily, Biotechnology, which was promised to be the “great big…
Why Protocol Buffers are superior to JSON for microservice communication. Much faster serialization/deserialization with practical Python examples.
These are a list of my favourites in tech, whether they’re podcasts, blogs, youtube videos, or books. Books Designing Data Intensive Applications - Martin Kleppmann Youtube Playlist of Lectures Database Internals - Alex Petrov (Also watch his talk - Link ) The Rust Programming Language - Carol Nichols and Steve Klabnik Learn Python the Hard Way - Zed A. Shaw (This book taught me how to code…
Comparing three methods to reverse lists in Python: slice notation, reversed(), and .reverse(). Includes performance benchmarks and readability considerations.
I get asked what devices I use (since I have a LOT of them). I wanted to document these at one place so that I answer this question a little deliberately. TLDR Devices Apple MacBook Pro (M5) laptop ASUS ROG Flow X13 (2022) laptop 2x Lenovo ThinkPad T14 Gen 2 Intel i5 laptops Beelink EQR5 Mini PC Beelink EQI12 Mini PC Apple iPad (A16) tablet White MoErgo Glove80 keyboard Logitech MX Ergo trackball…
Restructuring my website into subdomains with separate themes. Moving to Hugo and PaperMod theme for better content creation workflow.
I've left my role as Lead Software Developer at ChainSafe Systems in January 2025.
A simple solution using Zenity to create a confirmation dialog for screen locking in Cinnamon Desktop on Fedora 39.
Building effective teams by leveraging individual strengths instead of competing. Inspired by tactical video games where each member has specialized skills.
Building sustainable habits for coding interview preparation. Focus on systems over outcomes, consistent practice, and measuring the right metrics for long-term improvement.
My journey learning Rust over 145 days as my primary programming language, including gotchas, resources, and why I chose Rust over Golang.
How to implement retry logic for HTTP requests in Rust using reqwest and the again crate. Handling network failures, rate limiting, and JSON parsing errors with exponential backoff.
A career framework based on statistical quality control: Pay, People, Work - you can only have two good things at any job. Understanding when to join, stay, or leave a company.
An introduction to statistical quality control using control charts and Shewhart charts. Understanding process variation, control limits, and statistical manufacturing principles.
My journey learning Rust after 3 years of attempts, finally succeeding after 40 days and building a webservice at Merkle Science.
A comprehensive introduction to Rust for Python developers, covering why Rust matters, memory management, ownership, borrowing, and practical code examples.
How to use custom variable markers in Jinja templates to avoid conflicts with Apache Airflow or other template engines. Alternative approaches for nested templating scenarios.
TIL how to create fixed-length iterables in Python using collections.deque with maxlen parameter. Perfect for creating circular buffers and bounded collections.
Why good documentation means caring about your audience and stating the obvious. How assumption-free writing prevents confusion and creates better developer experiences.