Un téléphone qui travaille
comme un vrai instrument.
Signal Collector enregistre en continu les données de capteurs, radio et réseau que votre téléphone peut atteindre, directement dans le téléphone — sans stockage cloud et sans qu’aucune donnée mesurée ne quitte l’appareil.
Périmètre du MVP
Une session.
Tout le contexte.
- 01GPS, GNSS et capteurs de l’appareil
- 02Réseaux mobiles : LTE / 5G / 3G / 2G
- 03Wi‑Fi, Bluetooth et contexte réseau
- 04Cartographie continue d’internet en Wi‑Fi et en mobile
Sorti des tests,
lancé dans le monde.
La version 1.0.0 est la première sortie publique. L’instrument lui-même ne change pas ; ce qui est nouveau, c’est que n’importe qui peut l’installer, l’essayer une heure avant de payer et lire les écrans dans sa propre langue.
Une heure de mesure, offerte
Chaque téléphone reçoit une heure de temps de mesure par an, à répartir sur autant de mesures que vous voulez — l’outil est fait pour être essayé sur le terrain, pas sur une capture d’écran. Le temps restant et la date de son retour sont affichés juste au-dessus du bouton Démarrer.
Acheté, pas loué
Le déverrouillage est un achat unique dans l’application, au prix Google Play de votre pays. Pas d’abonnement, pas d’expiration, et il suit le compte sur tous les autres téléphones où vous vous connectez.
Les autorisations expliquées avant d’être demandées
Le premier lancement ne commence plus par une pile de dialogues système. Un écran indique à quoi sert chaque autorisation — et que la localisation est ce à quoi Android rattache les cellules et le Wi-Fi — et le système ne demande qu’après votre appui sur le bouton.
Des écrans dans votre langue
L’application et ce site parlent toute une série de langues, choisies par le téléphone ou réglées pour Signal Collector seul. L’export ne suit jamais : il reste en SI, en UTC et avec des noms de colonnes en anglais, pour que deux fichiers venus de deux pays restent un seul jeu de données.
Ready for the world
and for the Store.
Version 0.10.0 completes the move to the production identity, adds full English and US units, closes the release blockers and gives the instrument a calmer, more precise visual system — without changing how it is operated.
English and Czech, neither one a bolt-on
Text is no longer produced inside the collection layer, and errors are no longer recognised by their wording. The language can be switched for the app alone, and an English phone never gets half-Czech screens. Numbers follow the locale; the export deliberately stays stable.
Metres, feet and miles
Units can follow the phone automatically, or be forced to metric or imperial in the settings. Only the screen and the notification are converted; the database and the scientific export always stay in SI.
A release with no silent traps
The production bundle requires the upload key, targets Android 16 / API 36 and carries the final identity app.signalcollector. Corrected permission checks close the crashes that followed a revoked permission, and the updated SSH client brings security fixes.
Around the globe
runs time itself.
Inside the globe sits only what has a bearing. Quantities without direction got their own bands outside the horizon, the operator composes the instrument themselves — and measured data can finally leave the phone by a route other than the share sheet.
Four quantities in the ring
Noise, temperature, pressure and now light. The angle along a band is time, not bearing — one minute split into seconds, so the head of the trace sweeps like a second hand with a gap behind it where values have aged out of the minute.
You compose the view
The middle button switches off whatever the cursor rests on. A switched-off row stays in the list with its value, only struck through: the filter changes the picture, not the measurement.
Data can leave on their own
The gear icon gained S3, WebDAV and SFTP destinations. Passwords are encrypted with a key from the Android Keystore, an address without https is rejected, and the server key fingerprint is verified.
You can see
where the signal came from.
The pulsing background circle gave way to a globe of the sky. Satellites sit where they actually are — and anything without a direction lights the whole ring instead of inventing a bearing.
Satellites in their real place
Android reports azimuth and elevation for GNSS only, and the app has recorded them since day one — there was simply nowhere to see them. Colour separates the constellation, size and brightness carry C/N0, a filled dot counts towards the fix. Verified on a Pixel 10a: 20 satellites from four constellations, 14 in the fix.
What has no bearing lights the whole horizon
Wi‑Fi gives strength, not azimuth; Bluetooth gives none either, and cells report only their identity. Samples without direction therefore ripple the entire ring rather than a sector — a sector would claim the signal came from there. The ripples also rotate, so not even the tallest of them points anywhere.
It tilts with the phone, not just turns
Lying face up it looks into the zenith, held upright it looks at the horizon — and what was near the horizon moves behind the phone. Collapsed, the card leaves a flat compass with a needle to north: calm, no flicker.
Scrolling that
never jumps away.
While hiding, the header used to take part of the gesture for itself and the content was re-measured under the finger. Now it only observes the scroll and takes nothing from it.
Content follows the finger the whole time
The finger used to drag while the page stood still until the header had collapsed — and on reversing direction it expanded again first. The header now sits above the content and takes no part in scrolling; it simply moves away, taking the status row with it.
Nothing is re-measured mid-scroll
It hides by offsetting at draw time, not by changing its height, so the content inset stays constant. Measured on a Pixel 10a: 0.30 % janky frames and no missed vsync across ten drags over the threshold where the header switches.
It returns the moment you pull down
Direction decides, not position — you do not have to scroll back to the top to get the header. Because it also returns mid-page, it got an opaque backdrop; otherwise the title would sit on top of the card text.
A scan that does not
pretend to be a measurement.
Android throttles Wi‑Fi scans and keeps handing back the same result meanwhile. The app used to write it down again and again — and the export then claimed a measurement every five seconds.
A repeated scan is recognisable
Every attempt records the state FRESH, THROTTLED or UNCHANGED together with the age of the result; per-AP records are written only for a fresh scan. Without that, the data could not tell you where measuring actually happened — and for a coverage map, that is the whole difference.
Six times denser sampling
Measured on a Pixel 10a: with throttling on, 70 rejected attempts against 45 fresh scans; with it off, zero rejections and a fresh scan every 4.2 s at the median. At walking pace that is one sample every 6 metres instead of every 40.
Points on a floor plan, throughput per network
GPS gives no position indoors, so a place marker was added — you stop, mark a point, walk on. And a new optional source visits the Wi‑Fi networks you list one by one and measures their actual throughput, not just their signal.
Every second
gets its own row.
Continuous internet measurement no longer leaves holes in the timeline. When measuring is impossible, the reason is written down — and a Wi‑Fi network that is gone is recognised at once, not ten minutes later.
A second without a measurement is still a row
A capacity burst or a manual speed test holds the link for several seconds, and the data used to be left with a gap — a full minute in the worst case. Now it says BUSY, naming who held the link. A missing second cannot be told apart from a failed measurement; a written one can.
A dead Wi‑Fi is recognised immediately
After losing Wi‑Fi, the app stayed bound to a network that no longer existed, and over six hundred samples claimed the internet was not answering. The handle is now dropped as soon as the system stops knowing about it, and the app waits for a new Wi‑Fi with internet.
A sample knows which Wi‑Fi it came from
SSID and BSSID were added to the quality record — until now only the direct Wi‑Fi source knew them, and measured quality could not be tied to a network. Android placeholder values (RSSI −127, frequency −1) are also left empty instead of looking like readings.
From your pocket you can tell
how the run is going.
The notification for a running measurement no longer just says “collecting data”. It shows the duration and the record count, refreshes every five seconds and speaks up when data stops being stored.
Time and count in the notification
On a dark screen you see 00:02:43 · 29,880 records instead of a terse line. The duration is pure collection time, the same as on the status card — a pause between Stop and Start does not count towards it.
Data loss reports itself
As soon as samples are dropped, their count joins the line, and the title changes when writing stalls or fails. It is the one thing worth reporting before the operator looks at the screen again.
Ready for Live Updates
The notification declares itself to the system as a Live Update — Android's counterpart to the iOS Dynamic Island, a strip inside the status bar itself. On the Android 16 build under test it does not render yet, because that part of the system is not switched on; the app is waiting for it, ready.
The colour tells you
what was just captured.
A wave crosses the background every time something is written — and now in a colour that says where the sample came from. From across the desk you can see not only that data is flowing, but what is being heard right now.
A colour per source
Green is sensors, blue networks, amber GNSS and violet Bluetooth. Sensors run at 50 ms, so green is a continuous swell with the other colours flashing through it — a blue flash is a network scan, a violet one Bluetooth.
The wave keeps off the text
It used to be drawn over the content as well, tinting the title in the header, the messages and the status row. Now it sits at the very bottom: it passes under the header but leaves the type alone.
Content runs under the bars
When the header hides on scroll, the cards continue under the status bar instead of stopping at it and leaving an empty strip above. The wave shows through under the bars too.
Start no longer overwrites
work in progress.
Start resumes the last measurement instead of quietly replacing it with a new one. Beyond that, the phone lets your pocket know when the connection drops or data stops being stored.
Start continues, it does not restart
Until now every Start opened a new measurement and the previous one became unreachable — it stayed in the phone, but only the new one could be exported. Now it continues, and a clean slate comes only from Reset, which deletes the previous measurement.
A pause does not count towards the duration
The duration is the sum of the time actually spent collecting, not the span from the first Start to the last Stop — for a run interrupted overnight that would claim fifteen hours of collection. In the export it is running_ms.
Interruptions are in the data
Every stop and every resume adds its own session record with a timestamp. The data therefore shows when collection ran and when it waited, so a pause is not mistaken for a hole in coverage.
A buzz at a hole in coverage
Losing the connection is a soft thud, regaining it two light taps, a failed write three firm knocks. The phone is in your pocket while you walk, and these are the events the screen cannot tell you about. Every buzz goes into the data as haptic, so a window can be cut around the vibration.
The counter runs live
The count is no longer sampled. At two thousand records per second it used to jump by more than five hundred; now it flows, and only the digits slow enough to read are animated. The figures have fixed slots and sit on the baseline.
A panel instead of a form
Start, Reset and Stop are solid colour fields — an unavailable switch turns translucent but keeps its colour. Export got its own plate with a label on which the size of the pending file grows, and a green wave crosses the background with every written sample.
How much ground
we actually covered.
This version adds distance walked next to the duration, in a way that does not credit metres to a phone lying on a desk. Beyond that, the capacity burst shows its progress and technology selection is driven by presets.
Distance walked, in metres
The status card shows Distance instead of a static source count. The value is stored with the session, so a finished measurement still shows it after an app restart, and in the export it is distance_m.
Metres, not GPS noise
A walker covers about 1.4 m between one-second fixes, while the uncertainty of a single fix is usually larger. Distance is therefore not measured between neighbours but by moving an anchor once it passes the threshold max(3 m, accuracy).
Location accuracy on show
The accuracy of the last fix sits under the metrics. When the position is too coarse to count towards distance, the card says so outright, so a number that will not move has an explanation.
The capacity burst shows its progress
A new record for the start of a burst puts its beginning into the data, not only its result. Meanwhile the UI runs a countdown next to the transport, and a burst interrupted by Stop is not left hanging.
Technology presets
“All” and “Clear all” became a single switch, with Default in front of it. The app recognises hand-tuned sensor values, asks before overwriting them and offers to keep them as the Custom preset.
Legible messages
A dark treatment tinted by message type, dismissible by dragging down. An error stays on screen for 15 seconds, an ordinary notice disappears after four.
Internet mapping
while moving through a building.
Continuous transfer mapping got its own card ahead of Start, a heartbeat began watching collection from the inside, and a code audit cleaned up the bindings to Android callbacks.
A card of its own for mapping
A separate card keeps continuous mapping apart from the one-off speed test. It can measure Wi‑Fi, cellular data or both transports at once over a specific Android Network.
A data estimate up front
The interface shows the upper bound before you start: at most 204 MB per 30 minutes for one transport and 407 MB for both.
A heartbeat over collection
A running check of the collectors, the writer and the write queue. The session then distinguishes an ordinary Stop, a writer failure and an interruption after the process died.
The export admits its gaps
The header carries the last stored timestamp, the trailing gap and the counts of accepted, written and dropped samples.
Audited callbacks
Registrations for GPS, GNSS, NMEA and navigation messages are visible in the export itself. Bluetooth Classic stores the states of the discovery cycle as well as the devices actually found.
Fixes from the code audit
The duration of a finished measurement is computed from stored timestamps, stopping the mapping leaves no NetworkCallback hanging, and sensors deliver data on their own thread.
Maintenance that
stops dropping samples.
No new measurement feature. A version born from a code audit, fixing the reliability of collection, writing and export, and moving the format to V3.
Dropped samples on show
When writing falls behind, the count appears in the app and goes into the header as dropped_samples. Samples used to vanish unannounced; ending a measurement no longer loses the last of them either.
Ranges hold
A setting outside the allowed range is pulled back into it, so a zero interval no longer spins a scan with no pause.
A disabled Bluetooth is recognised
With the adapter off, the sources are not marked as measured and ADAPTER_DISABLED goes into the export instead of a blank.
Collection off the main thread
The GNSS, location, Wi‑Fi RTT and cellular callbacks run aside, so raw GNSS no longer slows the controls. The microphone is released only after the read completes.
Format V3
SIGNAL_COLLECTOR_TXT_V3 adds the dropped_samples header and drops the source_timestamp_ns column, which only duplicated elapsed_realtime_ns.
Schema 2 without losses
The database moves by migration and existing measurements survive. Temporary files created for sharing are cleaned up, so the cache no longer grows by a whole measurement.
Transfer quality,
measured continuously.
Alongside the one-off speed test there is now a per-second stream of samples of real download, upload and RTT — bound to a specific network and enriched with radio context.
A sample every second
The measurement runs from Start to Stop and produces roughly one network_quality_sample per second.
What a sample holds
A 64 KiB download, an 8 KiB upload and three small HTTPS RTT probes. The output carries the real transfer times, short-term throughput, RTT min/avg/max, jitter, errors and timeouts.
Capacity burst
Every 30 seconds a network_capacity_probe is produced with a 1 MiB download and a 128 KiB upload.
Forced transport
The test can be sent over a specific Wi‑Fi or cellular Android Network, even when both are available at once.
Radio and location with the sample
Every sample carries the last Wi‑Fi or cellular radio context and the last known location, including its age.
Quality, not a record
The small samples are labelled as measurements of quality over time, not of maximum internet speed. The server layer supports the CLOUDFLARE, CUSTOM and LOCAL modes.
Controls that
stay where they are.
A small interface release. Actions no longer move with the state of the measurement, the top bar gives room to the content, and a message can be dismissed when it is in the way.
Download and Share stay put
The buttons keep their place. Without a finished measurement they are dimmed and inactive, not hidden.
A vanishing top bar
It hides when you scroll down and comes back when you scroll up.
Recommend from the bar
Prepares a new e‑mail with no recipient filled in, carrying a subject, a message and links to the app.
Dismissible messages
Status notices are a bottom message that can be closed; otherwise they disappear on their own after a longer interval.
The storage note moved down
The note about local data storage now sits at the very bottom, visually subdued.
Active scan
and a measured speed test.
This version introduces an experimental active cellular scan with an exact reason for refusal, and a full speed test bound to the transport actually chosen.
Active scan events
Unambiguous ACTIVE_NETWORK_SCAN_REQUESTED, STARTED, RESULT, COMPLETE and FAILED instead of guessing support from the phone brand.
The exact reason for refusal
A failed scan stores the numeric code, the exception type, the message, the carrier privileges state and the state of the MODIFY_PHONE_STATE permission.
Kept apart from passive cells
The result carries scan_mode=ACTIVE_NETWORK_SCAN and only the operator Android supplied; an unknown one stays UNKNOWN.
A test over the chosen transport
Manually over MOBILE, WIFI or sequentially BOTH, with the traffic genuinely bound to the requested Android Network. The options offered follow the validated networks available.
A complete test summary
speed_test_result carries download and upload in Mb/s, bytes and times, the minimum, mean, median, maximum and p95 RTT, jitter, packet loss, errors and the server — together with the last cell or Wi‑Fi context.
Collection that survives
The measurement continues in the background through a foreground service, preferences survive a restart, and from an estimated 10 MB upwards the export preselects GZIP.
Installation
Installée uniquement
via Google Play.
- 1
Installez depuis Google Play — sans invitation, sans liste de testeurs, sans attente.
- 2
Mesurez jusqu’à une heure par an sans rien payer.
- 3
Déverrouillez la mesure illimitée depuis l’application dès que l’heure ne suffit plus.
Google Play est le seul canal de distribution : il signe la chaîne de mises à jour et aucun APK direct n’est proposé nulle part. L’application elle-même n’a besoin d’aucun compte chez nous ni d’aucun de nos serveurs pour fonctionner.
Essai, prix et assistance
Une heure par an
pour vous décider.
Un instrument de terrain ne se juge pas sur des captures d’écran, alors Signal Collector donne à chaque téléphone une heure de temps de mesure par an — de quoi parcourir un trajet, regarder l’anneau se remplir et ouvrir l’export. C’est le temps de mesure qui est compté, pas le nombre de sessions : il peut donc se dépenser à plusieurs endroits et sur plusieurs jours. Une fois épuisé, le déverrouillage est un achat unique dans l’application au prix Google Play de votre pays : pas d’abonnement, pas de date de renouvellement, et il vaut sur tous les téléphones connectés au même compte.
Les retours passent par l’avis Google Play ; chaque nouvel avis est repris dans la journée, transformé en ticket et traité, et les corrections partent avec la mise à jour suivante. L’application payante ne contient ni publicité, ni analytique, ni SDK tiers dans la mesure — c’est le prix qui finance le développement à leur place.
Ce que l’application collecte réellement
Des capteurs physiques
aux réseaux autour de vous.
Chaque source s’active ou se désactive individuellement avant une mesure, et pour certaines technologies l’intervalle se règle aussi.
Réseau mobile
Cellules serveuse et voisines, paramètres LTE/NR/3G/2G, changements d’enregistrement et le scan actif expérimental.
GNSS et localisation
GPS à 1 Hz, satellites, mesures GNSS brutes, horloge, AGC, messages de navigation, NMEA et infos d’antenne.
Wi‑Fi et RTT
La connexion actuelle, les points d’accès proches, le Wi‑Fi 7 MLO, les capacités et les distances RTT/FTM vers les points d’accès compatibles.
Bluetooth
Découverte classique et charge utile d’annonce BLE, y compris les données fabricant et service.
Capteurs et bruit
Mouvement, champ magnétique, pression, lumière, proximité, vecteur de rotation et un niveau dBFS indicatif sans aucun audio conservé.
Réseau et transfert
Échantillons à la seconde du débit descendant et montant réel, du RTT, de la gigue et des expirations, rafales de capacité de 30 secondes et rattachement simultané à un réseau Wi‑Fi et à un réseau mobile précis.
SIM et eSIM
Emplacement, opérateur, MCC/MNC, itinérance et quelle carte porte les données — les cellules à elles seules nomment l’émetteur, pas celui qui regardait. Ni l’ICCID ni l’EID ne sont enregistrés : ce sont des identifiants d’abonnement permanents qui survivent même à un changement de téléphone.
Contrôle terrain, 10 août 2026
Des données d’un vrai
téléphone.
Tout ce qui suit a été mesuré sur un Google Pixel 10a sous Android 16. En version 0.7.2, une seule mesure en trois tronçons a collecté 87 597 enregistrements : la durée est passée de 2:49 à 7:21 puis 8:12, le numéro de mesure n’a jamais changé, et plus de vingt minutes de pauses entre les tronçons n’ont pas compté dans la durée. Les chiffres de distance viennent d’une session de neuf minutes de la version 0.7.1 sur le même téléphone — le filtre de distance n’a pas changé depuis.
Les 274 premiers points avaient une précision comprise entre 9 et 114 m. Additionner les distances entre points voisins donnerait 429 m, ou 28 m une fois les points grossiers filtrés ; déplacer l’ancre au-delà du seuil a donné zéro. Le téléphone de test n’avait pas de SIM, donc la branche mobile de la cartographie a correctement signalé le réseau comme indisponible.
Versions et documents
Installation, changements
et code source.
Le dépôt reste privé. Les collaborateurs connectés y trouvent le code source, les versions taguées et les sommes de contrôle des APK.
Confidentialité
Les données mesurées ne quittent jamais le téléphone.
L’application fonctionne hors ligne et ne contient aucun SDK d’analytique, de publicité ou de rapport de plantage — rien qui puisse rendre compte de vous en arrière-plan, puisqu’il n’y a tout simplement rien dedans qui le pourrait. La cartographie continue optionnelle de la qualité de transfert utilise les points d’accès publics de Cloudflare Speedtest pour de petits transferts HTTPS de test et des rafales périodiques ; ce n’est pas une mesure de la vitesse maximale d’internet. Le module est désactivé par défaut. Si vous achetez le déverrouillage, un signalement d’achat quitte le téléphone sans aucune donnée mesurée ; il est décrit dans la politique de confidentialité. Un export peut contenir des données de localisation sensibles et des identifiants de réseaux voisins.
Comment ça marche
D’un capteur
à une ligne dans un fichier.
Chaque source va à son propre rythme. Un échantillon est horodaté avec la dernière position connue, passe par une file d’attente non bloquante et est stocké par lots dans la base locale. Les clés soulignées du schéma mènent au dictionnaire de données.
Réglages de la collecte
Les mêmes paramètres que l’application propose pour chaque source avant le début d’une mesure. Les plages et l’estimation de données correspondent à l’implémentation ; un changement apparaît aussitôt dans le schéma ci-dessus.
Plage 10–1000 ms
Plage 100–60000 ms
Plage 5–300 s
Plage 5–60 s
Plage 5–300 s
Cartographie d’internetRéseau pour la mesure continue
Les deux sélectionnés, deux identifiants Network Android distincts fonctionnent en même temps.
Plage 500–5000 ms
Plage 1–1024 KiB
Plage 1–256 KiB
Plage 10–300 s
Plage 64–10240 KiB
Plage 8–2048 KiB
L’estimation est une borne haute : sur un lien lent, un échantillon prend plus de temps, il en tient donc moins dans la même durée et moins de données sont transférées. Ce n’est pas une mesure de la vitesse maximale — pourquoi.