New to Claude Skills? Learn how to install them →

tldraw on GitHub

Simplify Trace

Free

Transform large performance traces into concise reports.

by tldraw49.7k stars on tldraw/tldraw
5 views
Updated Aug 10, 2026
Get this skill

Free · Opens the source repo

What Simplify Trace does

The Simplify Trace skill is designed to help developers and performance engineers analyze large Chrome DevTools performance traces efficiently. These traces can be several megabytes in size, making them cumbersome to read and interpret directly. This skill processes a Chrome performance trace file, summarizing it into a compact markdown report that highlights critical performance issues, such as slow-running tasks, frequent events, and janky JavaScript functions. By distilling complex data into a more manageable format, users can quickly identify performance bottlenecks without the need to sift through extensive raw JSON data.

To use this skill, simply run the provided script with your performance trace file as input. The script offers various options to customize the output, such as limiting the number of rows displayed, setting thresholds for long tasks, and filtering specific sections of the report. Users can focus on particular time windows or event types, making it easier to pinpoint areas of concern. The resulting markdown report includes essential metrics like event counts, long tasks, hot event types, and the most frequent function calls, providing a comprehensive overview of the performance landscape.

This skill is particularly useful when diagnosing performance issues in web applications, allowing developers to understand where their applications may be lagging or causing jank. It is ideal for those who regularly work with performance traces and need a way to extract actionable insights quickly. Whether you are optimizing a complex web application or simply looking to improve load times, the Simplify Trace skill can streamline your performance analysis workflow.

However, it is important to note that this skill does not modify the original trace data; it only summarizes it. Therefore, if you require in-depth analysis or modifications to the trace, you will need to use other tools in conjunction with this skill. Overall, Simplify Trace is a valuable addition to any developer's toolkit when working with performance traces from Chrome DevTools.

When to use it

Use this skill when you have a performance trace file from Chrome DevTools that you need to analyze for performance issues.

When not to use it

This skill is not suitable for modifying trace files or for users needing detailed, raw data analysis without summarization.

What you can build with it

Analyzing Performance Bottlenecks

Run the skill on a performance trace after a significant user interaction to identify slow tasks and jank.

Optimizing Web Applications

Use the markdown report to pinpoint frequent event types that may be causing performance degradation in your application.

Investigating Long Tasks

Filter the report to focus on long tasks and their offsets to understand when jank occurs during user interactions.

How to install Simplify Trace

View source

1. Install with the skills CLI

npx skills add tldraw/tldraw/simplify-trace --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by tldraw

Simplify trace

Chrome DevTools performance traces are tens to hundreds of MB of JSON — far too large to read directly. This skill turns one into a few-KB markdown report that surfaces the work taking too long or happening too often.

Usage

Run the script on the trace file. It prints markdown to stdout (or --out FILE):

node skills/simplify-trace/scripts/simplify-trace.mjs <trace.json> [--top N] [--long-task-ms MS] [--window START-END] [--out report.md]
  • --top N — rows per table (default 25).
  • --long-task-ms MS — long-task threshold (default 50).
  • --window START-END — scope the whole report to a time slice (offsets in ms from trace start).
  • --only a,b / --except a,b / --all — pick which sections to emit.
  • --match TEXT — case-insensitive filter for rows (event names, function names, URLs).
  • --list — print the available section keys and exit.
  • --out FILE — write to a file instead of stdout.
  • Traces over ~500 MB: prefix node --max-old-space-size=8192.

Default to running with --out to a temp file for big traces, then read the report. Don't read the raw trace.

Sections

Default sections: summary, longtasks, events, frequent, functions, categories. Opt-in: timeline (per-second main-thread busy time — use to locate activity), network (resource/fetch waterfall with TTFB/duration/size), websocket (WebSocket lifecycle — /app/file doc sync). Run --list for the full set. Interrogate narrowly, e.g.:

# where is the activity? then window to it
node …/simplify-trace.mjs trace.json --only timeline
# what was the network/socket doing during the action?
node …/simplify-trace.mjs trace.json --only network,websocket --window 62000-69000 --match tldraw

The trace's metadata.startTime (ISO/UTC) anchors offset 0 to wall-clock, so trace offsets can be lined up against server logs (zero-cache, sync-worker) by timestamp. For an idle, network-quiet gap, the trace shows when but not why — add performance.mark()/console.timeStamp() in the client path and they appear on the trace timeline.

"What happens when I do X" traces

A recording of a single action (switch file, open menu) is mostly idle setup time, which dilutes the action across the whole trace. Window to the action instead:

  1. Run once with no window. Note where activity is — the long tasks' offsets, or bucket main-thread busy-time per second with a quick inline script to find the active span.
  2. Re-run with --window START-END around that span. All tables then describe only the action.

The recording artifact CpuProfiler::StartProfiling (the profiler turning on, ~50–60ms) is excluded from the long-task table, including when it's nested inside a RunTask. If long tasks shows "None", the action genuinely has no single blocking task — look at aggregate self time, GC, and animation-loop events instead.

What the report contains

  • Header — event count, wall-clock span, sampled JS CPU time, and idle %.
  • Long tasks — top-level tasks over the threshold (main-thread jank), with the time offset where each occurred.
  • Hottest event types (self time) — where engine/browser time actually goes (layout, GC, paint, function calls), excluding time spent in nested children.
  • Most frequent event types (count) — work happening too often.
  • Hottest JS functions — bottom-up self time from the embedded V8 CPU profile, with file:line. Synthetic (idle)/(program) frames are excluded here (idle is in the header).
  • Self time by category — high-level breakdown across trace categories.

How to read it

  • A function high in self time is the actual cost; high total but low self means the cost is in its callees — follow the call tree.
  • High count with low avg = death by a thousand cuts (often a reactive/render loop firing too often); investigate why it fires, not its per-call cost.
  • Long tasks point at when jank happened; cross-reference the offset against what the user was doing.
  • Minified names (r, Tg) come with a file:line — use it to locate the source.

The script only summarizes; it does not modify the trace.

Frequently asked questions about Simplify Trace

Similar skills