Semi Koh
Frontend Engineer
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
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