An Android call blocker that silences unknown numbers and always lets your contacts through. Live on Google Play.
Every blocker I tried works from a database of known bad numbers, and the calls that reach me are the ones not in it yet. That is not a flaw in the approach, it is the approach: a number has to burn somebody before it can be scored. So my phone and my watch buzzed forty times a day, because a call that is merely filtered has still already arrived.
I wanted a different default. Silence from anyone I do not know, without waiting for a database to catch up, and without sending my calls anywhere to find out.
That is a narrow problem for a particular kind of person. Narrow was the point.
I had never written an Android app, and the first one I picked sits on the call path, where a bug does not mean a bad layout, it means a phone that does not ring. That failure is silent: block the wrong call and the user gets no error, just a missed call they never knew about. With no analytics I had no way to find out either, so correctness had to come from getting it right rather than from noticing later.
Android can already silence unknown callers, but the call still arrives as a banner and a missed call. Bouncer stops it completely, and lets a number through once it has rung enough times inside a window you set, so a real emergency still reaches you.
Android hands far more power to an app willing to become your default dialer. Better screening, richer call handling, a much larger product to build on. It also demands a considerably wider set of permissions, and it makes the app responsible for something nobody can afford to have broken.
I looked at what the people using it actually needed, and the answer was silence from strangers. The narrow version already delivered that. Taking the bigger capability would have meant asking for a lot more trust to solve a problem that was already solved. I passed, and it is the decision I am most confident about.
The first objection to an app like this is the one that matters: what happens when the hospital rings from a number you do not have. The industry answer is a cloud reputation database, which is precisely the thing I refused to build.
So the rule is mechanical instead: ring enough times inside a short enough window and you get through, with both numbers yours to set. It is less clever than a reputation score and it has to be, because it only knows what has happened on this one phone. It works because a real emergency dials again and an automated dialer moves on to the next number.
I would genuinely like to know which features get used. But the whole promise is that nothing leaves your phone, and an app that says that while quietly sending usage events is lying about the one thing it asks you to believe. So I shipped blind, and I feel the cost in every decision about what to build next. It was still the only option consistent with the promise.
Live on Google Play. I have not marketed it, and a narrow app does not get found by accident, so I have not decided yet whether that is a problem to solve or simply the shape of the thing.
I treated the store as the last step. A new personal developer account has to run a closed test with twelve testers for fourteen continuous days before it can even apply for production access, and I found that out at the point where I thought I was finished. The app was ready and the calendar was not.
None of that time needed to be spent in sequence. The account and the closed test should start on the first build that installs on a phone, so the fourteen days run while the app is still being built rather than after it.
I also trusted the emulator further than it deserved. On it, every notification appeared the moment it was posted. On a real phone they arrived in batches, and for an app whose whole promise is that you are not interrupted, a clump of blocked-call notices turning up together is an interruption of its own. That difference only showed up on hardware. It was fixed before release, later than it needed to be.
Try it on your own phone, or ask me about keeping a product deliberately narrow.