Spectre

A radio frequency scanner app for Android with recon and offensive capabilities.

Open Source

Spectre Source Code

Author

thomasbuilds

Description

Radio frequency scanner with recon and offensive capabilities

#android#app#bluetooth#cellular#gnss#grapheneos#jetpack-compose#kotlin#material3#network#pentesting#privacy#radio-frequency#scan#security#wifi

Homepage

License

GPL-3.0

Created

23 May 26

Last Updated

13 Jul 26

Latest version

v0.1.2

Primary Language

Kotlin

Size

1,304 KB

Stars

26

Forks

5

Watchers

26

Language Usage

Language Usage

Star History

Star History

Top Contributors

Recent Commits

  • Thomas (13 Jul 26)

    Add F-Droid in README.md

  • Thomas (11 Jul 26)

    Remove foojay JDK auto-download machinery

  • Thomas (11 Jul 26)

    Release 0.1.2

  • Thomas (11 Jul 26)

    Silence unused-expression warnings in empty when branches

  • Thomas (09 Jul 26)

    Add F-Droid changelog for 0.1.2

  • Thomas (09 Jul 26)

    Fix ktlint formatting in WifiCapabilities

  • Thomas (09 Jul 26)

    Move the skeleton shimmer to the draw phase Reading the infinite transition's alpha during composition recomposed every warming card's scope at the animation rate. SkeletonBar now takes the State and reads it inside graphicsLayer, so the shimmer only invalidates the layer.

  • Thomas (09 Jul 26)

    Harden Wi-Fi scanning and fix capability parsing Run the heartbeat and registration seed on the scan-callback executor so every apCache mutation is single-writer, which closes a lost-update race where the stale write-back could revert a concurrent scan's fresh data. Synchronize stop() with maybeRegister() in both the Wi-Fi and GNSS scanners so an in-flight registration can't complete after teardown, and guard the scan loop with the stopped flag. Parse security per capability bracket group and key the WPA2 badge on the group's PSK/EAP AKMs: the WPA2/RSN prefix alone also fronts WPA3-only (SAE) and OWE groups, which showed a phantom WPA2 label. Map 320 MHz channel width, move the 6 GHz band boundary to 5925 MHz with channel 2 at 5935, and clamp negative FTM distances from measurement noise.

  • Thomas (09 Jul 26)

    Harden Bluetooth scanning and GATT inspection Require fine location in the scanner's permission check (BLUETOOTH_SCAN is declared without neverForLocation, so scans need it anyway), key the signal cache on advertisement content so payload rotations at steady RSSI refresh the details, and run all scheduled work on one serial lane so publishNow is single-writer. Match GATT read responses to the queued characteristic instance before disarming the read timeout: a late response for an already-timed-out read could strip the in-flight read's safety net and hang the inspection, and same-UUID characteristics now keep distinct values. Clear a pending write when a new inspection supersedes it, gate advertising support on the advertiser's existence rather than the multi-advertisement feature, decode Tx Power Level, and trim the NUL padding devices put in fixed-size string characteristics.

  • Thomas (09 Jul 26)

    Fix cellular band mapping, neighbor identity, and monitor lifecycle Map UARFCN to frequency through a per-band offset table (TS 25.101) instead of N/5, which displayed UMTS-900 near 600 MHz; LTE, WCDMA, and GSM now share one band-table mechanism. Key cells that lack a cell id by PCI/PSC/BSIC and channel so distinct neighbors no longer overwrite each other in the cache or drop out of the exposure sum. Sync subscriptions on every heartbeat so a partial registration or a data-SIM move heals within a tick and the DisplayInfo listener follows the data SIM, and guard the subscription listener with the stopped flag. Expire towers in publishNow rather than on ingest so they age out even when the radio goes silent, with a conditional remove that spares a concurrently refreshed cell, and reject LTE RSSI readings below RSRP.

  • dependabot[bot] (08 Jul 26)

    Bump kotlin to 2.4.0

  • Thomas (08 Jul 26)

    Use the linked CodeQL bundle for Kotlin 2.4.0 support

  • Thomas (07 Jul 26)

    Harden scanner lifecycle and simplify readiness tracking Guard every scanner's register/scan path with a stopped flag so an in-flight heartbeat tick cannot re-engage a radio after stop(). Cache the GNSS measurement capability instead of a binder call per status epoch, seed the phone position from the last known fused fix so satellite geometry renders immediately, label below-horizon satellites instead of dropping the row, and use the geosynchronous mean altitude for QZSS. ReadinessTracker loses its staleness window: once a source has delivered data, an empty result now reads as "nothing there" rather than reverting to the warming-up skeleton.

  • Thomas (07 Jul 26)

    Fix scanner recovery after a late permission grant A permission granted while the service runs never re-invokes start(), so the GNSS and Wi-Fi callbacks stayed unregistered until process death. The heartbeat now retries registration. Also gate published satellites on status callback recency, a silent GNSS chip would otherwise keep its last delivery on screen as live data forever.

  • Thomas (07 Jul 26)

    Simplify GNSS scanner code Replace the nested band-name when with a declarative frequency table and compress the scanner's collection, formatting, and registration code. No behavior change.

  • Thomas (07 Jul 26)

    Fix BeiDou orbit classification PRNs C13 and C16 are BDS-2 IGSO and C59-C63 are BDS-3 GEO, all at 35786 km, while C41-C46 are BDS-3 MEO. The old ranges gave those thirteen satellites the wrong altitude, putting displayed slant range and sub-satellite position off by roughly 14000 km.

  • Thomas (07 Jul 26)

    Use the monotonic clock for staleness and interval timing System.currentTimeMillis() jumps with NTP corrections and manual time changes, which can make stale scan data pass freshness checks or expire fresh data early. Every converted site measures elapsed intervals on in-memory state, so SystemClock.elapsedRealtime() is the correct base.

  • Thomas (06 Jul 26)

    Make release builds reproducible for F-Droid F-Droid rebuilds from source and verifies the result byte-for-byte against the released APK, so the release build must be deterministic across machines. Two AGP defaults broke that: - vcsInfo include=false: AGP embeds the git commit into META-INF/version-control-info.textproto. The release is built before its own commit exists, so that revision never matches the tag F-Droid checks out. Only Google Play consumes this field. - keepDebugSymbols for all .so: bundled dependency libraries get stripped only when the build machine has an NDK, which F-Droid's does not. Shipping them unstripped makes the APK identical either way, at a cost of about 10 KB.

  • Thomas (05 Jul 26)

    Update release script - Let GitHub create the tag when the draft release is published, so the tag and its APK become visible to F-Droid together - Guard against reusing an existing remote tag, which gh release create silently attaches to while ignoring --target - Check the YubiKey is reachable over PKCS#11 before building, with one retry for pcscd cold starts - Verify every split APK signature against the release certificate - Delete a previous run's output artifacts before signing - Filter bundletool JVM deprecation noise, real errors still surface - Correct the PKCS#11 module install hint to opensc-pkcs11

  • Thomas (05 Jul 26)

    Add F-Droid and Accrescent distribution support

  • Thomas (05 Jul 26)

    Replace deprecated GNSS onStatusChanged with GnssCapabilities

  • Thomas (03 Jul 26)

    Move icon and banner into metadata/en-US/images

  • dependabot[bot] (02 Jul 26)

    Bump composeBom to 2026.06.01

  • g-maxxx (01 Jul 26)

    Create icon.png

  • dependabot[bot] (30 Jun 26)

    Bump spotless to 8.8.0

  • dependabot[bot] (27 Jun 26)

    Bump gradle-wrapper to 9.6.1

  • Thomas (26 Jun 26)

    Mark GNSS range rate unavailable on devices without clock drift

  • Thomas (26 Jun 26)

    Add range rate, ephemeris, and almanac to GNSS glossary

  • Thomas (26 Jun 26)

    Fix tap ripple on detail rows, settings, and sponsor tiles

  • Thomas (26 Jun 26)

    Expand GNSS per-satellite dropdown Add to each satellite's detail dropdown: - Range rate: line-of-sight closing speed from raw GnssMeasurements, corrected for receiver clock drift and labelled approaching or receding. Cached per satellite with a timestamp so a stale reading falls back to "Pending" rather than lingering as the satellite moves. - Ephemeris and almanac data flags, which indicate a satellite's lock state. Move elevation out of the row header into the dropdown alongside azimuth, and drop the standalone "Used in fix" row since the per-band "in fix" marker already conveys it. Broaden band-name coverage to Galileo E5 and E6, GLONASS L3, BeiDou B2b, QZSS L2 and L6, and the NavIC and SBAS constellations.

Spectre Reviews

More Mobile Apps

About the Data: Spectre

Change History

API

You can access Spectre's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/spectre

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Spectre

Help your friends compare Mobile Apps, and pick privacy-respecting software and services.
Share Spectre and Awesome Privacy with your network!

View Mobile Apps (23)