Private DNS Quick Toggle turns Android's private DNS setting into a tile
Quick settings tile to switch active private DNS server
At a glance
- What is it?
- Private DNS Quick Toggle is a small Kotlin app that adds a quick settings tile for switching between private DNS providers, including adblocking resolvers, and it needs WRITE_SECURE_SETTINGS to change the system setting. It fits an Android user who toggles a DNS resolver often, and it does not fit anyone unwilling to grant a system-level permission to a small utility.
- Who is it for?
- Private DNS Quick Toggle fits an Android user who switches between a plain and an adblocking private DNS resolver several times a day and wants one tap instead of a settings screen, and it does not fit a device where granting WRITE_SECURE_SETTINGS to a third-party app is off the table.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 28 days ago.
- What is it written in?
- Mainly Kotlin, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The whole app is a tile, and that is a deliberate constraint
Private DNS Quick Toggle is described as a quick settings tile to switch the active private DNS server, supporting any number of providers. The stated purpose is narrow and practical: it makes it easy to turn adblocking DNS servers on or off with just a single tap.
That framing matters because it tells you what the app is not trying to be. It is not a DNS client, not a VPN, not a filtering service, and not a firewall. It does not resolve anything itself. It changes which resolver the operating system is configured to use, and everything else follows from the operating system's own private DNS support.
The README title, Private DNS Quick Toggle, and the package name ru.karasevm.privatednstoggle both frame it as a switch rather than a service. The screenshot at the top of the README shows the tile in the quick settings shade.
The word any in supports any number of providers is the one substantive claim about scope, and it points at the design. The app is not a hardcoded toggle between two resolvers. You configure a list, and the tile cycles or selects within it. That is the difference between a widget that works for one person's setup and a widget that works for a household or a small team with a router-level resolver and a backup.
The project is MIT licensed, the last push was on 2026-09-25, and the release history shows v1.11.0 on 2025-08-05, v1.10.0 on 2025-02-25 and v1.9.0 on 2024-11-05.
WRITE_SECURE_SETTINGS is the whole permission story
To change the system DNS options the app requires android.permission.WRITE_SECURE_SETTINGS. That single sentence explains most of what follows, and it is the reason the README has a longer installation section than the app itself would suggest.
WRITE_SECURE_SETTINGS is a signature-level permission, so it cannot be granted to a normal app by an ordinary install. There is no prompt, no toggle, and no Play Store consent screen for it. The user has to obtain it by other means, which is why the README documents two routes.
The automatic route uses Shizuku. You install and start Shizuku, then start the app and allow Shizuku access when prompted. Shizuku is an app that runs with elevated privileges via ADB and lets other apps request a shell-level identity for specific operations, so the app can make the change without you having a PC in front of you.
The manual route uses ADB directly. You download platform tools from Google, extract them, open a terminal in that directory, turn on USB debugging on the phone, connect the phone to the PC, and run one command:
./adb shell pm grant ru.karasevm.privatednstoggle android.permission.WRITE_SECURE_SETTINGSThe README notes that for Xiaomi you also have to enable USB Debugging (Security settings), and links a video guide that should work on most other phones. After the grant, the app is installed and working.
The security implication is real and the project does not pretend otherwise. The app is being given permission to modify protected system settings, and it is being given it by the user through a shell command that names the package explicitly. A user who runs that command is trusting a specific APK, and the practical advice that follows from that is to get the APK from a source that verifies what it ships, which is what the next section is about.
IzzyOnDroid is the recommended install because it handles updates
The recommended installation route is IzzyOnDroid, and the reason given in the README heading is that it will enable auto-updates on Android 12 and later.
The steps are: install an F-droid client such as Droidify or the official F-Droid client, verify that the IzzyOnDroid repo is added and enabled, then search for the full app name Private DNS Quick Toggle and install it. The README includes the repository fingerprint in the link, so a user can verify which repository they are adding rather than trusting a URL blindly.
The alternative is GitHub Releases, where the latest APK is on the releases page.
The difference between the two is exactly the auto-update story, and that matters more for this app than for a typical utility. A permission-granting app is one where an old build is a liability, because the older the version, the further it is from whatever the current Android release expects of it. Getting updates automatically from the repository whose fingerprint you verified is a materially better posture than downloading an APK by hand each time.
There is also an IzzyOnDroid badge in the README header for the package ru.karasevm.privatednstoggle, so the distribution is a first-class part of the project rather than an afterthought, and the app is also listed in the F-Droid ecosystem, which is the other signal that the project is aimed at people who care about how software is distributed.
Translations are the cheapest contribution, and Weblate hosts them
The contributing section starts by naming the easiest contribution, and it is not code. Submitting a translation to your language is the path that requires no programming knowledge, and the README points at Weblate, which provides gratis hosting for open-source projects.
The translation status widget is embedded in the README, and a link to the Weblate project page sits in the header badges, so the coverage is visible without visiting another site.
For a DNS toggle, translation is not a cosmetic concern. The app's entire user interface is a list of resolvers and a switch, and a resolver's name is often a hostname, but the labels around it, the confirmation text and the error messages are not. A user who cannot read the string that tells them the change failed has no way to recover.
The code contribution guidelines are short and specific. Javadoc comments for all public methods you add, code kept neatly formatted using the built-in Android Studio formatter, and a description of what your code does and how it does it when sending a pull request. The last guideline is the one that sets the bar for the project: before sending a PR, test the change on the oldest and latest supported Android versions, which the README names as 9 and 14 at the time of writing.
That testing requirement is a small window onto the project. Android 9 is the floor, Android 14 the ceiling of what is supported, and the app deals with a system setting whose interface has changed across those versions. A contributor who tests only on their own device would be testing a fraction of what the project claims to support.
What the repository layout says about how the app is built
The repository is a standard Android Studio project, and the layout is the usual one. The app module is in app/, with build.gradle.kts and settings.gradle.kts at the root, gradle.properties, the gradle wrapper as gradlew and gradlew.bat, and a gradle/ directory holding the wrapper configuration.
Two directories stand out for what they say about the project. The fastlane/ directory means release automation is set up in the repository rather than done by hand, which fits a project that publishes to several channels and needs to version the APK consistently. The .idea/ directory is committed, which tells you the maintainer works in Android Studio and has chosen to share the IDE configuration, and the .gitattributes file is there to manage line ending behaviour across platforms.
The build is Kotlin-based, with the primary language listed as Kotlin, and the Gradle Kotlin DSL scripts mean the build logic is typed Kotlin rather than Groovy.
What the layout does not show is the interesting part, because the app's behaviour lives in the Android framework calls rather than in any local data. There is no database directory, no assets folder for resolver lists and no config file in the repository. The list of providers the tile cycles through is a user setting, which is why the app can support any number of them. A configuration file in the repository would have capped the number of providers at whatever the author shipped.
The readme.jpg at the root is the screenshot the README embeds, which is a small sign of a repository that is kept deliberately minimal: nothing in the tree that is not needed to build, ship or illustrate the app.
Where Private DNS Quick Toggle is the wrong tool
The first wrong-tool case is a device you do not control the way this app needs. The WRITE_SECURE_SETTINGS grant is the whole app, so a managed corporate device, a device whose bootloader is locked in a way that prevents Shizuku from working, or a device where you are simply not willing to run a shell grant command against a third-party package are all cases where this app is not usable at all. The alternative there is the system Settings screen, which is slower but requires nothing.
The second is a network you do not own. If the goal is adblocking, this app changes which resolver the phone asks. It does not filter anything itself, it does not run a local VPN, and it has no per-app rules. Anyone expecting the behaviour of a network-wide ad blocker should know that the filtering happens at the resolver you point at, and that a resolver which does not filter will not filter.
The third is a need for split routing or per-domain behaviour. The app's model is one system-wide private DNS setting, so there is no way to send some apps to a filtering resolver and others to a normal one. If that is the requirement, a local VPN client with per-app rules is the tool for it, and this tile will not get you there.
The fourth is the operational detail worth knowing: the app depends on the operating system's private DNS feature and on a resolver that speaks DNS over TLS or DNS over HTTPS. A provider that only offers plain DNS will not work, which is why the repository topics list dns-over-https and dns-over-tls. The tile can only point the system at a provider the system is able to speak to.
The maintenance picture is calm rather than busy. The last push was on 2026-09-25, and the last tagged release is v1.11.0 from 2025-08-05. For an app of this size, that is a reasonable rhythm, and the IzzyOnDroid route handles the update side without the user thinking about it.
Editorial conclusion
Private DNS Quick Toggle fits an Android user who switches between a plain and an adblocking private DNS resolver several times a day and wants one tap instead of a settings screen, and it does not fit a device where granting WRITE_SECURE_SETTINGS to a third-party app is off the table. Before installing, decide how the permission will be granted, because the Shizuku path and the ADB path differ in effort and in what they require from you, and note that the last tagged release is v1.11.0 from 2025-08-05 while the last push was on 2026-09-25.
Frequently asked questions
What does Private DNS Quick Toggle do?
It adds a quick settings tile for switching the active private DNS provider, supporting any number of providers, with the stated aim of making it easy to turn adblocking DNS servers on or off with a single tap. It changes the system setting rather than resolving DNS itself.
Why does Private DNS Quick Toggle need WRITE_SECURE_SETTINGS?
Changing the system DNS options requires android.permission.WRITE_SECURE_SETTINGS, which is a signature-level permission that cannot be granted through an ordinary app install. The README documents two ways to provide it, Shizuku or an ADB grant command.
How do I install Private DNS Quick Toggle?
The recommended route is IzzyOnDroid, using an F-Droid client such as Droidify or the official F-Droid client, adding and enabling the IzzyOnDroid repository, then searching for Private DNS Quick Toggle. It enables auto-updates on Android 12 and later. The alternative is downloading the latest APK from the GitHub releases page.
How do I grant WRITE_SECURE_SETTINGS manually?
Enable USB debugging on the phone, connect it to a PC with the Android platform tools, and run ./adb shell pm grant ru.karasevm.privatednstoggle android.permission.WRITE_SECURE_SETTINGS. On Xiaomi devices you also need to enable USB Debugging (Security settings).
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/karasevm-privatednsandroid)Was this useful?