Colum Kelly's Avatar

Colum Kelly

@columk.bsky.social

Fullstack Developer | Climbing | Paragliding

39 Followers  |  169 Following  |  83 Posts  |  Joined: 05.11.2024  |  2.0825

Latest posts by columk.bsky.social on Bluesky

I don't think it would make sense to link to an edited down version of the talk, given the context. It's also missing the part I quoted from.

18.01.2026 06:55 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

Yes, I meant the call to set the optimistic state shouldn't be wrapped in another one (a nested transition), like you would with the useState updater. I thought that could be what you meant by "everything should be in a transition except useOptimistic".

17.01.2026 17:30 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

That's not my take so you'd have to ask Ricky.

Text inputs should be the highest priority, but if the input is causing some side effect then that should be deferred in some way. Either with a transition or by using useDeferredValue to use the input value elsewhere with a lower priority.

16.01.2026 19:59 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

I think he means that the call to the optimistic updater itself doesn't have to be wrapped in a transition, since it's going to break out of the transition anyway to perform the update.

16.01.2026 19:36 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 2    πŸ“Œ 0
Preview
useOptimistic Won't Save You | Colum Kelly Thoughts on the useOptimistic hook that was introduced in React 19

www.columkelly.com/blog/use-opt...

Updated the todo examples and some of the writing after getting feedback from @ricky.fm

To be fair, Ricky's version of the final example is very clean, (although it took me a while to grasp). useOptimistic might save you after all.

16.01.2026 19:30 β€” πŸ‘ 8    πŸ” 2    πŸ’¬ 1    πŸ“Œ 0

That one should work, even when mashed.

16.01.2026 06:05 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

🀣 (if you're in a transition!) I'll update the todo examples tonight.

16.01.2026 00:29 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

Wow that's really clean, thanks. Useful to think of it that way. useAsyncState.

15.01.2026 23:52 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
Preview
useOptimistic Won't Save You | Colum Kelly Thoughts on the useOptimistic hook that was introduced in React 19

New blog post
www.columkelly.com/blog/use-opt...

#webdev #react

15.01.2026 09:53 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 1
Preview
where good ideas come from (for coding agents) (and the part where users have to level up)

Tech blogs that I used to enjoy are entirely written by ChatGPT now. I get it, we all want more free time, but it's still a shame.

sunilpai.dev/posts/seven-...

14.01.2026 19:43 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Async React

@emilkowal.ski I'm very curious what you think of the async react showcase at async-react.dev

The intention was to demo the last 10 years of innovation but it seems like bad UX to me. I know you have thoughts on why loading patterns like this can make an app feel much slower than it is.

05.12.2025 07:23 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Preview
Directives and the Platform Boundary | TanStack Blog A Quiet Trend in the JavaScript Ecosystem For years, JavaScript has had exactly one meaningful directive, "use strict". It is standardized, enforced by runtimes, and behaves the same in every environm...

Hear hear

tanstack.com/blog/directi...

31.10.2025 04:42 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Post image

Thanks @deadcode.website!

30.10.2025 16:20 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
let user = api.authenticate(token);

// Get the user's list of friends (an array).
let friendsPromise = user.listFriends();

// Do a .map() to annotate each friend record with their photo.
// This operates on the *promise* for the friends list, so does not
// add a round trip.
// (wait WHAT!?!?)
let friendsWithPhotos = friendsPromise.map(friend => {
  return {friend, photo: api.getUserPhoto(friend.id))};
}

// Await the friends list with attached photos -- one round trip!
let results = await friendsWithPhotos;

let user = api.authenticate(token); // Get the user's list of friends (an array). let friendsPromise = user.listFriends(); // Do a .map() to annotate each friend record with their photo. // This operates on the *promise* for the friends list, so does not // add a round trip. // (wait WHAT!?!?) let friendsWithPhotos = friendsPromise.map(friend => { return {friend, photo: api.getUserPhoto(friend.id))}; } // Await the friends list with attached photos -- one round trip! let results = await friendsWithPhotos;

This is really cool

blog.cloudflare.com/capnweb-java...

#webdev

19.10.2025 06:22 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Preview
The future of web development is AI. Get on or get left behind. Editor’s Note: previous titles for this article have been added here for posterity.

😜
alex.party/posts/2025-0...

#webdev #ai #frontend

15.05.2025 18:59 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Seconding that the scroll is pretty finicky on mobile. Tricky to get the tab content centered and then the tabs sometimes won't scroll until they're focussed first with a tap.

15.04.2025 03:37 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

My Discover page is all cute pets and nature photos no matter how many times I select "see less of this" on those posts. Something is definitely broken.

13.04.2025 00:04 β€” πŸ‘ 8    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

With image models you can train a LORA to reproduce a conventionally beautiful face accurately using as little as one reference image. With an unusual face, you need to train with a much larger dataset to get the same result.

12.04.2025 04:38 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

I've been playing around with this. I'd like to have a component continue suspending until the image within has fully loaded. I have tried throwing a promise and then resolving it in the onload callback but couldn't get it to work.

10.04.2025 18:48 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

People conflate SPA with CSR and MPA with SSR, forgetting that SPAs can combine rendering methods. I'd say most RSC apps are SPAs, although an RSC app with form navigation is actually a combination of SPA and MPA.

08.04.2025 17:23 β€” πŸ‘ 9    πŸ” 1    πŸ’¬ 1    πŸ“Œ 1

I see Kafka in a lot of job requirements so this was useful context.

Following up on your question to listeners, I'd love to hear a deep dive on long polling. Or even a full podcast on different ways to push data to the client. Long polling, SSE, websockets...

08.04.2025 06:26 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
type InputProps 
  = InputHTMLAttributes<HTMLInputElement> & CustomInputProps

const Input = ({customProp, ...rest}: InputProps) => {
  console.log(customProp)
  return <input {...rest} />
}

export default function App() {
  return <Input type="text" name="foo" customProp="bar" />
}

type InputProps = InputHTMLAttributes<HTMLInputElement> & CustomInputProps const Input = ({customProp, ...rest}: InputProps) => { console.log(customProp) return <input {...rest} /> } export default function App() { return <Input type="text" name="foo" customProp="bar" /> }

I've made the mistake of listing out a bunch of input attributes as prop types when I want to pass them to a component. React actually a type for these which makes it much cleaner.

#webdev #frontend #react #typescript

31.03.2025 20:16 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
React Query API Design: Lessons Learned - Dominik Dorfmeister
YouTube video by BeJS React Query API Design: Lessons Learned - Dominik Dorfmeister

Really enjoyed your talk on API design yesterday. It's here if anyone's interested: youtu.be/l3PxErcKeAI?...

26.03.2025 18:56 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

@wesbos.com thanks, that was my potluck q about NextJS.

I'm still confused because revalidateTag also clears the client's router cache completely.

In my testing, even calling it on a tag that doesn't exist does this. It makes all layouts and routes that were cached suspend again when navigating.

26.03.2025 18:49 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

@tej.as do you really need to rely on data-test attributes with Playwright? I thought the standard was to use user-facing attributes like accessibility roles and labels.

25.03.2025 20:20 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Preview
IO devices and latency β€” PlanetScale Take an interactive journey through the history of IO devices, and learn how IO device latency affects performance.

A great interactive visualisation of different types of storage from PlanetScale. Reminds me of Sam Rose's Turing Machine visualization.

planetscale.com/blog/io-devi...

#webdev

25.03.2025 17:54 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

There's a node compat flag that adds unjs polyfills for a lot of them, but not http. Workers use web requests. Best bet is to nag the library authors to use web APIs.

20.03.2025 07:51 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

I think it might be working because I hydrate the store in an effect with data from the server. It seems to be working anyway. I'm uncertain as the docs are clear that using it outside of context will cause issues.

In case you're curious: github.com/columk1/thre...

github.com/columk1/thre...

13.03.2025 21:43 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

@tkdodo.eu is there a way to force a global state issue with Zustand on the server? I'm using it in Next.js without Context but I'm struggling to find any issue. I've tried running multiple browser sessions and a suite of e2e tests but everything seems to work fine, no state is shared between users.

13.03.2025 20:43 β€” πŸ‘ 2    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

There are lots of posts with 1 like and no replies, and sometimes they're above posts that were made more recently with more interaction. It's all a bit confusing. None of it fits the "trending" descriptor.

13.03.2025 16:07 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

@columk is following 20 prominent accounts