Semi Koh

Frontend Engineer

semi8848@daum.netGitHubBlog

Work Experience

NHN Injeinc

Mar 2025 ~ Present

Tech Development Office

TicketLink Japan Service

  • Sole frontend developer for the Japan ticket-application/draw admin system

TicketLink Global Site Renewal

  • Applied i18n in a mixed JSP/AngularJS·React environment

TMAX GAIA

Sep 2023 ~ Mar 2025

GA2-2-2

GAIA Docs

  • Web-based office product with features comparable to Google Docs (canvas-based) / Sheets / Slides
  • Compatible with MS Office and HWP document formats, supports real-time multi-user collaborative editing
  • Architecture based on Event-driven Architecture + Command Pattern

Responsibilities

  • Owned the text-related common features shared by the Word / PowerPoint / Excel modules
  • Stabilized and maintained caret/selection, copy & paste, styling, collaborative editing, and save features in the text module

Jaeneung Education / Jaeneung e-Academy

Jan 2017 ~ Aug 2022

Math Content Team

Jaeneung AI Math

  • Learner-centered program that delivers optimal math content to each learner

Open Source

Node.js
  • base64 benchmark input was structured incorrectly, so the actual decoding path wasn't measured and threw an error#60841
  • Inspector help URL pointed to the wrong path, producing a dead link#62745
  • Crashed in GetErrorSource() when parsing a malformed using statement#62770
  • A DynamicLibrary with live references was collected by GC too early, causing a crash#63024
Mantine
  • Badge's circle prop was overridden by defaultProps.radius, so it didn't render as a circle#8466
  • TypeScript autocomplete wasn't working on path arguments of form methods like clearFieldError#8810
  • Missing Styles API documentation data for the Scroller component#8818
  • RichTextEditor: caret not visible in an empty task-list item#8821
  • SemiCircleProgress component wasn't rendering#8842
  • ScrollArea scrollbars didn't appear when offsetScrollbars="present"#8844
TanStack Query
  • A timer ID of 0 evaluated as falsy, so the timer wasn't cleaned up#10401
  • vue-query-devtools registered cleanup before mount, so it didn't work correctly#10439
Vite
  • Unnecessary fallback sourcemap was generated when handling ?raw imports#22148
  • Deno workspace root wasn't detected, so the project root was determined incorrectly#22238
  • In optimizeDeps, user-configured transform.target was being overwritten by the default#22273
Slate.js
  • slate-react's slate-dom peer dependency was pinned to an old version, producing a warning on newer versions#5976