News9 days ago

Signal Is Building Accounts Without Phone Numbers and Only Google Play Can Sell You One

Signal's Android repo has 20 commits building phone number free registration. We read them, and the one that matters wires the whole thing to a Google Play one-time purchase.

The WJS Desk

Sep 14, 2026 · 7 min read

Photo by Antonio Borriello on Pexels

Signal's Android repository now carries 20 commits mentioning "numberless" accounts, the first landing on 19 August 2026 and the largest batch on 9 September. There are another 17 for something called "Signal Login". We read all of them, because the Hacker News thread pointing at this had 318 points and several hundred comments arguing about a feature that nobody in it had actually described.

Here is the short version of what the code says. Registering a Signal account without a phone number will require a one-time purchase, and in the implementation as it stands today, the only thing that can sell you that purchase is Google Play Billing.

What is actually in the commits

The feature has a product name in the source: Signal Login. It is a pair of credentials, an account ID and a recovery key, which you type back in to restore the account later. There is no phone number anywhere in the flow, so there is no SMS to fall back on. Signal knows this, which is why the screens include "Save to password manager" and "Save as PDF" buttons and a confirmation step that makes you type the credentials back before it will let you continue.

The single most informative commit is 7da3357b, "Add ability to pay for a signal login", dated 9 September: 44 files, 2,439 lines added, 159 removed. It introduces a whole one-time-purchase layer that Signal did not have before (OneTimeProduct, OneTimeProductId, OneTimePurchaseApi, OneTimePurchaseResult), because until now Signal's billing code only knew how to handle recurring donations and backup subscriptions.

The same commit flipped the feature flag. PHONENUMBERLESS_REGISTRATION went from IS_STAGING to isInternal(), which moves it from a staging-server-only toggle to something Signal staff can run against production. A separate commit adds a BETA pill to every screen in the feature, with the disclaimer "This is a Beta feature that will be updated on an ongoing basis." So it is close, but it is not in your hands yet.

The payment path, and what it is not

The user-facing copy is already written. The purchase screen says: "Register without a phone number using Signal Login. With a one-time purchase, you'll receive an account key to get started." The selling points listed underneath are "One-time purchase", "No phone number needed", "Username for messaging & calls", and a line about the purchase supporting Signal as a non-profit.

That last one matters, and we will come back to it.

What it is not is a subscription. The string is explicit, and so is the code: this is Play's one-time product API, not the recurring billing Signal uses for backups. What it also is not, currently, is buyable outside the Play Store. The commit refactors supportsGooglePlayBilling() up out of the backups namespace and into the general Environment object, and the check is exactly what it sounds like:

fun supportsGooglePlayBilling(): Boolean {
  return BuildConfig.APPLICATION_ID == GOOGLE_PLAY_BILLING_APPLICATION_ID
}

If your build's application ID is not the Play Store one, which covers the APK Signal distributes directly from its own site and every F-Droid-flavoured fork, the price lookup returns Unavailable and the screen tells you "Signal Login can't be purchased on this device right now."

Phone number registrationSignal Login, as implemented today
CostFree, you already have a numberOne-time purchase, price not published
Works on non-Play buildsYesNo, price returns Unavailable
What you hand out to contactsYour phone numberA username
If you lose accessSMS to your numberOnly the key you saved yourself
iOS commits foundn/a, shippedZero
StatusShippedInternal builds, tagged BETA

We searched signalapp/Signal-iOS and signalapp/Signal-Desktop for the same term and got zero commits in both. Whatever ships first, it ships on Android first.

Where the zero knowledge part actually sits

The thread headline says zero-knowledge proofs, and that is accurate, but it is worth being precise about which problem they solve. They are not what hides your identity from Signal. They are what stops the payment from identifying you.

The new protobuf in the registration flow spells it out:

message SignalLoginPurchase {
  string purchaseToken = 1;
  bytes receiptCredentialRequestContext = 2;
}

This is the same zkgroup receipt credential machinery Signal already uses for donation badges, which is why a commenter in the thread recognised it immediately. You pay Google, Signal's service verifies the Play purchase token and issues a blinded credential, and you later present that credential to create an account. The presentation cannot be linked back to the purchase. A separate commit, "Use new zkgroup credential for numberless accounts", extends the same approach to group authentication so a numberless account can be in groups without a PNI to key off.

So the cryptography does what it says. Signal does not learn which account your money bought. Google still learns that you bought something from Signal, and Signal still learns that a valid purchase happened. Those are different facts, and conflating them is how "zero knowledge" turns into marketing.

What the commits do not say

Two things we went looking for and could not find, which is itself the finding.

There is no price. The code never hardcodes one. SignalLoginPriceResult.Available carries a formattedPrice string that comes back from Play "already formatted in the currency and locale of the user's Play account", so the number lives in the Play Console and nowhere in the repo. The one figure floating around is $1.99, and that appears in a translator's comment explaining what the Pay %1$s placeholder gets substituted with. That is an example for translators. Treat anyone quoting it as a price as having misread a code comment.

Worth flagging: the most repeated explanation in the Hacker News thread was that the charge exists to fight spam. We grepped the entire payment commit for "spam" and "abuse" and found nothing. The only rationale Signal has written down anywhere in the feature is the purchase screen's line about supporting a non-profit. Spam mitigation is a plausible guess. It is not what the code says.

What the thread caught

The sharpest comment was also the shortest. "you can't wave your hands, say 'zero knowledge', and be private," wrote ynniv, "this is too little information to be useful." Given that the linked source was page 10 of a community forum thread rather than an announcement, that is fair.

teravor made the more technical version of the same point: a coupon-redemption scheme like this can be done with a plain blind signature, and the thing to watch is whether Signal leans on secure enclaves anywhere in the path, which would mean trusting hardware on top of the maths.

wolvoleo put the practical objection bluntly: "Ugh wtf so I need a Google account on Android?" And Cider9986 supplied the number that makes the whole thing awkward, pointing out you can buy a phone number for Signal for roughly ten cents, so the price has to clear a bar that is already very low.

You cannot keep all 3 of "no gatekeeping", "anyone can message anyone", and "low spam".

That was karel-3d, and it is the cleanest framing of the tradeoff in the thread. Signal has spent a decade using your phone number as the thing that makes accounts expensive to mass-produce. Remove it and something has to take its place. A few dollars through Play is a reasonable candidate. It is just not a free one, and it is not a Google-free one.

Why this is bigger than one feature

Signal is a non-profit whose entire pitch is that it needs as little from you as possible. This is the first time it has built a flow where the way to give it less is to pay it money through the largest advertising company in the world. The zkgroup design means Signal has genuinely minimised what it learns. It has not minimised what Google learns, and it cannot, because Play Billing is the only payment rail an Android app can use for in-app purchases without picking a fight.

The interesting question is whether an alternative rail appears before general availability. Signal already accepts donations by card and has its own payments feature. Neither currently touches this flow. If the shipping version still says Play only, the group with the strongest reason to want a numberless account, people who deliberately run degoogled Android, will be the only group that cannot get one.

Your turn

If you already run Signal on a degoogled phone or the F-Droid-style build: what would you actually pay, and through what, to get an account with no number attached? A concrete figure and a payment method you would trust is more useful than another round of "Google bad", and it is the exact input Signal does not have yet.

This is the second time this month we have written about the Play Store quietly becoming the gate rather than a storefront. The other one is Google's developer verification deadline and what it does to F-Droid, which is the same squeeze from the other direction: there, sideloading gets harder, and here, the sideloaded build is the one that cannot pay.

Share

Signal is building accounts with no phone number. We read all 20 commits: it costs money, the payment is unlinkable, and only a Google Play build can complete the purchase. #Signal #Privacy #Android #OpenSource

Never miss a ship

The best stuff that shipped this week, delivered every Thursday. Free, no spam. We read all the boring stuff so you get the fun parts.

Keep reading