Skip to content
yceffort
PostsSeriesTagsAbout🧪 Research📰 News
KO

Tweaks

theme
accent palette
film grain
minimal mode
20 POSTS

Page 1

  • #web-performance#software-engineering#essay

    In Performance Work, the Techniques Were Short and the Judgment Was Long: Preparation, Observation, Response, Verification, Measurement

    I think order matters more than technique in performance work. This post lays out the practical flow: settle the support range and dependencies first, measure before picking a technique, decide what to fix first, choose a response when the cause lives in someone else's code or infrastructure, prove nothing broke and keep it guarded, and report numbers by grade.

    2026-10-26·35 min read
  • ◆ Core Web Vitals 직접 수집하기 · Part 4
    #web-performance#devops#debugging

    Self-Hosting Core Web Vitals Collection for a Quiet Blog

    Moved a Core Web Vitals collection setup designed for shared observability infrastructure to my personal blog. Fixed a dashboard left empty by sparse traffic and changed when metrics are collected for ordinary browsers. This post records the changes from October 17 to 22, query omissions investigated on October 23, and what five days of data can support.

    2026-10-23·32 min read
  • ◆ Core Web Vitals 직접 수집하기 · Part 3
    #web-performance#devops#debugging

    Sending the Core Web Vitals of an App Webview to a Shared Observability Platform

    Sent the Core Web Vitals measured in an app webview to an observability platform shared by many teams. The webview gave no signal on leaving, and tail sampling, delta-to-cumulative conversion and Tempo queries each dropped values in their own way without raising an error. For every setting that could not be changed, re-measured what was lost in a reproduction environment.

    2026-10-22·Updated 2026-10-23·37 min read
  • ◆ Core Web Vitals 직접 수집하기 · Part 2
    #web-performance#debugging#browser

    Sending Core Web Vitals at the Moment of Leaving the Page

    Traced why CLS and INP go missing when the page is left, through the transport of OTel JS and the order in which flush runs.

    2026-10-18·Updated 2026-10-23·22 min read
  • ◆ Core Web Vitals 직접 수집하기 · Part 1
    #web-performance#debugging#browser

    When Does web-vitals Report Core Web Vitals

    Checked the conditions under which web-vitals 6.2.3 reports each metric, and why INP goes missing when the page is left right after a click.

    2026-10-18·Updated 2026-10-23·33 min read
  • ◆ Swapping the Model Behind a Coding Agent · Part 1
    #ai

    How to Compare the Models Behind a Coding Agent with SWE-bench

    How do you measure the model performance of a coding agent?

    2026-10-10·28 min read
  • ◆ Building coldpath · Part 4
    #bundler#debugging#compiler

    How Bundlers Remember Imports

    Tracing a coldpath misclassification that read every synchronous dependency in the Turbopack analysis file as a static import. This post compares the graph information and build output of webpack, Turbopack, Vite, and esbuild, and looks at which clues reveal the original syntax and which cases cannot be recovered.

    2026-10-08·29 min read
  • ◆ Improving number-flow · Part 2
    #web-performance#animation#browser

    Improving number-flow Performance: Moving Animations onto the Compositor Thread

    In the number-flow fork I built to support old browsers, animations in modern browsers were still recalculating styles on every frame. This post records how 0.2.0 moved additive compositing into transform and opacity keyframes, how the change was measured, and the costs that remain in the mask and in interruptions.

    2026-10-07·24 min read
  • #pwa#caching#service-worker

    Saving Marp Slides from a Next.js App for Offline Use

    From running the existing Marp viewer offline to fixing what deployments, networks, and the presenter window exposed along the way.

    2026-09-30·23 min read
  • #nextjs#react#debugging

    Pages You Leave Don't Die, They Hide: Next.js cacheComponents and React Activity

    Next.js 16's cacheComponents hides the pages you leave with React Activity instead of unmounting them. Following a three.js canvas that went blank after a back navigation, I read the router, React, and react-three-fiber source and reproduced it in a browser.

    2026-09-26·34 min read
  • ◆ Building coldpath · Part 3
    #debugging#web-performance

    Tracing Toss Securities JavaScript Without Source Maps

    Chuseok side quest, part 3: with love, to Toss Securities

    2026-09-26·26 min read
  • ◆ Building coldpath · Part 2
    #web-performance#bundler#debugging

    Building a Bundle Analyzer with V8 Coverage and Source Maps

    Chuseok side quest, part 2: building a V8 coverage analyzer, one dead end after another.

    2026-09-22·24 min read
  • ◆ Building coldpath · Part 1
    #web-performance#bundler#blogging

    Tracing When This Blog's JavaScript Actually Runs

    Chuseok side quest, part 1: starting with my own blog

    2026-09-22·20 min read
  • #web-performance#javascript#browser

    I Grew Never-Executed JavaScript to 10MiB

    How much do you lose when 10MiB of functions you never call ships to the browser? I ran 855 measurements to separate the cost created by bytes from the cost created by the shape of the code. Uncalled declarations cost about 21ms per MiB and did not grow when I slowed the CPU by 4x, while initialization code that runs the moment the file is read added 201ms per MiB to the main thread. With real libraries, merely importing a module was enough to evaluate it.

    2026-09-16·32 min read
  • #browser#design-patterns#css

    Running One Web on Multiple WebViews: Folding Environment Branches into Adapters

    We supported the iOS and Android WebViews of our own app and of a partner app, and gathered the scattered environment branching into adapters. This is a record of how we organized insets, the bridge, and CSS, along with the problems we hit with the SSR seed and hydration.

    2026-09-09·Updated 2026-09-30·27 min read
  • #rust#markdown#oss

    The Real Cost of Drop-in Compatibility: What I Threw Away Porting markdownlint-cli2 to Rust

    I ported markdownlint-cli2 to Rust and matched 264,114 diagnostics on this blog repository byte for byte. The commits that ported 51 rules landed in a single day, but turning that into a tool you could actually swap in took two weeks. A record of giving up a parser 37 times faster, correcting two performance misreadings, and finding 11 more compatibility differences in an adversarial review.

    2026-09-08·26 min read
  • #bundler#web-performance#debugging

    Tearing Apart a Third-Party SDK and Rebuilding It My Way: Without Touching a Single Line of Logic

    I imported one constant and 97.7% of the bundle came along with it. The vendor had no timeline for a fix, so I pried open the published source maps, recovered over 400 TypeScript files, and rewrote the build, the entry points, and the dependencies however I wanted. Everything except the logic. That got /send to -77.5% raw. The hard part came after. All 1,932 tests passed, and a few of them were watching nothing at all.

    2026-08-31·41 min read
  • ◆ Service Worker Caching Deep Dive · Part 3
    #service-worker#web-performance#caching

    Measuring the Cost of Going Through a Service Worker: Building in the Lab the Control Group GA4 Could Not Give Me

    I set out to confirm the 500 ms hint that part 2 left behind, but the hard reloads that would form the control group arrive at under one a day. So I built the control group myself, with Playwright and a shaping proxy, and found that going through the worker costs 2 ms on a navigation, and that the cost is not latency but the bytes the worker fetches in the background on every click. The gap I had left between the lab and the field turned out, only after the post was written, to be a measurement definition difference created by 103 Early Hints. Third part of the service worker caching deep dive series.

    2026-08-28·Updated 2026-09-02·50 min read
  • ◆ Service Worker Caching Deep Dive · Part 2
    #service-worker#caching#nextjs

    Applying Service Worker Caching: App Router Traps and GA4 Field Data

    Armed with the theory from Part 1, I made this blog (Next.js App Router) open offline. On the first deploy, the post I had just read would not open offline; on the second, posts opened but every image was broken. This is a chronicle of fixing, one deploy at a time, the traps created by soft navigation, prefetching, and next/image, and a record of settling the results with GA4 real-user data. Returning-visitor FCP improved by 634ms on average, while TTFB worsened by 525ms on average. The second post of the Service Worker Caching Deep Dive series.

    2026-08-27·Updated 2026-09-02·27 min read
  • ◆ OG Scraping Server Design Notes · Part 2
    #security#nodejs#backend

    Building an OG Scraping Server in Node.js (2): How SSRF Gets Through

    A feature where the server opens a URL the user handed it has the textbook conditions for SSRF written into its spec. Six ways a whitelist gets bypassed first, then five defensive principles that block them, all actually run on Node. Strip IPv4-mapped by hand and it gets through in hex notation, undici lookup hook is never called when the host is an IP literal, and URL.hostname keeps the brackets on an IPv6 literal. The final post of a two-part design note on OG scraping servers.

    2026-08-22·25 min read
Page 2→
mailMail icongithubtwitter
yceffort
•
© 2026
•
https://yceffort.kr