Privacy policy
BL-202 is in closed alpha. This page says what the sign-up form and the alpha app collect, who holds it, how long it is kept and how to have it deleted.
Who holds it
Held by 98kb (github.com/98kb), the owner of the BL-202 alpha. Write to dsfx3d.98kb@gmail.com about anything on this page.
The sign-up form
The form collects your email, Android version, phone model, headphone type and 18-or-over answer. These are used only for the BL-202 alpha: to check your phone can run it and to email you about it.
Until you confirm your email, Supabase, our database provider, holds your answers for up to 24 hours and then deletes them. An unconfirmed signup cannot be completed after that.
Resend, our email provider, receives only your email address, to send you the confirmation link. It gets none of your answers. Emails are not tracked for opens or clicks.
After you confirm, Supabase keeps your answers, when you signed up, whether you are eligible and why, and your join code if you get one. The 18-or-over answer itself is kept only briefly; the eligibility result stays.
If you get an invite, the owner adds your email by hand to the Google Play test for BL-202, so Google Play can let that Google account install the app. Google receives only your email address, not your answers or join code. Your email stays on the test list until the alpha ends or you ask to be removed; Google's own handling of it follows Google's privacy policy.
To stop abuse, a scrambled form of your email and IP address is kept for 25 hours. It cannot be turned back into either.
A cookie lets this browser check, resend or correct your signup for up to 24 hours. Your signup result can stay in this browser until you clear its site data.
Vercel hosts this site and sees standard request information, such as your IP address.
Your sign-up answers are deleted when the alpha ends. You can ask to see or delete them sooner. Copies in the providers' backups and logs are removed on those providers' own schedules.
The alpha app
For the alpha testing program, and only temporarily, using the app requires sending testing telemetry: crash reports, audio performance data and a record of what happens in your visits. It is collected to find and fix what breaks and to see whether testers get a loop going and come back.
Your audio and your loops are never sent.
The app asks you to agree before it opens, and it stays closed until you do. No telemetry is sent before you agree. The telemetry is tied to your join code.
What is collected lists every event and every identifier.
Who processes it
- PostHog, hosted in the EU, receives the events. It gets your join code, never your email, and it is set to discard IP addresses.
- Firebase Crashlytics, a Google service, receives the crash reports, and Google processes them globally.
Only the owner reads either one.
The check-in with this site
The app also talks to this site, which the owner runs. When you enter your join code, the app sends the code, a random install identifier and your phone model, and the site stores them in Supabase. A join code works on up to three installs.
After that, each time the app opens online it checks in with the join code and install identifier, to learn whether the app is still open to you and whether telemetry is on. A check-in stores nothing new.
The check-in is not telemetry. It happens before you agree, and it goes on after you withdraw.
What the app never sends
- Your audio and your loops.
- Your email.
- Bluetooth device names or addresses.
- Your location.
- An advertising identifier or a hardware identifier.
- Anything you type, apart from the join code.
How long it is kept
The telemetry is kept until the owner removes it or the service’s own limit expires, whichever comes first: one year for events at PostHog, 90 days for crash reports at Firebase Crashlytics.
Check-in records in Supabase are kept until the owner removes them.
Withdrawing and deleting
You can withdraw from a setting in the app. Withdrawing stops collection from that install and closes the app until you agree again. It deletes nothing: what was already sent stays until it is removed under the rule above.
You can ask the owner to delete yours. Write to dsfx3d.98kb@gmail.com with your join code.
The owner can also turn telemetry off for an install. From its next check-in that install sends nothing more, and events still waiting on the phone are dropped.
Age
The alpha is for people who are 18 or over. The sign-up form and the app’s agreement both ask you to confirm it.
What is collected
The app can send only the events on this list. Every value is a number, a yes or no, or one word from a fixed list. Track is 1 or 2.
Events made offline wait on the phone and are sent when it next has a network connection, marked with the time they happened.
Identifiers
- Your join code is on every event and every crash report. It is the only identifier the app adds that links to a person.
- The app makes a random install identifier. It goes only to this site, with the check-in, and is stored in Supabase.
- Crashlytics makes its own random install identifier and sends it with crash reports.
- Events carry the install’s slot number, 1 to 3, and never an install identifier.
On every event
- The app version.
- The Android version.
- The phone model.
- The output route class:
wired,usb,bluetooth_headphones,bluetooth_speakerorphone_speaker, orpendingbefore the first route is known. - The install’s slot number.
- Your join code.
Crash reports
A crash report says where in the app the crash happened. It carries the app version, the phone model, your join code, the Crashlytics install identifier, and the state of the phone at that moment, such as its Android version and free memory.
Access and agreement
code_redeemed- No properties. Dated at the time you redeemed the code, and sent only after you agree.
agreement_acceptedagreement_versionagreement_withdrawn,access_blocked- No properties.
Visits
app_openedfirst_visit_of_processapp_backgroundedvisit_seconds
Permissions and audio output
mic_permission_resultgrantedbluetooth_permission_resultgranted,asker(row or fx_edit)output_route_changedfrom,to(output route classes)bleed_notice_shown- No properties.
Takes and loop control
take_startedtrack,kind(record or overdub)take_finishedtrack,kind,bars,length_ms,closed_by(tap, auto, too_short, too_long, disarmed or xrun)first_loop_completedtrack,seconds_since_agreement. Sent once per install.track_stopped,track_cleared,undo_usedtrackbar_multipliedtrack,barsall_started,all_stopped,session_cleared- No properties.
session_restoredtracks
Audio diagnostics
audio_visit_summary- One per visit:
visit_seconds,xruns,render_underruns,stream_errors,round_trip_estimate_ms,callback_p999_ms,callback_max_ms,sample_rate,frames_per_burst,low_latency,too_fast,too_slow,too_busy tempo_warning_showntrack,warning(too_fast, too_slow or too_busy)take_closed_by_xruntrackaudio_stream_errorerrors(the increase since the last count)engine_start_failedcause(native_unavailable, init_failed or stream_failed). At most once per visit.
Failed operations
session_save_failed,session_restore_failed- No properties.
event_cap_reachedcap. An install that passes a daily limit stops sending events for the rest of the day and says so once.