Privacy Policy
Back to AppEffective 26 October 2026.
This policy covers WebCHIRP: the website at
webchirp.org (formerly codeplug.org) and the
WebCHIRP Android app (com.hf2j.webchirp), which shows that same website.
Everything below applies to both.
In short
- There are no accounts and no ads, and your data is never sold.
- Your codeplugs, radio images and channel lists stay on your device. They are never uploaded.
- Usage statistics go to Google Analytics only if you accept them on the cookie banner. Error reports go to Sentry, which sets no cookies. Both leave out file names, channel names, frequencies, search terms and coordinates.
- A position, as coordinates or a locator, leaves your device only when you search for repeaters near it.
- Searching RepeaterBook first runs a Cloudflare bot check in your browser.
- Report Bug sends the app's diagnostics to GitHub when you press it. An issue is published only if you then submit it on GitHub yourself.
Who we are
WebCHIRP is developed and published by HF2J, the developer named on the Google Play listing, who decides how the data described here is used.
- Privacy contact: privacy@webchirp.org
- Website: https://webchirp.org/
- Android app: WebCHIRP, package
com.hf2j.webchirp - Source code: github.com/jasiek/webchirp. WebCHIRP is open source, so every line that handles your data can be read there.
Usage statistics (Google Analytics)
On webchirp.org and codeplug.org the app uses Google Analytics 4, provided by Google, which processes the data for us as a service provider. Copies of WebCHIRP hosted anywhere else do not load it. It tells us which radios people use and where the app fails, so we know what to fix.
It runs only if you allow it. A banner asks on your first visit, and until you press
Accept nothing is sent to Google and no Google Analytics cookie is set. Actions you
take before answering wait in the page's memory: Accept sends them, Decline drops
them. Your answer is kept on your device (webchirp-analytics-consent in
local storage). To change it, use Cookie settings at the bottom of the app, the About
page or this page. Declining after you accepted switches Google Analytics off and
deletes its cookies. Accepting allows analytics storage only: the app tells Google
to keep ad storage, ad user data and ad personalisation off.
What is collected once you accept:
- Pages viewed, and events for actions in the app: choosing a radio, connecting a cable, reading from or writing to a radio, loading or exporting a file, editing channels and settings, querying a repeater directory, installing the app and using it offline.
- The address of each page viewed. In the Android app that address says the page was opened from the app, and whether this is the app's first launch.
- Details of those events: the radio's make, model and CHIRP driver; how it was connected; whether a step worked, how long it took and what kind of error stopped it; how many channels were involved; the file format (CSV or IMG) but never the file name; which repeater directory you queried, the country you filtered on, how many repeaters came back, and whether the query used a position (yes or no, never the position itself); and whether the app runs in a browser tab or as an installed app.
-
A random identifier kept in Google Analytics cookies (
_gaand_ga_*, which expire after two years) so that visits from the same browser can be counted together. - Your browser, operating system, screen size and language, which Google Analytics records with every visit.
- Your approximate location (country and city), which Google works out from your IP address. Google Analytics 4 does not log or store the IP address itself.
Every event parameter the app sends
display_mode, install_outcome, radio,
radio_module, radio_class, method,
duration_ms, stage, error_kind,
error_type, catalog_source, transport,
channel_count, channel_count_bucket,
codeplug_source, format, import_source,
import_mode, outcome, repeater_source,
result_count, country, located,
preset, first_column, issue_count,
field_count, tab, served_from,
launch_count, delivery, event_count,
dropped_count, launch_count_bucket.
If you accepted, events that happen while you are offline wait in your browser's storage and are sent the next time the app loads online. Declining deletes any that are waiting. Google keeps user-level and event-level data for 14 months and then deletes it. Google explains how it uses this data in How Google uses information from sites or apps that use our services.
Error reports (Sentry)
On webchirp.org and codeplug.org the app reports errors to Sentry, a service run by Functional Software, Inc. that processes the data for us as a service provider. The data is stored in Sentry's European Union region, in Germany. Copies of WebCHIRP hosted anywhere else do not load it.
- When something goes wrong, the report holds the error and where in the code it happened (including CHIRP's Python traceback), the page address, your browser and operating system, the selected radio's make, model and driver, and the last few app steps before the error, such as buttons pressed and requests made. Anything printed to the browser console is left out.
- The app also sends counts and timings of its operations, labelled only with the radio and driver, the outcome and kind of error, the browser family and platform, the connection type, the programming cable's chip family and USB vendor and product IDs (which name a model of adapter, never a serial number), the file format, a channel-count range and the repeater directory.
- Before anything is sent, the app removes web address query strings (where a repeater search carries its coordinates), file names, quoted values, Maidenhead locators, and numbers that look like frequencies or coordinates.
-
Sentry is set up with
sendDefaultPiioff: the app sends no cookies and does not ask Sentry to store your IP address. - Reports that cannot be sent while you are offline wait, already cleaned, in your browser's storage and are sent later.
Sentry deletes reports after at most 90 days. See Sentry's privacy policy.
Location
WebCHIRP never reads your location in the background and never stores it. A position is used only by the repeater query (the przemienniki.net, RepeaterBook, IRTS and RSGB buttons above the channel grid), to find repeaters near it. You give the query a position in one of these ways:
- Pressing the 🛰️ "Use current location" button. Your browser or the Android app asks your permission first, and the app then reads your device's precise position once.
- Typing coordinates or a Maidenhead locator, picking a place name, or dragging the map.
Where the position goes:
-
przemienniki.net, RepeaterBook and IRTS: the latitude and longitude
are sent with your search filters to
api.webchirp.org, a server run by the developer, which fetches the results from that directory for you. The directory does not see your IP address. -
Place names: the text you type, and any position already set as a
hint, are sent to
api.webchirp.org. -
RSGB: your browser asks the Radio Society of Great Britain's
repeater API (
api-beta.rsgb.online) for the 4-character locator squares around the position, each more than 100 km across. The exact coordinates are not sent, but the RSGB sees your IP address. See the RSGB privacy policy. -
Maps: the preview map, and the maps of repeaters in a result or the
channel grid, load map images from the OpenStreetMap Foundation
(
tile.openstreetmap.org). The images requested cover the area around the position, so the tile server learns roughly where you looked, along with your IP address. See the OpenStreetMap Foundation privacy policy. -
Channel maps: hovering a channel's location in the grid sends its
name, when the name is a repeater callsign, to
api.webchirp.orgto find where that repeater is.
api.webchirp.org keeps request logs, which include your IP address and
the query with its coordinates, for 30 days and then deletes them. The position you
set stays in the open page's memory so the form remembers it, and is forgotten when
the page is closed. Google Analytics records only whether a query had a position, never
the position, and error reports have coordinates and locators removed.
Bot check for RepeaterBook searches (Cloudflare Turnstile)
api.webchirp.org answers RepeaterBook searches only from a browser that
passes a bot check. When you open the RepeaterBook query, the app loads Cloudflare
Turnstile from challenges.cloudflare.com. Turnstile checks your browser
to tell a person from a bot, and occasionally asks you to tick a box. To do that,
Cloudflare, Inc. receives your IP address and information about your browser and
device. Each RepeaterBook search then carries a single-use token from Turnstile to
api.webchirp.org, which checks it with Cloudflare. A page that never
opens the RepeaterBook query never contacts Cloudflare, and the other directories
need no check. See Cloudflare's
Turnstile Privacy Addendum.
What stays on your device
- Codeplugs, radio images, channel lists and radio settings are handled entirely in your browser. Files you load are read on your device, and files you export are saved where you choose. None of it is uploaded.
-
A cookie,
webchirp_last_radio, remembers the make and model you last selected so it is chosen for you next time. It expires after one year. Like any cookie it travels with requests to webchirp.org, but nothing on the server reads it. -
Local storage holds your answer to the cookie banner
(
webchirp-analytics-consent), analytics events waiting to be sent after an offline session if you accepted (webchirp-analytics-replay), and a count of launches made offline (webchirp-offline-launches,webchirp-offline-reported-build). -
Session storage holds a flag saying the page was opened from the Android app
(
webchirp-android-app). It is removed when the tab or app is closed. - Browser storage also holds error reports waiting to be sent, and a copy of the app's own files so that it works offline.
You can remove all of it by clearing webchirp.org's site data in your browser. The Android app runs inside your browser (usually Chrome), so on Android clear the site data for webchirp.org in that browser's settings.
Bug reports
The Report Bug button opens a new issue form on GitHub in a new tab, filled in with the selected radio's make and model, the USB vendor and product IDs of the last cable connected, your browser's user agent, the CHIRP version, and the last 40 or so lines of the Debug Output panel, which can include channel data, frequencies and radio traffic. These details travel in the form's web address, so GitHub receives them as soon as you press the button, even if you then close the form without submitting it. Nothing is published until you submit the form, which needs a GitHub account. Submitted issues are public: remove anything you do not want to publish before submitting, or email us to have an issue removed. GitHub's privacy statement applies to everything the button sends it.
Hosting and downloads
- The website is hosted on GitHub Pages. GitHub receives your IP address with each page request, under its privacy statement.
-
To run CHIRP's radio drivers, the app downloads Pyodide (Python for the browser) and
other libraries, including the Sentry library, from the jsDelivr CDN
(
cdn.jsdelivr.net). jsDelivr sees your IP address and browser with those requests, under its privacy policy.
Device permissions
- Location: asked for only when you press 🛰️ in a repeater query.
- USB, serial port and Bluetooth: asked for only when you connect a programming cable or adapter, and used only to talk to your radio.
Refusing either permission leaves the rest of the app working.
How data is protected
Every connection the app makes, to its own website and API and to every service named here, uses HTTPS, so data is encrypted in transit. There are no accounts, so there are no passwords to leak. Error reports are cleaned on your device before they leave it, and the code that does it is public.
What we do not do
- No accounts and no sign-in.
- No advertising.
- No selling or renting of data. Data goes only to the services named on this page, for the purposes described here.
How long data is kept
- Google Analytics: 14 months.
- Sentry: at most 90 days.
api.webchirp.orgrequest logs: 30 days.- The RSGB, the OpenStreetMap Foundation, Cloudflare, jsDelivr and GitHub: under their own policies, linked above.
-
On your device: until you clear it. The
webchirp_last_radiocookie expires after one year, and the Google Analytics cookies, set only if you accepted, after two.
Children
WebCHIRP is a tool for radio operators and is not directed at children under 13. We do not knowingly collect data from children. If you believe a child has sent us data, email us and we will delete it.
Your choices and deleting your data
-
To ask what data we hold about you, or to have it deleted, email
privacy@webchirp.org. Nothing we collect
carries your name, so tell us roughly when you used the app and, for analytics data,
the value of your
_gacookie, so we can find it. - Google Analytics runs only if you accept it. Press Decline on the cookie banner, or Cookie settings at the bottom of the page and then Decline, to turn it off.
- A content blocker that blocks Sentry stops it without stopping the app.
- You can refuse the location permission and type a position instead, or none.
- You can clear WebCHIRP's site data at any time, as described above.
Changes to this policy
When this policy changes, the date at the top changes with it. Every past version is public in the page's history on GitHub.
Contact
HF2J, privacy@webchirp.org