Sign in

Chance

@chance.dev
7K followers 556 following 820 posts

Senior useEffect engineer @workos.bsky.social

PostsRepliesMedia
Chance @chance.dev · 29/09/2026
Meme with a screenshot of Larry David in Curb Your Enthusiasm, with the caption: “when you argue with another leftist: ‘fuck you and I’ll see you tomorrow.’”
030
Chance @chance.dev · 12/09/2026
9.11. No History by @kevinpdevine.bsky.social
011
Chance @chance.dev · 20/08/2026
Every time storybook releases a new major
Ben Affleck smoking, looking rough and exasperated
1100
Chance @chance.dev · 10/04/2026
Hard to say what is the worst UI regression in iOS 26 but this has to be near the top. Maddening.
iPhone screenshot showing an active text field where the “clear field” button and “cancel” button are right next to one another and look basically the same, making them extremely easy to confuse and perform the wrong action.
2260
Chance @chance.dev · 02/01/2026
In celebration of keeping my 2025 fitness routine in tact all year, Bluesky gets one thirst trap to showcase said jeans.
A middle aged, white, red haired, bearded man standing shirtless in front of the mirror trying to be confident and sexy for random people on the internet for validation of his continued existence
3100
Chance @chance.dev · 14/10/2025
6/10. I might have a problem.
6 electric guitars hanging on a wall. From left to right:

1. Fender Jazzmaster in olive drab green
2. Fender Tom Delonge Starcaster in Shoreline gold
3. Fender Thinline Telecaster in a dark brown stain
4. Fender HH Strat in Fiesta Red
5. Epiphone Firebird in Ember Red
6. Custom build HH Jazzmaster in Pearl White
5281
Chance @chance.dev · 07/10/2025
If anyone is bopping around at React Conf and wants a Radix shirt, find me and I’ll hook you up.
Off white T shirt with a retro-geometric design variation of the Radix UI logo.
5130
Chance @chance.dev · 03/10/2025
Best conference ever kicking off LFG 🇪🇸 @reactalicante.es
Presentation stage with a large screen reading “React Alicante. The international React.js conference in Spain”
051
Chance @chance.dev · 02/10/2025
That said…might be a good time to get back into consulting. Sharp knives gonna cut.
Screenshot from the React docs:

When to use useEffectEvent
You should use useEffectEvent for functions that are conceptually "events" that happen to be fired from an Effect instead of a user event (that's what makes it an "Effect Event"). You don't need to wrap everything in useEffectEvent, or to use it just to silence the lint error, as this can lead to bugs.

For a deep dive on how to think about Event Effects, see: Separating Events from Effects.
040
Chance @chance.dev · 01/10/2025
Had to go to the bad place for a screenshot, but I’m stoked to be speaking at React Conf next week! Join me live or via stream to learn about why ViewTransition and Activity are such badass APIs, coming soon to a React near you.
Tweet that reads: @chancethedev is giving a talk on React’s new features. October 7-8, 2025 at React Conf. conf.react.dev
4290
Chance @chance.dev · 12/07/2025
Bass day in the sound lab
Me holding a bass in a music studio throwing a 🤙 gesture
170
Chance @chance.dev · 03/07/2025
cooking something up, from the degenerate mind of @chantastic.bsky.social
screenshot showing a StreamYard account named "OnlyChan.*s"
191
Chance @chance.dev · 16/06/2025
This one is up there
Me holding a medal after running a marathon in Antarctica
1100
Chance @chance.dev · 01/06/2025
🔟
Selfie of me after my 10th half marathon, smiling and holding a medal. 13.16 miles in 1 hour 44 minutes, 7:54 minute per mile pace.
4350
Chance @chance.dev · 31/05/2025
Making things today
A drum set all mic’d up ready to record, in front of a wall of guitar amps in a music studio
070
Chance @chance.dev · 20/05/2025
Worthy addition imo
Screenshot of the Rev Left Radio podcast
020
Chance @chance.dev · 17/05/2025
Not bad for pushing 40
Selfie of my flipping the ol bird during a running race. Stats show a half marathon in 1:50 at 8:20 minute per mile pace.
4380
Chance @chance.dev · 17/05/2025
Jack Nicholson as the Joker, dancing and breaking things during the painting scene in the 1989 Batman movie
020
Chance @chance.dev · 11/05/2025
Got a wife yesterday ☺️
Selfie with me and my lovely new wife at our wedding wearing the fanciest of wedding things
322081
Chance @chance.dev · 04/05/2025
This one smelled pretty great
New Epiphone Firebird V guitar in red with a white pickguard
120
Chance @chance.dev · 22/04/2025
gtfoh
Snippet from a news article about Italian cardinals who may succeed the pope, highlighting the last name of one: 

“Another Italian possibility is Cardinal Piersbattista Pizzaballa…”
260
Chance @chance.dev · 20/04/2025
“Text me when you land”
Text message screenshot reading “plane crashed, texting you from hell”
080
Chance @chance.dev · 20/04/2025
me: I’m gonna stay an extra day after the conference to relax and recover also me:
Photo of the bay in Miami with Strava stats overlayed for a 12 mile, 1 hour 46 minute run
080
Chance @chance.dev · 18/04/2025
Made other people live code for my talk, 10/10 highly recommend
Standing on stage smiling and relaxed next to Dave as he live codes intensely for a captivated crowd
1100
Chance @chance.dev · 05/04/2025
In the lab
A drum kit set up and mic’s up in a dark recording studio
0160
Chance @chance.dev · 01/04/2025
What do you think @chantastic.bsky.social and I are discussing here?
Me and Chan looking at each other with straight faces while making silly gestures with our hands. Chan is sticking the index finger of one hand into the fist of the other, while I am interlocking my fingers
8161
Chance @chance.dev · 31/03/2025
got the CSS wildin for this one
150
Chance @chance.dev · 22/03/2025
Dropping this on a Friday should be a crime
Screenshot of a GitHub issue showing Next.is has a critical security bug with its middleware
2140
Chance @chance.dev · 13/03/2025
@nerdy.dev is there a way to transition between intrinsic sizes if the size property itself remains the same? Was hoping this would work without additional JS to determine the starting height, but no dice!
:root {
  interpolate-size: allow-keywords;
}

.content {
  /* property value never changes, but size
     does when content changes */
  height: calc-size(fit-content, size);
}

@media (prefers-reduced-motion: no-preference) {
  /* this does not work :(
     presumably because height property value
     has not changed? */
  .content {
    transition: height 0.35s ease;
  }
}
140
Chance @chance.dev · 01/03/2025
Had a blast
Me standing on a colorfully lit stage playing guitar
5210
Chance @chance.dev · 17/02/2025
Prep work for my first gig in over a decade coming in a few weeks. Can’t wait to blow up and kick this computer thing to the curb. LFG.
Me with an electric guitar, gesturing and cheesing for the camera in a small, poster-covered rehearsal space next to a woman holding a bass guitar and similarly cheesing for the camera.
7320
Chance @chance.dev · 06/02/2025
4. `show` vs. `showModal` really simplifies the implementation details for modal and non-modal dialogs! 5. Included a scroll-locking component for the background, but you could _probably_ get rid of this and just use CSS these days 🙌 6. Probably should get rid of the focus guards altogether
CSS snippet

body:has(dialog[open]) {
    overflow: hidden !important;
}
120
Chance @chance.dev · 28/01/2025
the signs were there
Chuck Schumer pretending to grill burgers showing cold unsalted patties and unmelted cheese
360
Chance @chance.dev · 20/01/2025
the team on my shirt won the sports game, rad
Selfie, me in a sports bar wearing a Buffalo Bills tshirt
1150
Chance @chance.dev · 14/01/2025
Whose got two thumbs and will be looking for you in the Magic City? This f'in guy.
Chance Strickland: Software engineer, WorkOS

Talk title: "Are you smarter than a React Component?"

April 17-18 2025
ReactMiami.com
4162
Chance @chance.dev · 03/01/2025
Stoked for that. Just picked up a little Christmas toy and I’m dying for an excuse to record with it if you need any guest tracks 🙂
Two Notes Captor X Torpedo load box
110
Chance @chance.dev · 01/01/2025
Here’s a pic that sums it up quite nicely
Blurry late night action shot of me mindlessly dancing in a dimly lit bar dressed in a half-buttoned floral shirt and bejeweled police captain hat, rocking a neatly trimmed mustache to top it all off.
160
Chance @chance.dev · 25/12/2024
Christmas morning #9 in the books ❤️🎄🎅
Selfie of me and my gal, lounging cozily on the couch in our PJs on Christmas morning
1270
Chance @chance.dev · 24/12/2024
Made the southern hajj
Me holding a medium order of Bo Rounds from Bojangles
380
Chance @chance.dev · 23/12/2024
San Diego’s run of epic fog. Quite pleasant from up here.
Early morning view from the plane just before sunrise. The sky is a cotton-candy blue-pink gradient with sparse clouds. A thick layer of fog hides the ground, with mountains faintly present in the distance.
080
Chance @chance.dev · 19/12/2024
Me literally just opening my laptop every morning
Discord modal reading: “Update failed - retrying in 6 seconds”
110
Chance @chance.dev · 17/12/2024
Got a lil website running on React Router 7
Screenshot of the Radix UI website
0430
Chance @chance.dev · 16/12/2024
Not sure if this is a great solution since those tags can also stick around unexpectedly. With route transitions it'd be nice to have some control (and confidence) over when styles are loaded/unloaded and precision with ordering.
Snippet from React Docs:

This special treatment comes with two caveats:

- React will ignore changes to props after the style has been rendered. (React will issue a warning in development if this happens.)
- React may leave the style in the DOM even after the component that rendered it has been unmounted.
110
Chance @chance.dev · 15/12/2024
Rarely find much at thrift stores but best $10 I’ve spent in a while
Selfie of me wearing a dark gray Slayer tee shirt with an intricate metal graphic in white and red
3670
Chance @chance.dev · 14/12/2024
This, plus not unloading styles after navigating away from routes where they are loaded, or at least offer an API for users to do so manually. This is not a bug, just a constraint you’ve designed for some reason. I wish you would reconsider.
Screenshot from Next docs:

Adding Global CSS
In Next.js, you can add global CSS files by importing them from pages/_app.js. You cannot import global CSS anywhere else.

The reason that global CSS can't be imported outside of pages/_app.js is that global CSS affects all elements on the page.

If you were to navigate from the homepage to the /posts/first-post page, global styles from the homepage would affect /posts/first-post unintentionally.
170
Chance @chance.dev · 12/12/2024
Important little nuance here about callback ref's cleanup function in React 19. If you are assigning a ref object in a callback ref and you decide to add a cleanup function, make sure you re-assign the ref during cleanup.
Typescript code snippet:

function setRefReact18(node) {
  // setRef is called when the element is attached and detached. When detaching,
  // the node is null. So if it's referenced elsewhere (eg: another element's
  // event handler), its value will be null if the element is not rendered.
  nodeRef.current = node;
}

function setRefReact19(node) {
  // setRef is called when the element is attached but *not* when it's detached.
  nodeRef.current = node;
  let mutationObserver = new MutationObserver(() => {/* ... */});
  mutationObserver.observe(node, { attributes: true });
  return () => {
    // If you add a cleanup function be sure to explicitly re-assign the ref
    // object to null during cleanup, or other references will point to the
    // ghost element that no longer exists.
    nodeRef.current = null;
    mutationObserver.disconnect();
  };
}
2434
Chance @chance.dev · 03/12/2024
Manipulated photo of Obama book cover, title reads “The audacity of Nope”
1180
Chance @chance.dev · 02/12/2024
🔥 TypeScript tip: Infer types from a statically defined Set using `as const` and `infer`
TypeScript code snippet:

const INPUT_BUTTON_TYPES = new Set([
	"button",
	"color",
	"file",
	"image",
	"reset",
	"submit",
] as const);

// "button" | "color" | "file" | "image" | "reset" | "submit"
type InputButtonType =
  typeof INPUT_BUTTON_TYPES extends Set<infer T>
    ? T
    : never;

export function isButtonLike(
	element: Element,
): element is HTMLInputElement & { type: InputButtonType };
1320
Chance @chance.dev · 29/11/2024
Interesting that TS inference of function args is inconsistent depending on the return type 🤔 Can't tell if this is a bug or some heuristics I don't quite understand.
Typescript code block.

declare function A<T>(value: T): Truthy<T> extends never ? false : true;
declare function B<T>(value: T): T
declare function C<T>(value: T): T extends string ? T : T extends number | bigint | boolean | null | undefined ? `${T}` : never;
declare function D<T>(value: T): T extends number ? `${T}` : T;

// inferred as type string
const ATest = A("");
// inferred as type ""
const BTest = B("");
// inferred as type string
const CTest = C("");
// inferred as type ""
const DTest = D(""); 

type Truthy<T> = T extends false | "" | 0 | null | undefined ? never : T;
1100
Chance @chance.dev · 29/11/2024
You sure? Is there a config flag required to change the behavior?
Code snippet showing an array filtered using the Boolean constructor still may contain falsey values
200