# Writing

Notes on code, design, and the things I learned along the way.

19 articles, 2018–2026.

## All writing

[Browse tags](https://devinschulz.com/tags/index.md)

### Building a Chat Interface That Doesn't Fight Your Scroll Position

29 October 2026 · [React](https://devinschulz.com/tags/react/index.md), [Frontend](https://devinschulz.com/tags/frontend/index.md), [UX](https://devinschulz.com/tags/ux/index.md)

A React implementation for following streaming replies, pausing when someone scrolls up, and keeping their place when older messages load. Includes a working demo.

[Read article](https://devinschulz.com/blog/building-a-chat-interface-that-doesnt-fight-your-scroll-position/index.md) · [Website](https://devinschulz.com/blog/building-a-chat-interface-that-doesnt-fight-your-scroll-position/)

### Reflecting on Twelve Years of Remote Work

21 October 2026 · [Career](https://devinschulz.com/tags/career/index.md), [Remote](https://devinschulz.com/tags/remote/index.md)

Looking back on nearly twelve years of remote work, what changed during COVID, and what I still appreciate about working from home.

[Read article](https://devinschulz.com/blog/reflecting-on-twelve-years-of-remote-work/index.md) · [Website](https://devinschulz.com/blog/reflecting-on-twelve-years-of-remote-work/)

### The Hardest Part of Frontend Development Isn't Writing Code

18 October 2026 · [Frontend](https://devinschulz.com/tags/frontend/index.md), [Opinion](https://devinschulz.com/tags/opinion/index.md)

After more than a decade of building interfaces, the hardest work is deciding how they should behave when things don't go as planned.

[Read article](https://devinschulz.com/blog/the-hardest-part-of-frontend-development-isnt-writing-code/index.md) · [Website](https://devinschulz.com/blog/the-hardest-part-of-frontend-development-isnt-writing-code/)

### Using React Component Variants to Compose CSS Classes

20 February 2022 · [React](https://devinschulz.com/tags/react/index.md), [Tailwind CSS](https://devinschulz.com/tags/tailwind-css/index.md), [TypeScript](https://devinschulz.com/tags/typescript/index.md)

Learn how to build React component variants by composing CSS classes in a typesafe and flexible manner.

[Read article](https://devinschulz.com/blog/using-react-component-variants-to-compose-css-classes/index.md) · [Website](https://devinschulz.com/blog/using-react-component-variants-to-compose-css-classes/)

### My Definition of a First-Class Pull Request

25 August 2020 · [Workflow](https://devinschulz.com/tags/workflow/index.md), [Opinion](https://devinschulz.com/tags/opinion/index.md)

Learn how to spruce up your pull requests with a few simple tips. These tips shouldn't add more than a couple of minutes to your workflow, and you'll look like a rockstar to your peers.

[Read article](https://devinschulz.com/blog/my-definition-of-a-first-class-pull-request/index.md) · [Website](https://devinschulz.com/blog/my-definition-of-a-first-class-pull-request/)

### Handling an Event Callback Once

12 July 2020 · [JavaScript](https://devinschulz.com/tags/javascript/index.md), [Today I Learned](https://devinschulz.com/tags/today-i-learned/index.md)

Learn how to simplify your code by using a simple trick to remove an event listener after an event has been fired once.

[Read article](https://devinschulz.com/blog/handling-an-event-callback-once/index.md) · [Website](https://devinschulz.com/blog/handling-an-event-callback-once/)

### Rename Fields by Using Aliases in GraphQL

5 July 2020 · [GraphQL](https://devinschulz.com/tags/graphql/index.md), [Today I Learned](https://devinschulz.com/tags/today-i-learned/index.md)

Learn how to rename fields of a GraphQL object by using aliases.

[Read article](https://devinschulz.com/blog/rename-fields-by-using-aliases-in-graphql/index.md) · [Website](https://devinschulz.com/blog/rename-fields-by-using-aliases-in-graphql/)

### Filter Out Multiple Console Messages in Google Chrome

1 May 2020 · [DevTools](https://devinschulz.com/tags/devtools/index.md), [Today I Learned](https://devinschulz.com/tags/today-i-learned/index.md)

Learn how to filter out multiple console messages by using either regular expressions or prefixing a string with a hyphen-minus.

[Read article](https://devinschulz.com/blog/filter-out-multiple-console-messages-in-google-chrome/index.md) · [Website](https://devinschulz.com/blog/filter-out-multiple-console-messages-in-google-chrome/)

### Restrictions While Styling Visited Links

18 February 2020 · [CSS](https://devinschulz.com/tags/css/index.md)

Learn what the :visited pseudo-class selector is and the limits on how you can style it.

[Read article](https://devinschulz.com/blog/restrictions-while-styling-visited-links/index.md) · [Website](https://devinschulz.com/blog/restrictions-while-styling-visited-links/)

### Modify Create React App's Babel Configuration Without Ejecting

2 February 2020 · [React](https://devinschulz.com/tags/react/index.md), [Babel](https://devinschulz.com/tags/babel/index.md)

Learn how to modify the underlying Create React App configuration with customize-cra to include new Babel plugins, all without having to eject.

[Read article](https://devinschulz.com/blog/modify-create-react-apps-babel-configuration-without-ejecting/index.md) · [Website](https://devinschulz.com/blog/modify-create-react-apps-babel-configuration-without-ejecting/)

### I've Lost Faith in Client-Side Analytics

31 August 2019 · [Analytics](https://devinschulz.com/tags/analytics/index.md), [Opinion](https://devinschulz.com/tags/opinion/index.md)

Since switching to Netlify's server-side analytics, I learned how different the data is when compared to Google Analytics.

[Read article](https://devinschulz.com/blog/ive-lost-faith-in-client-side-analytics/index.md) · [Website](https://devinschulz.com/blog/ive-lost-faith-in-client-side-analytics/)

### Accumulate Complex Objects With the Reduce Method

29 July 2019 · [JavaScript](https://devinschulz.com/tags/javascript/index.md), [Array](https://devinschulz.com/tags/array/index.md), [Map](https://devinschulz.com/tags/map/index.md)

Learn how to recursively reduce a nested data structure by harnessing the power of the Array.reduce method.

[Read article](https://devinschulz.com/blog/accumulate-complex-objects-with-the-reduce-method/index.md) · [Website](https://devinschulz.com/blog/accumulate-complex-objects-with-the-reduce-method/)

### Building the Inspect Measurement Engine

17 July 2019 · [React](https://devinschulz.com/tags/react/index.md), [JavaScript](https://devinschulz.com/tags/javascript/index.md), [Flow](https://devinschulz.com/tags/flow/index.md)

Thoughts and learnings I had while building the Inspect measurement engine.

[Read article](https://devinschulz.com/blog/building-the-inspect-measurement-engine/index.md) · [Website](https://devinschulz.com/blog/building-the-inspect-measurement-engine/)

### From Hugo to Next.js and Back Again

18 May 2019 · [Static Sites](https://devinschulz.com/tags/static-sites/index.md), [Performance](https://devinschulz.com/tags/performance/index.md), [Tailwind](https://devinschulz.com/tags/tailwind/index.md)

Learn why I chose Hugo over a React-based static site generator for my blog.

[Read article](https://devinschulz.com/blog/from-hugo-to-next-js-and-back-again/index.md) · [Website](https://devinschulz.com/blog/from-hugo-to-next-js-and-back-again/)

### Reflecting on Four Years of Remote Work

12 March 2019 · [Career](https://devinschulz.com/tags/career/index.md), [Remote](https://devinschulz.com/tags/remote/index.md)

Learn about the good and the bad I've experienced while working remotely over the past four years.

[Read article](https://devinschulz.com/blog/reflecting-on-four-years-of-remote-work/index.md) · [Website](https://devinschulz.com/blog/reflecting-on-four-years-of-remote-work/)

### Building a Likes API With Google Cloud Functions

5 November 2018 · [Node](https://devinschulz.com/tags/node/index.md), [Google Cloud](https://devinschulz.com/tags/google-cloud/index.md), [Firebase](https://devinschulz.com/tags/firebase/index.md), [Serverless](https://devinschulz.com/tags/serverless/index.md)

Learn how to use Google Cloud Functions to build a likes API with Node.

[Read article](https://devinschulz.com/blog/building-a-likes-api-with-google-cloud-functions/index.md) · [Website](https://devinschulz.com/blog/building-a-likes-api-with-google-cloud-functions/)

### Copy React Props to Your Clipboard in Google Chrome

14 July 2018 · [DevTools](https://devinschulz.com/tags/devtools/index.md), [Today I Learned](https://devinschulz.com/tags/today-i-learned/index.md)

Learn how to copy React props to your clipboard using Google Chrome and the React Developer Tools.

[Read article](https://devinschulz.com/blog/copy-react-props-to-your-clipboard-in-google-chrome/index.md) · [Website](https://devinschulz.com/blog/copy-react-props-to-your-clipboard-in-google-chrome/)

### Combining Synchronous Actions Using Redux Thunk

9 July 2018 · [Redux](https://devinschulz.com/tags/redux/index.md), [Testing](https://devinschulz.com/tags/testing/index.md), [React](https://devinschulz.com/tags/react/index.md), [Jest](https://devinschulz.com/tags/jest/index.md)

Learn how to use Redux Thunk for handling several synchronous actions at once to modify different areas of the application state.

[Read article](https://devinschulz.com/blog/combining-synchronous-actions-using-redux-thunk/index.md) · [Website](https://devinschulz.com/blog/combining-synchronous-actions-using-redux-thunk/)

### Welcome Readers

17 June 2018

My first post, about why it took me years to launch a blog of my own, why I landed on Hugo, and what I plan to write about.

[Read article](https://devinschulz.com/blog/welcome-readers/index.md) · [Website](https://devinschulz.com/blog/welcome-readers/)

[RSS feed](https://devinschulz.com/blog/index.xml)

Source: https://devinschulz.com/blog/
