unjank
AGENTS.md2 starsChanged 6 months agoMITView on GitHub
Unjank is a set of four agent skills that pull screen rendering data out of Firebase Performance (via its BigQuery export) and show you which screens in an Android, iOS, or Flutter app are janky, how bad it is, and which way it's trending. There's an optional fourth skill that fixes the code. The user has a mobile app with Firebase Performance and wants to know where the jank is. Actual phrasings that should make you reach for this: Two…
- Pipes a download into a shell
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,700 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository4 other files it gives its agents.
- perf-dashboardSkill
- perf-fixSkill
- perf-querySkill
- perf-setupSkill
The file
We split this AGENTS.md into the rules it gives an agent
1 rule. About 0 are common, 1 is distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 23
Do not reach for this for general profiling, startup time, network latency, or app size.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
AGENTS.md
Unjank is a set of four agent skills that pull screen rendering data out of Firebase Performance (via its BigQuery export) and show you which screens in an Android, iOS, or Flutter app are janky, how bad it is, and which way it's trending. There's an optional fourth skill that fixes the code.
Use this when
The user has a mobile app with Firebase Performance and wants to know where the jank is. Actual phrasings that should make you reach for this:
- "which screens in my app are slow / janky / dropping frames"
- "we have Firebase Performance, can you pull the numbers"
- "frozen frames", "slow rendering", "frame drops", "ANR-adjacent stuff"
- "build me a performance dashboard for the app"
- "query our Firebase perf data in BigQuery"
- "HomeFragment feels laggy, fix the rendering"
Two things have to be true or none of this works: the app ships the Firebase Performance SDK, and BigQuery export is turned on in the Firebase Console. If either is missing, say so first — the data does not exist and no amount of querying will produce it.
Do not reach for this for general profiling, startup time, network latency, or app size. It only covers screen traces: frozen frame ratio and slow frame ratio per screen.
How to use it
Install into the target project (run from its root — the installers refuse to run without a
.git directory):
npx unjank-perfor
curl -fsSL https://raw.githubusercontent.com/no-hup/unjank/main/install.sh | bashBoth copy skills/perf-{setup,query,dashboard,fix} into .claude/skills/. Claude Code registers
skills at startup, so the user has to restart or start a new conversation before the slash
commands exist. Tell them that; it is the most common reason someone thinks the install failed.
Then, in order:
| Command | What it does |
/perf-setup | Finds the Firebase config (google-services.json, GoogleService-Info.plist, pubspec.yaml), checks the SDK is present, installs and authenticates gcloud if needed, verifies the BigQuery table exists, runs a 7-day COUNT smoke test. Writes .perf/config.json. |
/perf-query | Dry-runs the queries for cost, then runs three of them: 30-day per-screen summary, daily series for the top 10 screens, app-wide daily trend. Writes .perf/data/*.json. Takes about 30 seconds. |
/perf-dashboard | Builds .perf/dashboard.html from the bundled template and opens it. Three tabs: worst performing, highest volume, 30-day trends. |
/perf-fix ScreenName | Optional. Finds rendering anti-patterns for one named screen and fixes them. |
The skills talk to each other through files in .perf/, which the setup skill adds to
.gitignore. Each one is independently re-runnable — re-running /perf-query just refreshes the
JSON.
/perf-fix works in tiers and you should respect them. T1 (cached DateFormatter, DiffUtil,
allocations hoisted out of onDraw) it applies directly. T2 (async image loading, flattened
layouts, Compose remember) it shows as a diff and waits for a human. T3 it only suggests. T4
(lock contention, SDK swaps, architecture) it writes down and does not touch. Exhaust a tier
before moving to the next one. It's also marked disable-model-invocation: true — only run it
when the developer asks for a named screen by name, not because you noticed a perf smell while
doing something else.
Gotchas
- Data lags about 48 hours behind enabling the export. A fresh setup returning zero rows is usually this, not a broken query.
- Queries are partition-pruned and cost roughly $0.05 for 30 days.
/perf-querystops outright if the dry run estimates over 100 GB — that means partition pruning broke, so don't override it. - Auth is plain
gcloud auth loginplusgcloud auth application-default login. No service accounts, no key files. The account needsroles/bigquery.dataViewerandroles/bigquery.jobUser. - Flutter gets one platform at a time. Run
/perf-setupagain to switch between Android and iOS; the dashboards are separate. - Build flavors and
applicationIdSuffixtrip up app-ID detection. Setup will ask; the base ID without the suffix is the right answer. - The dashboard pulls Chart.js from a CDN, so it needs a network connection to render.
- The installers ping an anonymous hit counter.
UNJANK_NO_ANALYTICS=1turns it off.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

