- Work
How I Fixed a .jpg Image That Would Not Open on Windows
How I fixed images with a .jpg extension that downloaded fine on Windows but would not open.
- Work
How I fixed a drag-to-resize width problem caused by an iframe
While building a feature that adjusts the width of a list area (.listContainer) by dragging with the mouse, I ran into an unexpected problem.
- Work
How I fixed the Google Spreadsheet JWT 403 PERMISSION_DENIED error
On an Autowini project, I got a PERMISSION_DENIED error while fetching multilingual data from a Google spreadsheet with Node.js.

- Work
Setting Up Prettier with Automatic Import Sorting
I added Prettier to the WiniLogis project to unify code style, and a missing import sorting plugin kept Prettier from running at all.

- Work
Why Enter sends a chat message twice when typing Korean in a <textarea />
I first built the chat input this way: when the user types a message in a <textarea /> and presses Enter, it sends the message and clears the input.

- Work
Optimizing Build Size for React i18n Translations, Part 1
While developing the Autowini service, I had adopted react-i18next for multilingual (i18n) support.

- Tech notes
How I fixed the Failed to load module script error
While working on a project in Vanilla JS, I ran into a familiar error message again. Here is what caused it and how I fixed it.

- Projects
Open source contributions: Next.js Korean docs, es-toolkit, Frontend Fundamentals
While migrating a React portfolio I built a year ago to Next.js, I read the official docs to fill in what I didn't know about Next.js and find what I needed.

- Work
Building a Scroll To Top Button Optimized with es-toolkit's throttle
A few times now, I have built the Scroll To Top button you often see in the bottom-left or bottom-right corner of the screen.

- Work
Building Autowini's like feature with TanStack Query and Optimistic Update
Optimistic Update is a way of updating the UI before the server responds, on the assumption that the state update will succeed.

- Tech notes
A close look at React Context
I wanted to take a close look at React Context because many companies that use React seem to make active use of Context when props need to be passed down.

- Tech notes
Browser language and cross-browsing: ko vs ko-KR in navigator.language
While working on a company project, I recently had to build a feature that hides price information only from users in Korea.

- Projects
Hosting a static site with S3 and CloudFront: deploying a React app
I had deployed React projects several times before, but only the easy 'one-click' way, mostly on platforms like Vercel, GitHub, and Spotify.

- Work
Fixing WiniLogis blog readability with a React-Quill text editor
WiniLogis is a platform that offers booking services for global trade, and it runs a blog.

- Tech notes
What is JavaScript's event loop? How a single thread handles async work
Before getting into the event loop, I start with Single Thread, a trait of JavaScript, then cover the call stack, Web APIs, and the callback queue.

- Projects
Deploying a React Native App with Expo Hosting
I tried several commands from other blog posts and the official docs, but they didn't work. ChatGPT showed me a simple way to deploy with EAS.

- Work
Improving Web Performance with a Next-Gen Image Format (WebP)
To improve the WiniLogis main page, I checked its Core Web Vitals with Google Lighthouse, and one main issue it flagged was its PNG and JPG images.

- Work
Improving an Existing Slider's Performance with React-Swiper
The Slider on the main page of the AuctionWini Seller site was built by looping over the data with map and moving it 1px at a time, continuously.

- Work
How to tell a page navigation from a reload with React & TypeScript
I had to write logic that branches depending on whether the user reached a page in the browser by navigating to it or by reloading it.

- Work
Cross Browsing: Fixing the Keyboard Covering the Screen on iOS
While developing the Autowini claim project, I had to build a responsive web app in React so the chat UI worked well on web, mobile, and in the app.
