Agent skill

Triage Crashes

by MartinStyk in MartinStyk/apk-analyzer

A skill your agent uses to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet.

GPL-3.0Auto-check passedMobile

Install Triage Crashes

skills CLI
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/triage-crashes .claude/skills/triage-crashes && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
triage-crashes
GitHub stars
370
Token cost
~4.3k tokens
SKILL.md length
2,118 words
Files
2 (incl. scripts)
Skills in repo
18
Repo updated
First seen
Licence
GPL-3.0

At a glance

A skill your agent uses to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet.

  • Works in 8 steps: Determine the latest released version → Pull the issue list → Skip anything already reviewed → …
  • Review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isnt tracked yet
  • SKILL.md covers How Crashlytics is read, Step 1 — Determine the latest…, Step 2 — Pull the issue list and Step 3 — Skip anything already…, plus 6 more sections
  • Runs JavaScript scripts from its folder; calls gh, firebase and node

What it does

Triage Crashes is an agent skill from MartinStyk/apk-analyzer. Use to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet. Triggered by phrases like "triage crashes", "check production crashes", "look at Crashlytics", "any new crashes", "review non-fatals", "file issues for the latest release crashes", "what's crashing in production".

Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/crashlytics.js`).

It sits in Mobile. It works with GitHub and Firebase. The repository describes itself as: The most downloaded APK analysis app on Google Play. Detailed reports of every app on your device. No root, no ads, nothing leaves the phone. The licence is GPL-3.0.

When your agent uses it

  • Review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isnt tracked yet

Example prompts

  • “t tracked yet. Triggered by phrases like”
  • “check production crashes”
  • “look at Crashlytics”
  • “/triage-crashes”

Requirements

  • Node.js

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Determine the latest released version
  2. Pull the issue list
  3. Skip anything already reviewed
  4. Investigate each issue in parallel
  5. Reconcile proposed verdicts and decide
  6. File the GitHub issue
  7. Write the Crashlytics note
  8. Report

What it can do on your machine

Read from SKILL.md and the folder at commit d807559. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • gh
    • firebase
    • node
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, firebase and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Triage Crashes loads about 4.3k tokens when it runs. Until then it costs about 93 tokens; SKILL.md has 2,118 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~93
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from MartinStyk/apk-analyzer at commit d807559, republished under its GPL-3.0 licence (© MartinStyk). 2,118 words, ~4,299 tokens.

Download SKILL.mdSave it as .claude/skills/triage-crashes/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
triage-crashes
description
Use to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet. Triggered by phrases like "triage crashes", "check production crashes", "look at Crashlytics", "any new crashes", "review non-fatals", "file issues for the latest release crashes", "what's crashing in production".

Skill: Triage Production Crashes and Non-Fatals

Reads Crashlytics for the latest released version, decides which issues are worth tracking, and files one GitHub bug issue per untracked issue — linking both directions so the same crash is never filed twice. Not every non-fatal gets an issue: one that's already gracefully handled and still gives us useful signal just to watch gets a Crashlytics note recording that judgement, nothing more.

Fixing a crash is a different skill: fix-crash. This skill only triages and files.

How Crashlytics is read

There is no Crashlytics REST API and firebase crashlytics:* only uploads symbols. Read access comes from the Firebase CLI's MCP server, driven by scripts/crashlytics.js in this skill folder:

powershell
node .claude\skills\triage-crashes\scripts\crashlytics.js . <calls.json>

<calls.json> is an array of { "name": ..., "arguments": ... } tool calls run in order. Write it to the session artifacts folder, not the repo. Batch several calls into one file — each invocation pays the CLI's startup cost.

Constants for this project:

ThingValue
Firebase projectapkanalyzer-f79a3
appId (free flavour, the one that gets traffic)1:636588470688:android:c27a676c8deb5eb0
appId (premium — only if the user asks)1:636588470688:android:89ea2fd0c34abd89

Available tools: crashlytics_get_report, crashlytics_get_issue, crashlytics_list_events, crashlytics_batch_get_events, crashlytics_list_notes, crashlytics_create_note, crashlytics_delete_note, crashlytics_update_issue.

If a call fails with PRECONDITION_FAILED: ... requires an active project, prepend { "name": "firebase_update_environment", "arguments": { "active_project": "apkanalyzer-f79a3" } } to the calls file. If it fails on auth, ask the user to run firebase login — never try to re-authenticate on their behalf.

Step 1 — Determine the latest released version

Do not use the topVersions report to pick "latest" — it sorts by event count, so a popular old version outranks a fresh release. Get the version from git instead:

powershell
git tag --sort=-v:refname | Where-Object { $_ -match '^\d+\.\d+\.\d+$' } | Select-Object -First 1

Release tags are MAJOR.MINOR.PATCH; .github/workflows/release.yml computes versionCode = MAJOR * 10000 + MINOR * 100 + PATCH. Crashlytics wants the combined versionDisplayNames format — tag 4.0.0 → "4.0.0 (40000)".

Confirm that display name actually appears in a topVersions report before filtering on it; if it doesn't, the release has no events yet (say so and stop) or the tag/versionCode assumption broke.

Bare numeric tags (58, 57) are the pre-4.0 scheme — ignore them when resolving "latest".

Step 2 — Pull the issue list

Two reports, run separately so fatals and non-fatals stay distinguishable:

json
[
  { "name": "crashlytics_get_report",
    "arguments": { "appId": "1:636588470688:android:c27a676c8deb5eb0", "report": "topIssues", "pageSize": 25,
      "filter": { "versionDisplayNames": ["4.0.0 (40000)"], "issueErrorTypes": ["FATAL"] } } },
  { "name": "crashlytics_get_report",
    "arguments": { "appId": "1:636588470688:android:c27a676c8deb5eb0", "report": "topIssues", "pageSize": 25,
      "filter": { "versionDisplayNames": ["4.0.0 (40000)"], "issueErrorTypes": ["NON_FATAL"] } } }
]

Also run ANR unless the user narrowed the scope — an ANR is a production defect like any other.

The default window is the last 7 days. For a wider one pass both intervalStartTime and intervalEndTime (max 90 days). Skip issues whose state is not OPEN — closed/muted issues were already judged by a human.

Each group gives you issue.id, title, subtitle, errorType, state, signals, firstSeenVersion, lastSeenVersion, a console uri, a sampleEvent, and per-window eventsCount / impactedUsersCount.

Step 3 — Skip anything already reviewed

Check both directions before doing anything else. An issue was already reviewed if either is true:

  1. A Crashlytics note records a prior triage decision — crashlytics_list_notes with the issueId. This covers two shapes: a note linking a GitHub issue (github.com/MartinStyk/apk-analyzer/issues/), and a note recording a no-issue-needed judgement from Step 5 (see below) with no GitHub link at all.
  2. A GitHub issue references the Crashlytics issue id — gh issue list --state all --limit 200 --search "<crashlytics-issue-id>".

The Crashlytics issue id is the durable key. Never dedupe on the title: Crashlytics titles are derived from the top frame and change when the code moves. This only catches the same issueId recurring (same stack signature) — a different occurrence of the same underlying condition (a different package name, path, or byte count producing a fresh issueId) is not caught here and reaches Step 5 again on its own merits. That's fine: Step 5's criteria are meant to be re-applied consistently, not memorized in a lookup table, so it reaches the same conclusion each time.

When a GitHub issue exists but the note is missing (i.e. only direction 2 matched), backfill the note — that keeps the console usable for whoever looks there first. Skip the rest of triage for this issue either way.

Step 4 — Investigate each issue in parallel

Gathering event/device/OS data, mapping the crash to source, and reaching a judgement is read-only and independent per issue — spawn one forked subagent (Agent tool, subagent_type: "fork") per issue still standing after Step 3, all launched in the same message so they run in parallel. A fork inherits this skill's instructions and the module/package mapping already in context, so the prompt only needs the issue id and appId.

Each fork:

  1. Pulls its issue's detail:
json
[
  { "name": "crashlytics_get_issue", "arguments": { "appId": "...", "issueId": "<id>" } },
  { "name": "crashlytics_batch_get_events", "arguments": { "appId": "...", "names": ["<sampleEvent>"] } },
  { "name": "crashlytics_get_report",
    "arguments": { "appId": "...", "report": "topAndroidDevices", "pageSize": 5, "filter": { "issueId": "<id>" } } },
  { "name": "crashlytics_get_report",
    "arguments": { "appId": "...", "report": "topOperatingSystems", "pageSize": 5, "filter": { "issueId": "<id>" } } }
]
  1. Maps the top stack frame onto this repo. The frames are package-qualified (sk.styk.martin.apkanalyzer.core.userpreferences.searchhistory.SearchHistoryDao_Impl), so the owning module follows directly from the package — see the module/package mapping in AGENTS.md. Ignore framework-only frames when locating the owner — find the deepest sk.styk.martin.apkanalyzer.* frame.
  2. Reads the actual source of the top app frame before judging or writing anything. A triage issue that names the wrong file wastes more time than no issue, and a verdict reached without reading the code is just a guess.
  3. Applies the judgement criteria in Step 5 and returns a proposed verdict — worth-fixing / useful-signal / noise-downgrade / not-actionable — with its reasoning, the owning file, and (for every verdict except useful-signal) a draft title/body per Step 6's template.

A fork only investigates and proposes. It never calls crashlytics_create_note, crashlytics_update_issue, or files a GitHub issue — filing and notes happen in the coordinator (Steps 6–7) after reconciliation, so one place sees every issue in the batch before anything is written or filed.

Step 5 — Reconcile proposed verdicts and decide

Each fork judges its issue against the criteria below.

KindRule
FATALAlways file — unless it matches the third-party/no-app-frame shape under **Not
actionable** below, which applies regardless of errorType.
ANRSame as FATAL — always file unless it matches Not actionable below.
NON_FATALJudgement call — see below.

A non-fatal reaching this step never gets silently discarded — every one gets an explicit judgement, recorded via a Crashlytics note either way (Step 7). What varies is whether that judgement also produces a GitHub issue:

  • Worth fixing — a real defect the app swallowed (a caught exception that leaves a broken or empty screen, a failed parse of a valid APK, a permission path that silently no-ops). File it as a normal bug.

  • Working as designed, useful signal — no issue. The flow already degrades gracefully (caught, no crash, a sensible fallback or error state), and knowing how often it happens is genuinely useful: the user ends up with something materially worse than intended (a whole feature unavailable, an action failing outright, a screen that won't load) rather than something cosmetic, and a rising or falling rate could plausibly justify a future decision (raising a limit further, pinning a dependency, prioritizing a real fix). There's nothing to do about it right now, so don't file — just record the judgement in a Crashlytics note (Step 7) and leave the code exactly as it is. Ask two questions to tell this apart from the next bucket:

    1. Is the degraded outcome something a user would actually notice as worse, not just an invisible fallback?
    2. Would the occurrence rate, if it climbed, ever change what gets built or fixed?

    Both "yes" → this bucket. Worked example: #216 (on-device AI model download fails from an SDK/ coroutines version mismatch — the feature stays unavailable, no fix exists yet without a dependency decision, and the rate is worth watching in case that changes).

  • Noise / mis-reported — file, recommend downgrading. The flow degrades gracefully too, but the degradation is cosmetic or so routine that per-occurrence tracking has no debugging value at all — the answer to both questions above is "no." Recording it as a non-fatal actively hides real signal behind volume. File an issue whose body says plainly that the recommendation is to downgrade or remove the report, and why. Worked example: #204/#205/#213/#214/#215 (an app icon silently falling back to a default — invisible to the user, and no plausible future decision depends on how often it happens; one call site had produced five separate issues before this rule existed).

  • Not actionable — fires only on a rooted device, an ancient OEM ROM, an OS bug, or (for FATAL/ANR) a trace with zero sk.styk.martin.apkanalyzer.* frames and a blamed owner that isn't this app. Nothing in this repo can fix it. File an issue recommending the report be closed/muted, stating the evidence (top devices / top OS reports, or the absent app frame). Worked examples: #210 (third-party repackaging tool's injected ComponentFactory, crashes before any app code runs), #219 (background ANR, Crashlytics itself reports the root cause unknown, no app frame anywhere on the stack).

Before accepting any fork's proposed verdict, compare it against every other fork's from this run. Two or more issues that trace back to the same underlying call site or root cause — even with different issueIds, different package names, paths, or byte counts on the stack — must not become separate GitHub issues. Fold them into one issue that lists every Crashlytics issue id it covers, rather than filing one per fork. #204/#205/#213/#214/#215 is exactly the failure this check exists to prevent: the same call site produced five separate issues before this reconciliation step existed.

Once reconciled, each issue (or merged group of issues) has a final verdict — this is what Steps 6–7 act on, not the fork's raw proposal.

Show full SKILL.md (613 more words)Show less

Step 6 — File the GitHub issue

Only for worth fixing, noise / mis-reported, and not actionable verdicts — a working as designed, useful signal verdict skips this step entirely and goes straight to Step 7.

Use the create_issue tool (not gh issue create) so the user gets the confirmation card. Label it bug. If the crash is clearly scoped to one feature module and a matching scoped label exists (gh label list), add that too — but don't invent labels.

Title: <Exception type> in <the thing the user was doing> — concrete and human, e.g. SQLiteException when recording a recently viewed app. Not the raw Crashlytics title, which is a class name.

Body:

markdown
## What happens
<Plain-language description of what a user experiences. No class names in this paragraph.>

## Impact
- Version: 4.0.0 (40000)  •  first seen: <firstSeenVersion>
- <N> events, <M> impacted users (last 7 days)
- Top devices: <...>  •  Top OS: <...>

## Exception

<exception type and message, then the trimmed stack — app frames plus enough framework context to be meaningful>


## Where it comes from
<The owning module and file, and what the code is doing at that frame.>

## Suspected cause
<Only if the evidence supports one. If it doesn't, write "Not yet determined" — a wrong
guess in a triage issue is worse than none.>

---
Crashlytics issue `<crashlytics-issue-id>`
<console uri>

Keep the "What happens" section in the user-facing voice described in AGENTS.md — active, present tense, no internal identifiers.

For a non-fatal you judged wrong or unnecessary, replace "Suspected cause" with a ## Recommendation section that states whether to remove the report, downgrade it, or handle the condition quietly, and why.

Step 7 — Write the Crashlytics note

Every issue judged in Step 5 gets a note — filed or not. That note is what lets Step 3 recognize this exact issueId on the next run without re-judging it. For an issue folded into a merged group during reconciliation, write the note separately for each issueId in the group, all pointing at the same GitHub issue number — Step 3 dedupes per issueId, so a merged sibling without its own note looks unreviewed on the next run.

Filed:

json
[
  { "name": "crashlytics_create_note",
    "arguments": { "appId": "...", "issueId": "<id>",
      "note": "Tracked in https://github.com/MartinStyk/apk-analyzer/issues/<number>" } }
]

Judged working as designed, useful signal (no issue filed) — record the judgement itself, not a link, so it reads as a decision rather than a gap:

json
[
  { "name": "crashlytics_create_note",
    "arguments": { "appId": "...", "issueId": "<id>",
      "note": "Reviewed: already handled gracefully, occurrence rate is worth watching, no code change and no GitHub issue needed. See triage-crashes SKILL.md, Step 5." } }
]

A judged issue without its note is an incomplete triage — the next run repeats the work, or worse, files a duplicate.

Step 8 — Report

Summarise as a table: Crashlytics id (short), kind, events/users, the decision (filed as worth-fixing / filed as noise-downgrade / filed as not-actionable / reviewed-no-issue / already reviewed), and the GitHub issue number where one exists. Call out every working as designed, useful signal judgement explicitly, with the two-question reasoning from Step 5 — that's the one disposition with no GitHub issue to point at, so the report is the only place it's visible. Call out every group merged during Step 5 reconciliation too, listing every Crashlytics issue id folded into it — that's the other disposition a reader can't reconstruct from GitHub alone.

Never mark a Crashlytics issue closed with crashlytics_update_issue during triage — closing it is the fix-crash skill's job, after the fix actually ships.

Verification

  • Latest version came from git tags, not the topVersions ordering
  • That version display name was confirmed present in Crashlytics
  • Fatals, non-fatals, and ANRs were all queried
  • Every issue was checked against Crashlytics notes and GitHub search before being judged
  • Every issue still standing after Step 3 was investigated by its own forked subagent, launched in parallel with the others, and no fork filed a GitHub issue or wrote a Crashlytics note
  • Each non-fatal reaching Step 5 got an explicit proposed judgement — worth-fixing / useful-signal / noise / not-actionable — not a default
  • A useful-signal verdict was reached by reading the actual code, not the title alone, and answers both Step 5 questions
  • Every fork's proposed verdict was cross-checked against the others for a shared call site or root cause before filing, and any match was folded into one issue
  • Every filed issue names a real file in this repo, verified by reading it
  • Every filed issue carries the Crashlytics issue id and console link
  • Every judged issue — filed or not — has a matching Crashlytics note, including every sibling in a merged group
  • No Crashlytics issue state was changed

© MartinStyk, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (scripts) in .claude/skills/triage-crashes of MartinStyk/apk-analyzer.

  • SKILL.md
  • scripts/crashlytics.js

Open the folder on GitHubat commit d807559

Compare with similar skills

Triage Crashes next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Triage Crashes compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Triage Crashes this skillMartinStyk/apk-analyzer370—~4.3kAutomated safety check: PassGPL-3.0
Babysit PRZenUml/web-sequence150—~871Automated safety check: PassMIT
Release Asc CLIrorkai/App-Store-Connect-CLI7.7k—~2.4kAutomated safety check: PassMIT
Flutter Pub ReleaseMixinNetwork/flutter-plugins512—~1.3kAutomated safety check: PassMIT
Maa Issue Log AnalysisMaaAssistantArknights/MaaAssistantArknights24k—~4kAutomated safety check: PassAGPL-3.0
Releasenotepadqq/notepadqq2.3k—~2kAutomated safety check: PassGPL-3.0

Similar skills

  • Babysit PR

    ZenUml/web-sequence

    Monitor and diagnose GitHub Actions checks on ZenUML web-sequence PRs, fixing code-caused CI failures when appropriate.

    150 GitHub stars~871 tokensUpdated 5 days ago
    Testing & QAAuto-check passed
  • Release Asc CLI

    rorkai/App-Store-Connect-CLI

    Publish and verify a new release of the App-Store-Connect-CLI repository.

    7.7k GitHub stars~2.4k tokensUpdated today
    MobileAuto-check passed
  • Flutter Pub Release

    MixinNetwork/flutter-plugins

    Prepare and draft a pub.dev release for a package in the flutter-plugins monorepo.

    512 GitHub stars~1.3k tokensUpdated 1 mo ago
    MobileAuto-check passed
  • Maa Issue Log Analysis

    MaaAssistantArknights/MaaAssistantArknights

    分析 MaaAssistantArknights 上游仓库公开 Issue(https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/...

    24k GitHub stars~4k tokensUpdated today
    MobileAuto-check passed
  • Release

    notepadqq/notepadqq

    Release a new Notepadqq version. An agent skill from notepadqq/notepadqq.

    2.3k GitHub stars~2k tokensUpdated 5 days ago
    MobileAuto-check passed
  • Workbuddy Skin Studio

    cdredfox/workbuddy-skin-studio

    Apply a reversible theme/skin to the WorkBuddy desktop app (Tencent AI office agent) via local Chromium DevTools Protocol (CDP) injection.

    197 GitHub stars~1.5k tokensUpdated 2 mo ago
    MobileAuto-check passed

More from MartinStyk/apk-analyzer

All 18 skills in this repo
  • Analyze CI Failure

    MartinStyk/apk-analyzer

    A skill your agent uses to check GitHub Actions build status or diagnose why a workflow run failed and propose a fix.

    370 GitHub stars~1.9k tokensUpdated 5 days ago
    Auto-check passed
  • Capture App Flow Media

    MartinStyk/apk-analyzer

    A skill your agent uses to record or convert ApkAnalyzer app flows into screenshots or GIFs for the README or product docs.

    370 GitHub stars~1.7k tokensUpdated 5 days ago
    Auto-check passed
  • Create Compose Component

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new reusable Compose UI component that should live in core:ui-library.

    370 GitHub stars~885 tokensUpdated 5 days ago
    Auto-check passed
  • Create Core Module

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new core or shared library module for domain logic, data access, repositories, managers, or utilities.

    370 GitHub stars~1.7k tokensUpdated 5 days ago
    Auto-check passed
  • Create Feature Module

    MartinStyk/apk-analyzer

    A skill your agent uses when creating a new feature module, screen, or feature area.

    370 GitHub stars~1.6k tokensUpdated 5 days ago
    Auto-check passed
  • Fix Crash

    MartinStyk/apk-analyzer

    A skill your agent uses to fix a specific production crash or non-fatal — pulling its Crashlytics data, finding the linked GitHub issue, root-causing it, reproducing it, fixing it, and verifying the…

    370 GitHub stars~2.5k tokensUpdated 5 days ago
    Auto-check passed

Works with

Categories

Questions about Triage Crashes

What does Triage Crashes do?

A skill your agent uses to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet. Triage Crashes is an agent skill from MartinStyk/apk-analyzer. Use to review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isn't tracked yet.

When should I use Triage Crashes?

Triage Crashes fits situations like: review production Crashlytics crashes and non-fatals for the latest release and file a GitHub issue for each one that isnt tracked yet.

How do I install Triage Crashes in Claude Code?

Run `npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a claude-code`. Or copy the skill folder (.claude/skills/triage-crashes in MartinStyk/apk-analyzer) into .claude/skills/triage-crashes in your project. Claude Code loads it when a task matches its description.

How do I install Triage Crashes in Codex?

Run `npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a codex`. Or copy the skill folder (.claude/skills/triage-crashes in MartinStyk/apk-analyzer) into .agents/skills/triage-crashes in your project. Codex loads it when a task matches its description.

Can I use Triage Crashes in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/triage-crashes, .gemini/skills/triage-crashes, .github/skills/triage-crashes and .opencode/skills/triage-crashes in your project.

What does Triage Crashes need to run?

Going by SKILL.md and its folder, Triage Crashes needs JavaScript for the scripts in its folder and the command-line tools its instructions call (gh, firebase, node and git). Our summary lists: Node.js.

Does Triage Crashes access the network?

SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Triage Crashes safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Triage Crashes use?

Triage Crashes is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Triage Crashes use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Triage Crashes?

Skills that share tags, products or a category with Triage Crashes: Babysit PR (ZenUml/web-sequence, 150 stars), Release Asc CLI (rorkai/App-Store-Connect-CLI, 7.7k stars), Flutter Pub Release (MixinNetwork/flutter-plugins, 512 stars) and Maa Issue Log Analysis (MaaAssistantArknights/MaaAssistantArknights, 24k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Triage Crashes?

MartinStyk (a GitHub user) maintains it in MartinStyk/apk-analyzer, which has 370 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 5, 2026.

Source: MartinStyk/apk-analyzer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.