Today, Relay FM wrapped up their annual fundraiser for St. Jude Children's Research Hospital, with the event raising $706,397.10 for the lifesaving work being done at this magnificent Memphis mainstay. I'm also blown away by the support my sub-campaign received, raising well-over my initial $5,000 goal and ending the month with $7,554.20 contributed to the Relay community's total. Thank you to everyone who donated to my campaign (even if you voted "Save"...), and to anyone and everyone who kicked in to any of the 255 wonderful community fundraisers who joined the effort this year. It always feels good to do good, but there's something special about doing so with such a generous and engaged community of nerds rallying together behind a great cause.
Below (as promised in my campaign rewards) I am going to list the names of folks who requested acknowledgement in my "Thank You post" for their contribution to my campaign, but I want to thank a few people specifically:
First and foremost, thanks to Stephen and Myke for all of the work they've done over the years to make the Podcastathon the momentous annual occasion it has become — you've made a world of difference in the lives of so many patients and families at St. Jude through your efforts. Thank you both also for embracing the shenanigans and chaos that stemmed from enabling community campaigns, and especially for inviting me to join the Closing Ceremonies to smash the Flower Power iMac on stream with you both — it was a blast. (If you missed it, you can find the VOD over on Myke's Twitch channel).
Second, I want to call out The Lovely Developers for the Herculean effort they put forth to entirely remake their Relay FM for St. Jude app — enabling everyone to discover community campaigns and track all of the fundraisers' progress throughout September. I think the fundraiser would not have been the same with out this app surfacing campaigns and generating sharable screenshots of everyone's progress. It seems a small thing, an app that puts a progress bar on one's home screen; but I think it makes a world of difference. I want to especially call out Ben, Tony, Matt C, and Kate (QA lead!) — who really spearheaded the app's re-development this year (a process which Ben wrote about this week on his blog; give it a read).
Finally, to all of the folks who donated to my campaign, thanks you so much for the difference you've made in the lives of children battling cancer, and their family members battling right alongside them. Donors who requested a thank-you are listed below, in random order:
Every year, Relay FM and its surrounding community raises money to support St. Jude Children's Research Hospital in their mission to cure childhood cancer all while charging patients and their families zero dollars for their care. This year, Relay and the St. Jude folks have deployed what I refer to as "sub-campaigns" for the overarching Relay/St. Jude fundraiser — individuals can set their own goals, milestones, and incentives all while contributing their funds raised to the amount Relay has collectively raised as a community. You can find out more about creating your own sub-campaign at stjude.org/relay, but first I want to tell you about the chaos I've prepared for my sub-campaign: MVO Woodworks for St. Jude.
I Hope You're Happy, Stephen
A few weeks ago on an episode of Spotlight (a members-only Q&A show), Stephen Hackett refused to answer which Macintosh in his collection he would choose if forced to destroy one (like he did a IBM PC Junior during last year's Podcastathon). I could not abide this act of cowardice, and so that day I decided to make that choice for him and find out what Macs were available at my local Goodwill for me to smash. And as luck would have it, there was one Mac in stock: a Flower Power iMac G3 in working condition.
I decided to acquire that iMac and exact my revenge on Stephen by...raising money for the charity closest to his heart. I've spent the intervening week and a half preparing what I think is a truly chaotic bounty of fundraising milestones, donor incentives, and a campaign-long donation poll to determine the fate of the Flower Power iMac G3. Throughout the month of September, I will be streaming from my garage woodshop at mvo.live doing shop infrastructure projects, making cutting boards, and effecting unspeakable horrors on Apple products spanning decades. I've gathered old tech from my own drawers and from various friends and acquaintances to create a menu of mutilation milestones so troubling that some may wish to avert there eyes:
Milestone
Amount Raised
Turning a 1st Gen Apple Pencil into a 2nd Gen
$500
Mouse Dissection
$1,000
Making a Foldable iPhone SE
$1,500
Adding a Hole Punch Display to an iPhone 7
$2,000
50% Speedrun of Zelda II: Adventures of Link
$2,500
Stream of Adding an SSD to an Old All-in-One
$3,000
Permanently Uninstalling Flappy Bird off iPhone 4
$3,500
Apple M0110A Keyboard 100% > 75% > 67% > 40% mod
$4,000
The Fate of the iMac G3 is Determined
$5,000
Milestones are likely to change or be added throughout the month, and not all of them will involve technological violence. That said, I'm looking forward to destroying some devices on stream for your enjoyment and for the kids (though, if you are aghast at the idea of one of these devices coming to harm, read on to learn about the "Spare n' Save" donor incentive below!).
Donor "Incentives"
The iMac isn't the only purchase I made for my sub-campaign — I also order 600 stickers featuring the wonderful Justin Hamilton's parody fair-use artist rendition of the cuboid image and likeness of Jony Ive (henceforth referred to as the Jonycube). What am I going to do with 600 of these extremely cursed stickers, you ask? Easy: for every cumulative $10 donated to my sub-campaign, I will be affixing one (1) Jonycube sticker to my jointer — a woodworking tool that exists solely to create exact right angles...or cubes, if you will. Soon, my jointer will look all too similar to Myke Hurley's desk or Stephen Hackett's Kallax shelves. If I hit my goal of $5,000 raised for St. Jude, that will be 500 Jonycubes on my jointer for the rest of its useful life. And the remaining 100 stickers? Well, one of those rectilinear horrors can be yours, dear reader, for a donation of at least $25 to my sub-campaign! That incentive and more are listed below:
$1 — Your name in a "Thank you" blog post on Peer Reviewed at the end of the campaign
$25 — One (1) Jonycube sticker, shipped directly to you (or a recipient of your choice) [Limit 100]
$300 — You may choose one of the items I plan to destroy (Except the iMac!) and it will instead be spared and shipped to you. [Limit subject to change]
$500 — You will receive one one (1) bespoke MVO Woodworks cutting board in return for your extreme generosity. [Limit five (5)]
Do note that the incentives for my campaign are cumulative; meaning, a $500 donation makes you eligible for all other incentives in my sub-campaign. You can also opt to claim the delightful Relay FM cause incentives instead, but unfortunately you'll need to make two separate donations to get both my incentives and theirs. Make sure you select your desired incentive when you make your donation (and don't forget to vote on the fate of the iMac G3!).
Sawdust and Chicanery, for the Kids
This September is going to be full of wild and wacky activities hosted both by Relay FM itself and by members of its community — all to raise money for the admirable mission of St. Jude Children's Research Hospital. I hope you tune in to one of my woodshop streams this month (I don't have a schedule, consider following me on Twitch — I'll be working on a lot of shop infrastructure projects since we only recently moved into this house! Also, please kick in a donation to my sub-campaign and maybe get a delightfully devilish incentive — and make sure to vote with your dollar to determine the fate of the Flower Power iMac G3.
Oh, and of course: mark your calendars for Friday, September 16th from 11a-7p Central for Relay's annual Podcastathon live stream over on their Twitch channel.
Last week I announced a raffle for a lovely black walnut cutting board benefiting Relay FM's St. Jude Children's Research Hospital fundraiser, coinciding with a restock of cutting boards on this site's store page. Although Relay has extended their fundraiser to October 5th for any last minute donations (which the procrastinators among you should take advantage of now!), the cutting board raffle ended with the month of September. Donation receipts sent to me for the purpose of this raffle totaled just under $1,000 in contributions to St. Jude Children's Research Hospital — that's 10 Red Wagons to help lift the spirits of children being treated at St. Jude. This of course is a tiny sliver of the $680,000 raised by Relay FM and its broader community as of this writing — a staggering figure for such a worthy cause.
I've reached out to the winner of the raffle via email to get their shipping information, as well as all other entrants to thank them for their generous contributions. If you didn't win (or didn't enter): there are still some cutting boards in-stock, if you would like to purchase one the old-fashioned way.
A few weeks ago I shared my custom Pyto widget that automatically pulls from Relay FM's Tiltify page for their annual St. Jude Children's Research Hospital fundraiser, and shortly after that I shared Zach Knox's iterative improvement on the same concept. Well, now we've both been completely eclipsed by a lovely group of developers from the Relay FM members Discord, who quickly created a bespoke iOS app with native, customizable widgets all entirely dedicated to monitoring the fundraiser's progress. You can join the app's TestFlight beta to add its delightful widgets to your home screen. The app supports widgets of all sizes, displaying the total fundraiser goal as well as milestone progress, and even has notification support when reaching a milestone, "significant amounts" (like $250,000), or a custom dollar amount of your choosing.
The team behind this app has far outstripped what Zach and I cobbled together with mediocre scripts and middling widget design, and you should all go give the app a try if you want to keep an eye on the Relay FM community's donation progress. Oh, and you should go donateright now to St. Jude Children's Research Hospital — they do phenomenal, lifesaving work in kiddos with cancer all at no cost to their families. What better cause is there to give your money to? If you are reading this blog post, there's a good chance you are about to buy an expensive Apple product next week — figure out the sales tax on that purchase and go donate it to St. Jude.
Every year, Relay FM and its surrounding community of tech nerds and podcast listeners rally together to raise money for St. Jude Children’s Research Hospital — one of the premier pediatric cancer research institutions in the world. The fundraiser is back and better than ever with sticker rewards for certain donors, donation thresholds for Flight Simulator streams, a horrifying amount of stickers, and the annual Podcastathon live stream on September 17th. Relay hopes to raise $333,333.33 (though I have a feeling that goal will be raised, since they racked up $456,000 last year to bring their cumulative total to well-over $1,000,000. I’m always delighted to donate to this cause because St. Jude does such amazing work, and this year I also worked out a way to track their progress live right on my iPhone home screen.
Relay runs their St. Jude fundraiser using Tiltify — a service that focuses entirely on campaigns like this, and importantly has a public-facing API. Because of that, it’s fairly easy to pull updates from Relay’s donation page using a POST request and parsing the (rather large) JSON dictionary that returns. An intrepid member of the Relay FM members Discord discovered this fact and created a Siri Shortcut to quickly display the total amount raised…but that gave me a better idea: what about a home screen widget?
When you need to call an API and create a dynamic home screen widget, two apps come to mind: Scriptable and Pyto — given that my only serviceable programming know-how is in Python, I chose the latter and got to work cobbling together a script.
Displaying Campaign Data, Dr. Drang-Style
The first thing I needed to do was connect to the Tiltify campaign with a POST request — big thanks to Ben in the Relay Discord for doing most of the heavy lifting with his Siri Shortcut! Tiltify expects a nightmarishly-long JSON payload in a POST request, but the JSON data it returns is much more straight-forward. Using Pyto, I called the API and parsed the JSON key:value pairs in the returned data to snag the totalAmountRaised and goal values from Relay’s 2021 St. Jude campaign. A little conversion turns those raw floats into properly-formatted dollar values with thousands-commas and dollar signs.
#Pull data from the returned JSON payload.
info = (r.json())
rawraised = info["data"]["campaign"]["totalAmountRaised"]["value"]
rawgoal = info["data"]["campaign"]["goal"]["value"]
# Convert pulled values into properly-formatted dollar values:
raised = "$" + '{0:,.2f}'.format(float(rawraised))
goal = "$" + '{0:,.2f}'.format(float(rawgoal))
Once I was able to pull the fundraiser's goal and the current amount raised, the next challenge was displaying that information within an iOS home screen widget. First and foremost, I really wanted a dynamic progress bar but wanted to generate one as simply as possible. My brother (a much more experienced programmer) helped me write this clever snippet of code to simply display a string of emojis 12 characters long, with two emojis (⬜ and 🟩) proportionally placed to form the progress bar. Here's what the code looks like:
# Generate a progress bar using emojis
def progressbar(raised, goal):
# Modify these emoji to change the "empty" and "full" sections of the progress bar.
progress_full = "🟩"
progress_empty = "⬜"
bar_length = 12 # Modify this number to adjust the max width of the progress bar.
progress_percent = float(raised)/float(goal)
progress = ""
progress = progress_full * int(bar_length * progress_percent)
return '{:⬜<{x}}'.format(progress, x=bar_length)
#If you modify progress_empty above, you need to put it in this return statement as well.
The length of the progress bar needs to be fiddled with based on the width of the device; I'm sure there are much more clever ways to generate the proper number of emojis based on the device the code is being run on, but that was above my pay grade! Twelve emojis wide was just about perfect for a medium widget on my iPhone XS — your mileage may vary based on your device.
All that's left is to actually generate the widget to display all of this data on my home screen. I was expecting this to be much more challenging, since I had never used Pyto or its widget library, but luckily when you open a new script Pyto offers to automatically populate an example widget! A bit of hacking around with the example code and some digging in their widget documentation let me insert the variables I was interested in, change the background color, and remove the option of a small widget (it's just too small). In short order, I could present the amount raised, the fundraiser goal, the percent progress, and a delightful emoji progress bar right on my home screen! Here's the code:
if wd.link is None:
widget = wd.Widget()
wd.wait_for_internet_connection()
background = wd.Color.rgb(219.7/255, 182.8/255, 72.2/255)
#You can modify the background color by altering the RGB values to your liking
# Populate four rows of data, and accompanying font sizes:
text1 = wd.Text("Raised: " + raised)
text1.font = wd.Font.bold_system_font_of_size(20)
text2 = wd.Text("Goal: " + goal)
text2.font = wd.Font.bold_system_font_of_size(20)
text3 = wd.Text("Progress: " + progress)
text3.font = wd.Font.bold_system_font_of_size(20)
text4 = wd.Text(bar) #Progress bar
text4.font = wd.Font.bold_system_font_of_size(18)
# Supported layouts (the small widget is too small)
layouts = [widget.medium_layout, widget.large_layout]
for layout in layouts:
layout.add_row([text1])
layout.add_row([text2])
layout.add_row([text3])
layout.add_row([wd.Spacer()])
layout.add_row([text4])
layout.set_background_color(background)
layout.set_link("https://stjude.org/relay")
wd.schedule_next_reload(900) # Suggested refresh time in seconds
wd.show_widget(widget)
else:
open(wd.link) #This opens the link above when the widget is tapped.
And here's what the resulting widget looks like:
I think it looks pretty nice, given that I spent almost zero time optimizing the padding, font size, and background color in the Pyto code. Their widget documentation has many more UI customization options that intrepid readers can explore to make more advanced or aesthetically appealing widgets for themselves, but I'm pretty happy with where this simple version landed. As a nice bonus, Pyto also has a way to alter what tapping on the widget does — you'll notice that the entire widget generation code is wrapped in an IF-ELSE statement; tapping the widget sets wd.link to TRUE and instead runs the open(wd.link) function...which naturally directs to Relay's St. Jude Fundraiser page (if you've read this far and haven't donated yet, now's the time!). I think that having to bounce back into Pyto to make this happen is a bit clunky, but beggars can't be choosers. The widget also seems to refresh relatively often — Apple says that widgets dynamically refresh somewhere between 15-70 minutes depending on user behavior, which is more than enough to keep the raised amount relatively up-to-date.
I Don't Want to Read Your Code, I Just Want the Widget!
Fair enough, let's actually walk through the steps for you, dear reader, to get this widget on your iPhone:
Download Pyto from the app store. Pyto has a 3-day free trial, but you'll need to pay the $2.99 in-app purchase to run this script beyond then.
Download this python script from my GitHub page. It handles all of the steps I discussed above: Pulling the fundraiser data, generating a progress bar, and creating the widget using Pyto. Save it in the Files app so you can run it using Pyto (please don't judge my horrendous code too harshly, I'm still new to programming!) If you're feeling adventurous, you can also modify the font size and color, background color, and even what text is displayed — just dive into the code!
Run the script once using Pyto
Edit your home screen, and add the Run Script widget from Pyto (Medium or Large, your choice). Configure that widget to run the StJudeRelay2021.py script you just saved in Pyto
And just like that, you'll be able to monitor Relay's annual St. Jude fundraiser from your home screen. If you still haven't donated, you absolutely should click here now and do so — there's no better cause than St. Jude, and the Relay folks' partnership with them is exceptionally wholesome. And after you donate, you'll want to mark your calendar for the culmination of the campaign: the Podcastathon on September 17th over on Relay's Twitch channel. It's always a wild and wacky event full of fun shenanigans, all for a spectacular cause.