HyperText junkie. #RSS prosumer. Founder @herdworks.com. 🌹⚽️
I want so badly for this game to exist. The world needs a proper NBA Street Vol.2 successor! 🏀
Creating highly crafted sports games built to be played together and remembered forever.
https://playbyplaystudios.com/Squad up, stack wins and become the G.O.A.T. in The Run: Got Next. Welcome to a new fast-paced, 3v3 PvP basketball game that celebrates street hoops culture ...
https://www.youtube.com/watch?v=Vmq1zu8u0OUFinally ready to outsource bookkeeping for @herd.works 🎉
Scored some sweet deals on the Prime Sale this year after mostly ignoring it for the past few years. I had my eye on this charger for a while and noticed it was $60 off, so I snagged one of these and massively simplified the device charging setup in my home office. This thing is an absolute beast.
PS - this is not an affiliate link. I’m just sharing out of the goodness of my nerdy little heart. 🤓
Power up with the Anker Prime Desktop Charger (250W, 6 Ports, GaNPrime) –enjoy ultra-fast, efficient charging with this powerful desktop charging station.
https://www.anker.com/products/a2345-anker-prime-charger-250w-6-ports-ganprimeIs this thing on?!
I noticed my following feed was broken earlier this week. It turns out it's been broken since the updated site went live at the beginning of the year. Whoops! 😅
The issue was with my static site generator and how it was parsing OPML data files. With that fixed I can now drop a lightly modified OPML file (with paywalled #RSS feeds removed) into a data folder and get an auto-generated following page. 🤌🏽
This whole idea was inspired by this @anildash.com blog post that I think about way too often.
A blog about making culture. Since 1999.
https://www.anildash.com/2016/08/08/the-lost-infrastructure-of-social-media/Office productivity is going to take a slight hit this week. ⚽️😅📉
Inter and Barcelona are all square while Paris Saint-Germain hold a slender advantage as they welcome Arsenal for the climax of the UEFA Champions League semi-finals.
https://www.uefa.com/uefachampionsleague/news/0299-1da8eda6a8ed-aebd19692d21-1000--uefa-champions-league-semi-finals-what-to-look-out-for-in-/The web needs more experimentation like this from @eieio.games. 👏👏👏
I made a website. It's called One Million Chessboards. It has a million chessboards on it. Moving a piece moves it for everyone, instantly. There are no turns.
https://eieio.games/blog/one-million-chessboards/Exclusive video footage of Steve Jobs talking about his design vision and philosophy and how design worked at Apple.
https://stevejobsarchive.com/exhibits/objects-of-our-lifeCool to see @stripe.com jump in! Competition for payments on iOS?!
The comments on this Twitter thread from Stripe Product Manager Michael Lou are amazing. It reads like an FAQ, haha.
One comment replies "But using Apple Pay makes purchasing something way more likely for me." Lou responds "You can use Apple pay via Stripe!"
Another comment asks "Do users return to the app automatically after successful completion or is an action required?" Lou responds "They return automatically if [the developer has] Universal Links enabled".
🍿
Let customers buy digital goods or subscriptions by redirecting from your app to the browser.
https://docs.stripe.com/mobile/digital-goodsI knew today was gonna be an exceptional Daily Update on @stratechery.com and I was not disappointed! 🔥
The judge in the Epic case released a devastating ruling on Apple’s lack of compliance in terms of allowing links to the win; Apple was clearly in the wrong, but still might win on appeal.
https://stratechery.com/2025/apple-held-in-contempt-the-crux-of-the-case-the-takings-clause/These might be the three most meaningful paragraphs of policy/legal mumbo jumbo I've experienced in my professional career.
From an inconspicuously titled "Updated guidelines now available" from @developer.apple.com:
3.1.1(a): On the United States storefront, there is no prohibition on an app including buttons, external links, or other calls to action, and no entitlement is required to do so.
3.1.3: The prohibition on encouraging users to use a purchasing method other than in-app purchase does not apply on the United States storefront.
3.1.3(a): The External Link Account entitlement is not required for apps on the United States storefront to include buttons, external links, or other calls to action.
The email opened with an acknowledgement of this week's monumental legal mandate:
The App Review Guidelines have been updated for compliance with a United States court decision regarding buttons, external links, and other calls to action in apps. These changes affect apps distributed on the United States storefront of the App Store
Three cheers for regulation?! 👩⚖️
The most exciting thing about this to me personally is how @apple.com itself might respond to these changes by actually competing for developers' business in an area where it hasn't had to in the past.
It's gonna be a fun #WWDC & summer! 🙌🏽
While asking @chatgpt.com to help me debug a SwiftUI issue, it offered a solution and then said "but that results in a janky experience"!
The AI has become self-aware! 😅
Looks like the @gohugo.io website got a refresh. 👌
Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.
https://gohugo.io/Markdown: this is the way. 🤌
Notes on a revolution in slow motion.
https://ia.net/topics/markdown-and-the-slow-fade-of-the-formatting-fetishThe web never rests. I love seeing stuff like this from @webkit.org in the roadmap! #HTML
CSS Grid and Flexbox brought incredible layout tools to the web, but they don’t yet do everything a designer might want.
https://webkit.org/blog/16587/item-flow-part-1-a-new-unified-concept-for-layout/Just got a Freshboi 💈
Setting up my HyperTexting… 🤌
is experimenting… 👨🏽🔬
It's happening!! 😱
Whoa! 🤯
Test post from a new tool I've been working on. I hope this works!
customElements.apply()
A (naive?) approach to workaround customElements.define()
"same tag name" errors.
Web components have completely changed the way I write vanilla JavaScript. It turns out classes are quite useful for encapsulation (who knew?)! Complementary approaches like HTML web components (and CSS web components) have reduced the amount of JavaScript I'm writing by about 95%. These ideas from @adactio.com and @hawkticehurst.com together with a steady stream of web component content from @gomakethings.com have revived my interest in modern web development.
But recently I started running into a little speed bump.
I've been exploring HTML templating workflows that enable me to compose sections and entire pages from a collection of layout "partials" (ala server side includes).
This sometimes causes multiple <script>
tags to be added for a given web component, resulting in redundant calls to customElements.define()
and a "cannot define multiple custom elements with the same tag name" error.
NotSupportedError: Cannot define multiple custom elements with the same tag name.
My initial reaction to this was to move all <script src>
tags into the <head>
, but this inevitably resulted in failing to load a component's JavaScript on certain pages (dependency management fail).
Then I read @jakelazaroff.com's excellent Define a custom element blog post and it opened my eyes to the many different approaches to managing custom elements.
But I also felt like my challenge might have been slightly different than the problem Jake was solving.
So I tried something different that has been working really well for me.
It started with reviewing the CustomElementsRegistry
reference documentation and discovering that get()
and getName()
methods already existed.
All that was needed was an idempotent method for registering custom elements.
It turns out this was trivial to implement.
1CustomElementRegistry.prototype.apply = function(tag, component) {
2 if (!(!!component.constructor && component.toString().substring(0,5) == "class")) { return }; // guard
3 if (this.get(tag)) { return }; // lookup by tag name
4 if (this.getName(component)) { return }; // lookup by component class
5 try { this.define(tag, component) } catch(err) {
6 console.debug(`component ${component.name} already registered as <${tag}>`);
7 };
8};
This is already working so well for me that it's just about the only JavaScript I keep in main.js
for new projects.
I'm replacing calls to customElements.define
with customElements.apply
in all of my web component JavaScript.
1customElements.apply("my-element", class MyElement extends HTMLElement {
2 // this is where the magic happens 🪄
3});
In doing so, I can add <script src='/js/my-component.js'>
tags in any layout partial without worrying about "same tag name" errors.
Do you find this helpful? Or is this a horrible idea? 😅 Send me an email and let me know what you think: hello [at] calebhailey.com
This post by @ia.net reminds me of a quote I used to have permanently written on the top of the whiteboard in my office:
The only intuitive interface is the nipple. Everything else is learned.
— Bruce "Tog" Tognazzini
My favorite quote from the interview is:
Design requires a willingness to make a fool of yourself by asking outrageous and offensive questions and to be amazed at things that seem perfectly normal to other people.
Orlando and Oliver studied philosophy together 30 years ago. Their shared love for philosophy, design, and technology reunited them to discuss AI and the future.
https://ia.net/topics/design-as-thoughtSpeaking of #RSS, I love this piece by @anildash.com.
I've always wondered if one of the biggest differences in adoption between podcasts and text-based RSS feeds is that "podcast" has a catchy ring to it, and "really simple sindication" does not. Neither does "RDF site summary". It makes me further wonder if @textcasting.org (by @scripting.com) is more important as (re-)branding for text-based RSS feeds than it is as an actual new standard.
A blog about making culture. Since 1999.
https://www.anildash.com/2024/02/06/wherever-you-get-podcasts/I've been looking for good resources to introduce people to #RSS and this looks like a great one by @interconnected.org!
Getting Started guide to web feeds/RSS
https://aboutfeeds.com/I've thought about this @stephango.com blog post at least once per week for the last ~18 months.
Just added this to my inspired by hall of fame.
If you want to create digital artifacts that last, they must be files you can control, in formats that are easy to retrieve and read. Use tools that give you...
https://stephango.com/file-over-appLink to: https://daringfireball.net/2006/11/beta_excuse
https://daringfireball.net/linked/2025/01/07/beta-is-not-an-excuse-archiveI still haven't used @htmx.org, but I've read the #HyperMedia book and I'm a big fan of their ideas and where the project is headed overall. 🚀
htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext htmx is small (~14k min.gz’d), dependency-free, extendable, IE11 compatible & has reduced code base sizes by 67% when compared with react
https://htmx.org/essays/future/This is hands-down my favorite craft cocktail website. 🍹
The best underrated classic cocktails, according to bartenders, range from the Tom Collins to a 1930s rum Manhattan. Here are their recipes.
https://punchdrink.com/articles/best-underrated-classic-cocktails-bartenders/I'm loving the new @vw.com ID Buzz.
And my new scrolling image gallery. 😎
👈🏽 Swipe 👉🏽
With the Ququq BusBox, you can convert the VW ID Buzz passenger vans into a two-person camper — and back — in just minutes.
https://www.theverge.com/23735554/vw-id-buzz-review-ququq-camper-e-vanlifePretty cool, right?!
More like fast trashion, amirite? 😅
Amazon’s new ultracheap discount store, Haul, is filled with cheap, low-quality items. It sells the same things as Temu, Shein, or AliExpress — both physically and philosophically.
https://www.theverge.com/2024/12/19/24322922/amazon-haul-aliexpress-shein-temu-fast-fashion-ecommerceFirst post with my custom #markdown parser.
Here's a little sample code block to show off the <code>
syntax highlighting.
1<!DOCTYPE html>
2<html lang='en-US'>
3 <head>
4 <meta ht-include='partials/head.html'>
5 <meta itemprop='template.name' content='default'>
6
7 <!-- Web Components -->
8 <script src='/js/components/relative-time.js'></script>
9 </head>
10 <body>
11 <nav ht-include='partials/nav.html'></nav>
12 <content-whitespace></content-whitespace>
13 <section id='post' data-color-scheme='light'>
14 <article ht-include='partials/post-article'></article>
15 </section>
16 <content-whitespace></content-whitespace>
17 <footer ht-include='partials/footer.html' data-color-scheme='dark'></footer>
18 <section ht-include='partials/tail.html'></section>
19 </body>
20</html>
This is all table stakes stuff, but I'm pumped to get it all wired up!
Just started reading "Filterworld", by @kylechayka.com, and it starts with a picture from one of my favorite Wikipedia pages of all time. I think I'm gonna like this book!
TIL about the #HTML <base>
element!
The <base> HTML element specifies the base URL to use for all relative URLs in a document. There can be only one <base> element in a document.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/baseFriends don't let friends use old-fashioned ⌘-F.
https://herd.works/blog/introducing-the-magic-highlighter/Originally posted on @sheesh.blog.
As soon as you have 20 minutes to spare, I encourage you to go watch this short film about Sally Schmidt, produced by Oscar® award winning documentary filmmaker Ben Proudfoot, for the @nytimes.com1.
Speaking of restaurants, Sally started a little establishment you might have heard of called The French Laundry. 🤌
When my father died, he held disappointment in his heart. He was 66 and had only just retired from a life of 80-hour workweeks as a successful lawyer, and th...
https://www.youtube.com/watch?v=O5d1Cclk5QAI particularly like this comment in the accompanying article:
Talking to Ms. Schmitt that morning, I learned she held a different kind of wisdom: that success may have other definitions.
Now that's what I call life-work balance!
Originally posted on @sheesh.blog.
I can't remember the last time I read a book from front to back1, but I am a voracious reader. The thing is, I prefer to read "the internet" instead of books.
At some point early on in my internet journey I discovered #RSS and I immediately fell in love2.
My RSS feed became like my own personal newspaper, where I was the curator.
I could add and remove columnists blog feeds as my interest graph would change over time.
I was one of the many3 who decried the death of Google Reader.
RSS lives on, but it's not as ubiquitious as it once was.
For some years my feed shifted from RSS to social media — almost exclusively Twitter, and mostly via Twitter Lists — but a few trends in recent years have brought me back to RSS:
With my newfound replacement for Google Reader's service (Feedbin.com), and my favorite old RSS reader app making a glorious (and open source!!) comeback, I decided to start the curation process from scratch. I created folders for "News", "People", "Portland" (my local happenings), "Products", "Startups", and "Tech".
And then I started subscribing. And I discovered that the very first feeds I added were the very same feeds I've been reading all along. A combination of overlapping interest graphs (I'm assuming) and writing styles have kept me reading certain blogs for over a decade now. These are the bloggers who's writing has both intimidated me – because I hold them in high esteem – and inspired me to start this blog.
I have feared that if I ever started a blog I would appear as a copy cat, a cheap imitation of these now-veterans who probably started like I am starting right now. But I decided that instead of shying away from writing, I should lean into it. Give credit where credit is due. Start my blog, in my own voice (however heavily "inspired by" it may be), and acknowledge those who went before me.
Starting a blog is easy. Buy a domain ✅ write an /about page ✅ write a "hello, world" ✅ smash the publish button. 💥 But for me, I could not have started this blog without acknowledging who this blog was inspired by.
✌️
I mean, I do remember the last book I read, but it's embarrasing. 😅 ↩︎
FUN FACT: fast forward many years later and I somehow had the privilege of working with Matt Shobe – one of the co-founders of Feedburner (acquired by Google in 2007). And by "working with" I mean he became an angel investor in my first company, and a critical advisor in our early stages. ↩︎
Or few, I guess. Otherwise we would still have Google Reader? ↩︎
In the years following the death of Google Reader (RIP), I tried a handful of apps and services that built replacements for Google Reader — from Feedly to Flipboard (powered by a carefully curated Twitter list) – but nothing stuck. Then a few years ago I tried Feedbin, and subsequently discovered its support for Newsletters (at a time when it seemed like everyone was starting a SubStack), and I almost forgot that Google Reader ever existed. ↩︎
Every new blog should start with an obligatory "hello, world" — so here I am doing just that. My experience with blogging has generally rhymed with the experience a former co-worker of mine once shared:
"I’ve started seven different blogs. Every one had one post."
— Derek Newsom
Something feels different this time, but only time will tell.
✌️
These are a few of my favorite feeds. 🔀