<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Erik Runyon</title>
    <description>Home of Erik Runyon. Technical Director for the University of Notre Dame Web Team.</description>
    <link>https://erikrunyon.com/</link>
    <atom:link href="https://erikrunyon.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 17 Jan 2026 20:13:35 +0000</pubDate>
    <lastBuildDate>Sat, 17 Jan 2026 20:13:35 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>CSS random()</title>
        <description>&lt;p&gt;Safari recently implemented a non-standard (yet?) CSS random() function (currently only in WebKit, and not yet part of any CSS specification). Since many recent CSS features are directly aimed at replacing common JavaScript functionality, I expected this function to do the same. While it has some neat use cases, it doesn’t cover most of the scenarios where I currently use JavaScript’s Math.random().
&lt;!-- more --&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-it-does&quot;&gt;What it does&lt;/h2&gt;

&lt;p&gt;The basic format of the function follows the pattern “random(min, max, step)”. For instance, if you want to assign an element a random height between 50px and 200px, you would use “height: random(50px, 200px)”. You can also include a “step” value like so “height: random(50px, 200px, 50px)” where the values will always be a multiple of 50. You can see more examples on the WebKit post &lt;a href=&quot;https://webkit.org/blog/17285/rolling-the-dice-with-css-random/&quot;&gt;“Rolling the Dice with CSS random()”&lt;/a&gt; and Frontend Masters &lt;a href=&quot;https://frontendmasters.com/blog/very-early-playing-with-random-in-css/&quot;&gt;“Very Early Playing with random() in CSS”&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-it-doesnt&quot;&gt;What it doesn’t&lt;/h2&gt;

&lt;p&gt;Currently, random() can only be used in numeric or color contexts — not in selectors or string values like URLs or text content. I have two primary use cases, and one just for fun. All three are marked-up as I would expect to use them if they were supported in the CodePen below.&lt;/p&gt;

&lt;h3 id=&quot;random-items-from-a-collection&quot;&gt;Random items from a collection&lt;/h3&gt;

&lt;p&gt;A common pattern on many Notre Dame sites would be to show a random item from a collection. These could be content such as faculty spotlights, recent publications, or student profiles. We always know how many we’re choosing from, and they’re always contained to a specific section. So being able to use CSS to show a random child using “:nth-child” would be fantastic.&lt;/p&gt;

&lt;h3 id=&quot;random-images&quot;&gt;Random images&lt;/h3&gt;

&lt;p&gt;Less common is showing random images. This could be in a feature area on the homepage, or even a decorative background image. This would require the ability to concatenate a string with the random number.&lt;/p&gt;

&lt;h3 id=&quot;random-numbers&quot;&gt;Random numbers&lt;/h3&gt;

&lt;p&gt;A “just for fun” feature would be displaying the value from the random() function. My initial thought would be a CSS only dice roller. The demo in the pen would require being able to display the random value in an “::after” pseudo element.&lt;/p&gt;

&lt;iframe height=&quot;500&quot; style=&quot;width: 100%;&quot; scrolling=&quot;no&quot; title=&quot;Wishlist - Random Content with CSS random()&quot; src=&quot;https://codepen.io/erunyon/embed/QwyvabM?default-tab=result&quot; frameborder=&quot;no&quot; loading=&quot;lazy&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&quot;https://codepen.io/erunyon/pen/QwyvabM&quot;&gt;
  Wishlist - Random Content with CSS random()&lt;/a&gt; by Erik Runyon (&lt;a href=&quot;https://codepen.io/erunyon&quot;&gt;@erunyon&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;

&lt;p&gt;While none of these examples are difficult to accomplish with JavaScript, it’s always nice use CSS alone when possible. What use cases do you have for CSS random() that aren’t currently supported.&lt;/p&gt;
</description>
        <pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2025/10/css-random/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2025/10/css-random/</guid>
        
        
        <category>CSS</category>
        
        <category>Web Development</category>
        
      </item>
    
      <item>
        <title>Digital Collegium 2025</title>
        <description>&lt;p&gt;My presentation for &lt;a href=&quot;https://events.digicol.org/digicol25/&quot;&gt;Digital Collegium 2025&lt;/a&gt; was an overview of many recent and forthcoming additions to the web platform, specifically HTML and CSS.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;h2 id=&quot;description&quot;&gt;Description&lt;/h2&gt;

&lt;h3 id=&quot;roll-for-sanity-surviving-the-ever-expanding-web-feature-bestiary&quot;&gt;Roll for sanity: Surviving the ever-expanding web feature bestiary&lt;/h3&gt;

&lt;p&gt;Are you, brave front-end adventurer, feeling your sanity slipping as the Ever-Expanding Web Feature Bestiary grows with each browser update? Have you encountered strange and powerful creatures like “popovers” and “functions” and wondered how to tame them?&lt;/p&gt;

&lt;p&gt;Join us on this perilous quest as we delve into the depths of the latest web platform additions. We will examine these fearsome beasts, dissecting their syntax and revealing their practical applications in the realm of higher ed. We’ll learn to harness their power for real-world encounters, and even glimpse into the future, where new and even more formidable creatures lurk.&lt;/p&gt;

&lt;p&gt;Prepare your character sheets, sharpen your coding blades and roll for sanity as we navigate this challenging and ever-evolving landscape. Will you emerge victorious, a master of the modern web, or will the Bestiary claim your mind?&lt;/p&gt;

&lt;h2 id=&quot;presentation&quot;&gt;Presentation&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://events.digicol.org/digicol25/session/3090295/roll-for-sanity-surviving-the-ever-expanding-web-feature-bestiary&quot;&gt;Conference presentation details&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/erunyon/digicol2025&quot;&gt;Presentation/Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025 Dashboard&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/web-platform-tests/interop/issues?q=is%3Aissue%20state%3Aopen%20label%3Afocus-area-proposal&quot;&gt;2026 interop proposals&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/baseline&quot;&gt;Web Platform Baseline&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://webstatus.dev/&quot;&gt;Web Platform Status&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://microsoftedge.github.io/Demos/css-gap-decorations/playground.html&quot;&gt;CSS Gap Decorations playground&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;keeping-up-with-new-features&quot;&gt;Keeping up with new features&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/series/new-to-the-web&quot;&gt;New to the web platform&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://thinkdobecreate.com/&quot;&gt;Stephanie Eckles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ishadeed.com/&quot;&gt;Ahmad Shadeed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/kevinpowell&quot;&gt;Kevin Powell (YouTube)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://frontendmasters.com/&quot;&gt;Frontend Master&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2025/09/digicol2025/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2025/09/digicol2025/</guid>
        
        
        <category>Web Development</category>
        
        <category>Conference</category>
        
      </item>
    
      <item>
        <title>Lighting an Ikea Billy Bookcase</title>
        <description>&lt;p&gt;This past December I had the opportunity to put together my first proper home office. One aspect of the office is a bookshelf to corral all my books and memorabilia that up to this point have been scattered around the house. For this project I utilized three Ikea Billy bookcases, but to make the project really shine, I added LED lighting. Let’s go over the products and process I followed to set this up.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;h2 id=&quot;tldr&quot;&gt;TL;DR&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;LED and wire channels = clean finish&lt;/li&gt;
  &lt;li&gt;Cable management = worth the effort&lt;/li&gt;
  &lt;li&gt;Splicing wires = most time-consuming&lt;/li&gt;
  &lt;li&gt;End result = cozy, nerd-approved display&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;shopping-list&quot;&gt;Shopping List&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.ikea.com/us/en/p/billy-bookcase-black-oak-effect-00477337/&quot;&gt;Ikea Billy bookcase&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.ikea.com/us/en/p/hoegbo-glass-door-black-20530249/&quot;&gt;Ikea HÖGBO glass doors&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B09TDYKCBY&quot;&gt;LED Strip Lights - 16.4ft 3000K Dimmable&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0CNYW6NVM&quot;&gt;LED Strip Channel Diffuser&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0BLYLX8XX&quot;&gt;Black cable channel&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B07SLBD1FY&quot;&gt;22/2 AWG Red/Black Electrical Wire&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.amazon.com/dp/B0DF3L9QCB&quot;&gt;20 Pack COB 0.31in(8mm) 2-pin Transparent Connector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;tools-needed&quot;&gt;Tools needed&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Electric drill for drilling wiring holes in the back of the case and attaching difuser channel&lt;/li&gt;
  &lt;li&gt;Hacksaw for cutting difuser channel&lt;/li&gt;
  &lt;li&gt;Tin-snips for cutting cable channel&lt;/li&gt;
  &lt;li&gt;Screwdriver and allen wrenches&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-group.jpg&quot; width=&quot;1600&quot; height=&quot;921&quot; alt=&quot;Two empty brown bookshelves stand against a vibrant green wall&quot; /&gt;
  &lt;figcaption&gt;Two of the three shelves assembled and ready for wiring&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The HÖGBO doors come with inserts to hide the contents, but since the whole point here is to enjoy the display, I left those off. The reason for the doors is to keep everything inside relatively dust-free. These doors are made for the Billy cases, so they’re relatively easy to install.&lt;/p&gt;

&lt;h2 id=&quot;step-1-led-channel&quot;&gt;Step 1: LED channel&lt;/h2&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-channel.jpg&quot; width=&quot;1429&quot; height=&quot;952&quot; loading=&quot;lazy&quot; alt=&quot;The underside of a bookshelf with a black channel affixed to one edge&quot; /&gt;
  &lt;figcaption&gt;LED diffuser channel installed on underside of shelf&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A big priority for this project was to make the lighting look as clean as possible. So for step one I cut and installed the channel diffuser along the front lip of shelf. The diffuser channel is alumnium, so I used a hacksaw to cut to length. Luckily there was enough space between the shelf mounts and the front lip. To allow space for the wiring to run from the diffuser channel to the cable channel (see step #2), I cut a small notch.&lt;/p&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-channel-notch.jpg&quot; width=&quot;1600&quot; height=&quot;900&quot; loading=&quot;lazy&quot; alt=&quot;Closeup of the black diffuser channel with a notch cut out of one end.&quot; /&gt;
  &lt;figcaption&gt;Diffuser channel with notch for wiring&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;To connect the LED strip to the wiring I used 2-pin transparent connectors. This way the LED strip was only running along the front of the shelf, and the wiring could then do a 90-degree turn to head out the back of the case. If you look close, you would be able to see the connectors at the right end of the LED strip near the wall of the shelf. But I made sure these connections were at the door end of my office, so they’re less noticeable.&lt;/p&gt;

&lt;h2 id=&quot;step-2-cable-channel&quot;&gt;Step 2: Cable channel&lt;/h2&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-channel-and-track.jpg&quot; width=&quot;1600&quot; height=&quot;900&quot; loading=&quot;lazy&quot; alt=&quot;Closeup of bookshelf diffuser track and cable channel on the underside of a shelf.&quot; /&gt;
  &lt;figcaption&gt;Diffuser and cable channel installed&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The cable channel is added to the underside of each shelf to hide the wiring that runs from the LED strips to the back of the shelf where the wiring is joined. For this I drilled a hole just large enough for the wiring. This is a peel-and-stick product, so installation was simply a matter of cutting the plastic channel to fit, and then sticking it to the underside of the shelf. &lt;strong&gt;NOTE:&lt;/strong&gt; Due to how I ran the wiring through the back of the shelf, it does not allow for future adjustment to the height of the shelves. It’s not an issue in my case since I was going for a symmetrical, even-height look.&lt;/p&gt;

&lt;h2 id=&quot;step-3-connecting-the-wires&quot;&gt;Step 3: Connecting the wires&lt;/h2&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-channels-and-light.jpg&quot; width=&quot;1600&quot; height=&quot;900&quot; loading=&quot;lazy&quot; alt=&quot;A lit LED strip with the red/black wiring hidden by cable channel.&quot; /&gt;&lt;/figure&gt;

&lt;p&gt;The LED kit I purchased came with two 5-meter (16.4 ft) LED strips. The included controller had two outputs, one for each strip. Since I’m lighting nine separate shelves and the top of the cases, this required quite a bit of wire splicing. But since all of the cables were exiting through the back of the cases, it was easy to hide the mess. Wiring was easily the most labor intensive part of the project as there was quite a bit of experimentation and testing before I found a solution that I liked and worked well.&lt;/p&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-wires.jpg&quot; width=&quot;1600&quot; height=&quot;972&quot; loading=&quot;lazy&quot; alt=&quot;Six sets of red and black wires connected by yellow wire nuts.&quot; /&gt;
  &lt;figcaption&gt;One example of splicing the wires running to each strip&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;step-4-finish-adding-light-strips&quot;&gt;Step 4: Finish adding light strips&lt;/h2&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-lighting-progress.jpg&quot; width=&quot;1600&quot; height=&quot;1023&quot; loading=&quot;lazy&quot; alt=&quot;Three assembled shelves side-by-side with lighting mostly installed. There are some figurines on the shelf, and a LEGO bonsai on the adjoining bookcase.&quot; /&gt;
  &lt;figcaption&gt;All wiring connected&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I forgot to take some intermittent shots at this juncture. I installed LED strips along the underside of each shelf for an even glow across all levels. Connecting the light strips was probably the easiest and fastest step in the process. As you can see in the image above, none of the red/black wiring is visible. All that’s left is to finish attaching the top LED strip. After that comes the fun part… DECORATING!&lt;/p&gt;

&lt;h2 id=&quot;the-finished-product&quot;&gt;The finished product&lt;/h2&gt;

&lt;p&gt;My daughter was a big help in this final step. Much to my wife’s delight, we gathered all of the books and trinkets and began the organizing process. We attempted to organize by theme and genre as much as possible. But given that it’s a mad collection of various books, 80’s toys, and general nerddom trinkets, it was at times a challenge. And I have been adding and removing items as I’ve found more stuff stashed away in boxes. As soon as I can find my original NES, it will joining the collection (I know it’s in a box in the basement somewhere). The end result is a great backdrop for my new home office.&lt;/p&gt;

&lt;figure class=&quot;inline-block&quot;&gt;&lt;img src=&quot;/images/2025/bookshelf-final.jpg&quot; width=&quot;1600&quot; height=&quot;968&quot; loading=&quot;lazy&quot; alt=&quot;Three bookshelves side-by-side lit with LED lighting. The shelves are filled with a variety of books, Amiibo, and toys. There are seven plants on top alongside a Darth Vader carrying case.&quot; /&gt;
  &lt;figcaption&gt;Lit and decorated (photographed at 100% brightness)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The lighting kit is dimmable which is great. I almost never run at full brightness. In the morning, I go with 10% brightness. Later in the day I’ll bump up to 25-50%. It just depends on time of day, weather (light coming in through the windows), and general mood.&lt;/p&gt;

&lt;p&gt;If you have a use-case for lighted shelves, I highly recommend this project. It really makes the space feel cozy. However, if you’re not comfortable working with low-voltage wiring, I would recommend finding light strips that are already cut to length.&lt;/p&gt;
</description>
        <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2025/04/lighting-an-ikea-billy-bookcase/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2025/04/lighting-an-ikea-billy-bookcase/</guid>
        
        
        <category>DIY</category>
        
      </item>
    
      <item>
        <title>HighEdWeb 2024</title>
        <description>&lt;p&gt;My presentation for &lt;a href=&quot;http://2024.highedweb.org/&quot;&gt;HighEdWeb 2024&lt;/a&gt; was an overview of many recent and forthcoming additions to the web platform, specifically HTML and CSS.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;h2 id=&quot;description&quot;&gt;Description&lt;/h2&gt;

&lt;h3 id=&quot;css-is-awesome&quot;&gt;CSS is Awesome&lt;/h3&gt;

&lt;p&gt;Over the past few years, CSS has been gaining features at a rate that is almost impossible to follow. Features that once required pre-processors are now native to the platform. Variables? Check. Nesting? Check. And now there’s even whispers of mixins.&lt;/p&gt;

&lt;p&gt;During this presentation we will examine many of the latest features added to CSS including layers, container queries, subgrid, nesting, and probably the dozens of others added since this presentation was submitted. We will discuss the syntax and look at real-world use-cases. We will also briefly cover what’s on the horizon for CSS.&lt;/p&gt;

&lt;h2 id=&quot;presentation-links&quot;&gt;Presentation Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://events.highedweb.org/heweb24/session/2154395/css-is-awesome&quot;&gt;Conference presentation details&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://speakerdeck.com/erunyon/css-is-awesome&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/erunyon/hew2024&quot;&gt;Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;web-platform-info&quot;&gt;Web Platform Info&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wpt.fyi/interop-2024&quot;&gt;Interop 2024 Dashboard&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/baseline&quot;&gt;Web Platform Baseline&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://webstatus.dev/&quot;&gt;Web Platform Status&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;keeping-up-with-new-features&quot;&gt;Keeping up with new features&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://web.dev/series/new-to-the-web&quot;&gt;New to the web platform&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://thinkdobecreate.com/&quot;&gt;Stephanie Eckles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ishadeed.com/&quot;&gt;Ahmad Shadeed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/kevinpowell&quot;&gt;Kevin Powell (YouTube)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2024/09/heweb2024/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2024/09/heweb2024/</guid>
        
        
        <category>Web Development</category>
        
        <category>Conference</category>
        
      </item>
    
      <item>
        <title>A Tweetbot Shaped Hole</title>
        <description>&lt;p&gt;To the best of my memory &lt;a href=&quot;https://tapbots.com/tweetbot/&quot;&gt;Tweetbot&lt;/a&gt; has been my window into Twitter since pretty close to when it was released. I open Twitter’s web interface from time to time when I had to, but it has not been my primary way to use the service for well over a decade. There are multiple reasons I was fine with living as a second-class Twitter citizen. Primarily no ads, no algorithmic timeline, and syncing between mobile/desktop clients.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;I use a three monitor setup at both home and the office. The left is always my laptop, and the right is a vertical 24-inch monitor. That right monitor is used for two purposes.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A browser with dev-tools docked to the bottom (the extra vertical space is quite nice).&lt;/li&gt;
  &lt;li&gt;All my social/communications apps. This typically includes Slack, Messages, Discord, and up until recently Tweetbot. Having them all together on one screen (and covered by a browser the majority of the time) cuts down on distractions coming from any of them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, for the last two weeks there has been no Tweetbot. It’s former home now a glaring absence showing the desktop below. And gone with it is my consumption of Twitter. To say I dislike the Twitter web interface and native apps is an understatement. So for the past two weeks &lt;a href=&quot;https://webperf.social/@erunyon&quot;&gt;I’ve been exclusively on Mastodon&lt;/a&gt;. And since I’ve gained access to &lt;a href=&quot;https://tapbots.com/ivory/&quot;&gt;Ivory&lt;/a&gt; (by Tapbots) I’ve found I don’t miss Twitter. The community on Mastodon has been growing rapidly, so if you’ve been putting off trying it out, I would encourage you to at least set up an account and start lurking.&lt;/p&gt;

&lt;p&gt;So like many others, outside of posting to my teams work account, I’m done with Twitter. The new management have made it place I no longer want or need to be.&lt;/p&gt;

&lt;p&gt;So if you need me, I’ll be over on &lt;a href=&quot;https://webperf.social/@erunyon&quot;&gt;webperf.social Mastodon&lt;/a&gt;. And hopefully soon there will be a Mac version of Ivory to take up residence in that glaring Tweetbot shaped hole.&lt;/p&gt;
</description>
        <pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2023/01/tweetbot-shaped-hole/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2023/01/tweetbot-shaped-hole/</guid>
        
        
        <category>Social Media</category>
        
      </item>
    
      <item>
        <title>State of CSS 2022</title>
        <description>&lt;p&gt;A great overview of all the latest and upcoming CSS features. Presented by &lt;a href=&quot;https://nerdy.dev&quot;&gt;Adam Argyle&lt;/a&gt; at Google I/O ‘22.&lt;/p&gt;
</description>
        <pubDate>Tue, 17 May 2022 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2022/05/state-of-css-2022/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2022/05/state-of-css-2022/</guid>
        
        
        <category>Snippet</category>
        
        <category>Web Development</category>
        
      </item>
    
      <item>
        <title>Connecting to the PassKit API with Ruby</title>
        <description>&lt;p&gt;We were recently testing &lt;a href=&quot;https://passkit.com/&quot;&gt;PassKit&lt;/a&gt; as a way of managing membership cards for giving societies. Passkit is very up-front that they are not a CRM and strongly suggest using their API for integrating with outside systems, or for editing pretty much any data. To kick the tires, we set up some very basic scripts to connect to the Passkit API.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.passkit.io/protocols/member/#section/Authentication&quot;&gt;A REST example&lt;/a&gt; can be found on their docs. The example below shows &lt;a href=&quot;https://gist.github.com/erunyon/dd62cf77af9c70d6822e9775ce19be9f&quot;&gt;how to get a programs’s info using Ruby&lt;/a&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/erunyon/dd62cf77af9c70d6822e9775ce19be9f.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;The process consists of two steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Generate the payload and token using the &lt;a href=&quot;https://github.com/jwt/ruby-jwt&quot;&gt;jwt&lt;/a&gt; gem.&lt;/li&gt;
  &lt;li&gt;Connect to the API endpoint using &lt;a href=&quot;https://github.com/jnunemaker/httparty&quot;&gt;HTTParty&lt;/a&gt; passing the token value with the “Authorization” header.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it! From there you can modify the HTTParty path for whatever endpoint you need. Just be sure to adjust the verb and “body” in the call accordingly.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.passkit.io/protocols/member/#section/Introduction&quot;&gt;PassKit API docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 07 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2022/02/connecting-to-the-passkit-api-with-ruby/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2022/02/connecting-to-the-passkit-api-with-ruby/</guid>
        
        
        <category>Web Development</category>
        
        <category>Ruby</category>
        
      </item>
    
      <item>
        <title>My Challenge to the Web Performance Community</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/philwalton&quot;&gt;Philip Walton&lt;/a&gt; on the difficulties the webperf community faces when discussing web performance. Simple numbers don’t cut it. We need to provide context when discussing performance results.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What concerns me about this practice is that it glosses over a lot of important nuance, and it perpetuates the idea that synthetic or lab-based tools (like Lighthouse, WebPageTest, and many others) are genuine and precise assessments of a site’s actual, real-world performance—rather than what they are: tools to test, debug, diagnose, optimize, and predict performance or detect regressions under a set of controlled conditions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m definitely guilty of the simplicity he discusses. Thanks for the challenge Philip.&lt;/p&gt;
</description>
        <pubDate>Wed, 06 Oct 2021 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2021/10/my-challenge-to-the-web-performance-community/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2021/10/my-challenge-to-the-web-performance-community/</guid>
        
        
        <category>Snippet</category>
        
        <category>Web Development</category>
        
      </item>
    
      <item>
        <title>RSS and XSL Content-Type Requirement</title>
        <description>&lt;p&gt;We’ve provided Atom/RSS feeds for News and Events in our custom CMS at Notre Dame for well over a decade. However, if a visitor ended up on the url they were greeted with an unhelpful screen of XML. I decided to remedy this by appying some XSLT and styles to improve the user experience. However, even after reviewing several tutorials, I couldn’t get it to work.
&lt;!-- more --&gt;&lt;/p&gt;

&lt;p&gt;I was sure I had the templates and markup configured correctly. I even tested outside of the system using very basic test files. I finally started to question whether the Application-Type was correct. One tutorial mentioned making sure you served the correct type, but didn’t go into detail as to what the type should be. Since the very beginning, we would serve our Atom/RSS feeds with &lt;strong&gt;application/atom+xml; charset=utf-8&lt;/strong&gt; and &lt;strong&gt;application/rss+xml; charset=utf-8&lt;/strong&gt; respectively. What I discovered is that the Application-Type instead should be &lt;strong&gt;text/xml; charset=utf-8&lt;/strong&gt;. Once that was set in my test files everything started to work. Going back the Rails application and setting Application-Type in the “response.headers” and bingo, glorious formatting and styles.&lt;/p&gt;

&lt;p&gt;I don’t expect many users to end up seeing the results of this change. But for those that do, they’ll have an explanation about what a feed is as well as links to more resources. So much better than a screen of XML.&lt;/p&gt;
</description>
        <pubDate>Wed, 19 May 2021 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2021/05/rss-and-xsl-content-type-requirement/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2021/05/rss-and-xsl-content-type-requirement/</guid>
        
        
        <category>Web Development</category>
        
        <category>RSS</category>
        
      </item>
    
      <item>
        <title>Higher ed&apos;s slow page speed epidemic</title>
        <description>&lt;p&gt;Joel Goodman of &lt;a href=&quot;https://bravery.co/&quot;&gt;Bravery Media&lt;/a&gt; on the current state of HigherEd homepages.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Regardless, it’s an agency’s responsibility to do as much as possible to make that website a success when it goes live. Do no harm. Slow websites only do harm. Code needs to be optimized, frameworks need to be ditched, images need to be properly sized and deferred, CSS and JavaScript need to be used with efficiency in mind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Indeed&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Mar 2021 00:00:00 +0000</pubDate>
        <link>https://erikrunyon.com/2021/03/higher-eds-slow-page-speed-epidemic/</link>
        <guid isPermaLink="true">https://erikrunyon.com/2021/03/higher-eds-slow-page-speed-epidemic/</guid>
        
        
        <category>Snippet</category>
        
        <category>Web Development</category>
        
      </item>
    
  </channel>
</rss>
