Sign in

iiinova is part of the Atmosphere — an open, public network where you own your identity.

westbrook

@westbrook.mastodon.social.ap.brid.gy
25 followers 2 following 256 posts

Open web enthusiast. Maker of things with HTML, CSS & JS. Trombonist. Food lover. 日本語OK. Opinions are owned by no one but my myself. [bridged from mastodon.social/@westbrook on the fediverse by fed.brid.gy ]

PostsRepliesMedia
Reposted by westbrook
Aaron Gustafson @aaron.front-end.social.ap.brid.gy · 23h
Back in 2014, I decried CSS variables, but my perspective has largely changed. Here’s what I missed, how I use them now, and why fallbacks still matter. www.aaron-gustafson.com/notebook/i-…
aaron-gustafson.com
I’ve Changed My Mind About CSS Variables
A while back, Eric Meyer emailed to ask about my old post arguing that CSS variables were a bad idea. Did I still feel that way? No. I’ve changed my mind. These days, I use CSS custom properties—the feature we often call “CSS variables”—quite a lot. To adapt interfaces to people’s preferences. To pass theme colors to JavaScript-driven interfaces. To theme many of the web components I build. I also discuss them quite a bit in my forthcoming course on progressive enhancement. At this point, that old headline no longer applies. I’ve added a brief note to the original post, but I thought it best to explain the change in more detail. Hence this post. My change of heart came not just because browser support improved, but because I realized I’d been too focused on custom properties as Sass variable replacements. ## # My original concerns At the time of my original post, published in November 2014, browser support was extremely limited. The example I included used custom properties to store foreground and background colors: :root { --foreground-color: #333; --background-color: #fff; } body { background: var(--background-color); color: var(--foreground-color); } I was concerned that browsers without support would lose those color declarations. To give those browsers the intended colors too, we’d need to write old-school color values first: :root { --color-foreground: #333; --color-background: #fff; } body { background: #fff; background: var(--color-background); color: #333; color: var(--color-foreground); } I compared that with Sass, which could substitute the values during compilation, yielding universally understandable CSS: $color-background: #fff; $color-foreground: #333; body { background: $color-background; /* background: #fff; */ color: $color-foreground; /* color: #333; */ } If we only need to replace a name with a fixed value, doing that before sending the stylesheet was (and remains) perfectly reasonable. But I went further. I treated the necessity of fallback declarations as a flaw and used it to dismiss custom properties altogether. I shouldn’t have. The uncomfortable irony is that I’ve advocated for authoring a usable baseline followed by an enhancement in CSS for years. Some degree of repetition is often required to make that work. I shouldn’t have dismissed custom properties just because a preprocessor let me avoid the redundancy. In that piece, I also speculated about the performance cost of custom props without bringing receipts. Browsers do have to resolve their values, but I had no proof this would cause a meaningful performance problem. ## # What I missed I’ll admit I had a very simplistic view of custom properties. It was largely informed by my immersion in Sass at the time. I didn’t take the time to dig into the more powerful aspects of custom properties. Custom properties participate in the cascade. They inherit by default too. Their values can differ across elements or change in response to media queries and changes in the document. That power becomes apparent in an example like this: :root { --notice-background: #eee; --notice-foreground: #222; } @media (prefers-color-scheme: dark) { :root { --notice-background: #222; --notice-foreground: #eee; } } .notice { background-color: #eee; background-color: var(--notice-background, #eee); color: #222; color: var(--notice-foreground, #222); } .notice--warning { --notice-background: #ffe08a; --notice-foreground: #222; } Here, ordinary notices change their theme based on a user’s color-scheme preference. A warning notice, however, gets its own colors without changing the declarations that use them. Descendants can inherit those custom properties and use them too. A Sass variable, in contrast, is static. It doesn’t respond to that context at all. A custom property does. We can generate preference-aware styles with Sass, of course, but compiled variables and browser-resolved custom properties are worlds apart. I didn’t understand how powerful custom properties are when I wrote the original post. I was squinting at them through Sass’s pink-tinted glasses. ## # Theming through and through One project that made the value of custom props much clearer to me was a `canvas`-based audio visualizer I was working on. It looked fine while I was using dark mode. When I switched to the light theme, however, the visualization disappeared against its background. As my son would say: “That’s buns.” I’m almost always in dark mode, so that’s what I’d been testing in. I’d totally neglected to give it a look in light mode. Yikes. I was already using custom props to handle site-wide theming, so rather than maintain a second set of theme colors in JavaScript, I opted to read the values CSS had resolved: const theme = {}; function importTheme() { const styles = window.getComputedStyle(document.documentElement); theme.foreground = styles.getPropertyValue("--color-foreground").trim() || "black"; theme.background = styles.getPropertyValue("--color-background").trim() || "white"; } importTheme(); The drawing code could use those values for its strokes and fills. Then a listener could refresh the theme values when the user’s color-scheme preference changed: const preference = window.matchMedia("(prefers-color-scheme: dark)"); preference.addEventListener("change", importTheme); When the theme changes, the next draw uses the updated colors. A graphic that isn’t being continuously redrawn would also need to be repainted, of course, but for an audio visualizer it was perfect. I covered the setup in “Passing Your CSS Theme to `canvas`”. The key benefit of this approach is that CSS remains responsible for resolving the theme, while JavaScript can focus on managing the drawing. Clean separation. ## # Styling components If you’ve been following my work for a while, you’ve probably seen my growing list of web components. I use custom properties in them quite often. My `<fullscreen-control>` component, for instance, adds a “fullscreen” button to a wrapped `<video>` or `<iframe>`. Authors can adjust the button’s position through custom props: fullscreen-control { --fullscreen-control-button-inset-block-start: 1rem; --fullscreen-control-button-inset-inline-end: 1rem; } Those values control the button’s position. No need to crack open the JavaScript to move it. And because the positioning uses logical properties, the offsets follow the writing mode rather than assuming a particular physical corner. Similarly, `<form-validation-list>` exposes custom properties for icon size, matched and unmatched colors, and similar design choices. That makes it relatively straightforward to adapt the component to a site’s design without touching the component’s behavior. In both cases, custom properties provide a simple way to alter the look and feel of the component directly from within a stylesheet, where design decisions belong. ## # Fallback, carefully Even though I complained about them at the time, I don’t want to gloss over the importance of fallbacks for custom properties. Used properly, they help make our designs robust and progressively enhanced. ### # When the browser doesn’t support custom properties Take the following, for example: :root { --flow-space: 1em; } .flow > * + * { margin-block-start: 1em; margin-block-start: var(--flow-space); } .compact { --flow-space: 0.75em; } In this code sample, the second rule (`.flow > * + * {}`) establishes space between adjacent children in two steps: first, it sets a block-start margin using a standard value (`1em`), then it overrides that value using a custom property (`var(--flow-space)`). Browsers that understand custom properties use the value of `--flow-space` because that declaration comes later in the rule. Browsers that don’t understand `var()` ignore that declaration, following the rules of fault tolerance. They apply the earlier `1em` declaration instead.1 The `.compact` rule overrides the inherited spacing value, so a flow container in a compact region can use tighter spacing without a different margin rule. ### # When the custom property is missing The second argument in `var()` handles a different situation: .flow > * + * { margin-block-start: 1em; margin-block-start: var(--flow-space, 1em); } In a browser that supports custom properties, it provides a backup value the browser can use when the referenced property is missing or resolves to the _guaranteed-invalid value_. To test this, you could remove the `--flow-space` assignment from `:root` and—if no other assignment applied or was inherited—the fallback argument would supply `1em`. It’s important to note that this situation is different from a value being unacceptable for a given property. The fallback argument doesn’t check whether the custom prop’s value is a valid size or color. I’ll illustrate that with a silly example: .notice { --notice-color: 20px; color: #333; color: var(--notice-color, #333); } In a browser that supports `var()`, the earlier color declaration (`color: #333`) isn’t used. The custom property (`--notice-color`) exists, and `20px` is a valid value for an unregistered custom property2, so the fallback argument isn’t used either. Unfortunately, after substitution, the winning declaration is `color: 20px`, and `20px` is not a valid color value. In this scenario, you might expect the browser to fall back to the previous `color` declaration. It doesn’t. This is an example of an invalid-at-computed-value-time failure. The browser stores the `20px` value for `--notice-color` with no problem. The problem only becomes apparent when that value is used as a color, after the cascade has selected the declaration. At that point, it’s too late to ignore the declaration during parsing, as the browser would with a literal `color: 20px`. Instead, the element _inherits_ its `color` from its parent. For non-inherited properties like `background-color`, the browser uses the _initial_ value instead. The browser won’t rewrite the custom property. It won’t go back through the earlier declarations looking for a replacement either. That was a contrived example. Here’s a more realistic one. ### # When the value requires a newer feature Just because a browser supports custom properties doesn’t mean every value we assign to one will work. Imagine you want to use a newer color function in a custom property: :root { --button-background: color-mix(in oklab, #e200ff, black 65%); } button { background-color: #222; background-color: var(--button-background, #222); } A browser that supports custom properties but doesn’t know what `color-mix()` means will still retain the custom property’s value as a sequence of tokens. The failure comes later, when it tries to use that value as a background color. Neither the preceding declaration nor the fallback argument can save you; the background becomes transparent, its initial value. To retain a known-good value while using `color-mix()` as an enhancement, we can test for support before assigning it: :root { --button-background: #222; } @supports (color: color-mix(in oklab, red, red)) { :root { --button-background: color-mix(in oklab, #e200ff, black 65%); } } button { background-color: #222; background-color: var(--button-background, #222); color: #fff; } The `@supports` block checks whether the browser accepts `color-mix()` in the `oklab` color space, without tying it to a particular palette or background. Mixing red with itself is a terse way to test the syntax. We can then group multiple enhanced custom-property assignments inside that same block. If you’re using other color spaces or newer color syntax, place each in its own `@supports` block to ensure maximum compatibility. In this example, the known-good value (`#222`) remains unless the support test passes. Browsers without custom-property support still have the literal background declaration too. _Note: When enhancing this way, it’s critical that we test each potential color combination to ensure accessible contrast levels._ * * * Fallbacks aren’t mandatory. Sometimes an inherited value or the browser’s default provides a reasonable baseline experience. It’s good to know we have these options, though, and a modest amount of redundancy when it matters is a small price to pay. ## # Where that leaves me Eric’s question was a useful nudge to revisit an opinion I’d left sitting on the Web long after my own work had moved on. I still stand by the central concern in that original post: people should have a usable experience when a particular enhancement isn’t available. The difference is that now I’ve got plenty of ways to use custom properties in service of that goal. They let me respond to preferences, adapt components, and share dynamic styles between CSS and JavaScript. If you’re deciding between a preprocessor variable and a custom property, consider when the value needs to be resolved and what needs to influence it. If it needs to respond to the person using the page or the rendering context, a custom property resolved in the browser can be genuinely useful. Just be sure to check what happens when the value—or the enhancement consuming it—isn’t available. That’s the question I should have spent more time on in 2014. * * * #### Footnotes 1. This assumes the browser also supports `margin-block-start`; a browser that doesn’t will ignore both declarations. ↩︎ 2. You can register a custom property with `@property`, defining its syntax, inheritance behavior, and an initial value. Assigning a value using syntax like `--foo: bar;` doesn’t register it. The examples in this post use unregistered custom properties. ↩︎
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 18/10/2026
Eat ‘em. Wear ‘em. Keep ‘em as a pet. #nola #nawlins #gators
Baby gator portraits.
000 0
Reposted by westbrook
aburtch @aburtch.shakedown.social.ap.brid.gy · 18/10/2026
Here’s the thing. It looks like a political cartoon, but it’s real. The slices of the pizza are exactly mathematically proportional to reality. We are being screwed every single day by rich oligarchs. And we know it. It’s time to fundamentally change the […] [Original post on shakedown.social]
A pizza representing our economy is sitting on the table. A rich white guy labeled “Top 1%” gets a slice that looks to be about 85% of the pie. A white lady labeled “Merely wealthy” gets a slice that looks to be 13% or so. A black lady labeled “upper middle class” has a slice that’s about 2%. A frowning guy labeled “lower 50%” has a few crumbs on the table, not even a slice.

The captions say: 
How America’s economic pizza is sliced per capita. This is not a joke.
412103 103
Reposted by westbrook
Bruce Lawson ✅ ♫ ♿ ✌️♂️✊ @brucelawson.vivaldi.net.ap.brid.gy · 13/10/2026
W3C Draft Finding of the TAG: Installing Websites Must Be Easy. "We expect user agents to make installation an obvious affordance to users. Specifically, we expect the install option to clearly name the action, and to be easily reachable from the browser’s UI. An entry inside a menu with an […]
social.vivaldi.net
Original post on social.vivaldi.net
001 1
Reposted by westbrook
Jared White (ResistanceNet ✊) @jaredwhite.indieweb.social.ap.brid.gy · 13/10/2026
Trippy cosmic multiverse Narnia movie? Sold!! 🙌 youtu.be/gDJ-ini7fF0
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 14/10/2026
Creativity… Creation… The same? Not the same? Does technology empower/accelerate both? Equally? At all? Which is cloning something? Which is remixing two things that already exist? One or both or neither? Is it possible we’ve been using both words wrong for a while now? 🤔
000 0
Reposted by westbrook
Jared White (ResistanceNet ✊) @jaredwhite.indieweb.social.ap.brid.gy · 12/10/2026
He almost gets it. #BoycottSkydance
Screenshot of a toot.

John Gruber
@gruber@mastodon.social
@invalidname I don't need to follow what DF
readers are saying there. But I do occasionally
need to read posts exclusively posted there.
The Ellisons aren't much better than Musk.
Should I stop watching Warner Bros and
Paramount movies, HBO, CBS, and CNN?
111 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 12/10/2026
Absinthe. That is all. …hi from New Orleans! 👋🏽
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 08/10/2026
“Knowing what you’re talking about” has become such a dangerously nuanced proposition, it’s a wonder anyone tries to pretend they can do it these days. 😅
000 0
Reposted by westbrook
Aaron Gustafson @aaron.front-end.social.ap.brid.gy · 06/10/2026
I’ve spent the better part of the last 2 years both using coding models and trying to help these models deliver higher quality code and I honestly could not agree more with Zach here… www.zachleat.com/web/ai-websites
zachleat.com
“AI, make the website good”
Millions of _Large-Language-Model_ -generated words have been spilled on craftsmanship in this **gilded-age of software development**. We now have agents to plan how code will be written, agents to write code, agents to review code, agents to orchestrate and dispatch tasks to other more (or less) capable subagents (these heavily subsidized tokens aren’t going to pay for themselves). I’ve been in this game long enough to recognize tooling improvements from software companies at the bleeding edge of technique and application and it usually goes something like this: “If we make it easier for developers to create software, they will have more bandwidth to produce higher quality software!” I’m always left wondering (suspecting the answer with hopeful optimism that my hunch is wrong this time): do these workflow improvements actually improve how people (technical or otherwise) _experience_ software? Certainly **we have more software**. But is it better? I don’t know. Front-end web developers have lived through a few cycles of this (seven or eight years of client rendering, fifteen years of the _single-page-application_ -era smokescreen are a few that come to mind), sold as though improvements to developer experience would cause the reanimated corpse of Ronald Reagan himself to ask you for commit access to ship trickle-down improvements to user experience. Is this cycle repeating the same playbook (on a more accelerated pace)? Certainly we’ve seen numerous recent anecdotal examples of software becoming _less_ reliable over time (GitHub is the most recent scapegoat I’ve seen, but on my read they seem to be a second-order victim more than anything). _(Seems like a great time to be in the Monitoring/Status Page business)_ With these seismic changes, I will continue to make the argument that craft defined as **caring about the quality of output** (independent of the tools used to generate the output) is **more important than ever**. Caring about what you ship will always have **real-world value** to ~~visitors/consumers/users~~ **real people**. _Prefers-reduced-motion respecting web performance filmstrips fromthe AI category on Speedlify, a category boasting a failing median Core Web Vitals score with 12 out of 13 sites failing Lighthouse performance and Axe accessibility checks._
016 6
Reposted by westbrook
Bruce Lawson ✅ ♫ ♿ ✌️♂️✊ @brucelawson.vivaldi.net.ap.brid.gy · 06/10/2026
If I don't keep my car roadworthy and crash into yours, it hasn't gone "rogue", it's my negligence and I'm responsible. If my dog attacks you, I am liable. There are no rogue AIs, just negligent AI companies. Prosecute them.
714149 149
westbrook @westbrook.mastodon.social.ap.brid.gy · 01/10/2026
Do the dance macabre! greenlung.bandcamp.com/track/dance-… There's no better to day to take a listen to this new album from #greenLung on #bandcamp that today! And no better today than one that happens in October, the spookiest of months. 👻 👺 👹 🎃 Especially with […]
mastodon.social
Original post on mastodon.social
021 2
westbrook @westbrook.mastodon.social.ap.brid.gy · 22/09/2026
What sort of performance profile do you want to see in your component library/design system before you even START building your app? Don't let your dogs latest $1MM start-up idea get dragged down by bad out of the box decisions (no matter "who" is making […] [Original post on mastodon.social]
Various component library providers and their FCP and LCP numbers for a mid-complexity showcase site, no deep functionality, server connectivity, or the like. Just the bones...and how much they cost your users.
011 1
Reposted by westbrook
Bruce Mirken @brucemirken.mas.to.ap.brid.gy · 20/09/2026
RE: flipboard.com/@npr/u.s.-news-aspd61… A violent criminal gang is on the loose in the U.S. Its name is #ICE
flipboard.com
014 4
westbrook @westbrook.mastodon.social.ap.brid.gy · 19/09/2026
What does it all even mean any more?
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 15/09/2026
Ooooie! These customizable selects look HOT in Safari 27. 🥰 #developingDesignSystems #webDev #testingTheWebForward #webkit #safari
A neighborhood selector rendered as a Customizable Select in Safari 27.
021 2
westbrook @westbrook.mastodon.social.ap.brid.gy · 09/09/2026
RE: mastodon.social/@kyokokitamura/1172… As it seem to take less and less input to make "things", the questions of whether "the fringes" are a matter of control or time and how "ownership" can be preserved, both artistically and economically, continue to loom larger and […]
mastodon.social
Original post on mastodon.social
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 08/09/2026
@davatron5000 is there a microlighter syntax that would highlight tagged template literals? #developingDesignSystems #htmlInJS
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 08/09/2026
Is it too soon to give the "density" API for your component library values of "lust", "friendship" and "covid"? #askingForAFriend #developingDesignSystems #webDev
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 03/09/2026
@maarteuh Us regular people just get the 👍️ mark...
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 03/09/2026
RE: mastodon.social/@davatron5000/11720… Ignore the part I played it helping bring this spec to life, or the work I've done to possiblyfill it, and think of the users/developers that want an easier path to even more rich content in a highly accessible and performant manner […]
mastodon.social
Original post on mastodon.social
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 01/09/2026
Doing some experimentation around the upcoming Reference Target API for Shadow DOMS... - API: github.com/WICG/webcomponents/blob/… - Polyfill? westbrook.github.io/reference-targe… It's just landed in Chromium! […]
mastodon.social
Original post on mastodon.social
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 01/09/2026
@saschadiercks TFW you leverage a library built as a polyfill for features missing in IE8/9... Do the kids even know what #internetExplorer was like anymore? 👴
000 0
Reposted by westbrook
Sascha Diercks 🇪🇺 @saschadiercks.mastodon.social.ap.brid.gy · 01/09/2026
Using invoker api in a react environment and react is like, nah I don‘t know that … let‘s just remove it. I really don‘t understand why a framework/library requires workarounds to be able to work with native apis. 😓
101 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 23/08/2026
Can't the web can just measure my pupils' response to the site in question and automatically modulate its delivery to most appropriately serve the content in the specific environmental conditions at the intersection of the world around me, the content in question, and my eyes current physical […]
mastodon.social
Original post on mastodon.social
001 1
Reposted by westbrook
Joe Pea @joe.trusktr.io · 20/08/2026
The initial pieces of Declarative Partial Updates have landed in the HTML spec. Folks, I believe this means we are officially on the road towards declarative native templating! Microsoft Edge has prototyped a concept of {{handlebars}} interpolation syntax too. github.com/whatwg/html/...
github.com
Add <template for> for declarative out-of-order streaming by foolip · Pull Request #11818 · whatwg/html
Add support for &lt;template for&gt;, where the for attribute value identifies a &lt;?marker&gt; or &lt;?start&gt; processing instruction to be replaced. This makes out-of-order streaming in the in...
1155 15
Reposted by westbrook
Jenn / CaptainHanyuu 💖✨ @captainhanyuu.art · 12/08/2026
MY DISCO BALL IN THE BEDROOM IS SHOWING ME THE ECLIPSE, HOW COOL IS THAT?!
crescent light reflections
7546156 546
westbrook @westbrook.mastodon.social.ap.brid.gy · 11/08/2026
What the hell year am I in right now?!? #webDev #lifeAmirite
020 2
Reposted by westbrook
Marc Jacobs (he/him) @trollball.bsky.social · 28/07/2026
Listening to Tito Puente’s cover of Take Five. This is a great version. Puente rules on the drums, as expected. The sax solo by Mario Rivera, wow. Need to find more of him. #Jazz #LatinJazz #Music youtu.be/El3lMf_Mfhc?...
youtu.be
Take five . Tito Puente.Jazz latino
YouTube video by jairocol
063 6
westbrook @westbrook.mastodon.social.ap.brid.gy · 15/07/2026
So many changes and opportunities coming up in life these days…
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 12/07/2026
Karaoke. That is all.
100 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 12/07/2026
How are YOU feeling about it all?
000 0
Reposted by westbrook
Niki @nikitonsky.mastodon.online.ap.brid.gy · 12/07/2026
Trying to figure out what’s clickable in modern UI
14671339 671
westbrook @westbrook.mastodon.social.ap.brid.gy · 12/07/2026
It _is_ the same blocker in both cases, yes.
010 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 12/07/2026
Let's say, as a proof of concept, that someone got a browser to support code like this: ``` <div> <template shadowrootmode="open"> <style> ::slotted(ul) li {color: green;} ::slotted(ul) .deep {color: red;} </style> <slot></slot> </template> <ul> <li>should be green</li> <li><span […]
mastodon.social
Original post on mastodon.social
150 5
westbrook @westbrook.mastodon.social.ap.brid.gy · 09/07/2026
Reminder: the <dashed-ident> in CSS is so named because the identity requires a dash in its name. Who knew? 🤷‍♂️ Me. 😞 When do I forget? 😖 Always. 🕐️ #css
100 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 09/07/2026
#lazyDev `@function` is exciting to see coming to browsers new you, but how's the conversation around `@mixin` or the like coming? Did it fizzle out? Is it about to surprise and delight with a 60 minute encore? Where my #CSSWG friends at? #webDev #css #testingTheWebForward
030 3
Reposted by westbrook
Jared White (ResistanceNet ✊) @jaredwhite.indieweb.social.ap.brid.gy · 25/06/2026
@nshki Some accts off the top of my head: @davatron5000 @5t3ph @mia @jimniels @adactio @beep @konnorrogers @westbrook @markwyner @chriskirknielsen @belldotbz @sophie
001 1
Reposted by westbrook
IntentToShip @intenttoship.dev · 19/06/2026
Blink: Intent to Ship: aria-actions
groups.google.com
Blink: Intent to Ship: aria-actions
Blink: Intent to Ship: aria-actions
0118 11
westbrook @westbrook.mastodon.social.ap.brid.gy · 18/06/2026
Dare I say "salt of the earth"?
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 16/06/2026
If you can’t l share “context” unless you’re in the same room, it’s not really “context”…it’s just gossip.
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 14/06/2026
I guess, sometimes, defeating that _second_ dark empire is a bridge too far. See yall again, next year! #goSpursGo
000 0
westbrook @westbrook.mastodon.social.ap.brid.gy · 14/06/2026
OK #spurs, let’s do a whole game tonight. Pretty or ugly, a win is a win. Let’s go! #goSpursGo #nba
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 14/06/2026
Go Spurs Go!! Let's send it back to NYC and game six. The Knick's would have more fun winning there (if they can 🤭 ) than in SA. #nba #spurs #goSpursGo
011 1
Reposted by westbrook
Matt Campbell @matt.toot.cafe.ap.brid.gy · 10/06/2026
Excellent article about developing web apps that work for as many users as possible. mohkohn.co.uk/writing/html-first
mohkohn.co.uk
How building an HTML-first site doubled our users overnight
My client was a utility company, and they had a big problem...
104 4
westbrook @westbrook.mastodon.social.ap.brid.gy · 09/06/2026
I wonder if that was the most money spent on an #nba playoff game where the home team lost? #goSpursGo
001 1
westbrook @westbrook.mastodon.social.ap.brid.gy · 08/06/2026
Going fast probably isn't good for anyone. Absolutely none of your stakeholders benefit more than getting to prime the work queue again sooner. Quality. Quantity. Focus. Pleasure. All that starts to leak through the cracks that silently grow in parallel with your "velocity".
011 1