Skip to content
HonaPublic

About

Measure and explain performance: web pages, Electron apps, Bun/Node, any process. Agent-native CLI + MCP.

Resources

Stars

73 stars

Watchers

0 watching

Forks

Repository files navigation

strobe

Measure and explain performance: a web page, an Electron app, a Bun or Node process, or any process. strobe records everything on one clock, refuses measurements it cannot defend, and gives you, or your agent, a verdict with handles to drill into. It knows no product: what an app under test needs (how to build, serve or launch it in isolation) lives in that app's own strobe.json.

Pre-release, Windows first. The design is in SPEC.md; what is built is listed in the skill (skill/SKILL.md) and strobe --help.

Install it per project, so everyone who runs the project's benches runs the same strobe:

bun add -d @hona/strobe       # the strobe command and the bench file types; Windows x64 so far
bunx strobe up                # once per machine: engine, daemon, MCP and the skill
strobe bench perf/timeline.bench.ts --base origin/dev --head .   # did my change help? (and why)
strobe record app:desktop --for 10s                              # what is the installed app doing?
strobe query rec_3f9a hotspots --by package                      # where did the CPU time go?
strobe query rec_3f9a layout                                     # which line forced a layout?
strobe record app:desktop --probes memory --for 60s              # is it leaking? then: query <rec> leaks
strobe report experiment exp_8c21 --open                         # a page to share
strobe top                                                       # per-core, per-process, per-GPU-engine

A benchmark is a small TypeScript file, like BenchmarkDotNet:

import { bench, web } from "@hona/strobe"

export default bench({
  targets: { web: web({ url: "/" }) },
  cases: {
    scroll: {
      primary: "frames.presented.p95",
      async run({ page, phase }) {
        await phase("down", () => page.scroll("[data-timeline]", { by: 4000 }))
        await phase("up", () => page.scroll("[data-timeline]", { by: -4000 }))
      },
    },
  },
})

Or ask your agent: "did this branch make scrolling faster?"

Built like mesh: one small native binary, a per-user daemon, CLI and MCP with the same names and JSON, and a built-in skill for opencode.

About

Measure and explain performance: web pages, Electron apps, Bun/Node, any process. Agent-native CLI + MCP.

Resources

Stars

73 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages