<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title><![CDATA[Ash Furrow's Blog]]></title>
    <link>https://ashfurrow.com</link>
    <atom:link href="https://ashfurrow.com/feed.xml" rel="self" type="application/rss+xml" />
    <description><![CDATA[Compassionate Software Developer]]></description>
    <language>en</language>
    <item>
      <title><![CDATA[AI Coding Tools]]></title>
      <link>https://ashfurrow.com/blog/ai-coding-tools/</link>
      <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/ai-coding-tools/</guid>
      <description><![CDATA[I started writing this blog post as an attempt to collect and distill all my various thoughts and feelings about AI and AI coding tools. But the longer I took to write it, the more things kept changing, and the harder it became to fulfill that scope. So...]]></description>
      <content:encoded>&lt;p&gt;I started writing this blog post as an attempt to collect and distill all my various thoughts and feelings about AI and AI coding tools. But the longer I took to write it, the more things kept changing, and the harder it became to fulfill that scope. So I’m just going to give a history of my own use of AI coding tools. &lt;a href=&quot;https://www.youtube.com/watch?v=LACyqdAfnaw&quot;&gt;This video&lt;/a&gt; tries to describe why Claude Code specifically has taken off in popularity, but I don’t think the creator was specific enough. I’ll cut to the chase: Claude Code was the first AI coding tool to &lt;em&gt;meet me&lt;/em&gt; where &lt;em&gt;I&lt;/em&gt; was at.&lt;/p&gt;
&lt;div class=&quot;youtube-embed&quot;&gt;
      &lt;iframe src=&quot;https://www.youtube.com/embed/LACyqdAfnaw&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;I have a lot of problems with. and feelings about, generative AI. I’m conflicted about using these tools because I’m aware of both the benefits that AI coding tools can have and the harms that LLMs do at scale. My own copyrighted books were stolen and included in LLM training data. My open source contributions and this blog are almost certainly in LLM training data. If you’re looking for a cohesive moral stance on AI, &lt;a href=&quot;https://ashfurrow.com/blog/foresight/&quot;&gt;I don’t have one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have always been curious about new tools and technology, that’s why I chose this career. But I’m confused by the staunch rejection of AI coding tools by some coders. I see a kind of pride taken in their incuriosity, that I have a hard time relating to.&lt;/p&gt;
&lt;p&gt;My approach to writing this blog has been to share things &lt;em&gt;as I learn them&lt;/em&gt;: Since I still remember what it was like to not understand something, my explanations are helpful to others. Since it’s so new in my understanding, it helps me solidify my own understanding. So, keep that in mind here.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I was working at Shopify when GitHub Co-Pilot was first announced in 2021. I was given access to the tool in VS Code, so I tried it out. I hated it immediately, viscerally. It was only impressive in a technical sense, that it was able to predict what I might type next. But as I wrote code, it would interrupt my train of thought with its suggestion if I paused typing too long. My brain would get distracted by that suggestion, flipping from thinking-to-reading modes. GitHub Co-Pilot slowed me down and kept me out of flow state. I turned it off.&lt;/p&gt;
&lt;p&gt;When I joined Float, a few years later, GitHub Co-Pilot was enabled on my new laptop. It had improved since, but only in terms of how quickly it generated its distracting suggestions. The only time I ever had luck with it was when I wrote a multiline comment describing a custom &lt;code&gt;groupBy&lt;/code&gt; that I was too lazy to write, started writing a function definition, and waited.&lt;/p&gt;
&lt;pre class=&quot;language-tsx&quot;&gt;&lt;code class=&quot;language-tsx&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
TODO: Write a function that groups items by such-and-such a blah blah blah
*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;groupBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This is where I paused&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It filled in the implementation, mostly correctly. Cool! But I still turned it off again. Because that was the &lt;em&gt;only&lt;/em&gt; positive interaction I had with it.&lt;/p&gt;
&lt;p&gt;But you know how it is these days. Companies want to make sure they take full advantage of all the new AI tools. No one wants to get left behind, including me. I love to learn, and I love getting paid to learn. So when my coworkers started talking about Cursor, and Float offered me a licence, I tried it out.&lt;/p&gt;
&lt;p&gt;Cursor is a fork of VS Code with a ChatGPT-like interface where you can tell it what you want. It will walk through the implementation with you change-by-change, or you can just let it rip. I liked the chat interface – it was like my comment workaround with GitHub Co-Pilot. I didn’t like that I had to use an entirely new editor, &lt;em&gt;especially&lt;/em&gt; since Cursor stole the ⌘K keyboard shortcut. &lt;em&gt;Excuse you.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like Co-Pilot, I didn’t like Cursor either, but I kept at it anyway because tools do take time to learn. I wouldn’t expect to feel productive with a brand new IDE, AI or not. I committed to using Cursor as a &lt;em&gt;first&lt;/em&gt; resort for tasks and accepted that it would slow me down at first. I was getting better at it, but I still didn’t &lt;em&gt;like&lt;/em&gt; it. It felt like the worst of both worlds: I had to pay attention to every code change but I didn’t get to &lt;em&gt;make&lt;/em&gt; any changes myself.&lt;/p&gt;
&lt;p&gt;Each week, I would discuss what I had learned about using Cursor to Float Engineering’s weekly &lt;a href=&quot;https://artsy.github.io/blog/2020/12/09/share-your-knowledge/&quot;&gt;knowledge share&lt;/a&gt;. I got feedback from others about my workflow, I applied it, and then came back the next week. Other shared what they had learnt too. I was always honest about what was working and what was not. It was actually fun to learn, even if it was still frustrating.&lt;/p&gt;
&lt;p&gt;Then, Claude Code was released. I tried it while it was in preview and I &lt;em&gt;immediately&lt;/em&gt; cancelled my Cursor subscription. I’ve been using Claude Code daily ever since.&lt;/p&gt;
&lt;p&gt;Claude Code was the first tool that met me &lt;em&gt;where I was at&lt;/em&gt;. It wasn’t a new IDE, it was in my terminal. I could hold its hand, or I could let it work on its own; unlike Cursor, it was actually decently okay at making changes unsupervised. I review its output at the end, in a chunk, like a pull request. Claude Code’s VS Code plugin came out with just the right amount of IDE integration.&lt;/p&gt;
&lt;p&gt;Unlike other tools until then, Claude Code was functional, effective, and… it was cute. I think this last part is important: everyone at work loved the cute messaging Claude Code would give while it was running inference. It would give statuses like “Coding”, or “Spelunking”, or “Manifesting”, and I actually think this cuteness is important because it highlights that it’s not just a tool, but a &lt;em&gt;product&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;GitHub Co-Pilot is a tech demo. Claude Code is a product.&lt;/p&gt;
&lt;p&gt;When I started really getting into using Claude Code at Float, a coworker told me it was like watching &lt;em&gt;Invasion of the Body Snatchers&lt;/em&gt;. I had been so critical of these tools because they hadn’t been working for me, that when I started enjoying them it felt like I had changed. But &lt;em&gt;I&lt;/em&gt; hadn’t changed – the tools just finally got good enough.&lt;/p&gt;
&lt;p&gt;I credit Nilay Patel of The Verge for being the first person to articulate this idea in a way that resonated with me: AI technical innovation is impressive &lt;em&gt;only if&lt;/em&gt; it can be used to build something impressive. And generally, &lt;a href=&quot;https://www.theverge.com/podcast/801532/ai-smart-home-apple-m5-vergecast&quot;&gt;it can’t&lt;/a&gt;. But for coding specifically, it can.&lt;/p&gt;
&lt;p&gt;On the technical side, the real innovation with AI coding tools has been to loop them back on themselves, to give them the ability to verify their own work. That’s it, that’s the whole innovation. It sounds dumb and it is, but it works remarkably well. In fact, I don’t think LLM model development is a bottleneck on AI coding tool quality. There are many languages and development environments that aren’t yet set up with this loop back, and there is still a lot of experimentation happening in this product area.&lt;/p&gt;
&lt;p&gt;If an AI coding tool has a unit test suite with a broken test, it can fix the implementation &lt;em&gt;if&lt;/em&gt; given the right prompt, with strict compiler settings, and opinionated linters… and access to run tools. Sloppy codebases lead to sloppy AI tool output, and smart teams are currently investing in infrastructure to make it easier to evaluate code correctness: CI, linters, unit tests, automated regression tests, static analyzers, and so on. Smart teams are prioritizing investments in these.&lt;/p&gt;
&lt;p&gt;(But then again, smart teams were already investing these.)&lt;/p&gt;
&lt;p&gt;I never know if I’m ahead of the curve or behind the curve with these tools, but I &lt;em&gt;do&lt;/em&gt; think that there are a lot of developers out there who could get value from these tools but aren’t. The tools aren’t working for them and I blame the tools. GitHub Co-Pilot is &lt;em&gt;so bad&lt;/em&gt; that it has irreparably damaged the reputation of AI &lt;em&gt;generally&lt;/em&gt;. AI coding tools are products; they need to meet developers where they are at, provide onramps, and show their value quickly.&lt;/p&gt;
&lt;p&gt;Using Claude Code, like any tool, is a skill. It has taken me time to learn and I’m still learning. &lt;a href=&quot;https://gist.github.com/ashfurrow/efd5b84e2700b23fda266f3de36409b6&quot;&gt;My CLAUDE.md&lt;/a&gt; file gets updated all the time. I’ve learned to managed the context window like any kind of finite resource. The longer a conversation goes, the more likely Claude is to mess up. You have to know when to compact a conversation, when to use a subagent, and when to start over. AI coding agents makes other parts of coding harder, like code review: &lt;em&gt;you&lt;/em&gt; have to be the first reviewer of any pull request that you author with Claude Code.&lt;/p&gt;
&lt;p&gt;I have to confess that my resistance to AI tools hasn’t &lt;em&gt;only&lt;/em&gt; been because they sucked until Claude Code. I resisted them because emotionally, I was conflicted. I’m still conflicted. But I’m glad I pushed myself to try them. I don’t want to go back.&lt;/p&gt;
&lt;p&gt;While it’s sad to see the craft of programming change like this, become mechanized like this, &lt;a href=&quot;https://nolanlawson.com/2026/02/07/we-mourn-our-craft/&quot;&gt;I do not mourn it in the way that some do&lt;/a&gt;. After spending years as a technical lead who never feels he has enough time to code, I am &lt;em&gt;loving&lt;/em&gt; this. I can get &lt;em&gt;so much done&lt;/em&gt;. And sure, part of that shift is &lt;a href=&quot;https://ashfurrow.com/blog/joining-wealthsimple/&quot;&gt;my new job at Wealthsimple&lt;/a&gt; that brought me back to coding. But part of it is that I’m not fighting with compiler errors all the time. Claude Code is fixing them for me.&lt;/p&gt;
&lt;p&gt;It’s fun. I wish I had stopped resisting sooner.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here’s my practical advice.&lt;/p&gt;
&lt;p&gt;First, you aren’t going to get left behind if you haven’t used these tools yet. I mostly skipped Cursor and that turned out to be great for me: a lot of developers are currently &lt;em&gt;un&lt;/em&gt; learning their Cursor workflows in order to use Claude Code more effectively. So you won’t get left behind, but also, these tools &lt;em&gt;are&lt;/em&gt; becoming more widely used. An entire generation of programmers is starting their careers never &lt;em&gt;not&lt;/em&gt; having access to AI tools. You’re allowed to feel however you want about that.&lt;/p&gt;
&lt;p&gt;If you have access to AI coding tools as part of your job then try them. If you feel self-conscious about how slow you are when learning how to use the tool, just tell your boss that you’re investing in AI tooling and they’ll probably love it. Your workplace wouldn’t be paying for your subscription if they didn’t want you to use it. Share what you learn with your team. Figuring out what the tools &lt;em&gt;can’t&lt;/em&gt; do is just as important to learn as what they &lt;em&gt;can&lt;/em&gt; do.&lt;/p&gt;
&lt;p&gt;To learn what they’re good at, try using the tools as a &lt;em&gt;first resort&lt;/em&gt;. Look for upcoming projects at work that are well-suited to these tools, like prototypes or timeboxed explorations. Use an AI coding tool as a first draft of your next task. Point your tool towards a gnarly bit of tech debt that you’ve never had the time to pay off, and ask it for a plan. Use the tools for what &lt;em&gt;you&lt;/em&gt; want to do in your codebase.&lt;/p&gt;
&lt;p&gt;It’s okay to mourn your craft. It’s okay to have complicated feelings about all this. And it’s okay to be excited, too.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[The Over-Engineering Method]]></title>
      <link>https://ashfurrow.com/blog/the-over-engineering-method/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/the-over-engineering-method/</guid>
      <description><![CDATA[In Canada, “Engineer” is a protected term. I am a software developer, not a Software Engineer. There are valid reasons – historical reasons – to restrict who is a capital-E Engineer, but these reasons are at odds with how the term is commonly used today....]]></description>
      <content:encoded>&lt;p&gt;In Canada, “Engineer” is a protected term. I am a software &lt;em&gt;developer&lt;/em&gt;, not a Software &lt;em&gt;Engineer&lt;/em&gt;. There are valid reasons – &lt;em&gt;historical reasons&lt;/em&gt; – to restrict who is a capital-E Engineer, but these reasons are at odds with how the term is commonly used today. Nevertheless, my job title &lt;em&gt;was&lt;/em&gt; “Software Engineer” for seven years while I worked in the US, and I personally think that software development is best approached as an engineering problem.&lt;/p&gt;
&lt;p&gt;Bill Hammack (aka The Engineering Guy) has &lt;a href=&quot;https://www.youtube.com/playlist?list=PL0INsTTU1k2X4kCPqmi1eJBgmYJUth_2s&quot;&gt;an excellent playlist&lt;/a&gt; on “the engineering method”, which he defines as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Solving problems using rules of thumb that cause the best change in a poorly understood situation using available resources.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hammack’s videos describe the history of engineering, how it’s inaccurate to only think of engineering as applied understanding. How engineering is something done at, and just beyond, the edge of scientific understanding &lt;em&gt;that advances&lt;/em&gt; that understanding.&lt;/p&gt;
&lt;p&gt;I had some time off recently and wanted to reconnect to this engineering mentality, absent from &lt;em&gt;code&lt;/em&gt; specifically. &lt;a href=&quot;https://ashfurrow.com/blog/disintegrate-reintegrate-extrude/&quot;&gt;My 3D printer&lt;/a&gt; arrived recently, so I decided to apply some engineering method to my home office desk setup. My work-from-home setup is important to me – it’s where I spend a lot of my time. Maybe I’m also still traumatized from working in a one-bedroom apartment with my wife and two cats for ten months of 2020, maybe. Regardless, I’ve lived here for four years and I’m pretty proud of my setup.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2441.jpeg&quot; alt=&quot;My current desk setup.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I keep iterating. I recently tried multiple monitors, but it’s not a setup I work well with. I’ve settled on a laptop in clamshell mode on the desk, so it’s easy to access. I use an Apple Studio Display but I route a USB hub from the monitor for everything to connect to. The laptop just goes to the monitor. Unfortunately, I’ve run out of USB ports.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2442.jpeg&quot; alt=&quot;USB hub taped to a desk without available ports.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Also, it’s a bit messy. I’ve tried to make it tidier over the years, but I can still see the mess of wires under the desk. Especially at standing height. I don’t mind cables but I do mind mess.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2456.jpeg&quot; alt=&quot;The ugly underbelly of my desk.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I chose &lt;a href=&quot;https://www.opengrid.world/&quot;&gt;openGrid&lt;/a&gt; with &lt;a href=&quot;https://www.opengrid.world/guides/quickstart/underware/&quot;&gt;UnderWare&lt;/a&gt; as a means to organize the cables under my desk. This is actually an area of active development in the 3D printer world, and there are more popular systems than openGrid. But I like the idea of an grid system built &lt;em&gt;with desk organizing in mind&lt;/em&gt;. And it’s open source. I bought a new powered USB hub that &lt;a href=&quot;https://makerworld.com/en/models/1699061-opengrid-tp-link-powered-usb-hub-uh700-uh720&quot;&gt;someone had already designed an openGrid mount for&lt;/a&gt;. (The hub is &lt;em&gt;powered&lt;/em&gt; so I can attach further hubs, if needed.) I removed a few things from the desk that I didn’t need, like a light strip and a network switch.&lt;/p&gt;
&lt;p&gt;Instead of planning everything up front, I tried to make individual changes to move in the right direction. I started printing single pieces that I needed to cover the desk in a grid, and proceeded from there.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2462.jpeg&quot; alt=&quot;Printing an openGrid grid with missing sections.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I learned some TinkerCAD and Autodesk Fusion. I learned that 3D printing “slicer” software is a whole different skill. I already had a working understanding of computer graphics and strong graphic design skills (for a programmer) so I wasn’t starting from scratch. I would guess that a lot of people getting into 3D printing don’t know what “world coordinates” are, for example.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2465.jpeg&quot; alt=&quot;The openGrid grid from above, showing the missing sections were to accommodate my monitor stand mount.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I started by printing other people’s models, but soon started modifying them to suit my needs. I wanted to mount a light under my desk to use as a bias light (I didn’t like it behind my monitor) so I modified an openGrid part to hold some random camera part I had lying around, which has a 1/4&amp;quot; tripod mount.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2482.jpeg&quot; alt=&quot;Photo of a 3D printer bed, with piece of metal with a tripod mount stuck to it, next to a 3D part that has a hole for that piece of metal.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The printer itself slowed down my iteration loop, which made it easier to be more intentional.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2502.jpeg&quot; alt=&quot;Photo of an upside down light bar projecting bias light against my wall, under my desk.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I confess that I went overboard a bit, and that’s okay. It felt great reconnecting to that problem-solving feeling on an intrinsic level, outside the context of coding.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2478.jpeg&quot; alt=&quot;Photo of the underside of my desk, with neatly arranged power cables.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2480.jpeg&quot; alt=&quot;Photo of the underside of my desk, showing a neatly arranged USB hub. Some channels are still missing.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;My 3D printer is this amazing new tool that can solve a lot of problems. An overwhelming amount, actually. I’m now kind of surveying the different areas of 3D printing, letting my interests guide me.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2501.jpeg&quot; alt=&quot;Photo of the underside of my desk, showing all the cable channels.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There are still some cables you can see, but I’ve reduced this mess to its minimum. The remaining visible cables are the Thunderbolt cable for my laptop, and a Lightning and USB-C cable for connecting test devices.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2503.jpeg&quot; alt=&quot;Photo of under my desk, with the cables all in channels.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Back at Artsy, I kept a pretty tidy desk. My approach remains to &lt;em&gt;minimize&lt;/em&gt; distractions without being overzealous about &lt;em&gt;eliminating&lt;/em&gt; distractions. For instance, my monitor arm has less wobble when it’s extended less, so the monitor is offset from the centre of the desk. I dislike that it’s off-centre, but I’ve done everything else I can to remove the wobble. And this &lt;em&gt;does&lt;/em&gt; create a handy drop zone on the right, where I can set things as they come and go from the rest of the house (mostly coffee mugs).&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2499.jpeg&quot; alt=&quot;Photo of the top of my desk, which is largely unchanged.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The other night, I was walking up the stairs, and I found my office looking extra cozy. No cables, with softer light. This is exactly what I wanted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/the-over-engineering-method/IMG_2504.jpeg&quot; alt=&quot;My cozy office.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Well, maybe not &lt;em&gt;exactly&lt;/em&gt; what I wanted 😅 I’m thinking of 3D printing a cable chain to hide the mess of the power and ethernet cables going up to my desk. This project never ends.&lt;/p&gt;
&lt;p&gt;Designing a home office is a fun hobby, and I’m grateful to have the means to pursue it. I’m headed back to work tomorrow, and I’m feeling ready to code.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Disintegrate, Reintegrate, Extrude]]></title>
      <link>https://ashfurrow.com/blog/disintegrate-reintegrate-extrude/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/disintegrate-reintegrate-extrude/</guid>
      <description><![CDATA[I wrote last week how my wife and I had to say goodbye to Clementine. Without going into detail, caring for our sick cat took a lot out of us. Since last summer, Clem needed some kind of daily medical care: ear drops, pills, special food, eye lube. Yes,...]]></description>
      <content:encoded>&lt;p&gt;&lt;a href=&quot;https://ashfurrow.com/blog/goodbye-clementine/&quot;&gt;I wrote last week&lt;/a&gt; how my wife and I had to say goodbye to Clementine. Without going into detail, caring for our sick cat took a lot out of us. Since last summer, Clem needed &lt;em&gt;some&lt;/em&gt; kind of daily medical care: ear drops, pills, special food, eye lube. Yes, &lt;em&gt;eye lube&lt;/em&gt;. We wanted to help her get better. We only learned in November that she had cancer and only learned in January that there was nothing we could do.&lt;/p&gt;
&lt;p&gt;A few years ago, a member of my family was diagnosed with terminal cancer. My wife was one of the primary caregivers, and I supported where I could. Taking care of Clementine brought up a lot of those memories.&lt;/p&gt;
&lt;p&gt;The thing about taking care of a loved one while they die is that you still have to live your life. You have to go to work, and pay your bills, and clean your toilet, and everything else. And it sucks, because you want to spend all your time with your loved one. But spending time with them can also be difficult. It’s a lot. Clem liked to spend her days with me in my home office while I was working. Near the end and now afterward, my work days carry an extra burden. It’s been a tough year. (“Captain, it’s February!”)&lt;/p&gt;
&lt;p&gt;At the end of my day, after taking care of my responsibilities, I was left with time but no energy. I know what depression feels like and I now notice when it starts creeping in. And I have skills to forestall it.&lt;/p&gt;
&lt;p&gt;So. Last month. After playing &lt;em&gt;Hades II&lt;/em&gt; for so long that my thumbs hurt as much as my heart, I was doomscrolling. I came across some discussion about 3D printing. Something in my brain shifted. I felt it, like it was some physical mechanism. “Huh. 3D printing. Hmm.”&lt;/p&gt;
&lt;p&gt;I had been thinking of getting a 3D printer, off and on, since we bought our house. Usually, I’d let it go. I had other responsibilities and other interests that were taking up my time. But not lately. Lately, I’ve had time but not any interest. So when I felt that spark, I encouraged myself to follow it.&lt;/p&gt;
&lt;p&gt;Sometimes it’s okay to impulse buy something to make yourself feel better. When the excitement of diving into a new hobby is the only joy you can remember feeling. When you’re actually &lt;em&gt;glad&lt;/em&gt; that the thing is backordered because it means you’ll have something (&lt;em&gt;anything&lt;/em&gt;) to look forward &lt;em&gt;to&lt;/em&gt; for a bit longer. When &lt;em&gt;you do want&lt;/em&gt; to keep looking forward, even as you &lt;em&gt;also&lt;/em&gt; want time to slow down.&lt;/p&gt;
&lt;p&gt;My wife and I have spent the last few weeks learning about 3D printers together, sharing models we want to print, and preparing a workspace for the printer. We’ve lived in the house for over four years now, which is longer than we’ve ever lived in a space. Preparing for the printer led to spring cleaning our basement, something we’ve been meaning to do. So we’ve built up some momentum, doing things, taking care of ourselves and our space and each other.&lt;/p&gt;
&lt;p&gt;The printer should arrive this week. I’m excited. It feels good, to be excited. I’m cautious, too: I’ve learned the hard way how unwise it can be to hitch my mental wellbeing to the acquisition of things. But I’ve also learned how and when to work with my inclinations.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Goodbye Clementine]]></title>
      <link>https://ashfurrow.com/blog/goodbye-clementine/</link>
      <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/goodbye-clementine/</guid>
      <description><![CDATA[My wife and I said goodbye to our cat Clementine today. We had her for just four years – our time was cut short by cancer. Things have been up and down for months, but at the start of the year we changed priorities to keep her comfortable. Clementine and...]]></description>
      <content:encoded>&lt;p&gt;My wife and I said goodbye to our cat Clementine today. We had her for just four years – our time was cut short by cancer. Things have been up and down for months, but at the start of the year we changed priorities to keep her comfortable.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/goodbye-clementine/xmas.jpeg&quot; alt=&quot;Clementine meowing while wearing a Christmas tie&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Clementine and her kittens were rescued from an abusive home by a local animal shelter. For the next nine months, her kittens were slowly adopted. But no one wanted to take Clem home until we found her.&lt;/p&gt;
&lt;p&gt;I’ve had pets all my life and I’m very good with cats, but had never cared for an abused animal before. We took things slow. It wasn’t long at all until Clem came out of her shell. She never entirely shook off her experiences before the shelter, but she also came into her own here. She found her voice. She even made friends with our grumpy elder cat Bandita. She adored being pet and she had so much love to give.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/goodbye-clementine/friends.jpeg&quot; alt=&quot;Clementine and Bandita napping together&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I’m taking this pretty hard. It feels so unfair. We had so many plans.&lt;/p&gt;
&lt;p&gt;But I’m also so grateful to have had the time we did have together. Clem came into our life right before a lot of things went very sideways. I’m still recovering from some of those experiences; Clem showed me what it can look like to grow past and grow with your trauma. My wife picked Clementine because she believed that I could take good care of her, and she was right. But Clem took care of me, too.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/goodbye-clementine/blep.jpeg&quot; alt=&quot;Clementine blepping at the camera&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Clementine. &lt;em&gt;Ms. Clem&lt;/em&gt;. We love you and miss you. We’ll never forget you. Thank you.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[The Imperial Units Strike Back]]></title>
      <link>https://ashfurrow.com/blog/the-imperial-units-strike-back/</link>
      <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/the-imperial-units-strike-back/</guid>
      <description><![CDATA[I lived in the United States for six years, during which time I refused to learn Fahrenheit. I was forced to give in to using inches because, unlike every tape measure I owned in Canada that had both inches and centimetres, every measuring tape I could...]]></description>
      <content:encoded>&lt;p&gt;I lived in the United States for six years, during which time I refused to learn Fahrenheit. I was forced to give in to using inches because, unlike every tape measure I owned in Canada that had &lt;em&gt;both&lt;/em&gt; inches and centimetres, every measuring tape I could find at my local hardware store was &lt;em&gt;inches only&lt;/em&gt;. For this and other reasons, it wasn’t practical to resist.&lt;/p&gt;
&lt;p&gt;But I prided myself in my ignorance of Fahrenheit. It’s odd to be proud of ignorance, but using Celsius exclusively helped me hang on to my Canadian identity while living in a foreign country. Sometimes, people would ask me what the forecast was, and you just &lt;em&gt;know&lt;/em&gt; that I made it &lt;em&gt;a whole thing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But when the pandemic hit, I started calling home to my family a lot more often. My grandparents – snowbirds who lived in Florida half the year – didn’t know Celsius. That made conversations difficult (“how is the weather?”) and I wasn’t going to let a my pride get in the way of connecting to my family. So after years, I eventually did learn Fahrenheit. And then I promptly moved home to Canada.&lt;/p&gt;
&lt;p&gt;This is all to say, I have some complicated feelings about Fahrenheit.&lt;/p&gt;
&lt;p&gt;Because the thing is, during my six years in the United States, I kept hearing the same thing from Americans. Smart people – coworkers, friends! – would all tell me something along the lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yeah, sure, the Metric System &lt;strong&gt;is&lt;/strong&gt; better for everything… &lt;strong&gt;except&lt;/strong&gt; ambient air temperature! &lt;strong&gt;That&lt;/strong&gt; is the one thing that Fahrenheit is better for. You guys just don’t get it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This. In. Furiated me.&lt;/p&gt;
&lt;p&gt;And so, when I heard Casey on the latest &lt;a href=&quot;https://atp.fm/677&quot;&gt;ATP episode&lt;/a&gt; say something to this effect, I paused the recording to write this post. (Sending feedback before finishing the episode is poor form, I know.) I was compelled to write this because I think he and I get our dander up about this topic in the same way, from opposite sides. And I actually think I have a way for us to square the circle on this. And this has been bothering me for years.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;want&lt;/em&gt; to see eye-to-eye with my American friends, and podcast hosts. So this blog post is an olive branch of sorts.&lt;/p&gt;
&lt;h2&gt;The Case For Fahrenheit&lt;/h2&gt;
&lt;p&gt;I’m going to do the thing that Metric System advocates never do: I’m going to admit that &lt;em&gt;is neat&lt;/em&gt; that Fahrenheit stretches from zero to a hundred, as a range from “really cold” to “really hot.” It is! A hundred is a nice round number. &lt;em&gt;It’s very neat&lt;/em&gt;. I don’t think a reasonable person could deny this, even though I did for years, which maybe reflects on me a bit. &lt;em&gt;I’m sorry&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It is also convenient that the Fahrenheit degrees are small enough that thermostats can be adjusted by whole degrees. I don’t &lt;em&gt;mind&lt;/em&gt; that my car adjusts air temperature in half-degrees Celsius, but I must admit that it would look cleaner if they were whole numbers. And I once owned a space heater that adjusted its digital thermostat by whole degrees Celsius. I wanted more control so I switched it to Fahrenheit. I enjoy the finesse that comes with smaller degrees, and I appreciate the simplicity of design that follows from that.&lt;/p&gt;
&lt;p&gt;There is no “but” coming. There is no other shoe that’s about to drop, or backhanded compliment. The Europeans and the Australians and the other Canadians… they won’t admit that you’re right about the ambient air temperature thing. &lt;em&gt;I will&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I hope that you’re curious about &lt;em&gt;why&lt;/em&gt; no one else will admit that you’re right about this, because I think it’s fascinating. There are two nuanced points in this debate that get lost in &lt;s&gt;conversion&lt;/s&gt; translation.&lt;/p&gt;
&lt;h2&gt;Acknowledging the Arbitrary&lt;/h2&gt;
&lt;p&gt;When I hear Americans describe how intuitive the Fahrenheit system is, I feel like I’m going nuts. “This is so intuitive”, they say, “&lt;em&gt;because&lt;/em&gt; it goes from zero to a hundred.” Or maybe they’ll say “the sixties feel &lt;em&gt;this way&lt;/em&gt; and the seventies feel &lt;em&gt;that way&lt;/em&gt;, and it all makes sense!” Yeah! Of course it makes sense &lt;em&gt;to you&lt;/em&gt;. You grew up with this system! But going from zero to a hundred did not help it make sense to me.&lt;/p&gt;
&lt;p&gt;Any system used to measure something like air temperature, or any temperature, is going to be arbitrary. It’s going to have tradeoffs about how it works, what it’s optimized for. And although it is &lt;em&gt;neat&lt;/em&gt; that Fahrenheit goes from zero to a hundred, that &lt;em&gt;is&lt;/em&gt; arbitrary. Consider a temperature scale like Fahrenheit but that goes to 120 instead; we’d be able to reason about temperature like an analogue clock. Or, it could go to 60 like the Babylonians intended, so we could do fun fractions. Neither of these would &lt;em&gt;inherently&lt;/em&gt; be more intuitive.&lt;/p&gt;
&lt;p&gt;What is intuitive is the system you know.&lt;/p&gt;
&lt;p&gt;And even though it is &lt;em&gt;neat&lt;/em&gt; that Fahrenheit goes from zero to a hundred, that isn’t how people reason about temperature. For example. If it’s 35ºF outside, and you go inside where it’s 70ºF, do you think about that as being “twice as warm”? Probably not. Zero to a hundred suggests percentages, so do you think about inside being “35% warmer” than outside either?&lt;/p&gt;
&lt;p&gt;Maybe I’m wrong here, but I think people feel temperature differences in absolute terms &lt;em&gt;in degrees&lt;/em&gt;, not in terms of multipliers or percentages.&lt;/p&gt;
&lt;p&gt;Going from zero to a hundred is &lt;em&gt;neat&lt;/em&gt;. I like how it makes degrees act like a percentage, truly. But I don’t think that going from zero to a hundred helps people reason about temperature in a way that Celsius does not. I have the same intuitive understanding for Celsius that you have for Fahrenheit. I don’t think either is &lt;em&gt;inherently&lt;/em&gt; better. The one that feels like it “makes sense” is the system you know – please believe me on this.&lt;/p&gt;
&lt;p&gt;Yeah? Are we still friends? Okay I’m glad.&lt;/p&gt;
&lt;h2&gt;Putting the “System” in “Metric System”&lt;/h2&gt;
&lt;p&gt;I mentioned tradeoffs earlier: there are benefits and drawbacks to any temperature scale. I don’t think many Americans understand the value in Celsius because I don’t think many of them actually know the Metric System. The &lt;em&gt;systemic&lt;/em&gt; nature of Celsius makes up for the annoyingly large degrees, among its other drawbacks, in my opinion.&lt;/p&gt;
&lt;p&gt;When I took high school physics, it was revelatory. Suddenly, many different things about the world were interconnected. They always had been. I loved it. Learning about how the speed of sound is affected by air temperature, and the Doppler effect, and total internal refraction… It was so fun to learn how the real world could be modelled. And one part of this awakening was the realization that all these &lt;em&gt;units&lt;/em&gt; were connected, just like the world was.&lt;/p&gt;
&lt;p&gt;The Metric System is arbitrary, like Customary Units and like every other measuring scale. But by making very intentional decisions, the Metric System connects together the different aspects of our physical reality into one elegant, beautiful system. Let me explain.&lt;/p&gt;
&lt;p&gt;Using one cubic centimetre of water as a baseline, we have the definition for one gram of mass and for one millilitre of volume. Distance, mass, and volume are connected, boom. Next: raising that water’s temperature by one degree Celsius would require one calorie of energy. We could continue, to describe the connection to Joules, and Watts, and so on… but my point is that these are all connected by the &lt;em&gt;definition of the units themselves&lt;/em&gt;. And &lt;em&gt;that&lt;/em&gt; is also pretty &lt;em&gt;neat&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;By learning a system of measurements that makes it easy to reason within, I think people are able to more easily develop an &lt;em&gt;intuition&lt;/em&gt; about that reality. Celsius fits within that system, even if it has tradeoffs.&lt;/p&gt;
&lt;p&gt;My American friends: most of you don’t know the Metric System and so most of you can’t appreciate the value that the system affords. And I know that the idea of change is hard – it sucks for my family members who grew up before Metrification in Canada. And I appreciate the fact that most people don’t need to intuitively relate mass and energy, or whatever. But I relish in it. I love being able to reason about the size of my espresso machine boiler and its power draw and volume, and kilowatt hours, and all that. I just think it’s &lt;em&gt;neat&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This doesn’t make Celsius a better system than Fahrenheit – it’s just different tradeoffs.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;While (I think) I do understand the value in going from zero to a hundred, I don’t think Americans understand the value of the Metric &lt;em&gt;System&lt;/em&gt;. This isn’t a flaw or a shortcoming, in any way. It’s just something that I don’t think you all are aware of. An “unknown unknown.” And if you care about measuring ambient air temperature as much as I do, I thought you might be interested to learn.&lt;/p&gt;
&lt;p&gt;The tl;dr here is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fahrenheit &lt;em&gt;is&lt;/em&gt; convenient for ambient air temperature, but going from zero to one hundred didn’t make it easier for me to learn.&lt;/li&gt;
&lt;li&gt;Celsius &lt;em&gt;becomes more valuable&lt;/em&gt; when it’s used within the entire Metric System, leading most Americans to be unaware of that value. This is why no one will admit that you’re right about the first point.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I still prefer the tradeoffs that Celsius makes over the ones Fahrenheit does. But &lt;em&gt;I see you&lt;/em&gt;. We can agree to disagree.&lt;/p&gt;
&lt;p&gt;Time to go listen to the rest of that podcast episode.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Upcoming Conference Talk]]></title>
      <link>https://ashfurrow.com/blog/upcoming-conference-talk/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/upcoming-conference-talk/</guid>
      <description><![CDATA[I’m very excited to announce that I’ll be speaking at the Swift Rockies conference for iOS developers next July in Calgary. This will be my first conference presentation in over five years! My talk is titled My Slow Return to a Swift Career. I’m pecking...]]></description>
      <content:encoded>&lt;p&gt;I’m very excited to announce that I’ll be speaking at the &lt;a href=&quot;https://swiftrockies.com/&quot;&gt;Swift Rockies&lt;/a&gt; conference for iOS developers next July in Calgary. This will be my first conference presentation in over five years!&lt;/p&gt;
&lt;p&gt;My talk is titled &lt;em&gt;My Slow Return to a Swift Career&lt;/em&gt;. I’m pecking away at it (I have a half year to prepare) but it will be part “career retrospective” and part “technical deep dive comparing React Native to native iOS development.” My native iOS development experience stretches back to iPhoneOS 3.1. I still know UIKit like the back of my hand. But I have a lot of experience with React Native, too: I helped migrate Artsy’s native iOS app to become hybrid native/React Native, I built an entire SDK on top of React Native at Shopify, and I led the team that build Float’s mobile app from scratch.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ashfurrow.com/blog/joining-wealthsimple/&quot;&gt;I recently started a job at Wealthsimple&lt;/a&gt; where &lt;a href=&quot;https://ashfurrow.com/blog/work-at-your-spikes/&quot;&gt;my focus is on mobile user experiences&lt;/a&gt;. I’m using native iOS technologies again &lt;em&gt;a lot&lt;/em&gt; and I’m &lt;em&gt;really&lt;/em&gt; enjoying it!&lt;/p&gt;
&lt;p&gt;As a whole, it’s fair to say that the iOS developer community dislikes React Native. But the complaints I hear about React Native &lt;em&gt;tend&lt;/em&gt; to either over-generalize or exaggerate its problems. I bring a nuanced perspective with more… interesting complaints.&lt;/p&gt;
&lt;p&gt;I’m really looking forward to it, and I hope to see you in Calgary!&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Peer Lab Community Shut Down]]></title>
      <link>https://ashfurrow.com/blog/peer-lab-community-shut-down/</link>
      <pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/peer-lab-community-shut-down/</guid>
      <description><![CDATA[When I lived in Amsterdam, a friend ran a weekly meetup for programmers. He held it on Saturday mornings, to discourage people who only had ideas for apps. The idea was to spend time in a café working on projects around other coders who were working on...]]></description>
      <content:encoded>&lt;p&gt;When I lived in Amsterdam, a friend ran a weekly meetup for programmers. He held it on Saturday mornings, to discourage people who only had ideas for apps. The idea was to spend time in a café working on projects around other coders who were working on their projects, to exchange ideas and make connections. I enjoyed the Peer Lab so much that &lt;a href=&quot;https://artsy.github.io/blog/2015/08/10/peer-lab/&quot;&gt;I started my own&lt;/a&gt; when I moved to New York and &lt;a href=&quot;https://ashfurrow.com/blog/5-years-of-peer-lab/&quot;&gt;ran it for five years&lt;/a&gt;. It was only stopped by the novel coronavirus pandemic.&lt;/p&gt;
&lt;p&gt;I made a lot of friends and acquaintances at these meetups. Lots of great memories, lots of fun coding.&lt;/p&gt;
&lt;p&gt;Eventually, I created a website called &lt;em&gt;Peer Lab Community&lt;/em&gt; and hosted it at &lt;code&gt;peerlab.community&lt;/code&gt;. It had a list of dozens of worldwide Peer Labs and instructions to start one of your own. I’ve maintained that site and domain until recently; I’ve decided to shut it down and let the domain expire next month. This is more of a formality than an actual change, since the list is woefully outdated. All of the events predate the pandemic and the only pull requests I’ve received in five years have be to remove events. I don’t live in a big city (or travel frequently) like I used to, so I can’t spread the idea around like I once did.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ashfurrow/peerlab.community&quot;&gt;The GitHub repo is archived&lt;/a&gt; and the site content is still served at &lt;a href=&quot;https://ashfurrow.github.io/peerlab.community/&quot;&gt;ashfurrow.github.io/peerlab.community/&lt;/a&gt;. The old URL will 301 redirect to the new archive, but only over HTTP.&lt;/p&gt;
&lt;p&gt;It’s sad to see it go, but I didn’t want it to slip away unremarked upon.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Five Years in New Brunswick]]></title>
      <link>https://ashfurrow.com/blog/five-years-in-new-brunswick/</link>
      <pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/five-years-in-new-brunswick/</guid>
      <description><![CDATA[Today marks five years since my wife and I moved away from New York and back to New Brunswick. When I wrote about this last time, I seemed unhappy. I guess things hadn’t worked out the way that I had envisioned them when we moved home – even if I didn’t...]]></description>
      <content:encoded>&lt;p&gt;Today marks five years since my wife and I moved away from New York and back to New Brunswick. &lt;a href=&quot;https://ashfurrow.com/blog/four-years-in-new-brunswick/&quot;&gt;When I wrote about this last time&lt;/a&gt;, I seemed unhappy. I guess things hadn’t worked out the way that I had envisioned them when we moved home – even if I didn’t have a really clear vision for how things would go. I have a more optimistic view now.&lt;/p&gt;
&lt;p&gt;About a year ago, &lt;a href=&quot;https://photos.ashfurrow.com/downtown-in-the-rain&quot;&gt;I started taking photos again&lt;/a&gt;. It started on my phone, but then I got out my old film cameras which &lt;em&gt;still had film in them from New York&lt;/em&gt;. I finished the rolls and sent them off to be developed. When they came back, I found this:&lt;/p&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/five-years-in-new-brunswick/photo.jpg&quot; alt=&quot;Double-exposure photo with New York on the left and Fredericton on the right&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is a double exposuree, with half the frame being taken in New York and the other half being taken here in Fredericton. &lt;em&gt;Five years apart!&lt;/em&gt; From what I can piece together, what happened is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I took a photo in New York.&lt;/li&gt;
&lt;li&gt;Five years pass.&lt;/li&gt;
&lt;li&gt;At some point, the “double exposure” lever on my camera was activated.&lt;/li&gt;
&lt;li&gt;I advanced only halfway to the next frame.&lt;/li&gt;
&lt;li&gt;I took another photo in Fredericton.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s what I’ve pieced together, because this was not what I intended when I took either photo. One of the last photos I took in New York, and one of the first photos I took in Fredericton. &lt;em&gt;This was not what I envisioned.&lt;/em&gt; (I also have &lt;em&gt;no idea&lt;/em&gt; why one of the photos was taken &lt;em&gt;upside down!&lt;/em&gt; What!?)&lt;/p&gt;
&lt;p&gt;Something I love about film photography – and digital, too – is the unexpected. In photography, you see a scene and you pre-visualize the shot, and then you try to realize your photographic vision. But unexpected things happen. And I think &lt;em&gt;good&lt;/em&gt; photographers are open to that spontaneity. You can’t always faithfully execute on your vision, but you can choose to work with whatever happens.&lt;/p&gt;
&lt;p&gt;In this case, I’ve &lt;em&gt;edited&lt;/em&gt; the photo to look good. Without those edits, the original was kind of bleh:&lt;/p&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/five-years-in-new-brunswick/original.jpg&quot; alt=&quot;The same photo, but less contrasty and not cropped. I looks faded.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is not what I envisioned, but I love what I made of it. This is probably my favourite photo that I’ve ever taken &lt;em&gt;ever&lt;/em&gt;, and it was an accident.&lt;/p&gt;
&lt;p&gt;Things haven’t gone the way I intended when I moved home, but that’s okay. Part of being human is accepting the spontaneity of life and making something beautiful with it.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Joining Wealthsimple]]></title>
      <link>https://ashfurrow.com/blog/joining-wealthsimple/</link>
      <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/joining-wealthsimple/</guid>
      <description><![CDATA[I’m excited to announce that today is my first day working at Wealthsimple! I’ll be working as a staff developer on their mobile app. In a previous blog post, I teased that this role was a perfect fit for me. Today, I’m excited to share some details. But...]]></description>
      <content:encoded>&lt;p&gt;I’m excited to announce that today is my first day working at &lt;a href=&quot;https://www.wealthsimple.com/&quot;&gt;Wealthsimple&lt;/a&gt;! I’ll be working as a staff developer on their mobile app. &lt;a href=&quot;https://ashfurrow.com/blog/floating-on/&quot;&gt;In a previous blog post&lt;/a&gt;, I teased that this role was a perfect fit for me. Today, I’m excited to share some details.&lt;/p&gt;
&lt;p&gt;But first we need some context and a little background on React Native.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I started working with React Native at Artsy. &lt;a href=&quot;https://artsy.github.io/blog/2016/08/15/React-Native-at-Artsy/&quot;&gt;Orta and Eloy were keen on adopting it in 2016&lt;/a&gt;, but I was very skeptical. So skeptical, in fact, that I found myself working on non-mobile Artsy projects. That’s when I learned React on the web, and &lt;a href=&quot;https://ashfurrow.com/blog/the-case-for-react-native/&quot;&gt;that’s when I came around to React Native&lt;/a&gt;. I got on board with the vision that the two of them had started building. I started contributing to that vision and eventually I worked up to &lt;a href=&quot;https://artsy.github.io/blog/2020/09/29/becoming-mobile-first-at-artsy/&quot;&gt;leading the team that owned the whole app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the foundational principles that Orta and Eloy had established was that Artsy wouldn’t use React Native where it led to a worse user experience; we’d use React Native only &lt;em&gt;where it made sense&lt;/em&gt;, and use native iOS tech where &lt;em&gt;it&lt;/em&gt; made sense. Our goal was to create a great app, and React Native couldn’t do that on its own. As a concrete example, the navigation stack itself was still in Objective-C (while the view controllers were slowly migrated to React Native).&lt;/p&gt;
&lt;p&gt;That was (gosh) nearly a decade ago. React Native itself has gotten &lt;em&gt;much&lt;/em&gt; better, especially as tools like &lt;a href=&quot;https://expo.dev/&quot;&gt;Expo&lt;/a&gt; have taken off. It’s now easy for developers to access underlying native SDKs from JavaScript (like photo pickers, Spotlight integration, even augmented reality). But! There still remains a “last mile” in React Native, where native technologies &lt;em&gt;must&lt;/em&gt; be used &lt;em&gt;directly&lt;/em&gt; in order to build the best user experience. In 2016, maybe you could get 70% to a great UX in React Native alone. By 2020, maybe that had reached 90%. Today, maybe it’s around 95%, or so? But I don’t believe it will ever reach 100% for two reasons.&lt;/p&gt;
&lt;p&gt;First is the platform vendors themselves. Apple and Google develop their own SDKs for building apps and would prefer you to use them. Now, React Native &lt;em&gt;uses&lt;/em&gt; those SDKs under the hood, but React Native itself doesn’t fit in certain restrictive runtimes. Take widgets, for example. Or push notification extensions, or smartwatch apps, or any number of the small-but-deeply-integrated features that elevate an app from &lt;em&gt;good&lt;/em&gt; to &lt;em&gt;great&lt;/em&gt;. (Even where it’s &lt;em&gt;possible&lt;/em&gt; to fit a React Native runtime into these environments, you might not actually want to. I helped a team at Shopify build an &lt;a href=&quot;https://developer.apple.com/documentation/appclip&quot;&gt;App Clip&lt;/a&gt; in React Native; App Clips needed to archive down to under 10MB and fitting inside that constraint was a huge challenge. While the project was a technical success, the user experience wasn’t great.)&lt;/p&gt;
&lt;p&gt;Second is the irreducible complexity of a cross-platform development tool like React Native. This kind of tool needs to work across all kinds of platforms while not &lt;em&gt;feeling&lt;/em&gt; like a “lowest common denominator.” The React Native project itself has made a lot of improvements here over the years. In case you weren’t aware, please let me blow your mind: there is now synchronous, two-way interoperability between React Native’s JavaScript runtime and native code. JavaScript can now communicate &lt;em&gt;directly&lt;/em&gt; with native code through object references 🤯 This has come a long way since React Native’s original, asynchronous bridge where all communication was serialized over JSON. This advancement has led to huge performance gains that close the distance on that last mile – even if it can’t close it entirely.&lt;/p&gt;
&lt;p&gt;However. This fancy &lt;a href=&quot;https://reactnative.dev/architecture/landing-page&quot;&gt;new architecture&lt;/a&gt; comes with added complexity. You don’t get end-to-end type-safe memory access between TypeScript and native runtimes without &lt;em&gt;at least a little bit&lt;/em&gt; of C++. Any app developer who’s serious about delivering the &lt;em&gt;highest-possible quality mobile user experience&lt;/em&gt; will need to dive under React Native’s JavaScript exterior and work in the underlying native stack, in C++, Swift, Kotlin… whatever it takes.&lt;/p&gt;
&lt;p&gt;That’s where I come in.&lt;/p&gt;
&lt;p&gt;It’s very rare to find a developer who is comfortable in &lt;em&gt;both&lt;/em&gt; React Native &lt;em&gt;and&lt;/em&gt; the underlying native SDKs. Mobile native developers tend to avoid React Native. On the other side, React Native developers tend to want to stay in JavaScript, avoiding native tech. There are exceptionally few developers out there with deep enough experience with native iOS that they could still write manual-retain-release Objective-C &lt;em&gt;and&lt;/em&gt; who have extensive experience building React Native applications in JavaScript. &lt;em&gt;And&lt;/em&gt; who enjoy working in both.&lt;/p&gt;
&lt;p&gt;What I have to offer is an unbiased perspective. (Or at least, a less biased one.) Someone to help make the right decision for the product, whether it’s native or React Native. Someone who is confident contributing at any level of the stack. And someone to help scale up a larger team with those same skills. I can’t wait!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;My new role will have a narrower focus with more day-to-day coding and &lt;a href=&quot;https://ashfurrow.com/blog/work-at-your-spikes/&quot;&gt;I’m expecting a greater career satisfaction&lt;/a&gt;. I’ve learned that I &lt;em&gt;can&lt;/em&gt; do anything, but if I try to do &lt;em&gt;everything&lt;/em&gt;, then my work suffers. I suffer. It’s time to specialize in mobile UX again.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/joining-wealthsimple/wwdc2010.jpg&quot; alt=&quot;Photo of (a younger) me at WWDC 2010.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I’m also &lt;em&gt;really&lt;/em&gt; excited to be working in native technologies more often. I’ve followed every WWDC since I attended my first in 2010, but if I’m being completely honest, it’s been hard to feel as immersed as I used to in Apple technology without working in native iOS day-to-day. My Swift skills are a little rusty and my SwiftUI skills… well, let’s just say that I’m looking forward to sparring with Xcode again. In some ways, this will be a return to native iOS for me. But I’m not “going back”, I’m using my experience to go forward.&lt;/p&gt;
&lt;div class=&quot;narrow&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://ashfurrow.com/blog/joining-wealthsimple/mdevcamp.jpg&quot; alt=&quot;Photo of (a less younger) me speaking at mDevCamp.&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I’m really looking forward to ramping up with Wealthsimple. They have a great product for an underserved Canadian market. &lt;a href=&quot;https://www.wealthsimple.com/en-ca/culture&quot;&gt;Their stated culture&lt;/a&gt; describes the exact kind of environment where I can do my best work. Also, I’ve opened personal bank accounts in three countries so I also get to bring my experience banking in the US and Europe. When I moved home to Canada, I was surprised to see how little the big banks had changed in the seven years I lived away. Wealthsimple is pushing Canada forward here. They’ve built a quality app and have already done a lot to cover that last mile of React Native user experience – I can’t wait to pitch in!&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title><![CDATA[Eleventy Launch]]></title>
      <link>https://ashfurrow.com/blog/eleventy-launch/</link>
      <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
      <guid>https://ashfurrow.com/blog/eleventy-launch/</guid>
      <description><![CDATA[As I discussed previously, I’ve been rewriting this blog in a new tool called 11ty (aka Eleventy - the project’s devs aren’t consistent so I won’t be either). This is the first blog post written in the new blog engine, and the migration is complete! I...]]></description>
      <content:encoded>&lt;p&gt;&lt;a href=&quot;https://ashfurrow.com/blog/yet-another-blog-rewrite/&quot;&gt;As I discussed previously&lt;/a&gt;, I’ve been rewriting this blog in a new tool called &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt; (aka Eleventy - the project’s devs aren’t consistent so I won’t be either). &lt;em&gt;This&lt;/em&gt; is the first blog post written in the new blog engine, and the migration is complete!&lt;/p&gt;
&lt;p&gt;I already mentioned my reasons for migrating off of Gatsby, but it’s worth repeating &lt;em&gt;how much less complex&lt;/em&gt; an 11ty implementation is. Gatsby’s complexity led to long build times, which started exceeding Netlify’s (free tier) deploy timeout. On my M2 MacBook Air, you can see a &lt;strong&gt;16x speedup on fresh builds&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Gatsby
yarn build  329.83s user 28.18s system 257% cpu 2:19.14 total

# Eleventy
yarn build  57.01s user 4.42s system 387% cpu 15.863 total
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I had let the project sit on the back burner for a while but &lt;a href=&quot;https://ashfurrow.com/blog/floating-on/&quot;&gt;recent events&lt;/a&gt; have led me to have spare time to finish it. One of my first priorities was to get Netlify deploy previews working again, which was a great call. This helped me test end-to-end and verify that I would get back continuous (one of the goals of this project). To fully deploy the site from Netlify takes about a minute.&lt;/p&gt;
&lt;p&gt;Side note: I don’t want to beat up on Gatsby but it’s also clear that it hasn’t been a good fit. Gatsby is great for complex sites with dynamic content, but &lt;em&gt;this&lt;/em&gt; site is a static blog with hundreds of posts. My precious posts! When testing the build times, I saw the following warning:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Your GraphQL query in createPages took 28.522 seconds which is an unexpectedly long time. See https://gatsby.dev/create-pages-performance for tips on how to improve this.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Huh! Okay maybe the performance problems are on &lt;em&gt;my&lt;/em&gt; side of the keyboard after all! Maybe I’m holding Gatsby wrong. I examined the query in question, and laughed out loud.&lt;/p&gt;
&lt;pre class=&quot;language-graphql&quot;&gt;&lt;code class=&quot;language-graphql&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property-query&quot;&gt;allMdx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;frontmatter___date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;frontmatter___title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token object&quot;&gt;edges&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token object&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property-query&quot;&gt;excerpt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;pruneLength&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;body&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;id&lt;/span&gt;
        &lt;span class=&quot;token object&quot;&gt;frontmatter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;date&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;title&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token object&quot;&gt;siteSearchIndex&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;index&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All it’s doing is querying blog posts, which are &lt;em&gt;just text&lt;/em&gt;. Even the search index is &lt;em&gt;just processing text&lt;/em&gt;. It’s all just text! So I’m putting the blame here on Gatsby. I’m left wondering who this tool is for? Gatsby can’t scale to &lt;em&gt;under a thousand text files&lt;/em&gt; so it’s not a good fit for a simple static site. Do you need something more complex? Then you probably want more than a static site, anyway.&lt;/p&gt;
&lt;p&gt;Counting lines of code isn’t a perfect way to measure complexity, but in this case I think it’s helpful for comparing the two implementations. Remember that Gatsby is a React site generated from Markdown using GraphQL with lots of other bells and whistles; more complex but more expressive. The 11ty implementation uses plain HTML, CSS, and JavaScript; simpler but more verbose.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Gatsby
cloc --exclude-dir=node_modules,public,.netlify,blog,.cache,
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
TypeScript                      50            259             52           3143
Markdown                         6            112              0            616
JavaScript                       2              9             19            207
JSON                             3              0              0            155
CSS                              1             19             10            111
SVG                              6              0              3             93
Text                             2             13              0             61
diff                             1              2             28             24
TOML                             1              0              0              4
-------------------------------------------------------------------------------
SUM:                            72            414            112           4414
-------------------------------------------------------------------------------

# 11ty
cloc --exclude-dir=node_modules,public,.netlify,.husky --not-match-d=&amp;quot;blog|fontawesome&amp;quot; .
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
CSS                              7             86             54           1589
Nunjucks                        17             76             17           1239
JavaScript                      10             96            124            619
Markdown                         5             86              0            179
Text                             2             13              0             61
SVG                              3              0              3             48
JSON                             3              0              0             47
TOML                             1              0              0              4
-------------------------------------------------------------------------------
SUM:                            48            357            198           3786
-------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Despite being less expressive, 11ty is still the “smaller” implementation. Which makes sense, since &lt;em&gt;you don’t need GraphQL to render markdown into HTML&lt;/em&gt;. In any case, I remain impressed at how much can be accomplished using only what we was once called “Dynamic HTML.” Gatsby’s implementation used 24 dependencies (which get shipped to users reading the blog) and just as many build-time Gatsby plugins. 11ty used only &lt;em&gt;three&lt;/em&gt; user dependencies and &lt;em&gt;four&lt;/em&gt; build-time plugins. &lt;code&gt;package.json&lt;/code&gt; has gone from 118 lines down to just 39.&lt;/p&gt;
&lt;p&gt;You might be asking about using plain JavaScript instead of TypeScript. I’m generally in favour of TypeScript, but you don’t need to have a full build pipeline to benefit from it. In this project, TypeScript only helps with local development, it doesn’t really prevent user-facing bugs. I don’t think the tradeoff is worth it, so instead I used JSDoc comments to add types where I though they would help. Everything is a tradeoff, and I wanted the biggest benefit for the smallest complexity. That’s why I wrote my own &lt;code&gt;groupBy&lt;/code&gt; instead of using lodash.&lt;/p&gt;
&lt;p&gt;Overall, implementing the new site went smoothly with one exception. The thing that furstrated me the most was &lt;a href=&quot;https://www.11ty.dev/docs/plugins/image/&quot;&gt;11ty’s Image plugin&lt;/a&gt;. This is the most (only?) opinionated part of 11ty’s stack. The project clearly wants developers to use new HTML features (like image source sets) to provide multiple resolutions of an image so browsers can choose the best one to display. That makes sense, and Gatsby actually does something similar (albeit using JavaScript). But I just couldn’t really wrap my head around the plugin, it kept getting in my way. And due to &lt;s&gt;me being a stubborn ass&lt;/s&gt; some hard constraints of my directory structure, I couldn’t &lt;em&gt;not&lt;/em&gt; use it.&lt;/p&gt;
&lt;p&gt;Eventually, I figured it out. Actually it was quite easy, once I started &lt;em&gt;actually using my brain&lt;/em&gt;. I had been fighting the Image plugin by proxy, with Claude Code. This is probably a good time to talk about AI.&lt;/p&gt;
&lt;p&gt;I mentiond in the last post that Claude Code had accelerated this project. I think it’s fair to say I would not have gotten this done if Claude Code hadn’t automated some of the most tedious work. But Claude Code was &lt;em&gt;awful&lt;/em&gt; at the start of the project; only when I completed the initial project setup myself was it helpful. Maybe I just needed the context to prompt it, but I didn’t have that context without building the foundation. Near the end of the project, Claude Code became similarly frustrating, especially as I fought with the Image plugin. Once I &lt;s&gt;lost access to my former employer’s Claude Code account&lt;/s&gt; decided to valiantly complete the project on my own terms, it became a lot easier. I had to fully read the docs to understand what the Image plugin was trying to accomplish. Half an hour of using my brain was more rewarding and succesful than fighting with Claude Code.&lt;/p&gt;
&lt;p&gt;In summary, &lt;em&gt;AI tools seem most useful in the middle of a project&lt;/em&gt;. I needed to give them a solid foundation to start from. Simiarly, at the end of the project, they could not polish work to my satisfaction. I think it’s also helpful to be able to maintain this project &lt;em&gt;without&lt;/em&gt; using AI tools; call me old fashioned, but &lt;em&gt;I want to understand the code&lt;/em&gt;. I want to be able to maintain this project even if &lt;s&gt;the AI bubble bursts&lt;/s&gt; my internet connection goes down.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ashfurrow/blog/pull/520&quot;&gt;You can review the pull request here&lt;/a&gt; for insights into my process (ignore the lines-of-code count, as prettier formatted thes blog posts once they were migrated from MDX to markdown).&lt;/p&gt;
&lt;p&gt;I’ve taken pains to make sure the RSS feeds still work as expected, but I always worry about changes that might affect my favourite readers, the RSS nerds. If you see any problems, anywhere on the site, &lt;a href=&quot;https://github.com/ashfurrow/blog/issues/new&quot;&gt;please open an issue&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
    </item>
  </channel>
</rss>