Semi Koh

Frontend Engineer

semi8848@daum.netGitHubBlog

Work Experience

NHN Injeinc

Mar 2025 ~ Present

Tech Development Office

Cone Chain Portal

  • An integrated management platform for building, configuring, and operating Kubernetes clusters via a UI in a private cloud environment

TicketLink Global/Japan Service Frontend Development

  • Expanded the Korean-focused TicketLink service into a global service, including a ticket-application/draw admin system for the Japan market

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
  • —sqlite3_step()/sqlite3_reset() return values weren't checked, so SQLite errors were silently ignored#63319
  • —Idle sockets that hadn't sent a request yet were excluded from closeIdleConnections(), so the server never shut down#63470
  • —Blob.stream()'s wakeup callback was never cleared, keeping a reference to the source buffer and leaking memory unboundedly#63577
  • —postRun() ran before a filtered Suite finished registering its async children, cancelling tests that were still being registered#64208
Mantine
  • —Badge's circle prop was overridden by defaultProps.radius, so it didn't render as a circle#8466
  • —The MCP server used Content-Length header framing for stdio transport instead of the MCP spec's format, hanging clients like VS Code during the initialize handshake#8792
  • —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
  • —An Input that opted back into dir="ltr" inside an RTL page didn't forward the dir prop to its wrapper, leaving its sections visually mirrored#8905
  • —PasswordInput spread its rest props directly onto the inner input instead of going through Input, so the dir fix from #8905 didn't apply to it#8936
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
  • —The dependency scanner's transformSync call didn't pass along user-configured oxc JSX options, so it resolved react/jsx-runtime instead of the configured custom JSX runtime#22342
Wafflebase
  • —Local caret position was stored as an absolute offset, so it pointed at the wrong character once a remote peer edited the same block — added a design note and implementation anchoring it to Yorkie Tree positions instead#257
  • —Typing a single Hangul character via IME split into multiple undo units, so Undo toggled the character instead of removing it#332
  • —Backspace on an empty list item didn't exit the list, unlike Enter#339
  • —Composing (uncommitted) IME text had no underline, unlike other editors, making it impossible to tell apart from committed text#514
  • —Pasting a table while the caret was inside a table cell did nothing, because the cell context wasn't recognized#531
  • —Extended the design note for pasting a table nested inside another table, where the inner cell's input was misrouted to the original table#597
  • —A race condition where undoing right after an IME composition let the live-cursor publisher overwrite the same presence value, restoring the caret to the wrong position#612
  • —Design note for the +/- font-size buttons being a silent no-op when the selection mixes multiple font sizes#616
  • —Added a BigQuery connector — connection CRUD, query execution, and AES-256-GCM encrypted service-account credentials#811
Vite Plus
  • —Running vp format failed to parse instead of falling through to vp fmt — added format as a visible alias of fmt#1727
  • —On Windows, linting a pnpm monorepo workspace couldn't find the tsgolint executable because its path was computed incorrectly#1758
  • —vp env list-remote didn't mark installed/current/default versions, making them hard to spot in the registry listing#1907
  • —Downloading a missing package manager showed no progress at all, so a slow connection looked indistinguishable from a hang#2369
Rollup Plugins
  • —pluginutils's dataToEsm couldn't generate named exports for reserved-word keys and produced a duplicate default export#2002