Projects
Company 2 · Personal 8 · Open source 2Services I work on at my company, plus things I've built on my own.
Company
Autowini · Frontend Developer · 2023.07 ~ Present
Frontend Developer
An export platform that sells Korean used cars to overseas buyers.
Legacy page migration to React (Web · Mobile)
- Migrated legacy JSP pages to React and TypeScript step by step, leading the initial setup, folder structure, and shared architecture
- Embedded React into JSP pages piece by piece to lower migration risk, then moved the whole layout to a React SPA, fixing collapsing layouts and duplicate resource loading
- Carved out pages one by one: filter search, unified search, wishlist, shipping info, and PartWini unified search on Web, and wishlist, recently viewed listings, and shipping info on Mobile
- Consolidated scattered React projects into web-www-front and web-mobile-front and modularized shared UI and logic, cutting duplicate code by about 20%
- Reworked resource loading and added lazy loading on the filter search page, cutting load time for the same scenario 45s → 20s
- Rebuilt the global header and footer in React with SmartLink routing between JSP and React pages, lifting average Lighthouse performance and accessibility scores from the 10s → 70s
- Split React core into a vendor chunk with Vite manualChunks and fixed Akamai CDN cache policies to minimize static asset re-downloads
- Loaded JSON for 15 languages dynamically by language and page, shrinking the initial bundle by about 100KB
- Kept search filters in the URL with SearchParams-based state, and added skeleton UI, lazy-loaded images, and optimistic wishlist updates
Design system · Testing · Deploy automation
- Built a token-based design system with our designer and moved styling to Tailwind CSS
- Migrated Styled-Components to Emotion to fix style flicker (FOUC) under SSR
- Set up Vitest for key utilities and Playwright E2E tests for core user flows
- Built CI/CD on Bitbucket Pipelines with SSH key auth, incremental rsync deploys, Akamai Fast Purge cache invalidation, and a deploy notification bot
- Cut development time by over 50% with a Claude Code-centered workflow (first UI from screen images, auto-generated tests via Hooks, plans and progress tracked in Artifacts)
Keycloak authentication (Web · Admin)
- Customized 7 auth screens in React with Keycloakify, including login, sign-up, and password recovery
- Unified Web and Admin auth screens under one theme and supported 15 languages with i18next and Google Sheets translations
- Built a post-signup page for switching to a Buyer or Seller account, connecting authentication with service sign-up
- Automated access token refresh and shared API auth handling with Axios interceptors and updateToken()
Admin chat system
- Built real-time messaging and chat list sync over WebSocket with stomp.js, refreshing the list with a TanStack Query refetch on each incoming message
- Started as an iframe chat beside a JSP list, then moved to a unified React page with a draggable divider between list and chat
- Added image paste and drag-and-drop upload, keeping the chat pinned to the bottom even after images finish loading
- Alerted users to new messages through the browser tab title using visibilitychange and debouncing
- Fixed AVIF images downloading as broken JPGs on some Windows PCs by converting them with Canvas
- Fixed chat UI and Arabic text alignment broken by react-markdown's default styles, overriding only the styles that mattered
Video player quality selection
- Added manual 360p, 480p, and 720p quality selection to the Hls.js player
- Made AUTO pick a quality by comparing measured bandwidth with the bandwidth each level requires
Claim submission system (Web · Mobile · App)
- Built a chat-style claim submission screen shared across web, mobile, and in-app webviews
- Supported 7 languages with a script that pulls Google Sheets translations as JSON
- Separated success and failure logic for each processing step with TanStack Query useMutation
Car History · Repair records
- Built Car History lookup pages for web and mobile (JSP)
- Built screens to add and edit paint thickness data and repair history, plus lookup templates
React · TypeScript · TanStack Query · Zustand · Tailwind CSS · Emotion · Keycloak · stomp.js · Vitest · Playwright · Vite · JSP
Solo Full-Stack Developer
A logistics service for ocean freight quotes, bookings, and shipping schedules.
Build · SEO · Performance
- Migrated Webpack 5 to Vite, cutting dev server startup 39s → 148ms
- Used Claude Code to switch 177 environment variable references across 50+ files from process.env to import.meta.env in one pass
- Shrank the main bundle by about 77% with per-page lazy loading and code splitting, raising Lighthouse performance 34 → 70+
- Migrated Styled-Components to Tailwind CSS, eliminating the runtime cost of generating styles
- Improved LCP with WebP images, tuned video quality and a CDN, and preload plus fetchPriority on hero assets
- Built SeoHelmet to prevent duplicate meta tags, then generalized it and published it on npm as react-head-safe
- Set up canonical tags and a sitemap index (main · oceanfreight · shipping-schedule · blog · review)
- Split translation JSON into namespaces for dynamic loading, and removed 30 unused dependencies (18 legacy, 12 flagged by depcheck) along with unused translation keys
Global state: Redux Toolkit → Zustand
- Stripped out Redux Toolkit boilerplate and set a rule for structuring state (3+ values go in an object)
- Persisted only the state that needs it to localStorage with per-store persist
- Removed Redux Toolkit, react-redux, and redux-persist, cutting code 2,169 → 1,179 lines (about 45% less)
Country data DB migration · Dedicated API
- Moved phone country codes out of a frontend constants file (2,230 lines) into the DB and added a dedicated country API
- Replaced the old API that returned every code, cutting response size 229KB → 12.6KB, and dropped the constants file for another 11.3KB off the bundle
- Reshaped the data with TanStack Query select so logic in the existing 24 files stayed unchanged
Deploy migration (Jenkins → Bitbucket Pipelines)
- Moved the Jenkins deploy pipeline to Bitbucket Pipelines, standardizing deployment with Autowini
- Generated and deployed the sitemap automatically once a day with Pipelines Schedules
PWA
- Made the site installable on desktop and mobile home screens without a native app
- Kept data viewable offline with a Service Worker
Shipping Blog · Buyer Review
- Built the blog list and detail pages (infinite scroll, mobile swipe) and redesigned them to be responsive
- Built Admin post creation, editing, and visibility settings with a React-Quill editor and drag-to-reorder images
- Sanitized admin-authored HTML with DOMPurify before rendering
- Built the Buyer Review board with pop-up playback for review videos
Freight rates · Guest booking · Quote emails
- Autofilled member details after login, and for guests, checked for an existing account and booked automatically
- Built freight rate lookup by destination country with ticket-style rate cards
- Let Admin send quotation emails built from booking data to multiple recipients
EUR · Invoices
- Built invoice PDF downloads (Web), plus Admin invoice creation and editing with PDF and Excel export
- Cached the EUR exchange rate for 24 hours to convert to euros with minimal API calls, and issued invoices in euros
Booking requests · Admin screens
- Built a responsive booking request screen with request and consultation chat
- Built Admin screens for booking stages, request history, consultations, and email logs, plus member management CRUD
- Built a 5-step How It Works guide page, redesigned the main page, and rebuilt the Admin design with Tailwind CSS
- Refactored the header and mobile sidebar, fixing clipping issues and removing 1,249 lines of code
React · TypeScript · Vite · TanStack Query · Zustand · Tailwind CSS · Styled-Components · React-Quill · React-pdf · i18next
Personal
Services I planned and built myself, newest first.
20266
Overlay returns for 2,147 Korean and US stocks and ETFs to see what the same investment would be worth today.
Next.js · TypeScript · Tailwind CSS · Supabase · Vitest
View details →
A multiview for watching up to 4 SOOP live streams together on one screen.
Next.js · Tailwind CSS · TanStack Query · iron-session · Supabase
View details →
Gemini sums up the Jira issues you worked on this week and sends them as a weekly report email.
React · TypeScript · Vite · Tailwind CSS · Google Apps Script
View details →
See 2026 cherry blossom dates for 16 spots across Korea, with the Korea Meteorological Administration (KMA) forecast and an AI prediction side by side.
Next.js · Tailwind CSS · Gemini API · Firebase · SWR
View details →
Flip through 361 frontend interview questions as cards and check each answer.
Next.js · Tailwind CSS · Motion · Serwist · Gemini API
View details →
An unofficial fan site cheering on UFC welterweight Ko Seokhyeon.
Next.js · Tailwind CSS · next-intl · Supabase · Gemini API
View details →
20251
I rebuilt my React chat-style portfolio in Next.js.
Next.js · TypeScript · Tailwind CSS · next-intl · Zustand
View details →
20241
My first portfolio, where you pick a question and the answer arrives as a chat.
React · TypeScript · Vite · Tailwind CSS · Zustand
View details →
Open source
React libraries I built and published on npm, plus contributions to other repositories.
A device detection hook that sees through iPads posing as Macs, Android UAs with stripped model names, and even Samsung DeX.
v0.2.1 · 877 downloads in the past year
React · TypeScript · Vite · Vitest · Playwright
View details →
A library that manages the document head in client-rendered React so meta tags don't pile up as duplicates.
v1.11.2 · 3,093 downloads in the past year
React · TypeScript · Vite · Vitest
View details →
Contributions4 repos
- toss/es-toolkit4 PRsIncludes a bug fix for missing exports in the map and set modules
- daangn/stackflow1 PRUsed import type to prevent a runtime error
- mdn/translated-content11 PRsTranslated MDN docs into Korean and kept them in sync
- NaverPayDev/hidash12 PRsTests · Benchmarks · JSDoc

