<?xml version="1.0" encoding="UTF-8"?><rss 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" version="2.0"><channel><title><![CDATA[Blog feed]]></title><description><![CDATA[Riley J. Shaw is a programmer and designer. Rooted in repair and craft, he creates transparent, remixable tools for a sustainable and accessible future.]]></description><link>https://rileyjshaw.com</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 06 May 2026 16:22:03 GMT</lastBuildDate><item><title><![CDATA[Introducing: ShaderPad]]></title><description><![CDATA[Today I’m releasing ShaderPad. It’s a small, focused library to put a shader on a website without rebuilding the same graphics scaffolding every time. If you want to experiment with writing shaders, I think this is one of the best ways to get started. Motivation

If you’ve spent much time on this website, you know I mainly use my computer to doodle. Shaders are an expressive way to sketch with code. There are many shader sandboxes online, most notably ShaderToy, that make it easy to write shaders. But platform lock-in makes moving these sketches onto your own website a hassle.

After wiring up the same…]]></description><link>https://rileyjshaw.com/blog/introducing-shaderpad</link><guid isPermaLink="false">POST_INTRODUCING_SHADERPAD</guid><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate></item><item><title><![CDATA[Scaling faders: do these exist?]]></title><description><![CDATA[Occasionally, clumsily, I make music. I had a drum kit when I was growing up. Making music looked like this:

Sit down.Hit drums for an hour.

Now I’ve grown up, so I share walls with landlords and neighbours whose love is conditional. And though I’ve managed to fit drums into some astonishing nooks, my recent apartments haven’t had room for surfaces that I don’t eat or sleep on.

These days, I make music with a keyboard or drum pad connected to my computer. It’s the same computer that I spend most of my time…]]></description><link>https://rileyjshaw.com/blog/scaling-faders</link><guid isPermaLink="false">POST_SCALING_FADERS</guid><pubDate>Tue, 17 Nov 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[I oppose Amendment 3 to the .COM Registry Agreement]]></title><description><![CDATA[ICANN is the governing body for the Internet’s domain name system. They are responsible for enabling and achieving “broad representation of the global Internet community”. Over the past few years they have proven to be shady, if not downright corrupt. Last…]]></description><link>https://rileyjshaw.com/blog/ICANN-Amendment-3</link><guid isPermaLink="false">POST_ICANN_AMENDMENT_3</guid><pubDate>Mon, 10 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Repair Matters on CBC Radio]]></title><description><![CDATA[I was on the CBC again! Kady Wong and I representedRepair Matters on BC Today this afternoon. You can listen to the segment here. It starts at 33:30.]]></description><link>https://rileyjshaw.com/blog/repair-matters-on-cbc-radio</link><guid isPermaLink="false">POST_REPAIR_MATTERS_ON_CBC_RADIO</guid><pubDate>Mon, 16 Sep 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[I have a new blog]]></title><description><![CDATA[I made this website in early 2014 to document projects I worked on at Hacker School. Though I’ve changed a lot since then and worked on all sorts of problems, the site hasn’t updated to reflect that. After three years working on Khan Academy’s engineering team, I left to pursue art and activism full time at the School for Poetic Computation. I’m posting snippets at sfpc.rileyjshaw.com.

At some point I’ll update this site to reflect my current focus. For the time being, I’ve merged my waaay outdated portfolio into the lab.

For more about what I’m focusing on at the moment, you can check out my application to SFPC. It’s half a year out of date at time of writing, but that’s more recent than…]]></description><link>https://rileyjshaw.com/blog/i-have-a-new-blog</link><guid isPermaLink="false">POST_I_HAVE_A_NEW_BLOG</guid><pubDate>Mon, 05 Mar 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[“D30U30: You’re in Canadian Business!”]]></title><description><![CDATA[A few months ago I was nominated for a dubious “Developer 30 Under 30” award. I attended the first reception to speak with the organizers about representation in tech, and the impact these lists have on how we (individually and collectively) identify who moves into STEM. I wanted to ensure they took this seriously; specifically, that they wouldn’t promote a toxic status quo. Then this happened: There was a lot of internal discussion about “fairness”, etc. Most was disappointing and unsurprising; some was encouraging. The list got re-ordered, for whatever that’s worth. But if there was any lingering doubt in your mind about industry awards, they are 100% made up and unrepresentative of…]]></description><link>https://rileyjshaw.com/blog/D30U30</link><guid isPermaLink="false">POST_D30U30</guid><pubDate>Thu, 27 Apr 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[All of which are American dreams]]></title><description><![CDATA[Title lifted from . The results of the US presidential election last Tuesday shocked me. I checked Twitter to find that my entire feed felt the same. Again. Oops, I created a comfortable echo-chamber for myself.

Social news algorithms have been under intense scrutiny over the past week. I wanted to see what other people’s social media bubbles looked like, so I wrote a little shell script1.

I’m not interested in building empathy for racists. I am interested in improving my own awareness. This tool displaces me from the narrative I chose and delivers me from opinions I agree with. It’s helped me realize just how powerful a curated social feed can be as a tool of persuasion…]]></description><link>https://rileyjshaw.com/blog/all-of-which-are-american-dreams</link><guid isPermaLink="false">POST_ALL_OF_WHICH_ARE_AMERICAN_DREAMS</guid><pubDate>Sun, 13 Nov 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Escher Sketch!]]></title><description><![CDATA[I just had a blast playing with Anselm Levskaya’s Escher Sketch project!]]></description><link>https://rileyjshaw.com/blog/eschersketch</link><guid isPermaLink="false">POST_ESCHERSKETCH</guid><pubDate>Wed, 10 Feb 2016 00:00:00 GMT</pubDate></item><item><title><![CDATA[Khan Academy: a new employee’s primer]]></title><description><![CDATA[I recently joined the developer team at Khan Academy. Since arriving I’ve been surprised by a number of intentional decisions the organization has made to empower its developers. Whether you’re working in tech or just curious about the inner workings of Khan Academy, there’s some great wisdom in how things are done here. All aboard!

A benefit of working at an education startup is that everyone naturally puts a lot of thought into information design. As a result, this has been the smoothest onboarding I’ve experienced.

Onboarding…]]></description><link>https://rileyjshaw.com/blog/khan-academy-primer</link><guid isPermaLink="false">POST_KHAN_ACADEMY_PRIMER</guid><pubDate>Mon, 20 Jul 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[How to generate a static site from a folder of assets using Gulp]]></title><description><![CDATA[An entirely skippable preface (Seriously, we don’t start building it until the third section.)

While going through some of my dustier folders on a flight to Hawaii I came across . It’s a lovely book with plenty of inspiration for simple demos; perfect plane material.

After working through a few chapters, I moved my particle system and canvas logic into their own util.js file. Until then i’d been creating a new HTML file for each demo, manually adding the title, script includes, and next/previous links. This meant that I had to edit each file to include util.js. It was a frustrating amount of overhead considering each demo only took a few minutes to write.

didn’t someone…]]></description><link>https://rileyjshaw.com/blog/how-to-generate-a-static-site-from-a-folder-of-assets-using-Gulp</link><guid isPermaLink="false">POST_HOW_TO_GENERATE_A_STATIC_SITE_FROM_A_FOLDER_OF_ASSETS_USING_GULP</guid><pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[The pool on the roof must have a leak]]></title><description><![CDATA[Today we hiked the Kalalau Trail and swam beneath the cold spray of a waterfall. Today we discussed the finer points of the axolotl protocol used by TextSecure.

Today we delighted in “shave ice”, a local delicacy that is definitely not a snow cone.

Today we wrote copy, polished features, closed bugs, and merged pull-requests.

Measured by lines of code, today was short. Measured by steps taken, it was tall. Measured by ideas discussed, things learned, and sights seen, it was towering.

For the past week and a half I’ve been trapped on an island among a team of brilliant hackers. A curious duality exists on the island. At sunrise, stand…]]></description><link>https://rileyjshaw.com/blog/the-pool-on-the-roof-must-have-a-leak</link><guid isPermaLink="false">POST_THE_POOL_ON_THE_ROOF_MUST_HAVE_A_LEAK</guid><pubDate>Wed, 21 Jan 2015 00:00:00 GMT</pubDate></item><item><title><![CDATA[Graphing depth]]></title><description><![CDATA[There’s something magical about a procedure that just works. Even if you don’t understand why it works, having a set of steps that will always get you to the same destination feels nice. In life there are few patterns that consistently produce the same outcome. But in math? Hoo boy… This post takes us through two very simple procedures that converge to a numerical endpoint. We’re going to graph the amount of time it takes to reach this endpoint, which actually ends up being quite pretty.

Careful; such routines can be somewhat of a rabbit hole. As xkcd’s Randall Munroe puts it,

The Collatz Conjecture states that if you pick a number, and if it’s even divide it by two and if it’s odd…]]></description><link>https://rileyjshaw.com/blog/graphing-depth</link><guid isPermaLink="false">POST_GRAPHING_DEPTH</guid><pubDate>Thu, 04 Dec 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Stealing history with CSS binary trees]]></title><description><![CDATA[History-sniffing attacks let front-end code peek at other sites you’ve visited. They can be used to target ads, steal information, or discern your identity. Creepy. Historically, one of the most popular history-sniffing techniques was to style  links using CSS and check their color with JavaScript. Major browsers started implementing privacy changes to address this attack in 2010.1 As a result, JavaScript’s  now returns unvisited styles for visited sites.

Even with these limitations there are a number of ways to scrape a user’s…]]></description><link>https://rileyjshaw.com/blog/stealing-history-with-CSS-binary-trees</link><guid isPermaLink="false">POST_STEALING_HISTORY_WITH_CSS_BINARY_TREES</guid><pubDate>Wed, 12 Nov 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Riddle: chicken prices]]></title><description><![CDATA[Someone posted a riddle a few days ago: Three farmers were selling chickens at the local market. One farmer had 10 chickens to sell, another had 16 chickens to sell, and the last had 26 chickens to sell. In order not to compete with each other, they agreed to all sell their chickens at the same price. But by lunchtime, they decided that sales were not going so well, and they all decided to lower their prices to the same lower price point. By the end of the day, they had sold all their chickens. It turned out that they all collected the same amount of money, $35, from the day’s chicken sales. What was the price of the chickens before lunchtime and after lunchtime?

I’d been nerd sniped, and…]]></description><link>https://rileyjshaw.com/blog/chicken-prices</link><guid isPermaLink="false">POST_CHICKEN_PRICES</guid><pubDate>Tue, 28 Oct 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Fin?]]></title><description><![CDATA[I started writing this in April. It began, Three months ago I was in Toronto, squeezing in one last show at The Rex before shipping off to New York.

I had just finished Hacker School and wanted to write a retrospective post. I also wanted to officially resign from the Iron Blogger crew. But I was on a kiteboarding trip at the time, and the wind was picking up.

My three preceding posts are shoddy. Two are short quotes from materials I’d been reading through. The other reads like an assignment. All three were started on Monday morning before check-ins because I didn’t want to lose a bet.

I’m glad that I have a blog now. It’s a great way to share cool things that I’ve learned and silly things…]]></description><link>https://rileyjshaw.com/blog/fin</link><guid isPermaLink="false">POST_FIN</guid><pubDate>Sun, 12 Oct 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[The cat’s-whisker detector]]></title><description><![CDATA[Semiconductors are important. They allow us to make transistors1, which allow us to make integrated circuits, which allow us to build calculators and flight control systems and iPads. The transistor is the unequivocal poster child of semiconductor physics. It was developed in 1947 by John Bardeen, Walter Brattain, and William Shockley at Bell Labs.

It may have far-reaching significance in electronics and electrical communication.

This post is not about the transistor. It’s about the beginning of an industry that has changed the way we communicate. It’s also sort of about capitalism.

History

In 1874, German physicist Ferdinand Braun created a diode…]]></description><link>https://rileyjshaw.com/blog/the-cats-whisker-detector</link><guid isPermaLink="false">POST_THE_CATS_WHISKER_DETECTOR</guid><pubDate>Tue, 22 Apr 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Accidental reset]]></title><description><![CDATA[From page 33 of the Apple II User’s Guide: Sooner or later you will hit the RESET key when you did not intend to. It is inevitable, unless your Apple II requires you to type CTRL-RESET instead of just plain RESET. You can reduce the hazard by carefully prying off the plastic keytop, leaving just the keyswitch shaft available (Figure 2-9).

You can take this one step further and make it physically harder to push down the RESET key. Get a small rubber washer about 3/8 inches inner diameter, 1/2 inch outer diameter, and 1/8 inch thick. Remove the RESET keytop as shown in Figure 2-9. Work the washer over the exposed square flange of the keyshaft as shown in Figure 2-10. Replace…]]></description><link>https://rileyjshaw.com/blog/accidental-reset</link><guid isPermaLink="false">POST_ACCIDENTAL_RESET</guid><pubDate>Mon, 14 Apr 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[A language for weaklings]]></title><description><![CDATA[From Learn C The Hard Way: I’m going to guess that you come from a language for weaklings. One of those “usable” languages that lets you get away with sloppy thinking and half-assed hackery like Python or Ruby. Or, maybe you use a language like Lisp that pretends the computer is some purely functional fantasy land with padded walls for little babies. Maybe you’ve learned Prolog and you think the entire world should just be a database that you walk around in looking for clues. Even worse, I’m betting you’ve been using an IDE, so your brain is riddled with memory holes and you can’t even type out an entire function’s name without hitting CTRL-SPACE every 3 characters you type.

Br…]]></description><link>https://rileyjshaw.com/blog/a-language-for-weaklings</link><guid isPermaLink="false">POST_A_LANGUAGE_FOR_WEAKLINGS</guid><pubDate>Tue, 01 Apr 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Hue-angle transitions]]></title><description><![CDATA[I was recently browsing a beautiful red monochrome1 site. There were a few call-to-action buttons on the page that transitioned to green on hover. Where did that brown come from?! The initial red looks great, the final green looks great, but everything between is pretty dismal. Why is that?

The RGB color model

Red Green and Blue are the three primary additive colors. Your browser takes an 8-bit intensity value for each of the R, G, and B components to determine the output color…]]></description><link>https://rileyjshaw.com/blog/hue-angle-transitions</link><guid isPermaLink="false">POST_HUE_ANGLE_TRANSITIONS</guid><pubDate>Mon, 31 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Your art teacher lied]]></title><description><![CDATA[Guess what? Chemistry isn’t the only high school course built on a foundation of lies. In art class we’re taught that the primary colors are red, yellow, and blue. Not only is it wrong to say that there are three true primary colors, but if we were to pick three, we’d pick a better combination. Let there be light

A band of wavelengths in the electromagnetic spectrum between 390nm and 700nm makes up the visible spectrum of light; we perceive different wavelengths within this spectrum as colors. White light is a combination of all wavelengths in the visible spectrum.

Humans are trichromats, which means that we have three types of color receptors (cone cells). Our short-, mid-, and long…]]></description><link>https://rileyjshaw.com/blog/your-art-teacher-lied</link><guid isPermaLink="false">POST_YOUR_ART_TEACHER_LIED</guid><pubDate>Sun, 23 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Taking the average tone]]></title><description><![CDATA[Today I wanted to see what the average frequency of a song would sound like with no spectrum analysis or separation. I had a hunch that it would end up sounding like garbage, and I was totally right. If you took the average color of a beautiful painting, it would likely turn out muddy brown. Today, I created the audio equivalent:

Blazo’s Misty Sapphire:

Steve Reich’s Music for 18 Musicians:

Kill the Noise remix of KOAN Sound’s Talk Box:

These first tones were generated using the powerful, free, cross-platform audio software Audacity and a cool lisp-y language called Nyquist. Since Audacity lets you run Nyquist scripts on hand-selected audio segments, this first bit was quick and dirty:…]]></description><link>https://rileyjshaw.com/blog/taking-the-average-tone</link><guid isPermaLink="false">POST_TAKING_THE_AVERAGE_TONE</guid><pubDate>Mon, 17 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[Iron blogger]]></title><description><![CDATA[A few days ago a fellow Hacker-Schooler proposed Iron Blogger to our batch. The rules are simple: Get a blogWrite on said blog at least once a weekFailing completion of #2, be humiliated and ostracized. Also, forfeit $5.

I don’t think that we’ve decided on where the money is going yet; I’m hoping for giant Iron Blogger belt buckles.

Of course I’ll do that!

At the start of the batch I vowed to avoid any projects focusing on front-end design work, including a personal site.

Oops.

I also vowed to try my hand at blogging; breaking one vow to fulfill the other can’t be that bad, right? I made an addendum, stating that I could spend exactly two days making a site… and here we are!

It had to…]]></description><link>https://rileyjshaw.com/blog/iron-blogger</link><guid isPermaLink="false">POST_IRON_BLOGGER</guid><pubDate>Mon, 10 Mar 2014 00:00:00 GMT</pubDate></item><item><title><![CDATA[window.clusterFuck]]></title><description><![CDATA[I started a project called Terra a few weeks ago. I added a conditional to  that would complain if I’d already defined the library: (function (exports) {
	function init() {
		if (!exports.terra) {
			// do initialization things
		} else {
			throw 'You’ve already defined terra. Pay attention…';
		}
	}

	// more stuff happens…

	init();
})(this);


I’ll admit that this is a really ugly pattern for handling namespaces, but even common patterns are affected by this. Let me take you on a journey through the biggest browser wat I’ve ever seen.

I ran the code and the console yelled at me.

Strange… but maybe I forgot a  somewhere. I set some…]]></description><link>https://rileyjshaw.com/blog/window.clusterfuck</link><guid isPermaLink="false">POST_WINDOW_CLUSTERFUCK</guid><pubDate>Mon, 10 Mar 2014 00:00:00 GMT</pubDate></item></channel></rss>