By himattm
Automate end-to-end Android Compose development: scaffold opinionated projects with DI, networking, and Crashlytics; orchestrate CLI tasks for SDK, emulators, and devices; reproduce bugs via JUnit tests, stress loops, and git bisect; verify UI states with layout JSON, screenshots, and diffs; instrument for StrictMode, coroutines, and logs; capture and SQL-analyze Perfetto traces for jank, threading, and slowdowns.
npx claudepluginhub himattm/skills --plugin androidOrchestrates Android development tasks including project creation, deployment, SDK management, and environment diagnostics using the `android` command-line tool.
Use to find stuck coroutines, leaked jobs, and suspended awaits with no resumer — the concurrency bugs that don't crash but cause hangs, missing UI updates, or memory creep. Ephemerally add `kotlinx-coroutines-debug`, install `DebugProbes` in `Application.onCreate`, run the suspect flow, dump active coroutines with stack traces, fix, then remove the dependency and the install/dump calls. Reach for this when `Log.d` shows a `launch` ran but `collect` never received, or a screen leaves and something keeps running.
Use to flush out intermittent crashes and ANRs ("it crashes sometimes," "fails on slow devices," "happens after rotation a few times") by scripting the trigger sequence with `adb shell input` and running it in a shell loop against a cleared logcat, stopping on first match for `FATAL EXCEPTION` or `ANR in`. Inject deterministic stress (rotation, slow network, low memory) to surface latent races. The empirical answer to "is this still a bug, and under what conditions?"
Use to extract concrete numbers and slice-level evidence from a `.perfetto-trace` captured by `android-perfetto-capture`. Run SQL queries against the trace via the `trace_processor` binary, then hand the (small) result file to a Sonnet sub-agent for verdict — never read raw trace data inline. This is where "the app feels slow" becomes "frame 42 missed budget by 8.3 ms because `MainActivity.onResume` ran 18 ms on `main` while the IO dispatcher was idle." The analysis half of the perfetto loop.
Use to capture Perfetto system traces from a connected Android device — the input for any timing, threading, jank, or "is this on the main thread?" investigation. Writes a self-contained `.perfetto-trace` file to `/tmp` that downstream skills (`android-perfetto-analyze`, `android-trace-sections`) read with the `trace_processor` SQL backend. Pick the strategy that matches the question (one-shot, repeated, on-the-fly), drive the suspect flow during the recording window, and verify the trace contains the expected slices before declaring capture done.
Use when you need empirical proof a code path actually executed — branch entries, callback fires, coroutine continuations, suspect early returns. Insert temporary `Log.d` calls with a unique sentinel tag, redeploy, drive the app, read filtered logcat, then remove every probe before declaring done. The default investigation skill when the question is "did this run, in what order, with what values?"
Use INSTEAD of git bisect when investigating a regression between two refs (releases, branches, "it worked yesterday") — especially when builds are slow or the bug is hard to reproduce. Hand the full `git diff <good> <bad>` to a Sonnet sub-agent along with the bug description and let it surface suspect areas. Bisect exists because humans can't reason about thousands of lines at once. LLMs can. No builds, no waiting — minutes instead of an hour of compiling.
Use BEFORE fixing any non-trivial bug. Write a test that fails because of the bug, watch it fail, then fix the bug until the test passes. Forces the agent to demonstrate the bug exists in code before guessing at fixes — and leaves a regression guard. Trigger whenever you'd otherwise edit production code based on a stack trace, user report, or "I think the issue is…" hypothesis.
Use to flip framework-level diagnostics without code changes — verbose framework logging (`log.tag.<Tag> VERBOSE`), view-bounds overlay (`debug.layout`), overdraw flashes, frame-time bars, slow-animation toggles. Set via `adb shell setprop` for the duration of an investigation, then reset every flag. Reach for this when the question is about framework behavior or rendering — and code changes feel like overkill for a quick look.
Use to prove (or disprove) that a state actually changed between two points — "did the dialog dismiss?", "did this navigation actually leak memory?", "did my fix do anything?". Capture a snapshot bundle (layout JSON, dumpsys meminfo, getprop, screenshot) at point A, perform the action, capture at point B, diff. The empirical answer to "did anything change?" — useful when the agent suspects its own fix is a no-op.
Use to surface invisible main-thread I/O, leaked closeables, leaked activities, and other policy violations that don't crash but cause jank, ANRs, or memory creep. Temporarily install StrictMode in `Application.onCreate` with `.penaltyLog()`, drive the suspect flow, read logcat for `StrictMode policy violation`, fix the violations, then remove the StrictMode setup. Trigger when the symptom is "feels slow," "occasionally janks," "leaks across rotations," or any concern about silent main-thread work.
Use to answer questions logging can't — "did this run, on what thread, for how long, in what overlap with frame boundaries?" Wrap suspect operations in `Trace.beginSection("AGENT_TRACE_<id>")` / `Trace.endSection()`, capture a Perfetto trace, inspect the named slice. Better than `Log.d` when the question is about timing, threading, or whether a block fits inside a frame budget. Reach for this for jank, slow startup, dropped frames, and "is this on the main thread?" investigations.
Use when the user wants to scaffold, bootstrap, or create a new Android project from scratch. Produces an opinionated single-module Compose app with Metro DI, Circuit (Slack) state/architecture, Material You theming, Coil 3 images, kermit logging, Ktor networking, and Firebase Crashlytics — plus a CLAUDE.md/AGENTS.md pair and ergonomic runDebug/runRelease Gradle tasks.
Use FIRST when verifying any UI state on an Android emulator or device — checking that elements rendered, text appears, state is correct, or a fix landed. Reads the structured JSON tree from `android layout`, which is faster and cheaper than a screenshot for almost everything except WebViews, animations, and purely visual checks (color, font, image content).
Use when verifying an Android UI state requires a real screenshot — WebView content, animations, visual fidelity (color, font, image content, alignment), or finding an element by appearance when you don't know its resource id. For everything else, prefer `verify-android-layout` first — JSON is cheaper and more precise. Triggers whenever you'd otherwise read a PNG from `android screen capture` in the main thread.
Share bugs, ideas, or general feedback.
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge.
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge.
Sign in to claimDesign fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.
Access thousands of AI prompts and skills directly in your AI coding assistant. Search prompts, discover skills, save your own, and improve prompts with AI.
Behavioral guidelines to reduce common LLM coding mistakes, derived from Andrej Karpathy's observations on LLM coding pitfalls
Comprehensive skill pack with 66 specialized skills for full-stack developers: 12 language experts (Python, TypeScript, Go, Rust, C++, Swift, Kotlin, C#, PHP, Java, SQL, JavaScript), 10 backend frameworks, 6 frontend/mobile, plus infrastructure, DevOps, security, and testing. Features progressive disclosure architecture for 50% faster loading.
Reliable automation, in-depth debugging, and performance analysis in Chrome using Chrome DevTools and Puppeteer
Claude Code skills for Godot 4.x game development - GDScript patterns, interactive MCP workflows, scene design, and shaders
The himattm Claude Code plugin marketplace — Matt McKenna's personal skill bundles.
.
├── .claude-plugin/
│ └── marketplace.json # marketplace manifest (name: "himattm")
├── plugins/
│ ├── android/ # Android/Compose development
│ │ ├── .claude-plugin/plugin.json
│ │ └── skills/
│ ├── review/ # Pull request review workflows
│ │ ├── .claude-plugin/plugin.json
│ │ └── skills/
│ └── utilities/ # Utility skills + slash commands
│ ├── .claude-plugin/plugin.json
│ ├── commands/ # slash commands (/checkpoint, /resume)
│ └── skills/
├── references/ # platform tool mappings
└── README.md
| Plugin | Skills |
|---|---|
android@himattm | android-cli, new-android-app, verify-android-layout, verify-android-screen, android-probe-logging, android-reproduce-as-test, android-strictmode-probe, android-snapshot-diff, android-regression-diff-scan, android-crash-repro-loop, android-trace-sections, android-runtime-flag-probe, android-coroutine-trace, android-perfetto-capture, android-perfetto-analyze |
review@himattm | address-gemini-review, review-cycle, validate-merge-prs |
utilities@himattm | code-as-image, interrogation, /checkpoint + /resume |
Install via the marketplace (auto-updates at startup):
/plugin marketplace add https://github.com/himattm/skills
/plugin install android@himattm
/plugin install review@himattm
/plugin install utilities@himattm
Claude Code refreshes the marketplace manifest at startup; new skills and version bumps in either plugin's plugin.json ship to every machine without manual /plugin update calls.
Local development shortcut (edits show up immediately, no commit needed):
mkdir -p ~/.claude/skills
for s in plugins/*/skills/*/; do
ln -sfn "$(realpath "$s")" "$HOME/.claude/skills/$(basename "$s")"
done
The symlinks and the plugin install can coexist on a development machine. On consumer machines, prefer the plugin install alone — it's the only path with auto-update.
To push an update that auto-installs on every consumer machine at next Claude Code startup:
plugins/<plugin>/skills/.version field in that plugin's .claude-plugin/plugin.json (e.g. 0.1.0 → 0.1.1). Use semver: patch for fixes, minor for new skills, major for breaking changes.main.Claude Code refreshes the marketplace manifest at startup; consumers see the version bump and pull the new content automatically. No /plugin update invocation needed.
To add a brand-new plugin:
plugins/<new-plugin>/.claude-plugin/plugin.json with name, version: "0.1.0", and description.plugins/<new-plugin>/skills/<skill-name>/SKILL.md for each skill..claude-plugin/marketplace.json under plugins[]./plugin install <new-plugin>@himattm.See references/ for platform-specific tool mappings and integration guides.