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

Repository

  • LicenseGPL-3.0
  • Created23 May 26
  • Primary languageKotlin
  • Size1,350 KB
  • Stars131
  • Forks9
  • Watchers131

Language Usage

Language Usage

Project Health

  • Last commit18 days ago
  • Open issues3
  • Latest releasev0.1.3

Top Contributors

Recent Commits

  • Thomas(30 Jul 26)

    Release 0.1.3

  • dependabot[bot](30 Jul 26)

    Bump kotlin to 2.4.10

  • Thomas(30 Jul 26)

    Add a GitHub Sponsor button pointing to DONATE.md

  • dependabot[bot](28 Jul 26)

    Bump spotless to 8.9.0

  • dependabot[bot](23 Jul 26)

    Bump agp to 9.3.1

  • Thomas(23 Jul 26)

    Add F-Droid changelog for 0.1.3

  • Thomas(23 Jul 26)

    Document filter/sort, dual-SIM, and range rate in README.md

  • g-maxxx(23 Jul 26)

    Update full_description.txt

  • g-maxxx(23 Jul 26)

    Add trailing newline to short_description.txt

  • Thomas(23 Jul 26)

    Fix notification for app exit on Android 12

  • Thomas(19 Jul 26)

    Filter untracked GNSS satellites and mark unknown geometry

  • dependabot[bot](15 Jul 26)

    Bump agp to 9.3.0

  • Thomas(14 Jul 26)

    Fix formatting and clean up CellularScanner

  • Thomas(14 Jul 26)

    Filter modem-fabricated cells and harden serving-cell parsing Verified against a Pixel 9 (Tensor) modem, which pads and corrupts CellInfo in several ways: - Drop unregistered WCDMA neighbors pinned at the reporting floor (Ec/No -24 or RSCP below demod sensitivity); the modem reports its whole configured neighbor set as unmeasured floor entries - Drop zero-identity placeholder cells (NR and WCDMA) emitted during NSA/RAT transitions: all-zero identity on a 0 Hz carrier with a clamped signal value - Skip unregistered cells whose measurement is older than the display TTL, so registry replays can't resurrect aged-out towers - Read the LTE serving cell's strength from SignalStrength when CellInfo omits RSRP, instead of dropping the serving tower - Remove a redundant UNAVAILABLE check in sanitizeCellId

  • Thomas(14 Jul 26)

    Update installation section of README.md

  • 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.

Spectre Android App

APK Info

Trackers

No trackers found

    Permissions

    • Access Coarse Location
    • Access Fine Location
    • Access Local Network
    • Access Network State
    • Access Wifi State
    • Bluetooth Advertise
    • Bluetooth Connect
    • Bluetooth Scan
    • Change Wifi State
    • Foreground Service
    • Foreground Service Location
    • Foreground Service Special Use
    • Internet
    • Post Notifications
    • Read Phone State
    • Dynamic Receiver Not Exported Permission

    Spectre Reviews

    More Mobile Apps

    About the Data: Spectre

    Change History

    Edit Spectre Data

    You can edit Spectre's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
    Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

    Origin Data

    Modify Data

    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!