RSSAmplifier

Blog

Raine Virta

Raine Virta's blog

raine.devRSS feed ↗20 posts

Latest posts

Giving an AI agent access to my online bank

I have recently been trying to automate my company's monthly bookkeeping with agents. I find it tedious and procrastinate on it for far too long. The biggest time sink is finding receipts from various services and one-off purchases, then attaching each one to the corresponding transaction in Holvi which I use as online bank. I collect receipts in an iCloud Drive folder. A yet-to-be-released macOS…

How to orchestrate large coding tasks without context bloat

I have lately been experimenting with an agentic workflow where one agent coordinates a large coding task, while short-lived worktree agents implement isolated phases in their own branches. A tmux session with phased-implement workflow running. Each tab in the sidebar on the left is a worktree agent. # The orchestration layer It uses workmux's primitives as the control plane for spinning off work…

Never leave the home row to navigate tmux panes

tmux's default pane navigation requires pressing your prefix key The key combo you press before a tmux command, e.g. Ctrl+b followed by an arrow key. If you switch panes dozens (or hundreds) of times a day, that means constantly moving your right hand away from its resting position to reach the arrow keys, then back again. It's a minor interruption each time, but these unnecessary hand movements…

Apple's new Icon Composer and why your Mac app icon is too big

After creating an icon for my Mac app with Icon Composer, I realized that it's way bigger than rest of the apps when browsing the Applications directory. For whatever reason, when archiving the app in Xcode, it didn't get the empty space around the icon, even though many sources on the Internet suggested it should work like that automatically. Some people were even suggesting you're supposed to…

Atomic commits for AI agents

These days I hardly write commit messages manually anymore. The agent, with all the context on the task, writes reasonably good commit messages in a fraction of the time I would. Where agents occasionally struggle, however, is atomic commits - commits that contain exactly one logical change. If at any point unrelated changes are introduced into the same file, not to mention within close proximity…

tmux tip: Add Obsidian notes to Claude Code context

When working with Claude Code , I often want to reference documents from my Obsidian vault. Using tmux-file-picker , you can bind a key to open a fuzzy finder in a popup, scoped to your vault's markdown files: .tmux.conf bind C-n display-popup -E "TMUX_FILE_PICKER_FD_FLAGS='-H --type f -e md' tmux-file-picker '/Users/raine/Library/Mobile Documents/iCloud~md~obsidian/Documents/raine'" The…

Dynamic tmux popup sizing across different displays

tmux's display-popup is hard to size when you switch between displays. Fixed character sizes are either too small on 4K or too large on a laptop. Percentages don't help either - 60% of a 4K monitor is massive. With some help, came up with a wrapper script that uses a fancy algorithm. popup = base × (screen / reference) ^ 0.5 You set your reference screen (the one you tune on) and base sizes for…

My setup, and why tmux workflow is better than ever

tmux, circa 2011. Over the years, tmux has become an essential part of my terminal-centric workflow. For many, tmux is merely a screen replacement to be used on remote servers, but for me it's closer to a tiling window manager for the terminal. Briefly, what I think makes tmux so useful: I work on many projects at a time, and recently, with many AI agents at a time. tmux allows isolating each…

Using git worktrees to parallelize AI coding

As a continuation of the earlier post that introduced workmux , here's a useful pattern for delegating tasks to worktree agents. # The workflow in a nutshell The workflow uses a main agent on the main branch to brainstorm and dispatch tasks, while worktree agents run in separate worktrees. Brainstorm tasks with the main agent Refine the items, by yourself or with the help of the agent Delegate…

Resolve merge conflicts with Claude Code

Merge conflicts are an unavoidable part of software development when working in a team, or even solo, especially when running multiple agents in parallel . Even if you do your best to organize work for agents so that parallel tasks don't touch the same area of the codebase, conflicts will invariably occur at some point. Fortunately, the agent you built the feature with can probably resolve the…

workmux: git worktrees + tmux for parallel AI agents

Recently, with AI-assisted coding gaining momentum, a long-standing and not that well-known git feature is finding new relevance. The feature is git worktrees , the ability to have multiple branches checked out simultaneously, each in its own directory. Running multiple agents in parallel is becoming increasingly common, and agents benefit from the isolation worktrees provide. If agents share the…

tmux tip: Add file paths to context with fzf in Claude Code

One of the killer features in tmux is the floating popup window. This enables all kinds of interesting workflows, because with a mapping of your choice, you can spawn any process in a floating window on top of your panes. This process will inherit the current pane's working directory, has all the tmux APIs etc. at its disposal, so all kinds of cool things are possible. Over a year ago, when I was…

My experience with Zola static site engine

I recently converted WalkingMate's website from plain HTML to use Zola which is a static site engine written in Rust. As the number of pages grew from just one, the lack of templating started to be a problem for development experience. Duplicating the navigation and footer in every page is annoying because they can start to diverge by accident. I chose Zola for no particular reason, but the fact…

Making Keychron K3 Pro behave like Apple Magic Keyboard

My keyboard setup lately has been that I use Apple Magic Keyboard for work on the Mac, and Keychron K3 Pro for gaming on the PC. Just recently, a key fell off from the Apple keyboard and it had to be sent in for a repair which will likely take at least 2 weeks. For this reason, I'm now trying to make the Keychron as similar to the Apple Keyboard as possible to reuse muscle memory. Previously, I've…

Connecting to a wireless network on Ubuntu Server 21.04 and Raspberry Pi 4

Problems solved here: Connecting to a wireless network on Ubuntu Server 21.04 and Raspberry Pi 4 Prefer 5 GHz WiFi when 2.4 GHz exists with the same SSID Add the wifi network configuration to /etc/netplan/50-cloud-init.yaml . Looks like this file is generated by netplan somehow and there's probably a better way but this persists through restarts so it's good enough for now. $ sudo vim…

Connect to Beats headphones from command-line

# !/usr/bin/env bash # Requirements: # - Add https://github.com/lapfelix/BluetoothConnector/ to $PATH mac = ` BluetoothDeviceConnector | grep ' Beats Studio³ ' | awk ' {print $1} ' ` BluetoothDeviceConnector $ mac

Switch browser tabs with scroll wheel in Mac OS X using Karabiner

I have a Kensington Slimblade trackball and wanted an accessible way to switch tabs if my left hand is resting around home row and the right hand is on the trackball. Hotkey Action ⌘ Scroll Wheel Up Switch to tab on the left ⌘ Scroll Wheel Down Switch to tab on the right Here's the configuration that needs to be added in Karabiner's private.xml : < item > < name > Scroll Wheel to Switch Tabs Back…

Tutorial to ramda-cli, a jq-like JSON processor for command-line

In this tutorial we'll use ramda-cli with GitHub's Repos API to get a list of @jeresig's most starred repos. ramda-cli is a command-line tool for processing JSON using functional pipelines. As the name suggests, its utility comes from Ramda and the wide array of functions it provides for operating on lists and collections of objects. It also employs LiveScript for its terse and powerful syntax. On…

Essential LiveScript for ramda-cli

LiveScript is a language that compiles into JavaScript. It allows for writing code with minimal boilerplate and is especially suitable for functional style. With ramda-cli , snippets of code are written directly on the command line: cat people.json | R ' filter (.name is /bob/i) ' ' pluck \name ' [ " Bobbie Huel " , " Bobby Ryan " , " Dr. Bobby Schiller " ] For this reason, LiveScript interface…

Parsing and rendering tori.fi categories with Acorn, archy and Ramda

Tori.fi , a Finnish online marketplace based on blocket.se , has a category selection input that dynamically reveals sub-categories as user selects them. It works like this: I was curious about the data structure beneath this widget and how it would look like if the categories were rendered into a tree-like format. The source lies in the file arrays_v2.js [gist] and contains all kinds of variables…