<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>S.R. Wild</title><description>Frontend developer, design engineer, photographer, printmaker, collagist, and maker of things on the internet and beyond located somewhere in Vermont.</description><link>https://www.srwild.com/</link><item><title>Raspberry Pi Infrared Camera</title><link>https://www.srwild.com/blog/raspberry-pi-infrared-camera/</link><guid isPermaLink="true">https://www.srwild.com/blog/raspberry-pi-infrared-camera/</guid><description>Making an infrared camera with a Raspberry Pi Zero</description><pubDate>Sun, 08 Feb 2026 16:32:45 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://www.srwild.com/@images/blog/pinfrared-test-20260111-44.jpg&quot; alt=&quot;A rocky shore with patches of snow at the bottom of the frame curves to the right and then to the center of the frame. The trees along the shore are gray and inverted because they’re reflecting infrared light. Dark clouds are on the left of the sky, and on the right the sky looks bronze.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I’ve been working on building an infrared camera with a Raspberry Pi. I took it to the beach to take some test shots. A partially cloudy evening was not an ideal time, and the photos are still unedited DNGs, but I can see the potential. By spring, I will have all the kinks worked out in time for actual foliage and sunny days.&lt;/p&gt;
&lt;p&gt;There are some issues. Focus is unpredictable; the capture script requires adjustment. The biggest issue is guessing what the composition is, so I need to add some sort of viewfinder. Unpredictability is fun and all, but….&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.srwild.com/@images/blog/pinfrared-test-20260111-45.jpg&quot; alt=&quot;Looking down a road toward a small covered bridge. A person is walking toward the bridge on the side of the road. A tree next to the bridge looks white because of the infrared view.&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Eventually, when I get a good working prototype, I’ll house it in a wooden box to make it aesthetically pleasing and user-friendly. I’m imagining a wood box like early cameras.&lt;/p&gt;
&lt;p&gt;I got the idea from this post where someone &lt;a href=&quot;https://camerahacksbymalcolmjay.substack.com/p/ir-camera-build&quot;&gt;converted a camera into an infrared camera using a Raspberry Pi&lt;/a&gt;. I really liked the photos with vegetation. Looking at the parts and code, it seemed pretty straightforward to me. I used what they did as a starting point.&lt;/p&gt;
&lt;p&gt;Sure, I could convert an old DSLR to infrared, and I probably will someday, but I like building things and doing things the hard way.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.srwild.com/@images/blog/raspberry-pi-camera.jpg&quot; alt=&quot;A grid of four images showing the camera in two small camera battery boxes taped together. Top left: the lens covered with a piece of film. Top right: lens covered with an infrared filter. Bottom left: boxes separated showing the internals of the camera. Bottom right: back of the camera with a small OLED that says “ready” and “photos: 0” &quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The parts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi Zero 2W&lt;/li&gt;
&lt;li&gt;Raspberry Pi Camera v3 NoIR&lt;/li&gt;
&lt;li&gt;OLED display&lt;/li&gt;
&lt;li&gt;Momentary on switch&lt;/li&gt;
&lt;li&gt;USB battery pack. I’m looking for a better solution.&lt;/li&gt;
&lt;li&gt;Cardboard boxes&lt;/li&gt;
&lt;li&gt;720nm infrared filter. It replaced the DIY filter: unexposed, developed film.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Notes of note&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The script is written in Python.&lt;/li&gt;
&lt;li&gt;Photos are saved as DNGs.&lt;/li&gt;
&lt;li&gt;The sensor is 12 MP. The quality is better than I expected.&lt;/li&gt;
&lt;li&gt;Total cost so far is about $75. The IR filter was a third of the cost!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Roadmap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add a viewfinder.&lt;/li&gt;
&lt;li&gt;An enclosure that is not a janky cardboard box.&lt;/li&gt;
&lt;li&gt;Write files to an external SD card. Currently, I have to remotely connect to the camera over SSH in the command line to download the photos.&lt;/li&gt;
&lt;li&gt;Battery that’s in the housing and not stuffed up my sleeve.&lt;/li&gt;
&lt;li&gt;Manual control. It’s currently all automatic.&lt;/li&gt;
&lt;li&gt;Add an intervalometer. I’d build that separately so I could use it on other cameras. That’s another rabbit hole.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Accessible Kaomojis</title><link>https://www.srwild.com/blog/accessible-kaomojis/</link><guid isPermaLink="true">https://www.srwild.com/blog/accessible-kaomojis/</guid><description>Making kaomojis, the emoticons that use a combination of text characters to create images, accessible to assistive tech</description><pubDate>Sun, 09 Nov 2025 16:32:45 GMT</pubDate><content:encoded>&lt;p&gt;Kaomojis are emoticons that use a combination of text characters to represent faces and other visuals. The precursor to emojis we know and abuse. For example, &lt;span&gt;&lt;code&gt;(╯°□°)╯︵ ┻━┻&lt;/code&gt;&lt;/span&gt; or &lt;span&gt;&lt;code&gt;¯\_(ツ)_/¯&lt;/code&gt;&lt;/span&gt;, &lt;span&gt;&lt;code&gt;ᘛ⁐̤ᕐᐷ&lt;/code&gt;&lt;/span&gt;, or the classic &lt;span&gt;&lt;code&gt;:(&lt;/code&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;When a screen reader announces them, it’s frequently not helpful. For the table flip kaomoji, VoiceOver announces the characters and symbols in Japanese that aren’t words or sentences, as far as I could tell. Interestingly, VoiceOver announces the frown kaomoji as “frown,” which makes sense since it’s a common one that’s been used for decades. Emojis, on the other hand, are usually announced with helpful descriptive text. 😹 is announced as “laughing with tears cat face.”&lt;/p&gt;
&lt;p&gt;To make kaomojis and other text-based visuals accessible, add &lt;code&gt;role=&quot;img&quot;&lt;/code&gt; and &lt;code&gt;aria-label&lt;/code&gt;. For more details, read the Web Accessibility Initiative’s (&lt;span&gt;WAI&lt;/span&gt;) article &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/html/H86&quot;&gt;Providing text alternatives for emojis, emoticons, ASCII art, and leetspeak&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span role=&quot;img&quot; aria-label=&quot;Person flipping a table&quot;&amp;gt;(╯°□°)╯︵ ┻━┻&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I do wonder if using visually hidden text would be better because some browsers don’t translate &lt;code&gt;aria-label&lt;/code&gt;. Although, copying the text would copy the visually hidden text along with the kaomoji. I may be overthinking it.&lt;/p&gt;
&lt;p&gt;If you want to get sidetracked and go down an emoji rabbit hole, &lt;a href=&quot;https://shadycharacters.co.uk/books/face-with-tears-of-joy/&quot;&gt;Face with Tears of Joy: A Natural History of Emoji&lt;/a&gt; sounds fun. I haven’t read it yet; it’s on my list. He also wrote &lt;a href=&quot;https://shadycharacters.co.uk/&quot;&gt;Shady Characters&lt;/a&gt;, which is a wonderful book. Isn’t it‽&lt;/p&gt;
&lt;div&gt;
&lt;h2&gt;Did you know?&lt;/h2&gt;
&lt;p&gt;Some emojis are made up from other emojis chained together with a zero-width joiner (&lt;code&gt;\u200D&lt;/code&gt;). I was blown away when I first learned about this. Useless trivia? Maybe not. This could be useful to know if you need to do character counts that contain emojis because 🐻‍❄️ is four characters long!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos;🐻‍❄️&apos;.split(&apos;\u200D&apos;);
// [ &apos;🐻&apos;, &apos;❄️&apos; ]

&apos;👩‍🔬&apos;.split(&apos;\u200D&apos;);
// [ &apos;👩&apos;, &apos;🔬&apos; ]

&apos;👩‍💻&apos;.split(&apos;\u200D&apos;);
// [ &apos;👩&apos;, &apos;💻&apos; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content:encoded></item><item><title>Case-insensitive Git</title><link>https://www.srwild.com/blog/case-insensitive-git/</link><guid isPermaLink="true">https://www.srwild.com/blog/case-insensitive-git/</guid><description>How I learned that Git is not case-sensitive on macOS or Windows, and how I fixed it.</description><pubDate>Sat, 24 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Changing the case of a file on macOS or Windows won’t be recognized by Git. &lt;code&gt;git mv MY-FILE.txt my-file.txt&lt;/code&gt; can be used to tell Git it changed. On Linux, which is case-sensitive, Git does recognize the change. How did I learn this?&lt;/p&gt;
&lt;p&gt;I was building an Astro component to dynamically render SVG components. It’s passed an SVG’s filename as a string, gets all the SVGs as components, finds the right one if it exists, then returns an SVG component — I’m oversimplifying things, it does more.&lt;/p&gt;
&lt;p&gt;When I deployed to Netlify, two SVGs weren’t showing. My work wasn’t complete when I deployed because I wanted to show a coworker what I was working on. I figured I did something silly. Scrolling through the deployment log, I saw &lt;code&gt;Cound not find &quot;my-file.svg&quot;&lt;/code&gt;. But, it was there. I thanked myself for including an error message and got to work.&lt;/p&gt;
&lt;p&gt;I cleaned up the code, added some more error handling, nitpicked, then redeployed. The two SVGs still weren’t showing. “I don’t like that”, I muttered.&lt;/p&gt;
&lt;p&gt;In the component, I temporarily added a &lt;code&gt;console.log()&lt;/code&gt; to print all the SVGs that were being found, and redeployed. After the deployment finished, I scrolled through the long log, and found where all the SVG names were being dumped. I didn’t notice right away, but then I saw &lt;code&gt;My-File.svg&lt;/code&gt; in the array of SVGs. Locally, the filename was &lt;code&gt;my-file.svg&lt;/code&gt;. That’s it!&lt;/p&gt;
&lt;p&gt;I went into the markdown file that set the SVG name in its frontmatter, and changed it to all caps. Now, locally, the SVG wasn’t loading because it was looking for the file in all caps. I found the file, changed it to all caps, then staged the fi… there wasn’t an SVG to stage. I was confused, but then realized Git wasn’t case-sensitive. For kicks, I tried it on Linux, since that’s what Netlify uses, and it did recognize the case change. It all made sense now.&lt;/p&gt;
&lt;p&gt;I changed the filenames back to their original names, then ran &lt;code&gt;git mv File-Name.svg file-name.svg&lt;/code&gt; on each one — there were only two, so no need for a Bash script. I deployed again, and was relieved to see all the SVGs were there. Finally.&lt;/p&gt;
&lt;p&gt;What happened is I changed my mind on the naming convention of SVGs. At the same time, I was adding more SVGs. I didn’t notice the renamed files weren’t being committed because of all the other SVG noise.&lt;/p&gt;
&lt;p&gt;I was reminded of a few things. If the case changes had been separate commits, I would have noticed. Error handling is a good friend. And, of course, I should have written tests in Vitest and Playwright from the start.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I know there’s a way to configure case sensitivity locally, but I would rather not do that. It seems like it could make a mess when working with others, always think about other people. In addition, I know there are multiple puns available to use in this post, but I will not use them. I don’t like puns. Lastly, this is really long, but I’m trying to get better at writing.&lt;/p&gt;
</content:encoded></item><item><title>CSS Console Log</title><link>https://www.srwild.com/blog/css-console-log/</link><guid isPermaLink="true">https://www.srwild.com/blog/css-console-log/</guid><description>A little thing I use for debugging CSS</description><pubDate>Sun, 18 May 2025 19:04:27 GMT</pubDate><content:encoded>&lt;p&gt;I have an Alfred snippet &lt;code&gt;!or&lt;/code&gt; that spits out &lt;code&gt;outline: dashed 1px red;&lt;/code&gt;. I use it numerous times a day to test if a class is working or finding an element on a page. Using &lt;code&gt;outline&lt;/code&gt; prevents elements from resizing. I also add a &lt;code&gt;consolelog&lt;/code&gt; class to my CSS with the same outline property, which is useful for testing conditionally displayed classes.&lt;/p&gt;
</content:encoded></item><item><title>Alpine Content Link</title><link>https://www.srwild.com/blog/alpine-content-link/</link><guid isPermaLink="true">https://www.srwild.com/blog/alpine-content-link/</guid><description>My first npm package. An Alpine plugin for creating clickable cards with content that is still selectable. Your heard it here first.</description><pubDate>Sat, 19 Apr 2025 16:32:45 GMT</pubDate><content:encoded>&lt;p&gt;A frequent component to build is a card. I’ve built many. A common request is to make the card “clickable” — a not so distant relative of “make it pop”. Or, in other words, make the card a link. Click card, something happens.&lt;/p&gt;
&lt;p&gt;Usually, developers wrap a card in an &lt;code&gt;a&lt;/code&gt; element. Which, if you test it with a screen reader, it will announce it as a link, and then all the content in there: image alt text, text, subtitle, or whatever. That’s not helpful for screen reader users. It will also prevent people from selecting the text or right-clicking on the images to download. And, it looks gross.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- DO NOT DO THIS --&amp;gt;
&amp;lt;ul&amp;gt;
  ...
  &amp;lt;li&amp;gt;
    &amp;lt;a href=&quot;/nowhere&quot;&amp;gt;
      &amp;lt;img src=&quot;blep.jpg&quot; alt=&quot;Cat with a blep, holding a pen&quot; /&amp;gt;
      &amp;lt;h2&amp;gt;Cat Doctors of Space&amp;lt;/h2&amp;gt;
      &amp;lt;p&amp;gt;Something something content content stuff and things, oh yeah.&amp;lt;/p&amp;gt;
    &amp;lt;/a&amp;gt;
  &amp;lt;/li&amp;gt;
  ...
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead, the heading should be the link. I can’t recall who said it, but a card is a mini webpage. You wouldn’t make your entire page a link now, would you? No, you would not do that. However, moving the link to the heading, the card has no clicking powers.&lt;/p&gt;
&lt;p&gt;In Heydon Pickering‘s &lt;a href=&quot;https://inclusive-components.design/cards&quot;&gt;Cards chapter in Inclusive Components&lt;/a&gt;, they go over solutions for card links — the book is a valuable resource. I used their solution, but wanted something a little easier to work with. Like, add an attribute, make client happy, dramatically close laptop and walk away.&lt;/p&gt;
&lt;p&gt;I use Alpine on pretty much every project. Unless I’m being a snobby purist(?). I usually create a custom Alpine directive in the codebase for card links. This is fine, but wouldn’t it be easier to install a package? Having more dependencies is always a good idea, so I created &lt;a href=&quot;https://www.npmjs.com/package/@srwild/alpinejs-content-link&quot;&gt;Alpine Content Link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here’s an example of how to use the Alpine content link. For working examples, visit the &lt;a href=&quot;https://www.srwild.com/code&quot;&gt;Code&lt;/a&gt; and &lt;a href=&quot;https://www.srwild.com/work&quot;&gt;Work&lt;/a&gt; index pages of this site.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  ...
  &amp;lt;li x-data x-content-link&amp;gt;
    &amp;lt;img src=&quot;blep.jpg&quot; alt=&quot;Cat with a blep, holding a pen&quot; /&amp;gt;
    &amp;lt;h2&amp;gt;&amp;lt;a href=&quot;/nowhere&quot;&amp;gt;Cat Doctors of Space&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;Something something content content stuff and things, oh yeah.&amp;lt;/p&amp;gt;
  &amp;lt;/li&amp;gt;
  ...
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obviously, since this is my first npm package, I’m sure I’m doing something wrong — I ooze confidence. If so, please let me know, just don’t be a wet sock. I obsessively winged it until things worked and were moderately clean. Making mistakes is a great way to learn, as long as no one gets hurt, like in life.&lt;/p&gt;
&lt;p&gt;Safe journeys, web fans… wherever you are.&lt;/p&gt;
</content:encoded></item><item><title>Starting Over Again</title><link>https://www.srwild.com/blog/starting-over-again/</link><guid isPermaLink="true">https://www.srwild.com/blog/starting-over-again/</guid><pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Jeepers, this is like the 20th time I’ve rebuilt this site. Very few have actually launched. No one but me has seen them, and I’ve forgotten most of them.&lt;/p&gt;
&lt;p&gt;I’m starting fresh. Except &lt;a href=&quot;https://www.srwild.com/blog/my-best-s/&quot;&gt;My Best S&lt;/a&gt;, which I’m proud of, all the old content, what little there was, is gone. Poof. Archived in a folder or git repo, never to be seen again. I don’t know, things change, I change. It’s good to start over. I don’t need or want to preserve everything I’ve ever done or said. Let’s be honest, I doubt more than a few people will actually read this. If you are reading this, hi.&lt;/p&gt;
&lt;p&gt;This version of the site had been in the works for months. It’s not done, nor will it ever be. I’d rather have something up right now that’s better than what I had. Building a site for yourself is hard. I’m never happy with it, and I constantly change it and break it.&lt;/p&gt;
&lt;p&gt;That’s the point of a personal site. It’s something to experiment with. There are no rules, or people to disappoint.&lt;/p&gt;
&lt;p&gt;For the current version of this site, I’m using &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. My previous site was in &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, Jekyll before that, and &lt;a href=&quot;https://textpattern.com/&quot;&gt;Textpattern&lt;/a&gt; before that. Although I absolutely adore Eleventy, I wanted to try something new.&lt;/p&gt;
&lt;p&gt;Brief rundown of what I’m using.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.arrowtype.com/lang&quot;&gt;Lang&lt;/a&gt; by Arrow Type&lt;/li&gt;
&lt;li&gt;Alpine, but there’s not much JavaScript on this site&lt;/li&gt;
&lt;li&gt;&lt;abbr&gt;SCSS&lt;/abbr&gt;&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Netlify&lt;/li&gt;
&lt;li&gt;Deno I had to switch back to Node because Deno 2.0 doesn’t work with Netlify without some work. Deno is rad, though. I’ll switch back to it when I can.&lt;/li&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;li&gt;Vitest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Astro has been fun, and I’ve learned a lot. I’m also using it to build a new site for the agency I work for. Like most of my side projects, my professional projects benefit from them.&lt;/p&gt;
&lt;p&gt;I don’t need a Content Management System (&lt;abbr&gt;CMS&lt;/abbr&gt;) for this site. A &lt;abbr&gt;CMS&lt;/abbr&gt; is overkill for a lot of sites. I write in Markdown, static site generators work with Markdown. The time I’d spend setting up a &lt;abbr&gt;CMS&lt;/abbr&gt; could be spent doing more important things, like adding Easter Eggs.&lt;/p&gt;
&lt;p&gt;This not a good post. To be honest, I just wanted to write something, so I had at least one post on the site when I launched it. If you’ve read this far, wow.&lt;/p&gt;
</content:encoded></item><item><title>My Best S</title><link>https://www.srwild.com/blog/my-best-s/</link><guid isPermaLink="true">https://www.srwild.com/blog/my-best-s/</guid><pubDate>Sun, 15 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I think this is the best S I’ve drawn. Ss are really hard to make. It’s not perfect, but I’m very pleased with it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.srwild.com/images/blog/my-best-s.jpg&quot; alt=&quot;Hand drawn sans serif letter s in pencil on paper. The lines have been erased and redrawn many times so there’s a lot of smudges. The paper is white but it’s almost a light gray from all the erasing. Parts of other letters can be seen on the edges.&quot; /&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>