Droidwatch inside your AI assistant
Analyse an APK without leaving the chat you are already in. Ask "is this app malicious?", drop the file, and get back a verdict, the attacker's C2 if there is one, and the findings that matter.
What it is
A thin client — one Python file, no dependencies. It uploads, polls and brings back the result. Every bit of analysis happens on our servers.
That is deliberate, and not only because the analyser is not distributed: an
agent driving jadx and semgrep on your laptop only ever sees what those
tools see. You cannot improvise "I have seen ten thousand samples." Threat
intelligence, a model trained on a corpus and the history to correlate
campaigns are things that live on the server or do not exist.
Install
curl -fsSLO https://droidwatch.app/ci/claude-skill/droidwatch-skill.zip
unzip droidwatch-skill.zip -d ~/.claude/skills/
export DROIDWATCH_API_KEY=dw_... # optional
The zip holds one droidwatch/ folder: the skill instructions (SKILL.md) and
the client (scripts/droidwatch.py). Unzip it wherever your assistant looks
for skills — ~/.claude/skills/ is the one for Claude Code. Python 3 is the
only requirement.
It works without a key, anonymously and with limits. That is the way to try it before deciding anything.
The skill is not gated by plan. Anyone can use it. A key does not buy you access — it raises the limits in the table below.
If you want one, it is created at droidwatch.app → My Profile → API Keys,
scope read + analyze. With read only the server answers 403.
Limits
| How you use it | Analyses/day | Max size |
|---|---|---|
| Without a key (anonymous) | 3 | 150 MB |
| Free account | 5 | 200 MB |
Pro (with a dw_ key) |
100 | 500 MB |
| Team | 500 | 750 MB |
| Enterprise | unlimited | 1 GB |
Use
Your assistant runs these for you. To try them by hand, from the
droidwatch/ folder:
python3 scripts/droidwatch.py analyze suspicious.apk
python3 scripts/droidwatch.py summary <run_id>
python3 scripts/droidwatch.py lookup evil-c2.example.com
An analysis takes 1 to 10 minutes depending on size.
What comes back
Compact JSON — around 8 KB, down from a full report of up to 740 KB, so it fits in a model's context with room left to reason:
| Field | What it is |
|---|---|
veredicto |
Benign · Low Risk · Suspicious · High Risk · Malicious, with a score |
hallazgos.graves |
The critical and high findings, already prioritised |
iocs.c2 |
The attacker's infrastructure, decrypted out of the sample |
attack |
MITRE ATT&CK Mobile techniques |
masvs |
Security-posture scorecard |
defensas_runtime |
Whether the sample fights back against analysis |
sin_analizar |
Stages that did not complete |
bloqueado_por_plan |
Sections the analysis produced that your plan does not include |
What it will not do
It answers "is this malicious, and who is behind it?" — not "does my own app have a vulnerability?". For an audit of your own code, this is the wrong tool.
And it will not analyse something you have no right to analyse.
Why the last three fields matter
sin_analizar and the truncado flags exist so an assistant cannot give you
false comfort. "Nothing was found" and "it could not be looked for" are
different sentences, and a summary that hides the difference is worse than no
summary. The skill instructions make the model say which one it is.
The same goes for defensas_runtime: if the sample kills itself when it detects
instrumentation, an empty dynamic report is not evidence of innocence — and
you will be told so.
And it goes for bloqueado_por_plan too. App Authenticity — typosquatting, icon
comparison against the Play listing, repackaging signals — is a paid section, so
on a free plan it does not travel. What the summary will not do is pretend it
found nothing: the blocked findings still count in hallazgos.total, and the
field says how many they are. A gate you can see is honest; a silent one is a
report that reads complete and is not.