agentleFS
no-hupno-hup/unjank/AGENTS.md

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.

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
  1. Distinctive:

    Do not reach for this for general profiling, startup time, network latency, or app size.

    line 23

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

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-perf

or

curl -fsSL https://raw.githubusercontent.com/no-hup/unjank/main/install.sh | bash

Both 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:

CommandWhat it does
/perf-setupFinds 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-queryDry-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-dashboardBuilds .perf/dashboard.html from the bundled template and opens it. Three tabs: worst performing, highest volume, 30-day trends.
/perf-fix ScreenNameOptional. 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-query stops outright if the dry run estimates over 100 GB — that means partition pruning broke, so don't override it.
  • Auth is plain gcloud auth login plus gcloud auth application-default login. No service accounts, no key files. The account needs roles/bigquery.dataViewer and roles/bigquery.jobUser.
  • Flutter gets one platform at a time. Run /perf-setup again to switch between Android and iOS; the dashboards are separate.
  • Build flavors and applicationIdSuffix trip 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=1 turns it off.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.