v1.12.0 — Trustworthy offline analysis
What's new
If you run APK-JTM offline with a local model, this is the release to update to. Scanning an app the model had never heard of — a private build, an internal tool, a freshly compiled APK — could produce a confident report full of things the scan never found. The clearest example: a "Geographic & Server Analysis" section naming the countries hosting an app's servers, for an app with no network code whatsoever.
The cause was structural. The report asked for a fixed set of sections, but when a scan found nothing for one of them, that section's data was left out of what the AI was given. A required heading with no evidence behind it is an invitation to make something up, and smaller models took it. Sections are now only requested when the scan actually found something, and every category the scan checked is reported even when it came back empty — so "nothing found" is stated as a result rather than left as a gap to fill.
Re-running a report now gives you the same report. No provider was pinning a sampling seed, so every regeneration started from fresh randomness even when nothing about the app had changed. Local models now reproduce their previous report exactly. Hosted providers are best-effort, and current Claude models can't be pinned at all — the app says so rather than implying a guarantee it can't keep.
Reports now open with a Scan evidence panel. Signing status, server locations, packer findings, behaviour patterns, exported components — taken straight from the scan tools and rendered by the app, not written by the AI. These are facts the model can't alter or invent, shown before its interpretation of them. It also tells you when a tool didn't run, which previously looked identical to it running and finding nothing.
Unsigned and debug-signed APKs are now detected and reported. Signing state was never extracted, so an unpublished or freshly built app reached the AI with no sign it wasn't properly signed — while the AI was separately told to be harsher on apps it didn't recognise.
A scanned APK can no longer influence its own verdict. Text taken from the APK went into the AI's instructions unchanged, so a crafted app could embed instructions or forge the machine-readable verdict tag behind the badge you see. That text is now neutralised, fenced off as untrusted, and the verdict is read from the end of the report so a planted tag can't win. Report output is also filtered to safe formatting tags before rendering, closing a route to script running in your browser.
You can now tell the app what you know before scanning. An optional box for describing who built the app and what it's for — most useful for exactly the private and internal builds no model could recognise. It's treated as unverified context that helps judge whether a behaviour is expected, never as proof the app is safe, and it's kept when you re-analyse with a different model.
Also in this release: the prompt now adapts to the model doing the analysis, with smaller models getting the same sections and depth restated as explicit steps (decided by the model, so a large model run offline still gets the full brief); a scan is refused outright rather than quietly producing fiction when the findings won't fit the model's context window; incomplete reports are marked as such instead of appearing merely unrated; and the test suite has grown from 70 to 128.
Full detail in CHANGELOG.md.