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

Mean, together
34.7 CPM
0.229 uSv/h
Precision
±0.0 CPM
0.07% of the mean
Arrivals behind it
1,937,197
over 930.4 tube-hours
Do they agree?
they disagree -- not the same measurement
widest gap 714.6 sigma

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.

1101001,000Aug 25Aug 26Aug 27Aug 28Aug 29Aug 30Aug 31Sep 1Sep 2Sep 3Sep 4Sep 5Sep 6Sep 7Sep 8Sep 9Sep 10Sep 11Sep 12Sep 13Sep 14Sep 15Sep 16Sep 17Sep 18Sep 19Sep 20Sep 21Sep 22Sep 23Sep 24Sep 25Sep 26Sep 27Sep 28Sep 29Sep 30Oct 1Oct 2Oct 3Oct 4Oct 5Oct 6Oct 7F48824B8207F7EF7F4CA7F05C2EACPM, log

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

Mean
45.5 CPM
0.300 uSv/h
Highest 3s peak
9360 CPM
61.782 uSv/h
Rows
74,350
613.8 hours counted
Covering
2026-08-24 02:37
to 2026-10-07 18:01

Counts per minute, by the hour

101001,00010,000Aug 25Aug 26Aug 27Aug 28Aug 29Aug 30Aug 31Sep 1Sep 2Sep 3Sep 4Sep 5Sep 6Sep 7Sep 8Sep 9Sep 10Sep 11Sep 12Sep 13Sep 14Sep 15Sep 16Sep 17Sep 18Sep 19Sep 20Sep 21Sep 22Sep 23Sep 24Sep 25Sep 26Sep 27Sep 28Sep 29Sep 30Oct 1Oct 2Oct 3Oct 4Oct 5Oct 6Oct 7CPM, log
hourly meanhighest 3-second peak in the houra break in the line is an hour with no recording

By day

DayMean CPMµSv/hPeak 3s CPMRowsHours
2026-10-0728.80.190400146212.2
2026-10-0643.60.288700261720.4
2026-10-0547.10.311740286623.1
2026-10-0437.40.247660288023.7
2026-10-0364.30.425860286022.5
2026-10-0261.90.4095080288023.6
2026-10-0154.20.358880286923.5
2026-09-3064.30.424880284723.5
2026-09-2944.30.292780287323.9
2026-09-2841.90.277780272122.7
2026-09-2735.20.233380173014.4
2026-09-2631.50.2082605794.8
2026-09-2533.20.21928011139.3
2026-09-2438.20.2527320259321.6
2026-09-2343.10.2849360273422.7
2026-09-2247.10.3119360208717.4
2026-09-2143.70.289720267822.3
2026-09-2041.50.274620287123.9
2026-09-1940.30.266800284923.7
2026-09-1846.00.3043480288023.6
2026-09-1749.50.3275140288024.0
2026-09-1646.90.3093480287223.9
2026-09-1534.80.2302401681.4
2026-09-0941.10.271240210.2
2026-09-0246.00.30473201221.0
2026-09-0138.40.254300700.6
2026-08-3142.90.2836840229319.1
2026-08-3039.30.259680229419.1
2026-08-2940.80.2708520257221.4
2026-08-2841.90.276680245620.4
2026-08-2743.60.288700241420.1
2026-08-2646.50.3076820234619.5
2026-08-2547.80.316740258321.5
2026-08-2445.20.2988520227018.9

Latest rows

TimeCPS3s30s300sPeak 3sSourceSite
2026-10-07T18:01:290.70060.042.038.8120.0live--
2026-10-07T18:00:590.90060.054.037.8180.0live--
2026-10-07T18:00:290.50040.030.036.0100.0live--
2026-10-07T17:59:590.4000.024.037.080.0live--
2026-10-07T17:59:290.76740.046.039.8120.0live--
2026-10-07T17:58:580.933120.056.039.0160.0live--
2026-10-07T17:58:280.56740.034.037.2120.0live--
2026-10-07T17:57:580.6330.038.036.6200.0live--
2026-10-07T17:57:280.33320.020.035.680.0live--
2026-10-07T17:56:580.7330.044.037.6160.0live--
2026-10-07T17:56:270.567100.034.037.6120.0live--
2026-10-07T17:55:570.56740.034.038.280.0live--
2026-10-07T17:55:270.70040.042.037.2100.0live--
2026-10-07T17:54:570.83360.050.036.6120.0live--
2026-10-07T17:54:270.66740.040.035.6160.0live--
2026-10-07T17:53:570.60060.036.036.060.0live--
2026-10-07T17:53:260.50020.030.036.4120.0live--
2026-10-07T17:52:560.43380.026.036.480.0live--
2026-10-07T17:52:260.70080.042.040.2120.0live--
2026-10-07T17:51:560.70020.042.040.0140.0live--
2026-10-07T17:51:260.7000.042.040.2140.0live--
2026-10-07T17:50:550.43340.026.040.060.0live--
2026-10-07T17:50:250.60080.036.040.8100.0live--
2026-10-07T17:49:550.60040.036.041.0140.0live--
2026-10-07T17:49:250.767160.046.041.6160.0live--
2026-10-07T17:48:550.6330.038.042.6120.0live--
2026-10-07T17:48:250.5000.030.042.2100.0live--
2026-10-07T17:47:541.1330.068.044.2180.0live--
2026-10-07T17:47:240.6000.036.041.6100.0live--
2026-10-07T17:46:540.800100.048.039.6140.0live--
2026-10-07T17:46:240.66740.040.036.480.0live--
2026-10-07T17:45:540.53340.032.036.080.0live--
2026-10-07T17:45:240.60020.036.036.4100.0live--
2026-10-07T17:44:530.7000.042.038.0240.0live--
2026-10-07T17:44:231.06780.064.037.0180.0live--
2026-10-07T17:43:530.43360.026.034.280.0live--
2026-10-07T17:43:230.83360.050.035.0120.0live--
2026-10-07T17:42:530.70020.042.032.0140.0live--
2026-10-07T17:42:230.30020.018.032.060.0live--
2026-10-07T17:41:520.2670.016.033.680.0live--
2026-10-07T17:41:220.5670.034.035.880.0live--
2026-10-07T17:40:520.6000.036.037.8100.0live--
2026-10-07T17:40:220.8670.052.045.6140.0live--
2026-10-07T17:39:520.56720.034.049.6120.0live--
2026-10-07T17:39:220.5670.034.054.4120.0live--
2026-10-07T17:38:510.56740.034.061.8140.0live--
2026-10-07T17:38:210.36740.022.064.4100.0live--
2026-10-07T17:37:510.66780.040.072.0120.0live--
2026-10-07T17:37:210.600100.036.075.4100.0live--
2026-10-07T17:36:510.60080.036.079.4120.0live--
2026-10-07T17:36:210.900220.054.081.6260.0live--
2026-10-07T17:35:511.933140.0116.078.8320.0live--
2026-10-07T17:35:211.53360.092.072.0260.0live--
2026-10-07T17:34:501.333200.080.065.4280.0live--
2026-10-07T17:34:201.8330.0110.062.0320.0live--
2026-10-07T17:33:500.9670.058.056.0180.0live--
2026-10-07T17:33:201.6330.098.053.6400.0live--
2026-10-07T17:32:501.23340.074.047.2340.0live--
2026-10-07T17:32:201.2670.076.042.4220.0live--
2026-10-07T17:31:500.96780.058.038.0200.0live--

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

Mean
13.8 CPM
0.091 uSv/h
Highest 3s peak
2220 CPM
14.653 uSv/h
Rows
37,641
316.5 hours counted
Covering
2026-09-18 19:28
to 2026-10-07 18:01

Counts per minute, by the hour

1101001,00010,000Sep 19Sep 20Sep 21Sep 22Sep 23Sep 24Sep 25Sep 26Sep 27Sep 28Sep 29Sep 30Oct 1Oct 2Oct 3Oct 4Oct 5Oct 6Oct 7CPM, log
hourly meanhighest 3-second peak in the houra break in the line is an hour with no recording

By day

DayMean CPMµSv/hPeak 3s CPMRowsHours
2026-10-0714.20.094140212718.1
2026-10-0614.20.093160287523.1
2026-10-0514.30.094140286623.9
2026-10-0414.30.094140287224.1
2026-10-0314.20.094140242619.6
2026-10-0214.00.092140288024.4
2026-10-0113.90.092160285024.2
2026-09-3013.50.0892220287324.3
2026-09-2913.90.0922220288024.5
2026-09-2813.70.090140285924.1
2026-09-2713.60.090160144312.3
2026-09-2613.60.0901404273.7
2026-09-2513.40.08814010038.6
2026-09-2422.50.1494010.0
2026-09-2313.40.088140267822.7
2026-09-2213.70.0911407846.7
2026-09-2013.20.0871404313.7
2026-09-1913.10.086140282224.1
2026-09-1812.80.0841205444.4

Latest rows

TimeCPS3s30s300sPeak 3sSourceSite
2026-10-07T18:01:390.19440.012.013.440.0live--
2026-10-07T18:01:080.12920.08.013.040.0live--
2026-10-07T18:00:380.22620.014.012.660.0live--
2026-10-07T18:00:070.16120.010.013.240.0live--
2026-10-07T17:59:360.1940.012.013.240.0live--
2026-10-07T17:59:050.35520.022.013.660.0live--
2026-10-07T17:58:340.3230.020.012.660.0live--
2026-10-07T17:58:030.35540.022.012.660.0live--
2026-10-07T17:57:330.1290.08.011.840.0live--
2026-10-07T17:57:020.12920.08.012.460.0live--
2026-10-07T17:56:310.09720.06.012.840.0live--
2026-10-07T17:56:000.16120.010.013.260.0live--
2026-10-07T17:55:290.2580.016.013.260.0live--
2026-10-07T17:54:590.25820.016.012.660.0live--
2026-10-07T17:54:280.1290.08.012.240.0live--
2026-10-07T17:53:570.2260.014.013.060.0live--
2026-10-07T17:53:260.35540.022.013.260.0live--
2026-10-07T17:52:550.19420.012.012.640.0live--
2026-10-07T17:52:240.2580.016.012.8100.0live--
2026-10-07T17:51:540.1290.08.013.020.0live--
2026-10-07T17:51:230.2260.014.013.860.0live--
2026-10-07T17:50:520.0970.06.014.020.0live--
2026-10-07T17:50:210.1940.012.014.860.0live--
2026-10-07T17:49:500.19440.012.015.040.0live--
2026-10-07T17:49:190.32320.020.014.860.0live--
2026-10-07T17:48:490.16120.010.014.620.0live--
2026-10-07T17:48:180.2900.018.015.080.0live--
2026-10-07T17:47:470.22640.014.014.460.0live--
2026-10-07T17:47:160.35540.022.014.260.0live--
2026-10-07T17:46:450.22620.014.013.840.0live--
2026-10-07T17:46:140.2260.014.013.460.0live--
2026-10-07T17:45:440.32340.020.013.480.0live--
2026-10-07T17:45:130.1290.08.012.640.0live--
2026-10-07T17:44:420.22640.014.013.840.0live--
2026-10-07T17:44:110.25820.016.014.040.0live--
2026-10-07T17:43:400.2260.014.014.6100.0live--
2026-10-07T17:43:090.25820.016.015.280.0live--
2026-10-07T17:42:390.0970.06.015.620.0live--
2026-10-07T17:42:080.29020.018.015.840.0live--
2026-10-07T17:41:370.1940.012.016.040.0live--
2026-10-07T17:41:060.1610.010.015.260.0live--
2026-10-07T17:40:350.19420.012.015.460.0live--
2026-10-07T17:40:050.35560.022.015.480.0live--
2026-10-07T17:39:340.45240.028.015.080.0live--
2026-10-07T17:39:030.32320.020.014.0100.0live--
2026-10-07T17:38:320.2260.014.013.640.0live--
2026-10-07T17:38:010.2900.018.013.060.0live--
2026-10-07T17:37:300.09720.06.012.620.0live--
2026-10-07T17:37:000.32320.020.013.680.0live--
2026-10-07T17:36:290.1290.08.013.260.0live--
2026-10-07T17:35:580.1610.010.013.840.0live--
2026-10-07T17:35:270.22620.014.014.480.0live--
2026-10-07T17:34:560.29020.018.014.060.0live--
2026-10-07T17:34:250.3230.020.013.880.0live--
2026-10-07T17:33:550.1290.08.013.440.0live--
2026-10-07T17:33:240.1610.010.013.640.0live--
2026-10-07T17:32:530.22640.014.015.040.0live--
2026-10-07T17:32:220.32340.020.015.660.0live--
2026-10-07T17:31:510.2260.014.016.440.0live--
2026-10-07T17:31:200.16120.010.016.840.0live--

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.

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
radbeeper probe, against the counter these logs came from
radbeeper probe, against the counter these logs came from

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 monitor: five time constants, the counts, the spectrum and a line of decay-derived random
the monitor: five time constants, the counts, the spectrum and a line of decay-derived random

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.

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.

the long window still filling, and saying so
the long window still filling, and saying so

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.

the accumulating spectrum: flat is healthy
the accumulating spectrum: flat is healthy

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.

the log on disk, and what a row holds
the log on disk, and what a row holds

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

the same rows with every tab made visible
the same rows with every tab made visible

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