Radiation monitor
A GQ GMC Geiger-Muller counter on the desk · generated 2026-10-08 02:14 by radbeeper 0.6.0 · tube factor 151.5 CPM per µSv/h
A GQ GMC-320 Plus Geiger–Müller counter, plugged into a machine running Alpine Linux — or Copal, its distillation, which carries this as a stage and installs the linux-lts kernel package the counter needs to be seen at all — as a USB serial device, here shared into a virtual machine over USB pass-through. RadBeeper reads the counter, logs it to tab-separated files, and this page is regenerated from those files by a GitHub Action on every push. The whole of it is forkable: copy your own logs into logs/ and you get a page like this one. Source and instructions. Where the random comes from.
Both counters
Two tubes watching one room are two measurements of one number: they do not double the dose — what doubles is the evidence. The mean above is counts-weighted across 2 tubes, and the precision is all a second counter buys: arrivals are Poisson, so N of them are known to 1/√N and twice the counts is a factor of √2 better. The agreement is the one question a second instrument exists to answer — identical tubes in one room should sit within about two sigma of each other, and a gap that keeps growing is the tubes differing, not the room being interesting.
Every counter's hourly mean, one colour each. Two tubes in one room draw the same shape; where they stop being parallel is where something is wrong with a tube, a cable or a pass-through, and no table of averages shows that as quickly.
Counter F48824B8207F7E
Counts per minute, by the hour
By day
| Day | Mean CPM | µSv/h | Peak 3s CPM | Rows | Hours |
|---|---|---|---|---|---|
| 2026-10-07 | 28.8 | 0.190 | 400 | 1462 | 12.2 |
| 2026-10-06 | 43.6 | 0.288 | 700 | 2617 | 20.4 |
| 2026-10-05 | 47.1 | 0.311 | 740 | 2866 | 23.1 |
| 2026-10-04 | 37.4 | 0.247 | 660 | 2880 | 23.7 |
| 2026-10-03 | 64.3 | 0.425 | 860 | 2860 | 22.5 |
| 2026-10-02 | 61.9 | 0.409 | 5080 | 2880 | 23.6 |
| 2026-10-01 | 54.2 | 0.358 | 880 | 2869 | 23.5 |
| 2026-09-30 | 64.3 | 0.424 | 880 | 2847 | 23.5 |
| 2026-09-29 | 44.3 | 0.292 | 780 | 2873 | 23.9 |
| 2026-09-28 | 41.9 | 0.277 | 780 | 2721 | 22.7 |
| 2026-09-27 | 35.2 | 0.233 | 380 | 1730 | 14.4 |
| 2026-09-26 | 31.5 | 0.208 | 260 | 579 | 4.8 |
| 2026-09-25 | 33.2 | 0.219 | 280 | 1113 | 9.3 |
| 2026-09-24 | 38.2 | 0.252 | 7320 | 2593 | 21.6 |
| 2026-09-23 | 43.1 | 0.284 | 9360 | 2734 | 22.7 |
| 2026-09-22 | 47.1 | 0.311 | 9360 | 2087 | 17.4 |
| 2026-09-21 | 43.7 | 0.289 | 720 | 2678 | 22.3 |
| 2026-09-20 | 41.5 | 0.274 | 620 | 2871 | 23.9 |
| 2026-09-19 | 40.3 | 0.266 | 800 | 2849 | 23.7 |
| 2026-09-18 | 46.0 | 0.304 | 3480 | 2880 | 23.6 |
| 2026-09-17 | 49.5 | 0.327 | 5140 | 2880 | 24.0 |
| 2026-09-16 | 46.9 | 0.309 | 3480 | 2872 | 23.9 |
| 2026-09-15 | 34.8 | 0.230 | 240 | 168 | 1.4 |
| 2026-09-09 | 41.1 | 0.271 | 240 | 21 | 0.2 |
| 2026-09-02 | 46.0 | 0.304 | 7320 | 122 | 1.0 |
| 2026-09-01 | 38.4 | 0.254 | 300 | 70 | 0.6 |
| 2026-08-31 | 42.9 | 0.283 | 6840 | 2293 | 19.1 |
| 2026-08-30 | 39.3 | 0.259 | 680 | 2294 | 19.1 |
| 2026-08-29 | 40.8 | 0.270 | 8520 | 2572 | 21.4 |
| 2026-08-28 | 41.9 | 0.276 | 680 | 2456 | 20.4 |
| 2026-08-27 | 43.6 | 0.288 | 700 | 2414 | 20.1 |
| 2026-08-26 | 46.5 | 0.307 | 6820 | 2346 | 19.5 |
| 2026-08-25 | 47.8 | 0.316 | 740 | 2583 | 21.5 |
| 2026-08-24 | 45.2 | 0.298 | 8520 | 2270 | 18.9 |
Latest rows
| Time | CPS | 3s | 30s | 300s | Peak 3s | Source | Site |
|---|---|---|---|---|---|---|---|
| 2026-10-07T18:01:29 | 0.700 | 60.0 | 42.0 | 38.8 | 120.0 | live | -- |
| 2026-10-07T18:00:59 | 0.900 | 60.0 | 54.0 | 37.8 | 180.0 | live | -- |
| 2026-10-07T18:00:29 | 0.500 | 40.0 | 30.0 | 36.0 | 100.0 | live | -- |
| 2026-10-07T17:59:59 | 0.400 | 0.0 | 24.0 | 37.0 | 80.0 | live | -- |
| 2026-10-07T17:59:29 | 0.767 | 40.0 | 46.0 | 39.8 | 120.0 | live | -- |
| 2026-10-07T17:58:58 | 0.933 | 120.0 | 56.0 | 39.0 | 160.0 | live | -- |
| 2026-10-07T17:58:28 | 0.567 | 40.0 | 34.0 | 37.2 | 120.0 | live | -- |
| 2026-10-07T17:57:58 | 0.633 | 0.0 | 38.0 | 36.6 | 200.0 | live | -- |
| 2026-10-07T17:57:28 | 0.333 | 20.0 | 20.0 | 35.6 | 80.0 | live | -- |
| 2026-10-07T17:56:58 | 0.733 | 0.0 | 44.0 | 37.6 | 160.0 | live | -- |
| 2026-10-07T17:56:27 | 0.567 | 100.0 | 34.0 | 37.6 | 120.0 | live | -- |
| 2026-10-07T17:55:57 | 0.567 | 40.0 | 34.0 | 38.2 | 80.0 | live | -- |
| 2026-10-07T17:55:27 | 0.700 | 40.0 | 42.0 | 37.2 | 100.0 | live | -- |
| 2026-10-07T17:54:57 | 0.833 | 60.0 | 50.0 | 36.6 | 120.0 | live | -- |
| 2026-10-07T17:54:27 | 0.667 | 40.0 | 40.0 | 35.6 | 160.0 | live | -- |
| 2026-10-07T17:53:57 | 0.600 | 60.0 | 36.0 | 36.0 | 60.0 | live | -- |
| 2026-10-07T17:53:26 | 0.500 | 20.0 | 30.0 | 36.4 | 120.0 | live | -- |
| 2026-10-07T17:52:56 | 0.433 | 80.0 | 26.0 | 36.4 | 80.0 | live | -- |
| 2026-10-07T17:52:26 | 0.700 | 80.0 | 42.0 | 40.2 | 120.0 | live | -- |
| 2026-10-07T17:51:56 | 0.700 | 20.0 | 42.0 | 40.0 | 140.0 | live | -- |
| 2026-10-07T17:51:26 | 0.700 | 0.0 | 42.0 | 40.2 | 140.0 | live | -- |
| 2026-10-07T17:50:55 | 0.433 | 40.0 | 26.0 | 40.0 | 60.0 | live | -- |
| 2026-10-07T17:50:25 | 0.600 | 80.0 | 36.0 | 40.8 | 100.0 | live | -- |
| 2026-10-07T17:49:55 | 0.600 | 40.0 | 36.0 | 41.0 | 140.0 | live | -- |
| 2026-10-07T17:49:25 | 0.767 | 160.0 | 46.0 | 41.6 | 160.0 | live | -- |
| 2026-10-07T17:48:55 | 0.633 | 0.0 | 38.0 | 42.6 | 120.0 | live | -- |
| 2026-10-07T17:48:25 | 0.500 | 0.0 | 30.0 | 42.2 | 100.0 | live | -- |
| 2026-10-07T17:47:54 | 1.133 | 0.0 | 68.0 | 44.2 | 180.0 | live | -- |
| 2026-10-07T17:47:24 | 0.600 | 0.0 | 36.0 | 41.6 | 100.0 | live | -- |
| 2026-10-07T17:46:54 | 0.800 | 100.0 | 48.0 | 39.6 | 140.0 | live | -- |
| 2026-10-07T17:46:24 | 0.667 | 40.0 | 40.0 | 36.4 | 80.0 | live | -- |
| 2026-10-07T17:45:54 | 0.533 | 40.0 | 32.0 | 36.0 | 80.0 | live | -- |
| 2026-10-07T17:45:24 | 0.600 | 20.0 | 36.0 | 36.4 | 100.0 | live | -- |
| 2026-10-07T17:44:53 | 0.700 | 0.0 | 42.0 | 38.0 | 240.0 | live | -- |
| 2026-10-07T17:44:23 | 1.067 | 80.0 | 64.0 | 37.0 | 180.0 | live | -- |
| 2026-10-07T17:43:53 | 0.433 | 60.0 | 26.0 | 34.2 | 80.0 | live | -- |
| 2026-10-07T17:43:23 | 0.833 | 60.0 | 50.0 | 35.0 | 120.0 | live | -- |
| 2026-10-07T17:42:53 | 0.700 | 20.0 | 42.0 | 32.0 | 140.0 | live | -- |
| 2026-10-07T17:42:23 | 0.300 | 20.0 | 18.0 | 32.0 | 60.0 | live | -- |
| 2026-10-07T17:41:52 | 0.267 | 0.0 | 16.0 | 33.6 | 80.0 | live | -- |
| 2026-10-07T17:41:22 | 0.567 | 0.0 | 34.0 | 35.8 | 80.0 | live | -- |
| 2026-10-07T17:40:52 | 0.600 | 0.0 | 36.0 | 37.8 | 100.0 | live | -- |
| 2026-10-07T17:40:22 | 0.867 | 0.0 | 52.0 | 45.6 | 140.0 | live | -- |
| 2026-10-07T17:39:52 | 0.567 | 20.0 | 34.0 | 49.6 | 120.0 | live | -- |
| 2026-10-07T17:39:22 | 0.567 | 0.0 | 34.0 | 54.4 | 120.0 | live | -- |
| 2026-10-07T17:38:51 | 0.567 | 40.0 | 34.0 | 61.8 | 140.0 | live | -- |
| 2026-10-07T17:38:21 | 0.367 | 40.0 | 22.0 | 64.4 | 100.0 | live | -- |
| 2026-10-07T17:37:51 | 0.667 | 80.0 | 40.0 | 72.0 | 120.0 | live | -- |
| 2026-10-07T17:37:21 | 0.600 | 100.0 | 36.0 | 75.4 | 100.0 | live | -- |
| 2026-10-07T17:36:51 | 0.600 | 80.0 | 36.0 | 79.4 | 120.0 | live | -- |
| 2026-10-07T17:36:21 | 0.900 | 220.0 | 54.0 | 81.6 | 260.0 | live | -- |
| 2026-10-07T17:35:51 | 1.933 | 140.0 | 116.0 | 78.8 | 320.0 | live | -- |
| 2026-10-07T17:35:21 | 1.533 | 60.0 | 92.0 | 72.0 | 260.0 | live | -- |
| 2026-10-07T17:34:50 | 1.333 | 200.0 | 80.0 | 65.4 | 280.0 | live | -- |
| 2026-10-07T17:34:20 | 1.833 | 0.0 | 110.0 | 62.0 | 320.0 | live | -- |
| 2026-10-07T17:33:50 | 0.967 | 0.0 | 58.0 | 56.0 | 180.0 | live | -- |
| 2026-10-07T17:33:20 | 1.633 | 0.0 | 98.0 | 53.6 | 400.0 | live | -- |
| 2026-10-07T17:32:50 | 1.233 | 40.0 | 74.0 | 47.2 | 340.0 | live | -- |
| 2026-10-07T17:32:20 | 1.267 | 0.0 | 76.0 | 42.4 | 220.0 | live | -- |
| 2026-10-07T17:31:50 | 0.967 | 80.0 | 58.0 | 38.0 | 200.0 | live | -- |
The last 60 rows of 74,350. Read the full chart: cpm-F48824B8207F7E-2026-08.tsv · cpm-F48824B8207F7E-2026-09.tsv · cpm-F48824B8207F7E-2026-10.tsv — tab-separated, one row every 30 seconds.
Where this counter's random comes from — every line it has emitted, with the counts behind it.
Counter F7F4CA7F05C2EA
Counts per minute, by the hour
By day
| Day | Mean CPM | µSv/h | Peak 3s CPM | Rows | Hours |
|---|---|---|---|---|---|
| 2026-10-07 | 14.2 | 0.094 | 140 | 2127 | 18.1 |
| 2026-10-06 | 14.2 | 0.093 | 160 | 2875 | 23.1 |
| 2026-10-05 | 14.3 | 0.094 | 140 | 2866 | 23.9 |
| 2026-10-04 | 14.3 | 0.094 | 140 | 2872 | 24.1 |
| 2026-10-03 | 14.2 | 0.094 | 140 | 2426 | 19.6 |
| 2026-10-02 | 14.0 | 0.092 | 140 | 2880 | 24.4 |
| 2026-10-01 | 13.9 | 0.092 | 160 | 2850 | 24.2 |
| 2026-09-30 | 13.5 | 0.089 | 2220 | 2873 | 24.3 |
| 2026-09-29 | 13.9 | 0.092 | 2220 | 2880 | 24.5 |
| 2026-09-28 | 13.7 | 0.090 | 140 | 2859 | 24.1 |
| 2026-09-27 | 13.6 | 0.090 | 160 | 1443 | 12.3 |
| 2026-09-26 | 13.6 | 0.090 | 140 | 427 | 3.7 |
| 2026-09-25 | 13.4 | 0.088 | 140 | 1003 | 8.6 |
| 2026-09-24 | 22.5 | 0.149 | 40 | 1 | 0.0 |
| 2026-09-23 | 13.4 | 0.088 | 140 | 2678 | 22.7 |
| 2026-09-22 | 13.7 | 0.091 | 140 | 784 | 6.7 |
| 2026-09-20 | 13.2 | 0.087 | 140 | 431 | 3.7 |
| 2026-09-19 | 13.1 | 0.086 | 140 | 2822 | 24.1 |
| 2026-09-18 | 12.8 | 0.084 | 120 | 544 | 4.4 |
Latest rows
| Time | CPS | 3s | 30s | 300s | Peak 3s | Source | Site |
|---|---|---|---|---|---|---|---|
| 2026-10-07T18:01:39 | 0.194 | 40.0 | 12.0 | 13.4 | 40.0 | live | -- |
| 2026-10-07T18:01:08 | 0.129 | 20.0 | 8.0 | 13.0 | 40.0 | live | -- |
| 2026-10-07T18:00:38 | 0.226 | 20.0 | 14.0 | 12.6 | 60.0 | live | -- |
| 2026-10-07T18:00:07 | 0.161 | 20.0 | 10.0 | 13.2 | 40.0 | live | -- |
| 2026-10-07T17:59:36 | 0.194 | 0.0 | 12.0 | 13.2 | 40.0 | live | -- |
| 2026-10-07T17:59:05 | 0.355 | 20.0 | 22.0 | 13.6 | 60.0 | live | -- |
| 2026-10-07T17:58:34 | 0.323 | 0.0 | 20.0 | 12.6 | 60.0 | live | -- |
| 2026-10-07T17:58:03 | 0.355 | 40.0 | 22.0 | 12.6 | 60.0 | live | -- |
| 2026-10-07T17:57:33 | 0.129 | 0.0 | 8.0 | 11.8 | 40.0 | live | -- |
| 2026-10-07T17:57:02 | 0.129 | 20.0 | 8.0 | 12.4 | 60.0 | live | -- |
| 2026-10-07T17:56:31 | 0.097 | 20.0 | 6.0 | 12.8 | 40.0 | live | -- |
| 2026-10-07T17:56:00 | 0.161 | 20.0 | 10.0 | 13.2 | 60.0 | live | -- |
| 2026-10-07T17:55:29 | 0.258 | 0.0 | 16.0 | 13.2 | 60.0 | live | -- |
| 2026-10-07T17:54:59 | 0.258 | 20.0 | 16.0 | 12.6 | 60.0 | live | -- |
| 2026-10-07T17:54:28 | 0.129 | 0.0 | 8.0 | 12.2 | 40.0 | live | -- |
| 2026-10-07T17:53:57 | 0.226 | 0.0 | 14.0 | 13.0 | 60.0 | live | -- |
| 2026-10-07T17:53:26 | 0.355 | 40.0 | 22.0 | 13.2 | 60.0 | live | -- |
| 2026-10-07T17:52:55 | 0.194 | 20.0 | 12.0 | 12.6 | 40.0 | live | -- |
| 2026-10-07T17:52:24 | 0.258 | 0.0 | 16.0 | 12.8 | 100.0 | live | -- |
| 2026-10-07T17:51:54 | 0.129 | 0.0 | 8.0 | 13.0 | 20.0 | live | -- |
| 2026-10-07T17:51:23 | 0.226 | 0.0 | 14.0 | 13.8 | 60.0 | live | -- |
| 2026-10-07T17:50:52 | 0.097 | 0.0 | 6.0 | 14.0 | 20.0 | live | -- |
| 2026-10-07T17:50:21 | 0.194 | 0.0 | 12.0 | 14.8 | 60.0 | live | -- |
| 2026-10-07T17:49:50 | 0.194 | 40.0 | 12.0 | 15.0 | 40.0 | live | -- |
| 2026-10-07T17:49:19 | 0.323 | 20.0 | 20.0 | 14.8 | 60.0 | live | -- |
| 2026-10-07T17:48:49 | 0.161 | 20.0 | 10.0 | 14.6 | 20.0 | live | -- |
| 2026-10-07T17:48:18 | 0.290 | 0.0 | 18.0 | 15.0 | 80.0 | live | -- |
| 2026-10-07T17:47:47 | 0.226 | 40.0 | 14.0 | 14.4 | 60.0 | live | -- |
| 2026-10-07T17:47:16 | 0.355 | 40.0 | 22.0 | 14.2 | 60.0 | live | -- |
| 2026-10-07T17:46:45 | 0.226 | 20.0 | 14.0 | 13.8 | 40.0 | live | -- |
| 2026-10-07T17:46:14 | 0.226 | 0.0 | 14.0 | 13.4 | 60.0 | live | -- |
| 2026-10-07T17:45:44 | 0.323 | 40.0 | 20.0 | 13.4 | 80.0 | live | -- |
| 2026-10-07T17:45:13 | 0.129 | 0.0 | 8.0 | 12.6 | 40.0 | live | -- |
| 2026-10-07T17:44:42 | 0.226 | 40.0 | 14.0 | 13.8 | 40.0 | live | -- |
| 2026-10-07T17:44:11 | 0.258 | 20.0 | 16.0 | 14.0 | 40.0 | live | -- |
| 2026-10-07T17:43:40 | 0.226 | 0.0 | 14.0 | 14.6 | 100.0 | live | -- |
| 2026-10-07T17:43:09 | 0.258 | 20.0 | 16.0 | 15.2 | 80.0 | live | -- |
| 2026-10-07T17:42:39 | 0.097 | 0.0 | 6.0 | 15.6 | 20.0 | live | -- |
| 2026-10-07T17:42:08 | 0.290 | 20.0 | 18.0 | 15.8 | 40.0 | live | -- |
| 2026-10-07T17:41:37 | 0.194 | 0.0 | 12.0 | 16.0 | 40.0 | live | -- |
| 2026-10-07T17:41:06 | 0.161 | 0.0 | 10.0 | 15.2 | 60.0 | live | -- |
| 2026-10-07T17:40:35 | 0.194 | 20.0 | 12.0 | 15.4 | 60.0 | live | -- |
| 2026-10-07T17:40:05 | 0.355 | 60.0 | 22.0 | 15.4 | 80.0 | live | -- |
| 2026-10-07T17:39:34 | 0.452 | 40.0 | 28.0 | 15.0 | 80.0 | live | -- |
| 2026-10-07T17:39:03 | 0.323 | 20.0 | 20.0 | 14.0 | 100.0 | live | -- |
| 2026-10-07T17:38:32 | 0.226 | 0.0 | 14.0 | 13.6 | 40.0 | live | -- |
| 2026-10-07T17:38:01 | 0.290 | 0.0 | 18.0 | 13.0 | 60.0 | live | -- |
| 2026-10-07T17:37:30 | 0.097 | 20.0 | 6.0 | 12.6 | 20.0 | live | -- |
| 2026-10-07T17:37:00 | 0.323 | 20.0 | 20.0 | 13.6 | 80.0 | live | -- |
| 2026-10-07T17:36:29 | 0.129 | 0.0 | 8.0 | 13.2 | 60.0 | live | -- |
| 2026-10-07T17:35:58 | 0.161 | 0.0 | 10.0 | 13.8 | 40.0 | live | -- |
| 2026-10-07T17:35:27 | 0.226 | 20.0 | 14.0 | 14.4 | 80.0 | live | -- |
| 2026-10-07T17:34:56 | 0.290 | 20.0 | 18.0 | 14.0 | 60.0 | live | -- |
| 2026-10-07T17:34:25 | 0.323 | 0.0 | 20.0 | 13.8 | 80.0 | live | -- |
| 2026-10-07T17:33:55 | 0.129 | 0.0 | 8.0 | 13.4 | 40.0 | live | -- |
| 2026-10-07T17:33:24 | 0.161 | 0.0 | 10.0 | 13.6 | 40.0 | live | -- |
| 2026-10-07T17:32:53 | 0.226 | 40.0 | 14.0 | 15.0 | 40.0 | live | -- |
| 2026-10-07T17:32:22 | 0.323 | 40.0 | 20.0 | 15.6 | 60.0 | live | -- |
| 2026-10-07T17:31:51 | 0.226 | 0.0 | 14.0 | 16.4 | 40.0 | live | -- |
| 2026-10-07T17:31:20 | 0.161 | 20.0 | 10.0 | 16.8 | 40.0 | live | -- |
The last 60 rows of 37,641. Read the full chart: cpm-F7F4CA7F05C2EA-2026-09.tsv · cpm-F7F4CA7F05C2EA-2026-10.tsv — tab-separated, one row every 30 seconds.
How to use it
What you need
A GQ GMC-320 Plus, plugged into a USB port, switched on. That is the hardware, and no amount of software substitutes for it: every number on this page came off a real tube over a real serial port. A GMC-300 works too — RadBeeper tries its 57600 baud as well as the 320's 115200 — and a 500 or 600 is found and read, but its tube is not an M4011, so it needs its own --cpm-per-usvh.
- The USB cable that came with it. A charge-only cable carries no data, and is indistinguishable from an empty port until you try another one.
- The counter switched on. Its USB-serial chip is powered by the counter, not by the bus — a flat 320 enumerates as nothing.
- A kernel with
ch341. The 320 Plus presents as a CH340.linux-ltsandlinux-rpicarry the driver; Alpine'slinux-virtdoes not, which is the commonest reason a counter that is plugged in cannot be found. Copal installs thelinux-ltsAlpine package, so the case does not arise there. - Membership of
dialout. The serial node isroot:dialoutand RadBeeper does not want root.
Plugged in and working, Linux says so: dmesg ends with ch341-uart converter now attached to ttyUSB0 and /dev/ttyUSB0 exists. USB pass-through into a VM counts — these logs came from one — provided the guest kernel is one of the two that has the driver.
No counter yet? radbeeper --source sim watch draws the whole monitor against a synthetic Poisson background.
Install
One stdlib Python file. No packages, no build, nothing to compile — the install is a copy.
git clone https://github.com/vonglurt/radbeeper.git cd radbeeper && make install doas adduser $USER dialout # then log in again
The read side is also a Rust crate, if a native binary suits the machine better: cargo install radbeeper, or a static musl build from the releases page for x86_64, aarch64, armv7 or the Pi Zero's armv6. It does probe, cpm and watch; everything that writes these logs stays in the Python.
Find the counter
radbeeper probe

If it finds nothing it says which of four things went wrong, because they have four different fixes: no serial node at all (often a kernel with no ch341 — Alpine's linux-virt has none, linux-lts does), permission on the node, something that is not a GMC, or a port another reader already holds.
Watch it
radbeeper watch

The counter's own reading is a rolling 60-second count — one number with one time constant. RadBeeper counts the blips itself and keeps five windows at once, each a factor of ten apart.
- 3 sThree seconds is too short to be a measurement. On a 40 CPM background it swings between 0 and 80, because at this rate three seconds is two counts. Watch it to see a source come and go as you move it, and do not write it down.
- 30 sHalf a minute, and the shortest window that is a count rather than a flicker. Settled enough to compare two places, quick enough to follow your hands — which is why it is the number in the big digits, and what
radbeeper cpmreports. - 300 sFive minutes. A number worth writing down.
- 3000 sFifty minutes. What the background here actually is, once the day's traffic through the room has averaged out.
- 30000 sEight hours twenty — a working day. It is not a faster answer to the same question, it is the only window that spans one; a shift's worth of background, against which a day that was different is visible as a difference.
A window shows nothing until it is full, and says how long it still needs. A three-second CPM built from one sample is twenty times noisier than it looks, and drawing it as though it were settled is how a 25 CPM background reads as 60 and somebody goes hunting for a leak.

Is anything periodic?
The monitor also accumulates a power spectrum of the per-second counts. Decay is a Poisson process and the spectrum of a Poisson process is flat — so a featureless strip is the good answer, and says that nothing is arriving on a schedule.

A peak is the interesting case: mains hum on the tube's supply, a fan carrying a source past, a loose connector, firmware that batches its reporting. In the time domain all of those look exactly like more counts. Averaging successive windows is what makes a real line climb out of the noise — one periodogram of a Poisson process is flat in expectation and violently noisy in fact.
No counter on the desk? Every command runs against a built-in source, and it is a real one — radioactive decay is a Poisson process, so the simulator draws Poisson samples.
radbeeper --source sim --sim-cpm 400 watch
Random numbers out of decay
The monitor also keeps an entropy pool and prints a line of hex whenever the samples have earned it. Not modelled — measured: the counts coming back over the serial link are measurably burstier than Poisson, so the bits per second are estimated from the samples themselves and pushed to the far end of a 99% confidence interval before anything is emitted.
radbeeper random
Where the random comes from — the counts against the model, the bits accumulating second by second, what the serial link's one-second resolution costs, and every line emitted with the counts behind it.
Log it
radbeeper service
A row every 30 seconds into a dated file per counter, cpm-<serial>-YYYY-MM.tsv — which is rotation by construction, with no cron entry and nothing renaming a file while a service appends to it. Each row carries the peak every window reached since the last one, so a source that came and went between two rows still leaves a trace.

Tabs are invisible, and that matters here: an empty field is not a zero, it is a window that was not full yet.

The counter also records to its own flash whether or not anything is listening. radbeeper backfill reads that back and fills the gaps — one row per slot, never over a live measurement, and an hour nobody recorded stays an hour nobody recorded.
radbeeper backfill
Publish it
radbeeper export --logs logs -o index.html
This page. Fork the repository, copy your cpm-*.tsv into logs/, push, and the workflow rebuilds and commits it — served by GitHub Pages with no build step. There is nothing to install in the workflow: the generator is the same one file, which is also why the page cannot drift from the log format.
MIT License — Copyright (c) 2026 Paul Richeson · github.com/vonglurt/radbeeper