Sign in

Tom Sherman

@tom.sherman.is
8.5K followers 485 following 4.4K posts

Software Engineer in Norwich. he/him Working on @frontpage.fyi tom-sherman.com

PostsRepliesMedia
Tom Sherman @tom.sherman.is · 21h
The fancier the cheeses, the stinkier the fridge is
070
Tom Sherman @tom.sherman.is · 01/10/2026
Haha yeah. This spec is much better though tbh!
060
Tom Sherman @tom.sherman.is · 01/10/2026
astryx.atmeta.com is pretty good! When you have a team of any reasonable size you have to build it yourself though really, with your own trade offs baked into the interface (there comes a point where accepting somebody else's comes back to bite you)
astryx.atmeta.com
Astryx Design System
An open source design system that is fully customizable and agent ready.
010
Tom Sherman @tom.sherman.is · 01/10/2026
Base UI isn't designed to be a design system though, they're primitives to enable you to build one. They need lots of escape hatches for supporting all of the different ways you might use it, that's not a flaw IMO The problem with shadcn is that it doesn't attempt to add that layer on top
030
Tom Sherman @tom.sherman.is · 01/10/2026
Most recent example of many of this is Claude choosing to conditionally wrap something in a tooltip when it should use disabled on the tooltip root, conditional wrapping causes focus to be shifted to document.body when hiding the tooltip These are just fundamentally bad component abstractions
140
Tom Sherman @tom.sherman.is · 01/10/2026
I'm really changing my opinion on shadcn lately, i don't think it adds enough value to warrant existing Humans and LLMs are not capable of using the component abstractions in a way that's accessible. Being accessible is objective number 1 of any component library or design system
1110
Tom Sherman @tom.sherman.is · 01/10/2026
That's for tag names right? Not attribute/property names
100
Tom Sherman @tom.sherman.is · 01/10/2026
So I just learned that in @typescriptlang.org any JSX element is allowed arbitrary attributes as long as they contain a `-` 🤔 It's documented as an exemption for invalid JS identifiers (why?) but I checked the source and literally only checks for hyphens. Insane behaviour
function Foo() {
  return null;
}

const jsx = <Foo foo foo-bar />;

the `foo` attribute on the component is underlined in red showing an error.Note: If an attribute name is not a valid JS identifier (like a data-* attribute), it is not considered to be an error if it is not found in the element attributes type.
170
Tom Sherman @tom.sherman.is · 30/09/2026
I believe it's fixed but the fix is disabled behind a flag 😭
130
Tom Sherman @tom.sherman.is · 29/09/2026
I suppose if you follow that idea to it's logical conclusion you basically reinvent cloudflare workers 😆
010
Tom Sherman @tom.sherman.is · 29/09/2026
I always wondered: why bother assigning multiple cores to a pod only to then do clustering inside? Why not just assign a single core and do all clustering at the k8s layer?
200
Tom Sherman @tom.sherman.is · 29/09/2026
We ran into a really frustrating bug in @stylexjs.com dev mode, has anyone experienced a similar issue? Surprised it's not been reported before! github.com/facebook/sty...
github.com
[unplugin] Vite dev: CSS for a lazily loaded module is applied after the module has evaluated · Issue #1919 · facebook/stylex
Describe the issue With @stylexjs/unplugin under the Vite dev server, a module that uses StyleX and is loaded after the page has started does not have its CSS applied when it evaluates. The styles ...
121
Tom Sherman @tom.sherman.is · 24/09/2026
Yeah it's deceptively tricky. In the next version of our design system at work we're gonna remove the tooltip component, it's just too hard to get people to use it correctly. We'll just have props to allow relevant components to have a tooltip (eg. IconButton)
010
Tom Sherman @tom.sherman.is · 24/09/2026
For example if a tooltip just shows the full value of a piece of truncated text, it shouldn't be linked with aria-describedby lest the label be announced twice by screen readers In this use case the tooltip only exists for users _not_ using a screen reader
120
Tom Sherman @tom.sherman.is · 24/09/2026
On top of that it's not even clear what the best default experience is, because there are always use cases where having an accessible label is required and where it absolutely shouldn't exist
110
Tom Sherman @tom.sherman.is · 24/09/2026
But this is actually impossible to implement in React without relying on mutation observers. And even that relies on being able to get a ref to the trigger's HTML node, which isn't always possible
100
Tom Sherman @tom.sherman.is · 24/09/2026
Firstly, what if the trigger supplies a description of it's own? Should Tooltip content A: Override it B: Merge with it C: Yield to it I'd say B is the best default behaviour because A & B throw away context
110
Tom Sherman @tom.sherman.is · 24/09/2026
Accessible tooltips are incredibly hard to build as a generic component in React (and I assume other component-based frameworks) It's way harder than just linking the tooltip text to the trigger with aria-describedby
130
Tom Sherman @tom.sherman.is · 16/09/2026
The novel UX benefit over using a password manager is that a passkey is also time based, so you don't need a secondary TOTP.
030
Tom Sherman @tom.sherman.is · 10/09/2026
It's massively inspired by Effective RSC. It extracts the parts out that make sense for use in a framework agnostic way
nikhilsnayak.dev
Introducing effective-rsc
An Effect-native React Server Components framework for Bun, built on Rspack and the Navigation API.
000
Tom Sherman @tom.sherman.is · 10/09/2026
I'm still not sold on the syntax noise, it feels weird when you're trying to just compose UI. But if all of your data layer and business logic is in already in Effect it might make sense instead of doing `await Effect.runPromise(e)` in every server component
100
Tom Sherman @tom.sherman.is · 10/09/2026
You write server components and server functions using Effect, and it integrates into React and the framework (Next.js adapter in the repo) to scope resources to the request or the process
100
Tom Sherman @tom.sherman.is · 10/09/2026
Experimenting with Effect-native React Server Components github.com/tom-sherman/...
github.com
GitHub - tom-sherman/rsc-effect
Contribute to tom-sherman/rsc-effect development by creating an account on GitHub.
100
Tom Sherman @tom.sherman.is · 09/09/2026
For React Server Components, yeah. But that's not render blocking either.
110
Tom Sherman @tom.sherman.is · 09/09/2026
Maybe in a bad React app, but a good one will return usable HTML from the server.
110
Tom Sherman @tom.sherman.is · 09/09/2026
I know this question is mostly rhetorical but one answer is: Not all bytes are created equal. CSS is render blocking, JS is not.
110
Tom Sherman @tom.sherman.is · 09/09/2026
I'd love to see an example if you have one!
000
Tom Sherman @tom.sherman.is · 07/09/2026
People that self host their observability stack: what do you use for frontend RUM?
110
Tom Sherman @tom.sherman.is · 06/09/2026
No caption button on either on Android for me
000
Tom Sherman @tom.sherman.is · 02/09/2026
bsky.app/profile/tom....
100
Tom Sherman @tom.sherman.is · 02/09/2026
Yeah I remember @jakearchibald.com writing about how this is deceptively complicated to add
100
Tom Sherman @tom.sherman.is · 02/09/2026
Can you share a link to this post?
100
Tom Sherman @tom.sherman.is · 02/09/2026
What apps have you used that do this well/correctly? Specifically apps that have some complex shell-like navigation, like Jira or Notion. I haven't found one that implements this pattern yet
100
Tom Sherman @tom.sherman.is · 02/09/2026
None of the people recommending that you do this seem to capture the nuance, it's just "move the focus". I've found zero apps that do this so it begs the question: is implementing it the "correct" way more surprising than keeping the focus on the nav link?
000
Tom Sherman @tom.sherman.is · 02/09/2026
Agree. But I think there are genuine reasons for some UIs (not all) to keep the focus on the nav item, I'm thinking of UIs that have a shell with sidebar back items. I feel like it's a bit weird to move the focus to the inner frame on navigate, that feels more disruptive than helpful
100
Tom Sherman @tom.sherman.is · 02/09/2026
I think that's the reason why frameworks or routers don't build it in by default, they can't guarantee a good experience so they just fall back to the safe decision of keeping focus on the link.
010
Tom Sherman @tom.sherman.is · 02/09/2026
I feel like this is just a massive case of "it depends", with moving focus at least. It depends on the exact UI, app, demographic, user type, demographic etc. Adding live region announcements for a route change seems like a no brainer, very little reason not to do that that I can see.
000
Tom Sherman @tom.sherman.is · 02/09/2026
Many apps/routers/frameworks do include live region announcements for route changes but don't move focus, even though I see that both measures are recommended equally by accessibility advocates
100
Tom Sherman @tom.sherman.is · 02/09/2026
So, it's recommended that nav links move focus to the main content by #a11y experts. But I can't find a single app that actually does this outside of static content apps. All of the apps of any complexity that I've checked don't work this way What gives?
411
Tom Sherman @tom.sherman.is · 29/08/2026
Get business idea Realise I can't do sales Realise I don't have any friends that are good at sales Give up on idea Repeat 😂
030
Tom Sherman @tom.sherman.is · 26/08/2026
And just like clockwork GitHub actions is down. The same time every day it feels like. You'd think GitHub would have worked out which time Americans wake up at this point and pre warm their infra or something
280
Tom Sherman @tom.sherman.is · 23/08/2026
Time for a bloom filter maybe?
100
Tom Sherman @tom.sherman.is · 21/08/2026
sad
030
Tom Sherman @tom.sherman.is · 19/08/2026
The important thing is that there is full suspense support and my understanding was that the prefetchInRender flag was the closest thing to that in RQ today
110
Tom Sherman @tom.sherman.is · 19/08/2026
This part is why I'm not fussed about the actual API being use(promise) or not, if RQ needs to encapsulate it inside use(Suepense)Query to keep those features then so be it
100
Tom Sherman @tom.sherman.is · 19/08/2026
I'm not seeing any problems with either of those tbh, pretty sure it's the recommended approach with RQ today anyway. Put it in the fetcher or derive it in render. They removed the onSuccess callbacks a while ago
100
Tom Sherman @tom.sherman.is · 19/08/2026
they can never convince me that sin and cosine are the same. sin is a wave and cos is literally just a v like what do you mean
Graph of f(x) = cos x and f(x) = sin x
140
Tom Sherman @tom.sherman.is · 19/08/2026
@ricky.fm was discussing with the team about this but I don't know where it got to. My assumption was that the reason this didn't get traction was because there was tension in these changes and the way the RQ API (or maybe the core/react split pattern) works, but I don't know for sure
110
Tom Sherman @tom.sherman.is · 19/08/2026
My understanding was that RQ's cache needed to be changed to be based around [next, prev] states to properly support concurrent rendering, which sounds like the root of the issue you described
120
Tom Sherman @tom.sherman.is · 19/08/2026
Both Relay and Fate both work by reusing promises (well, they both use their own thenable resources but same thing really)
100