Babysit PR
ZenUml/web-sequence
Monitor and diagnose GitHub Actions checks on ZenUML web-sequence PRs, fixing code-caused CI failures when appropriate.
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.
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .claude/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/triage-crashes .agents/skills/triage-crashes && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .agents/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/triage-crashes .cursor/skills/triage-crashes && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .cursor/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/MartinStyk/apk-analyzer.git --path .claude/skills/triage-crashes--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/triage-crashes .gemini/skills/triage-crashes && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .gemini/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install MartinStyk/apk-analyzer triage-crashesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/triage-crashes .github/skills/triage-crashes && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .github/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add MartinStyk/apk-analyzer --skill triage-crashes -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install MartinStyk/apk-analyzer triage-crashes --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MartinStyk/apk-analyzer.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/triage-crashes .opencode/skills/triage-crashes && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "triage-crashes" agent skill from https://github.com/MartinStyk/apk-analyzer/tree/develop/.claude/skills/triage-crashes into .opencode/skills/triage-crashes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-crashes", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
triage-crashesA 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. 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.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d807559. It shows what the files ask for, not the result of running them.
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.
Ships 1 file in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
ghfirebasenodegitFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from MartinStyk/apk-analyzer at commit d807559, republished under its GPL-3.0 licence (© MartinStyk). 2,118 words, ~4,299 tokens.
.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.Reads Crashlytics for the latest released version, decides which issues are worth tracking, and files one GitHub
bugissue 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.
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:
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:
| Thing | Value |
|---|---|
| Firebase project | apkanalyzer-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.
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:
git tag --sort=-v:refname | Where-Object { $_ -match '^\d+\.\d+\.\d+$' } | Select-Object -First 1Release 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".
Two reports, run separately so fatals and non-fatals stay distinguishable:
[
{ "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.
Check both directions before doing anything else. An issue was already reviewed if either is true:
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.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.
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:
[
{ "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>" } } }
]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.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.
Each fork judges its issue against the criteria below.
| Kind | Rule |
|---|---|
FATAL | Always file — unless it matches the third-party/no-app-frame shape under **Not |
actionable** below, which applies regardless of errorType. | |
ANR | Same as FATAL — always file unless it matches Not actionable below. |
NON_FATAL | Judgement 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:
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.
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:
## 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.
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:
[
{ "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:
[
{ "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.
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.
topVersions ordering© 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
SKILL.md and 1 other file (scripts) in .claude/skills/triage-crashes of MartinStyk/apk-analyzer.
Open the folder on GitHubat commit d807559
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Triage Crashes this skillMartinStyk/apk-analyzer | 370 | — | ~4.3k | Automated safety check: Pass | GPL-3.0 | |
| Babysit PRZenUml/web-sequence | 150 | — | ~871 | Automated safety check: Pass | MIT | |
| Release Asc CLIrorkai/App-Store-Connect-CLI | 7.7k | — | ~2.4k | Automated safety check: Pass | MIT | |
| Flutter Pub ReleaseMixinNetwork/flutter-plugins | 512 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Maa Issue Log AnalysisMaaAssistantArknights/MaaAssistantArknights | 24k | — | ~4k | Automated safety check: Pass | AGPL-3.0 | |
| Releasenotepadqq/notepadqq | 2.3k | — | ~2k | Automated safety check: Pass | GPL-3.0 |
ZenUml/web-sequence
Monitor and diagnose GitHub Actions checks on ZenUML web-sequence PRs, fixing code-caused CI failures when appropriate.
rorkai/App-Store-Connect-CLI
Publish and verify a new release of the App-Store-Connect-CLI repository.
MixinNetwork/flutter-plugins
Prepare and draft a pub.dev release for a package in the flutter-plugins monorepo.
MaaAssistantArknights/MaaAssistantArknights
分析 MaaAssistantArknights 上游仓库公开 Issue(https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/...
notepadqq/notepadqq
Release a new Notepadqq version. An agent skill from notepadqq/notepadqq.
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.
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.
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.
MartinStyk/apk-analyzer
A skill your agent uses when creating a new reusable Compose UI component that should live in core:ui-library.
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.
MartinStyk/apk-analyzer
A skill your agent uses when creating a new feature module, screen, or feature area.
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…
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.