Reports, tools and agents
profiler.report() returns plain JSON about the frames in the buffer (ten seconds by default). This one is from a debuff game on a 165 Hz display:
json
{
"frames": 558,
"seconds": 3.47,
"fps": 160.88,
"budgetMs": 9.09,
"displayIntervalMs": 6.06,
"intervalMs": { "p50": 6.1, "p95": 6.2, "p99": 12.1, "max": 30.3 },
"cpuMs": { "p50": 0.2, "p95": 0.6, "max": 1.4 },
"hitches": 3,
"causes": { "unknown": 2, "script": 1 },
"worst": [],
"spans": { "update": 0.04, "render": 0.09 },
"perFrame": { "draws": 1, "uploads": 1, "uploadBytes": 0 },
"overheadMs": 0.053,
"support": { "attribution": true, "heap": true, "contexts": true },
"warnings": []
}intervalMsis what players feel. Watch p95 and p99, not the average.cpuMsis what your frame code costs.worstholds up to 10 verdicts, slowest first.supportsays what this browser reports, so you know how much to trust the causes.warningssays what myaku couldn't see. Check it before trusting a quiet report.
Warnings
Myaku would rather tell you it's blind than show a healthy-looking graph it can't vouch for. profiler.warnings(), the report's warnings and the overlay all list:
- No frames recorded. The game kept its own reference to
requestAnimationFramefrom before myaku loaded. Load myaku first. - No canvas context seen. The game created its context before myaku loaded, so draws, uploads and compiles aren't counted. Load myaku first.
- More than 16 span names. The rest are added up under
other, not dropped. - Heap too coarse. Some browsers report the heap rarely or in big steps, which can't show garbage collection. Myaku checks that readings actually change. When they don't,
support.heapisfalseandunknownverdicts say GC can't be ruled out.
From browser automation
Myaku exposes itself as window.__MYAKU__, so Playwright or Puppeteer can read it after playing:
ts
await page.goto("http://localhost:5173");
await page.waitForTimeout(5000);
const report = await page.evaluate(() => window.__MYAKU__.report());
expect(report.intervalMs.p95).toBeLessThan(20);From coding agents
In debuff projects, the MCP server's game_profile tool returns the report from the running game, and the explain-stutter prompt walks an agent through it: read the worst verdicts, open the code they point at, fix it, and measure again.