<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>pig-monkey.com - general</title><link href="https://pig-monkey.com/" rel="alternate"/><link href="https://pig-monkey.com/category/general/feed" rel="self"/><id>https://pig-monkey.com/</id><updated>2026-05-10T19:10:55.822765-07:00</updated><entry><title>Link Log 2026-05-10</title><link href="https://pig-monkey.com/2026/05/link-log-20260510/" rel="alternate"/><published>2026-05-10T00:00:00-07:00</published><updated>2026-05-10T19:10:55.822765-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-10:/2026/05/link-log-20260510/</id><content type="html">&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Default_mode_network"&gt;Default mode network&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ukiyo-e.org/"&gt;Japanese Woodblock Print Search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://daverupert.com/2026/04/claude-no/"&gt;I don&amp;rsquo;t want a screenshot of your Claude conversation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.cia.gov/resources/csi/static/Cultural-Topography.pdf"&gt;Cultural Topography: A New Research Tool for Intelligence Analysis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ews.kylemcdonald.net/"&gt;Apocalypse Early Warning System&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=g2nAZdSWp3s"&gt;Glory Box (Brass Against, 2025)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55262135706/in/dateposted/" title="Kaaba, Nine Inch Boyz"&gt;&lt;img src="https://live.staticflickr.com/65535/55262135706_5fbeaf5951_c.jpg" width="800" height="600" alt="Kaaba, Nine Inch Boyz"/&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="general"/><category term="links"/></entry><entry><title>Zebra Magnetics</title><link href="https://pig-monkey.com/2026/05/zebra-magnetics/" rel="alternate"/><published>2026-05-09T00:00:00-07:00</published><updated>2026-05-09T18:31:00.413847-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-09:/2026/05/zebra-magnetics/</id><summary type="html">&lt;p&gt;As &lt;a href="/2025/02/window-film-flood/"&gt;mentioned previously&lt;/a&gt;, two years ago I bought a &lt;a href="https://www.zebralight.com/H600c-Mk-IV-18650-XHP502-4000K-High-CRI-Headlamp_p_235.html"&gt;ZebraLight H600c Mk IV&lt;/a&gt; headlamp. When I was ordering the light, &lt;a href="https://old.reddit.com/r/flashlight/comments/hktb36/psa_adding_a_tailcap_magnet_to_a_zebralight/"&gt;The Internet also suggested that I buy magnets for it&lt;/a&gt;. Reader, I did.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55260086879/in/dateposted/" title="ZebraLight H600c Mk IV: Tail Cap Magnet"&gt;&lt;img src="https://live.staticflickr.com/65535/55260086879_bc75ab186d_c.jpg" width="800" height="533" alt="ZebraLight H600c Mk IV: Tail Cap Magnet"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From K&amp;amp;J Magnetics I bought the &lt;a href="https://www.kjmagnetics.com/d82-n52-neodymium-disc-magnet"&gt;D82-N52&lt;/a&gt;. This is a 1/2&amp;rdquo; x 1/8&amp;rdquo; N52 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As &lt;a href="/2025/02/window-film-flood/"&gt;mentioned previously&lt;/a&gt;, two years ago I bought a &lt;a href="https://www.zebralight.com/H600c-Mk-IV-18650-XHP502-4000K-High-CRI-Headlamp_p_235.html"&gt;ZebraLight H600c Mk IV&lt;/a&gt; headlamp. When I was ordering the light, &lt;a href="https://old.reddit.com/r/flashlight/comments/hktb36/psa_adding_a_tailcap_magnet_to_a_zebralight/"&gt;The Internet also suggested that I buy magnets for it&lt;/a&gt;. Reader, I did.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55260086879/in/dateposted/" title="ZebraLight H600c Mk IV: Tail Cap Magnet"&gt;&lt;img src="https://live.staticflickr.com/65535/55260086879_bc75ab186d_c.jpg" width="800" height="533" alt="ZebraLight H600c Mk IV: Tail Cap Magnet"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From K&amp;amp;J Magnetics I bought the &lt;a href="https://www.kjmagnetics.com/d82-n52-neodymium-disc-magnet"&gt;D82-N52&lt;/a&gt;. This is a 1/2&amp;rdquo; x 1/8&amp;rdquo; N52 neodymium disc magnet. It can be slid inside the spring of the tail cap. It does not interfere with the function of the cap. The flat top 18650 still fits, and the cap still screws on all the way.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55258955562/in/dateposted/" title="ZebraLight H600c Mk IV: Tail Cap Magnet"&gt;&lt;img src="https://live.staticflickr.com/65535/55258955562_a0ba4e482e_c.jpg" width="800" height="533" alt="ZebraLight H600c Mk IV: Tail Cap Magnet"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also bought the &lt;a href="https://www.kjmagnetics.com/bx842-neodymium-block-magnet"&gt;BX842&lt;/a&gt;. This is a 1 1/2&amp;rdquo; x 1/4&amp;rdquo; x 1/8&amp;rdquo; N42 neodymium block magnet. It can be attached to the pocket clip, and then secured with heat-shrink tubing.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55259991258/in/dateposted/" title="ZebraLight H600c Mk IV: Pocket Clip Magnet"&gt;&lt;img src="https://live.staticflickr.com/65535/55259991258_a238ca333e_c.jpg" width="800" height="533" alt="ZebraLight H600c Mk IV: Pocket Clip Magnet"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I installed these magnets as soon as I got the light. I haven&amp;rsquo;t regretted it. The only minor annoyance is that when I ride to the beach and set my helmet down in the sand, the pocket clip magnet collects all the iron in the sand. I don&amp;rsquo;t like sand. It&amp;rsquo;s coarse and rough and irritating and it gets everywhere.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55260256785/in/dateposted/" title="ZebraLight H600c Mk IV: Helmet Mount"&gt;&lt;img src="https://live.staticflickr.com/65535/55260256785_bf552205ca_c.jpg" width="800" height="533" alt="ZebraLight H600c Mk IV: Helmet Mount"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While the H600c is primarily a headlamp, I do occasionally carry it in my pocket, and I&amp;rsquo;ve yet to be annoyed by the magnets. If it was a dedicated pocket light, perhaps I&amp;rsquo;d feel differently.&lt;/p&gt;</content><category term="general"/><category term="gear"/><category term="edc"/></entry><entry><title>Restic Continuum</title><link href="https://pig-monkey.com/2026/05/restic-continuum/" rel="alternate"/><published>2026-05-08T00:00:00-07:00</published><updated>2026-05-08T08:30:19.519307-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-08:/2026/05/restic-continuum/</id><summary type="html">&lt;p&gt;As I was &lt;a href="/2026/05/restic-adoption/"&gt;migrating my online backups to Restic&lt;/a&gt;, I was concurrently building a system that would allow me to use &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt; to complete full-disk backups to external USB drives, thus replacing my use of &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; and &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. I give you &lt;a href="https://github.com/pigmonkey/resnap"&gt;Resnap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, the main appeal of rsnapshot has …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I was &lt;a href="/2026/05/restic-adoption/"&gt;migrating my online backups to Restic&lt;/a&gt;, I was concurrently building a system that would allow me to use &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt; to complete full-disk backups to external USB drives, thus replacing my use of &lt;a href="https://github.com/pigmonkey/cryptshot"&gt;cryptshot&lt;/a&gt; and &lt;a href="https://rsnapshot.org/"&gt;rsnapshot&lt;/a&gt;. I give you &lt;a href="https://github.com/pigmonkey/resnap"&gt;Resnap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, the main appeal of rsnapshot has always been that the resulting backups are just directories full of files. When it comes time to restore, no special tooling is required for access. Just copy the files over using &lt;code&gt;rsync&lt;/code&gt; or &lt;code&gt;cp&lt;/code&gt; or whatever tickles your fancy. If you can read the disk, you can recover data. Most competing systems create backups in a way that you also need the backup tool for recovery. This introduces fragility into the setup. My experience has been that most people do not think or care about this, but I have spent many years thinking about how not to lose data. I have certain requirements for backup systems. &amp;ldquo;Robustness&amp;rdquo; is a big one.&lt;/p&gt;
&lt;p&gt;Restic does fall into the second category of tool. If you have a copy of a Restic repository but the Restic project has imploded and you do not have or cannot execute the tool, you&amp;rsquo;re in for a bad time. But the reason Restic has been on my radar since the project first stated a decade ago (it takes me a while to adopt new backup software &amp;ndash; also I recall it took them a while to implement compression) is that it is compiled to a single, statically linked Go binary. This means you can easily store the tool itself alongside (not within) your backups. You&amp;rsquo;re not going to do that with a sprawling Python project like &lt;a href="https://www.borgbackup.org/"&gt;Borg&lt;/a&gt;, which is why I continued to use rsnapshot for my local full-disk backups even after I adopted Borg for online backups.&lt;/p&gt;
&lt;p&gt;But with Restic you can just &lt;code&gt;cp&lt;/code&gt; the binary to the backup drive. &lt;a href="https://github.com/pigmonkey/resnap/blob/380caaea8a35224a26ac5f20a3bd2cf8a95afb56/resnap#L112"&gt;And that&amp;rsquo;s what I do&lt;/a&gt;. Resnap also provides &lt;a href="https://github.com/pigmonkey/resnap/blob/master/resnap-restore"&gt;&lt;code&gt;resnap-restore&lt;/code&gt;&lt;/a&gt;, a simple wrapper script that makes it easy to perform the &lt;code&gt;restic restore ...&lt;/code&gt; operation during full-disk recovery. This too is stored on the backup drive alongside the binary.&lt;/p&gt;
&lt;p&gt;What this means is that you can use Resnap to create a full-disk backup to an external drive and then bury that drive in your backyard for 25 years (properly sealed). After you dig it up, as long as you have the passphrase, can read the drive&amp;rsquo;s filesystem (ext4 for me), and can execute a binary compiled for whatever architecture you were using 25 years ago (x86-64 for me) &amp;ndash; both highly likely given the commonality of those systems &amp;ndash; you are going to have no problem restoring that data (subject to the physics of spinning rust). An unlikely scenario perhaps, but that&amp;rsquo;s sort of the data backup baseline we plan for here at pig-monkey.com.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>I would have to relinquish my Street Samurai credentials if I didn't occasionally wear tabi booties.</title><link href="https://pig-monkey.com/2026/05/tabi-booties/" rel="alternate"/><published>2026-05-07T00:00:00-07:00</published><updated>2026-05-07T18:05:44.802587-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-07:/2026/05/tabi-booties/</id><content type="html">&lt;p&gt;&lt;a href="https://bedrocksandals.com/collections/all-cairn-sandal-models"&gt;Bedrock Cairns&lt;/a&gt; and &lt;a href="https://lunasandals.com/products/luna-tabu-2-0"&gt;Luna Tabu 2.0&lt;/a&gt;. Paired with &lt;a href="/2026/05/rudy-mirrorshades/"&gt;the mirrorshades&lt;/a&gt;, I am led to understand that this is what The Youth refer to as a &amp;ldquo;fit&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55256291760/in/dateposted/" title="Tabi Booties"&gt;&lt;img src="https://live.staticflickr.com/65535/55256291760_85ba4b5b25_c.jpg" width="800" height="533" alt="Tabi Booties"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a &lt;a href="https://en.wikipedia.org/wiki/Molly_Millions"&gt;wise woman&lt;/a&gt; once said, &amp;ldquo;You can&amp;rsquo;t let the little pricks generation-gap you.&amp;rdquo;&lt;/p&gt;</content><category term="general"/><category term="micro"/></entry><entry><title>Restic Adoption</title><link href="https://pig-monkey.com/2026/05/restic-adoption/" rel="alternate"/><published>2026-05-06T00:00:00-07:00</published><updated>2026-05-06T08:26:42.653975-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-06:/2026/05/restic-adoption/</id><summary type="html">&lt;p&gt;After mulling it over for many cycles, I finally decided to migrate my online backups to &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt;. As is my wont, I have published my solution as &lt;a href="https://github.com/pigmonkey/restash/"&gt;Restash&lt;/a&gt; so that members of the Pig Monkey Data Backups Fan Club can be like me.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash"&gt;&lt;code&gt;restash&lt;/code&gt; script&lt;/a&gt; will look pretty familiar …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After mulling it over for many cycles, I finally decided to migrate my online backups to &lt;a href="https://restic.net/"&gt;Restic&lt;/a&gt;. As is my wont, I have published my solution as &lt;a href="https://github.com/pigmonkey/restash/"&gt;Restash&lt;/a&gt; so that members of the Pig Monkey Data Backups Fan Club can be like me.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash"&gt;&lt;code&gt;restash&lt;/code&gt; script&lt;/a&gt; will look pretty familiar to anyone who has been using my old &lt;a href="/2017/07/borg/"&gt;Borg wrapper script&lt;/a&gt;. It is mostly the same basic structure, with Borg logic replaced with Restic logic, and two other significant differences.&lt;/p&gt;
&lt;p&gt;Previously I ran the Borg wrapper hourly via a systemd timer, and used &lt;a href="https://github.com/pigmonkey/backitup"&gt;backitup&lt;/a&gt; to run the verification checks (and &lt;a href="/2024/07/borg-compact/"&gt;compacting&lt;/a&gt;) less frequently. Now the script has subcommands, and I use different systemd units to call the different functions on different schedules &amp;ndash; backups more frequently, verification and pruning less frequently.&lt;/p&gt;
&lt;p&gt;Previously I achieved redundancy by using Borg to backup hourly to my &lt;a href="https://www.rsync.net/products/borg.html"&gt;rsync.net&lt;/a&gt; account, while &lt;a href="https://www.tarsnap.com/"&gt;Tarsnap&lt;/a&gt; ran daily backups of a smaller subset of the same data. Now I&amp;rsquo;m using Restic to backup hourly to my &lt;a href="https://www.rsync.net/products/restic.html"&gt;rsync.net&lt;/a&gt; account, and also using Restic to backup the same data daily to a &lt;a href="https://www.backblaze.com/cloud-storage"&gt;Backblaze B2&lt;/a&gt; bucket. I&amp;rsquo;ve been an rsync.net customer since 2014 and I think highly of their service, but the B2 bucket is cheap insurance that helps me &lt;a href="/2018/11/sleep/"&gt;sleep&lt;/a&gt; better.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://github.com/pigmonkey/restash/blob/master/restash.conf.example"&gt;the example config&lt;/a&gt; you will see that the &lt;code&gt;SFTP_HOST&lt;/code&gt; is simply &lt;code&gt;restic&lt;/code&gt;. That refers to an entry in my &lt;code&gt;~/.ssh/config&lt;/code&gt;, which looks something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Host restic
    Hostname abc123.rsync.net
    User abc123
    IdentityFile ~/.ssh/passphraseless-key
    IdentitiesOnly yes
    BatchMode yes
    ServerAliveInterval 60
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The only other significant change from the old Borg wrapper script is that I broke out some of the config options, backup targets, and excludes to separate files to make it easier for you, my adoring public, to reuse the tool.&lt;/p&gt;
&lt;p&gt;As hinted at in the README, I still use &lt;a href="https://github.com/pigmonkey/nmtrust"&gt;nmtrust&lt;/a&gt; to only execute backups on trusted networks. Don&amp;rsquo;t be a data litterer.&lt;/p&gt;</content><category term="general"/><category term="backups"/><category term="linux"/></entry><entry><title>Rudy Mirrorshades</title><link href="https://pig-monkey.com/2026/05/rudy-mirrorshades/" rel="alternate"/><published>2026-05-05T00:00:00-07:00</published><updated>2026-05-05T18:23:03.411103-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-05:/2026/05/rudy-mirrorshades/</id><summary type="html">&lt;p&gt;I find it useful to periodically review certain practices, in order to determine when I am doing something out of rote habit rather than intention. In that vein, a couple weeks ago I took the &lt;a href="/2018/11/laser-red/"&gt;photochromic laser red lenses&lt;/a&gt; out of my &lt;a href="/2016/08/rudy/"&gt;Rudy Rydon&lt;/a&gt; spectacles that I&amp;rsquo;ve been rocking …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I find it useful to periodically review certain practices, in order to determine when I am doing something out of rote habit rather than intention. In that vein, a couple weeks ago I took the &lt;a href="/2018/11/laser-red/"&gt;photochromic laser red lenses&lt;/a&gt; out of my &lt;a href="/2016/08/rudy/"&gt;Rudy Rydon&lt;/a&gt; spectacles that I&amp;rsquo;ve been rocking since 2011. In their place I inserted the &lt;a href="https://www.rudyprojectna.com/products/rydon-replacement-lenses?variant=52214913728877"&gt;Stealth ImpactX Photochromic 2 Black&lt;/a&gt; lenses that came with the Z87 Rydons.&lt;/p&gt;
&lt;p&gt;The difference was immediate. Black (or grey) tinted lenses pretty much suck. They dim the day-star, but make everything look flat. Contrast disappears. Terrain becomes muted. This has significant practical disadvantages when you are out and about in the world. I had forgotten how much the red lenses were levelling up my capabilities by enhancing my visual acuity. Most of the time I&amp;rsquo;ve spent out-of-doors for the past 8 eight years has been spent wearing said red lenses, so to me this was not an augmented enhancement but instead was just the way the world looked.&lt;/p&gt;
&lt;p&gt;The alternative lenses I always carry in my bag are the &lt;a href="https://www.rudyprojectna.com/products/rydon-replacement-lenses?variant=31523924443201"&gt;Polar 3FX Brown Laser&lt;/a&gt; (for environments where I want lenses that are polarized and/or darker &amp;ndash; water and snow being the primary applications) but, like red, the brown tint also increases contrast. I do sometimes still wear the &lt;a href="/2024/07/micropore-refresh/"&gt;Micropores&lt;/a&gt;, but guess what tint those lenses have. Brown.&lt;/p&gt;
&lt;p&gt;Still, I forced myself to wear the black (or grey) lenses for a week. I wanted to see if my opinion would change after I got used to them. Reader, it did not. But I did find myself wondering how much the &amp;ldquo;laser&amp;rdquo; treatment contributes to contrast. I had a coupon with Rudy, so I ordered the &lt;a href="https://www.rudyprojectna.com/products/rydon-replacement-lenses?variant=31523924115521"&gt;ImpactX Photochromic 2 Laser Black&lt;/a&gt; lenses. These have the same black (or grey) tint as the ones I was using, but with the laser treatment.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been wearing those lenses the past few days now, and they actually do seem better. I&amp;rsquo;m not constantly thinking about how flat everything looks, and I can see potholes and such. They certainly remain inferior to the contrast provided by red (or brown) lenses. Basically they make everyday look kind of gloomy and overcast, even when it isn&amp;rsquo;t. On the other hand, the silver mirrorshade effect does look bitchin&amp;rsquo; &amp;ndash; and that counts for something &amp;ndash; but that&amp;rsquo;s likely the only reason to wear them. I think the bottom line is that if you&amp;rsquo;re wearing black (or grey) tinted lenses, you are leaving capability on the table.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55251891663/in/dateposted/" title="Rudy Rydon ImpactX2 Laser Black"&gt;&lt;img src="https://live.staticflickr.com/65535/55251891663_d1209f9526_c.jpg" width="800" height="533" alt="Rudy Rydon ImpactX2 Laser Black"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55251893388/in/dateposted/" title="Rudy Rydon ImpactX2 Laser Black: Rear"&gt;&lt;img src="https://live.staticflickr.com/65535/55251893388_629c41e612_c.jpg" width="800" height="533" alt="Rudy Rydon ImpactX2 Laser Black: Rear"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If my karma is to be reincarnated as a razorgirl, the photochromic laser red lenses are probably what I&amp;rsquo;ll get surgically implanted.&lt;/p&gt;</content><category term="general"/><category term="gear"/><category term="eyewear"/></entry><entry><title>Rohloff Gearing</title><link href="https://pig-monkey.com/2026/05/rohloff-gearing/" rel="alternate"/><published>2026-05-04T00:00:00-07:00</published><updated>2026-05-04T18:46:42.229386-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-05-04:/2026/05/rohloff-gearing/</id><summary type="html">&lt;p&gt;When I &lt;a href="/2024/04/expanding-fleet/"&gt;had my Rohloff bike built&lt;/a&gt;, I was not initially sure what gearing to go with. In the rear I chose the 16-tooth sprocket, as that seemed pretty standard. On the front I decided to start with a 42-tooth chainring. With my 170mm cranks and 26x1.9&amp;rdquo; wheels, that …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When I &lt;a href="/2024/04/expanding-fleet/"&gt;had my Rohloff bike built&lt;/a&gt;, I was not initially sure what gearing to go with. In the rear I chose the 16-tooth sprocket, as that seemed pretty standard. On the front I decided to start with a 42-tooth chainring. With my 170mm cranks and 26x1.9&amp;rdquo; wheels, that gave me a range of 18.9 to 99.2 gear inches, or a &lt;a href="https://www.sheldonbrown.com/gain.html"&gt;gain ratio&lt;/a&gt; of 1.4 to 7.4.&lt;/p&gt;
&lt;p&gt;On my derailleur bike, the setup that I&amp;rsquo;ve been running since 2018 gives me a range of 21.9 to 117.8 gear inches, or a gain ratio of 1.6 to 8.8. I had done plenty of touring on that and felt pretty good about it. So something similar, but a hair lower, seemed like a good place to start with the Rohloff build.&lt;/p&gt;
&lt;p&gt;Since then I&amp;rsquo;ve done a couple big tours with the Rohloff, and plenty of smaller escapades. I sometimes found myself getting down to the low gears more than I thought I ought to, which made me think that I probably should slap on a smaller chainring. Last month I finally got around to doing so.&lt;/p&gt;
&lt;p&gt;36 and 38 tooth chainrings both seem to be common for Rohloff touring builds with 16-tooth sprockets. I had one of Rivendell&amp;rsquo;s &lt;a href="https://www.rivbike.com/products/silver-chainrings"&gt;Silver 38-tooth chainrings&lt;/a&gt; in my spare parts bin, so that&amp;rsquo;s what I went with. (If I was buying a new chainring I would probably try out the &lt;a href="https://surlybikes.com/products/stainless-steel-5-bolt-chainring?variant=42162729910295"&gt;Surly Stainless Chainring&lt;/a&gt;.) This gives me a range of 17.1 to 89.7 gear inches, or a gain ratio of 1.3 to 6.7 &amp;ndash; dropping my low-end about 1&amp;rdquo; lower. While I have yet to do any loaded touring with it, I&amp;rsquo;ve been enjoying the new gearing while tooling around town and ripping up the local dirt on weekends. There is some significant mountain touring in my near-future that will let me give this a proper trial, but so far I think this was the right call.&lt;/p&gt;
&lt;p&gt;Swapping chainrings was super easy thanks to the &lt;a href="https://rodbikes.com/bushnell-ebb/"&gt;Bushnell Eccentric Bottom Bracket&lt;/a&gt;. I&amp;rsquo;m still using the same &lt;a href="https://connexchain.com/en/bike-chains/detail/connex-808"&gt;Wippermann Connex 808&lt;/a&gt; chain.&lt;/p&gt;
&lt;p&gt;Over in Jolly Old England, the &lt;a href="https://thorncycles.co.uk/"&gt;Thorn&lt;/a&gt; people &lt;a href="https://www.sjscycles.com/thornpdf/ThornLivingWithARohloff.pdf"&gt;advocate for 19-tooth sprockets&lt;/a&gt;. They argue that the larger diameter means that the chain doesn&amp;rsquo;t have to make such a tight bend, which makes for less opportunity for dirt to get inside the plates, thus leading to longer chain life, which in turn leads to longer sprocket life. That makes sense to me, and someday when my 16-tooth sprocket needs replacing I may try a 19-tooth. In that case I&amp;rsquo;d probably put the 42-tooth chainring back on, which would keep me in the same gearing neighborhood as what I currently have with the 38x16.&lt;/p&gt;</content><category term="general"/><category term="bicycle"/></entry><entry><title>Link Log 2026-04-24</title><link href="https://pig-monkey.com/2026/04/link-log-20260424/" rel="alternate"/><published>2026-04-24T00:00:00-07:00</published><updated>2026-04-24T21:19:50.274706-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-04-24:/2026/04/link-log-20260424/</id><content type="html">&lt;p&gt;&lt;a href="https://github.com/mpv-player/mpv/commit/1e70e82baa9193f6f027338b0fab0f5078971fbe"&gt;stream_libarchive: workaround various types of locale braindeath&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.davidabram.dev/musings/the-machine-didnt-take-your-craft/"&gt;The machine didn&amp;rsquo;t take your craft. You gave it up.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://library.osu.edu/site/copyright/2026/02/06/artificial-intelligence-and-the-public-domain/"&gt;Artificial Intelligence and the Public Domain&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.mkgandhi.org/nonviolence/phil8.php"&gt;Between Cowardice and Violence&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://citadeloutpost.substack.com/p/greco-futurism-long-post"&gt;Greco-futurism long post&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=fluSgAKaUnk"&gt;Apostate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55228928483/in/dateposted/" title="Marin Spin"&gt;&lt;img src="https://live.staticflickr.com/65535/55228928483_c15d44d6c8_c.jpg" width="800" height="600" alt="Marin Spin"/&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="general"/><category term="links"/></entry><entry><title>Make VMs Great Again</title><link href="https://pig-monkey.com/2026/04/make-vms-great-again/" rel="alternate"/><published>2026-04-19T00:00:00-07:00</published><updated>2026-04-19T16:56:20.414332-07:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-04-19:/2026/04/make-vms-great-again/</id><summary type="html">&lt;p&gt;I have trust issues.&lt;/p&gt;
&lt;p&gt;When &lt;a href="https://claude.com/product/claude-code"&gt;Claude Code&lt;/a&gt; was released last year I was interested in playing with it, but struggled to find a way to run it in a secure, isolated manner. Trusting &lt;a href="https://code.claude.com/docs/en/sandboxing"&gt;its own sandbox&lt;/a&gt; was obviously not in the cards. I explored other people&amp;rsquo;s solutions &amp;ndash; mostly using …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have trust issues.&lt;/p&gt;
&lt;p&gt;When &lt;a href="https://claude.com/product/claude-code"&gt;Claude Code&lt;/a&gt; was released last year I was interested in playing with it, but struggled to find a way to run it in a secure, isolated manner. Trusting &lt;a href="https://code.claude.com/docs/en/sandboxing"&gt;its own sandbox&lt;/a&gt; was obviously not in the cards. I explored other people&amp;rsquo;s solutions &amp;ndash; mostly using things like &lt;a href="https://github.com/containers/bubblewrap"&gt;Bubblewrap&lt;/a&gt; and &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; &amp;ndash; but none of them fully satisfied me. It also quickly became evident that most of the value from using Claude Code comes from the &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; argument, which gives it the ability to pursue a targeted task without constant permission requests. This requires even stricter isolation.&lt;/p&gt;
&lt;p&gt;Eventually I landed on a full virtual machine being the only viable option. I reinstalled &lt;a href="https://developer.hashicorp.com/vagrant"&gt;Vagrant&lt;/a&gt; for the first time in almost a decade and was off to the races.&lt;/p&gt;
&lt;p&gt;I was a heavy user of Vagrant in the twenty-teens. I still really like the interface. But when revisiting it today the software felt rather heavy and clunky. It defaults to using &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, which has its own set of issues. There is a &lt;a href="https://github.com/vagrant-libvirt/vagrant-libvirt"&gt;community provided libvirt plugin&lt;/a&gt;, but that seems largely abandoned. &amp;ldquo;Abandoned&amp;rdquo; seems to be the word for most of the Vagrant community &amp;ndash; probably caused in part by the &lt;a href="https://www.theregister.com/2023/08/11/hashicorp_bsl_licence/"&gt;license change&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So for the past month I&amp;rsquo;ve been building &lt;a href="https://github.com/pigmonkey/migrant"&gt;Migrant&lt;/a&gt;, a lightweight VM management tool for running assumed-malicious AI agents in ephemeral environments. The heavy lifting is done by &lt;a href="https://libvirt.org/"&gt;libvirt&lt;/a&gt; and &lt;a href="https://www.qemu.org/"&gt;QEMU&lt;/a&gt;. Migrant started out as just a way to get a more Vagrant-like interface with modern tooling. I use &lt;a href="https://cloud-init.io/"&gt;cloud-init&lt;/a&gt; to initialize the image, &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; to configure it, and libvirt for the VM management. But because the whole &lt;em&gt;raison d&amp;rsquo;être&lt;/em&gt; of the project is the fact that non-deterministic systems are inherently untrustworthy, Migrant expanded to have a suite of security features. It has network isolation, so the agent can&amp;rsquo;t compromise the rest of your LAN. It has shared folder isolation, so that the agent can&amp;rsquo;t exhaust the host disk or engage in any symlink traversal shenanigans. It has &lt;a href="https://www.wireguard.com/"&gt;WireGuard&lt;/a&gt; tunnel support, implemented host-side such that the VM cannot bypass it (because why wouldn&amp;rsquo;t you want to run all your agents through &lt;a href="https://mullvad.net/en"&gt;Mullvad&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s pretty great. I use it regularly.&lt;/p&gt;
&lt;p&gt;Migrant also serves as my testament as to how agentic coding should work. I&amp;rsquo;ve written it using Claude Code (initially running in a Vagrant-managed VM, but since the first public commit I&amp;rsquo;ve been building Migrant-in-Migrant), but it is the antithesis of &amp;ldquo;vibe coding&amp;rdquo;. I design the systems. I tell the agent how things should work. I review every line of code it produces. Most of the time I reject its first attempts. I take ownership of and responsibility for commits. The result, I think, is a pretty reasonable looking codebase.&lt;/p&gt;
&lt;p&gt;My conclusion thus far is that coding agents are useful tools. They&amp;rsquo;re an accelerant. They&amp;rsquo;re great for exploring a problem space. There&amp;rsquo;s no going back to software development without them, but if they&amp;rsquo;re not being actively driven by an opinionated human with domain-knowledge and expertise, what they produce is mostly crap. Maybe that will change the future. For now, if you&amp;rsquo;re not challenging every line of output from the clankers, you&amp;rsquo;re doing it wrong. I suspect this applies equally to the application of LLMs in other areas, but personally I haven&amp;rsquo;t found LLMs to be useful for anything other than writing code.&lt;/p&gt;</content><category term="general"/><category term="toolchain"/><category term="linux"/><category term="shell"/><category term="llm"/></entry><entry><title>Link Log 2026-03-05</title><link href="https://pig-monkey.com/2026/03/link-log-20260305/" rel="alternate"/><published>2026-03-05T00:00:00-08:00</published><updated>2026-03-05T20:09:16.701207-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-03-05:/2026/03/link-log-20260305/</id><summary type="html">&lt;p&gt;&lt;a href="https://andykirkpatrick.substack.com/p/death-to-trust"&gt;Death to Trust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://om.co/2026/01/16/our-algorithmic-grey-beige-world/"&gt;Our Algorithmic Grey-Beige World&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/"&gt;The Slow Death of the Power User&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.dedoimedo.com/computers/plasma-6-4-performance-wayland-x11-power-cpu-kernel.html"&gt;Plasma 6.4 Wayland vs X11, processor and power benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20221110180414/https://minds.wisconsin.edu/bitstream/handle/1793/78760/ChracaSteven.pdf"&gt;Improving Visual Processing During Deadly Force Encounters and Recommendations for Office&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sciencedirect.com/science/article/pii/S0001457523004657"&gt;The effect of rear bicycle light configurations on drivers&amp;rsquo; perception of cyclists&amp;rsquo; presence and proximity …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://andykirkpatrick.substack.com/p/death-to-trust"&gt;Death to Trust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://om.co/2026/01/16/our-algorithmic-grey-beige-world/"&gt;Our Algorithmic Grey-Beige World&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/"&gt;The Slow Death of the Power User&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.dedoimedo.com/computers/plasma-6-4-performance-wayland-x11-power-cpu-kernel.html"&gt;Plasma 6.4 Wayland vs X11, processor and power benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20221110180414/https://minds.wisconsin.edu/bitstream/handle/1793/78760/ChracaSteven.pdf"&gt;Improving Visual Processing During Deadly Force Encounters and Recommendations for Office&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.sciencedirect.com/science/article/pii/S0001457523004657"&gt;The effect of rear bicycle light configurations on drivers&amp;rsquo; perception of cyclists&amp;rsquo; presence and proximity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Cu4VGOi4188"&gt;LoFi Festival x Echo World (Elijah Nang, 2023)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55130551307/in/dateposted/" title="Point Bonita"&gt;&lt;img src="https://live.staticflickr.com/65535/55130551307_28eeaeeb16_c.jpg" width="800" height="600" alt="Point Bonita"/&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="general"/><category term="links"/></entry><entry><title>Tracking Investments with Ledger</title><link href="https://pig-monkey.com/2026/02/ledger-investments/" rel="alternate"/><published>2026-02-12T00:00:00-08:00</published><updated>2026-02-12T20:37:00.781351-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-02-12:/2026/02/ledger-investments/</id><summary type="html">&lt;p&gt;I have a few investment accounts I track with &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt;. Ledger has &lt;a href="https://ledger-cli.org/doc/ledger3.html#Currency-and-Commodities"&gt;ways of tracking commodities&lt;/a&gt; that are too complex for me. My investments are index funds of different flavors. I neither know nor care to know what individual components they consist of. They mostly manage themselves. I do want …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have a few investment accounts I track with &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt;. Ledger has &lt;a href="https://ledger-cli.org/doc/ledger3.html#Currency-and-Commodities"&gt;ways of tracking commodities&lt;/a&gt; that are too complex for me. My investments are index funds of different flavors. I neither know nor care to know what individual components they consist of. They mostly manage themselves. I do want to know their balance, but I do not care to think about them more than a few times per year, so the up-to-date-ness factor can be pretty low (which is the complete opposite of everything else that I track in Ledger).&lt;/p&gt;
&lt;p&gt;I represent these things in Ledger using an asset account for the fund, with subaccounts for contributions, earnings, and fees.&lt;/p&gt;
&lt;p&gt;Contributions into the accounts are entered as soon as they happen, since those contributions are being debited out of an account where the up-to-date-ness factor is critical. So a transfer from my bank account to my Roth IRA may look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;Cont&lt;/span&gt;&lt;span class="n"&gt;ributions&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Earnings and fees are tracked, but I only make those entries about once per quarter. However, the investment companies provide monthly statements. That level of granularity can be useful to have stored. So when I perform my quarterly updates, I&amp;rsquo;ll download each of the monthly statements from the past quarter and use them to make three sets of entries &amp;ndash; two per month for the three months in the quarter. For example, in January 2026 I might make entries for the 2025 Q4 activity such as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;79.05&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Income&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;

&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1.05&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;

&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;103.25&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Income&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;

&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;2.20&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;

&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;13.82&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Income&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Earnings&lt;/span&gt;

&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Investment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1.31&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Invest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;RothIRA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Fees&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Before making the first entry, I will ask Ledger for the balance of &lt;code&gt;Assets:Invest:RothIRA&lt;/code&gt; as of 2025-10-01 and confirm that the value matches the October statement&amp;rsquo;s opening balance. I will then read the total earnings and fees from the October statement and make the two October entries in my journal. Then I ask Ledger for the balance of the account as of 2025-10-31 and make sure the reported value matches the statement&amp;rsquo;s closing balance. Rinse and repeat for the next two months. I can ignore any contributions mentioned on the statement because those entries were already entered in my journal whenever I made the contribution.&lt;/p&gt;
&lt;p&gt;These transactions are marked as cleared with the &lt;code&gt;*&lt;/code&gt; symbol as I write the entry because the data comes direct from the statement of past activity. There is no separate &lt;a href="/2020/08/reconciling-ledger/"&gt;reconciliation process&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The PDF statements themselves then get stored, but (unlike &lt;a href="/2020/08/receipts-ledger/"&gt;receipts, invoices, and checks&lt;/a&gt;) that happens in a different repository.&lt;/p&gt;
&lt;p&gt;Doing things this way allows me to query for the value of the accounts (as of the last quarter or so), have some idea of how they are performing, and keep track of fees. I don&amp;rsquo;t really care to know any more details than this, nor do I care to think about these accounts with any more frequency than this.&lt;/p&gt;</content><category term="general"/><category term="finance"/><category term="plaintextaccounting"/></entry><entry><title>Tax Payments with Ledger</title><link href="https://pig-monkey.com/2026/02/tax-payments-ledger/" rel="alternate"/><published>2026-02-11T00:00:00-08:00</published><updated>2026-02-11T20:37:31.457549-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-02-11:/2026/02/tax-payments-ledger/</id><summary type="html">&lt;p&gt;How I record taxes in &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt; is pretty simple. In my demonstration of &lt;a href="/2026/02/salary-ledger/"&gt;how I record salary payments&lt;/a&gt; the example entry included tax deductions that show the basic account structure.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Acme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;200.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;How I record taxes in &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt; is pretty simple. In my demonstration of &lt;a href="/2026/02/salary-ledger/"&gt;how I record salary payments&lt;/a&gt; the example entry included tax deductions that show the basic account structure.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Acme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;200.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;50.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Insurance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Medical&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;20.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Income&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I pay state and federal taxes, so I have two main accounts: &lt;code&gt;Expenses:Tax:Federal&lt;/code&gt; and &lt;code&gt;Expenses:Tax:State&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tax payments (and refunds for overpayments) can occur in years other than the tax years that the payments are related to. This requires some way to query transactions by tax years rather than just the posting date. You could do this by tagging the transactions, but I prefer to use a fourth account level to indicate the fiscal year. Thus my 2025 taxes live in &lt;code&gt;Expenses:Tax:Federal:FY2025&lt;/code&gt; and &lt;code&gt;Expenses:Tax:State:FY2025&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If I pay an accountant to help me file taxes, I will log the payment against the &lt;code&gt;Expenses:Tax:Preparation&lt;/code&gt; account, which uses the same fiscal year subaccount.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Accountant&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Preparation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;100.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If I receive a federal refund in March, I will debit it out of the appropriate tax account. I also tag these transactions with &lt;code&gt;refund-tax&lt;/code&gt; so I can easily query them later.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IRS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Refund&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If instead I discover that I still owe federal taxes in March, I will credit the payment into the appropriate tax account. I tag these transactions with &lt;code&gt;final-tax&lt;/code&gt; so I can easily query them later.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;03&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IRS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Taxes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;final&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Some years I have made quarterly estimated tax payments instead of having taxes withheld from my paycheck. These entries look as you would expect, but I tag them with &lt;code&gt;estimated-tax&lt;/code&gt; as well as the quarter number for future queries.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;09&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;02&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IRS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Q3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Estimated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;estimated&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;q3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The bottom line with all of this is that I can do a simple &lt;code&gt;ledger balance fy2025&lt;/code&gt; and see a complete and easy to understand picture of my 2025 taxes. Or I can run &lt;code&gt;ledger balance expenses:tax:federal&lt;/code&gt; to see what I&amp;rsquo;ve paid in federal taxes over the past 14 years, broken out by year.&lt;/p&gt;
&lt;p&gt;As with most things related to Ledger, this seems like pretty basic stuff when you&amp;rsquo;re doing it but becomes a superpower when you realize how most of the rest of the world lives.&lt;/p&gt;</content><category term="general"/><category term="finance"/><category term="plaintextaccounting"/></entry><entry><title>Salary Tracking with Ledger</title><link href="https://pig-monkey.com/2026/02/salary-ledger/" rel="alternate"/><published>2026-02-10T00:00:00-08:00</published><updated>2026-02-10T17:54:02.045557-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-02-10:/2026/02/salary-ledger/</id><summary type="html">&lt;p&gt;In my previous &lt;a href="/tag/plaintextaccounting/"&gt;descriptions of how I perform plain text accounting&lt;/a&gt; I did not discuss logging salary income with &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt;. My basic strategy is to create an entry with all the same data that appears on the paystub. The only number that actually matters to me is whatever amount ends …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my previous &lt;a href="/tag/plaintextaccounting/"&gt;descriptions of how I perform plain text accounting&lt;/a&gt; I did not discuss logging salary income with &lt;a href="https://www.ledger-cli.org/"&gt;Ledger&lt;/a&gt;. My basic strategy is to create an entry with all the same data that appears on the paystub. The only number that actually matters to me is whatever amount ends up in my bank account, but it is still important to have withholdings documented for later querying.&lt;/p&gt;
&lt;p&gt;A simplified entry would look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;2025&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Acme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inc&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;1000.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Federal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;200.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FY2025&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;50.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;Exp&lt;/span&gt;&lt;span class="n"&gt;enses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Insurance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Medical&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;20.00&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Income&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At the time of entry, I store a PDF of the paystub &lt;a href="/2020/08/receipts-ledger/"&gt;just like a receipt&lt;/a&gt;. (In Ye Olden Days this came from scanning a piece of paper, but now I just download the PDF from a web site.) This entry will be &lt;a href="/2020/08/reconciling-ledger/"&gt;reconciled&lt;/a&gt; and get cleared with the &lt;code&gt;*&lt;/code&gt; mark the next time I login to the bank account and verify the amount I received.&lt;/p&gt;
&lt;p&gt;If I want to know how much money the employer or a government thinks I made last year, I can just ask Ledger for the balance of the &lt;code&gt;Income:Salary&lt;/code&gt; account.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ledger&lt;span class="w"&gt; &lt;/span&gt;balance&lt;span class="w"&gt; &lt;/span&gt;income:salary&lt;span class="w"&gt; &lt;/span&gt;--period&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;$-&lt;/span&gt;&lt;span class="m"&gt;1270&lt;/span&gt;.00&lt;span class="w"&gt;   &lt;/span&gt;Income:Salary
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, this number has no real bearing on my reality. What is much more useful to me is the ability to query how much money I actually received last year, e.g. my take-home pay. I can do this by asking Ledger to show the balance of the bank account, limiting it to postings that involved the &lt;code&gt;Income:Salary&lt;/code&gt; account.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ledger&lt;span class="w"&gt; &lt;/span&gt;balance&lt;span class="w"&gt; &lt;/span&gt;assets:bank:checking&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;any(account =~ /Income:Salary/)&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--period&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;$1000&lt;/span&gt;.00&lt;span class="w"&gt;    &lt;/span&gt;Assets:Bank:Checking
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If the only financial relationship you have with your employer is them giving you money in the form of a salary, then you could simplify this by just asking Ledger for the balance of transactions in the bank account from that payee.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ledger&lt;span class="w"&gt; &lt;/span&gt;balance&lt;span class="w"&gt; &lt;/span&gt;assets:bank:checking&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@Acme Inc&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--period&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, my employer sells stuff, and sometimes I buy that stuff, so for me the above query would show me my salary less my employee purchases. Which is mostly worthless.&lt;/p&gt;
&lt;p&gt;When I receive a W-2 after the end of the year, I check all of its entries &amp;ndash; gross pay, pre- and post-tax deductions, etc &amp;ndash; against Ledger with a simple &lt;code&gt;ledger balance "@Acme Inc" --period 2025&lt;/code&gt;. Having all this data stored locally in queryable plain text, rather than needing to access some web portal or read through various PDFs like a prehistoric savage, is a key life strategy for me.&lt;/p&gt;</content><category term="general"/><category term="finance"/><category term="plaintextaccounting"/></entry><entry><title>Night Moves</title><link href="https://pig-monkey.com/2026/01/night-moves/" rel="alternate"/><published>2026-01-25T00:00:00-08:00</published><updated>2026-01-25T10:58:36.799310-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-01-25:/2026/01/night-moves/</id><summary type="html">&lt;p&gt;After falling out of the habit for a few months, I resumed my &lt;a href="/2024/07/night-run/"&gt;night runs&lt;/a&gt; at the end of December. I&amp;rsquo;ve been back into it for about a month now. It&amp;rsquo;s great, speed-running &lt;a href="https://vogelmusic.bandcamp.com/track/night-city"&gt;night city&lt;/a&gt;, just me and the coyotes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55060498646/in/dateposted/" title="After Dark"&gt;&lt;img src="https://live.staticflickr.com/65535/55060498646_fd8091f84d_c.jpg" width="800" height="600" alt="After Dark"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;New to this cycle, I now stop at …&lt;/p&gt;</summary><content type="html">&lt;p&gt;After falling out of the habit for a few months, I resumed my &lt;a href="/2024/07/night-run/"&gt;night runs&lt;/a&gt; at the end of December. I&amp;rsquo;ve been back into it for about a month now. It&amp;rsquo;s great, speed-running &lt;a href="https://vogelmusic.bandcamp.com/track/night-city"&gt;night city&lt;/a&gt;, just me and the coyotes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55060498646/in/dateposted/" title="After Dark"&gt;&lt;img src="https://live.staticflickr.com/65535/55060498646_fd8091f84d_c.jpg" width="800" height="600" alt="After Dark"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;New to this cycle, I now stop at one of those outdoor fitness areas near the end of my run and knock out some pull-ups. (It turns out using a bar is in fact easier than my normal &lt;a href="/2025/07/pull-ups/"&gt;finger pull-ups&lt;/a&gt;.) There&amp;rsquo;s usually a couple other weirdos there.&lt;/p&gt;</content><category term="general"/><category term="run"/><category term="physical training"/></entry><entry><title>Link Log 2026-01-21</title><link href="https://pig-monkey.com/2026/01/link-log-20260121/" rel="alternate"/><published>2026-01-21T00:00:00-08:00</published><updated>2026-01-21T21:07:04.804509-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-01-21:/2026/01/link-log-20260121/</id><content type="html">&lt;p&gt;&lt;a href="https://www.altcinc.com/work/chimera"&gt;Chimera&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://andykirkpatrick.substack.com/p/vbl-2023"&gt;VBL 2023&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.shibuya.film/series/white-rabbit"&gt;White Rabbit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://om.co/2025/05/18/designing-a-life/"&gt;Designing a Life&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://tante.cc/2026/01/08/personal-computing/"&gt;Personal computing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://obsoletearchive.substack.com/p/when-sega-built-the-most-extreme"&gt;When Sega Built the Most Extreme Arcade Cabinet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rollingstone.com/feature/beat-godfather-meets-glitter-mainman-william-burroughs-interviews-david-bowie-92508/"&gt;Beat Godfather Meets Glitter Mainman: William Burroughs Interviews David Bowie&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flickr.com/photos/pigmonkey/55054892549/in/dateposted/" title="Tam Cruising"&gt;&lt;img src="https://live.staticflickr.com/65535/55054892549_877046309f_c.jpg" width="800" height="600" alt="Tam Cruising"/&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="general"/><category term="links"/></entry><entry><title>I brush my teeth while standing on one foot.</title><link href="https://pig-monkey.com/2026/01/toothbrush-balance/" rel="alternate"/><published>2026-01-10T00:00:00-08:00</published><updated>2026-01-10T10:43:27.473560-08:00</updated><author><name>Pig Monkey</name></author><id>tag:pig-monkey.com,2026-01-10:/2026/01/toothbrush-balance/</id><content type="html">&lt;p&gt;It takes about two minute to &lt;a href="/2025/07/how-to-brush-teeth/"&gt;brush your teeth&lt;/a&gt;. These two minutes are an opportunity to improve balance and ankle strength. Sometimes I switch feet halfway through, other times I&amp;rsquo;m feeling more ambitious and will balance on one foot in the morning and the other that night.&lt;/p&gt;</content><category term="general"/><category term="micro"/></entry></feed>