{"name":"batch-notify","generatedAt":"2026-10-04T08:25:35.522Z","languages":{"Kotlin":27477,"Java":10274},"commitTotal":3,"commits":[{"sha":"ec6c105749fd99406df4a1be34002c9d475f4a84","message":"Enhance README with installation and usage details\n\nExpanded README with detailed installation, usage, and troubleshooting instructions for Batch Notify.","date":"2026-09-29T07:11:40Z","author":"Srajan Mishra","login":"srajan-mishra28","avatar":"https://avatars.githubusercontent.com/u/103876072?v=4","verified":true,"url":"https://github.com/Aayush-Mishraa/batch-notify/commit/ec6c105749fd99406df4a1be34002c9d475f4a84"},{"sha":"ac95a3a42c12c3890957f5fe4829b243c0e423ee","message":"Make gradlew executable","date":"2026-09-28T20:57:57Z","author":"Srajan","login":"srajan-mishra28","avatar":"https://avatars.githubusercontent.com/u/103876072?v=4","verified":false,"url":"https://github.com/Aayush-Mishraa/batch-notify/commit/ac95a3a42c12c3890957f5fe4829b243c0e423ee"},{"sha":"f1bfbcf955180e3bc25416ea3e37cee19ae5a06e","message":"First version","date":"2026-09-28T20:48:39Z","author":"Srajan","login":"srajan-mishra28","avatar":"https://avatars.githubusercontent.com/u/103876072?v=4","verified":false,"url":"https://github.com/Aayush-Mishraa/batch-notify/commit/f1bfbcf955180e3bc25416ea3e37cee19ae5a06e"}],"readmeHtml":"<div id=\"readme\" class=\"md\" data-path=\"README.md\"><article class=\"markdown-body entry-content container-lg\" itemprop=\"text\"><div class=\"markdown-heading\" dir=\"auto\"><h1 class=\"heading-element\" dir=\"auto\">Batch Notify</h1><a id=\"user-content-batch-notify\" class=\"anchor\" aria-label=\"Permalink: Batch Notify\" href=\"#batch-notify\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\"><strong>Get your notifications in batches, not every minute.</strong></p>\n<p dir=\"auto\">Batch Notify quietly holds notifications from your apps and delivers them together every <strong>3, 4, 6 or 12 hours</strong>. Apps that really matter (like calls or family chats) still reach you right away.</p>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">Why use it</h2><a id=\"user-content-why-use-it\" class=\"anchor\" aria-label=\"Permalink: Why use it\" href=\"#why-use-it\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ul dir=\"auto\">\n<li><strong>Fewer interruptions.</strong> One batch every few hours instead of dozens of pings.</li>\n<li><strong>Deeper focus.</strong> No buzz pulling you out of work, study or rest.</li>\n<li><strong>Less phone checking.</strong> Nothing new to see, so less reason to pick up the phone.</li>\n<li><strong>Nothing important missed.</strong> Calls, alarms and your chosen apps always come through.</li>\n<li><strong>Nothing lost.</strong> Held notifications survive app restarts and phone reboots.</li>\n<li><strong>Private by design.</strong> The app has no internet permission. Your notifications never leave your phone.</li>\n<li><strong>Light.</strong> Works quietly in the background with minimal battery use.</li>\n</ul>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">How it works</h2><a id=\"user-content-how-it-works\" class=\"anchor\" aria-label=\"Permalink: How it works\" href=\"#how-it-works\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<markdown-accessiblity-table><table>\n<thead>\n<tr>\n<th>Situation</th>\n<th>What happens</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Message from a normal app</td>\n<td>Hidden instantly. No sound, no banner. Saved for later.</td>\n</tr>\n<tr>\n<td>Message from an important app</td>\n<td>Shows normally, right away.</td>\n</tr>\n<tr>\n<td>Calls and alarms</td>\n<td>Always show normally.</td>\n</tr>\n<tr>\n<td>Music, maps, downloads</td>\n<td>Always show normally.</td>\n</tr>\n<tr>\n<td>Batch time arrives</td>\n<td>One summary per app, e.g. <strong>\"Instagram (5)\"</strong>. Tap to open the app.</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">Install the app</h2><a id=\"user-content-install-the-app\" class=\"anchor\" aria-label=\"Permalink: Install the app\" href=\"#install-the-app\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">Requires <strong>Android 8.0 or newer</strong>. iOS is not supported (Apple doesn't allow apps to manage notifications).</p>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">1. Download the APK</h3><a id=\"user-content-1-download-the-apk\" class=\"anchor\" aria-label=\"Permalink: 1. Download the APK\" href=\"#1-download-the-apk\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ol dir=\"auto\">\n<li>Open this repo's <strong>Actions</strong> tab.</li>\n<li>Click the latest <strong>Build APK</strong> run with a green tick.</li>\n<li>Scroll down to <strong>Artifacts</strong> and download <strong>BatchNotify-apk</strong>.</li>\n<li>Unzip it. You'll get <strong>app-debug.apk</strong>.</li>\n<li>Send it to your phone (Google Drive, email, or USB).</li>\n</ol>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">2. Uninstall any old version</h3><a id=\"user-content-2-uninstall-any-old-version\" class=\"anchor\" aria-label=\"Permalink: 2. Uninstall any old version\" href=\"#2-uninstall-any-old-version\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">If Batch Notify is already installed, <strong>uninstall it first</strong>. Each build is signed differently, so Android won't install a new one over an old one.</p>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">3. Pause Play Protect (temporarily)</h3><a id=\"user-content-3-pause-play-protect-temporarily\" class=\"anchor\" aria-label=\"Permalink: 3. Pause Play Protect (temporarily)\" href=\"#3-pause-play-protect-temporarily\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">Play Protect doesn't know this app, so it may block it with <strong>\"App not installed\"</strong> or <strong>INSTALL_FAILED_VERIFICATION_FAILURE</strong>.</p>\n<ol dir=\"auto\">\n<li>Open the <strong>Play Store</strong>.</li>\n<li>Tap your <strong>profile picture</strong>, then <strong>Play Protect</strong>.</li>\n<li>Tap the <strong>gear icon</strong> (top right).</li>\n<li>Turn off <strong>Scan apps with Play Protect</strong>.</li>\n</ol>\n<blockquote>\n<p dir=\"auto\">Remember to turn it back <strong>on</strong> after installing (step 5).</p>\n</blockquote>\n<p dir=\"auto\"><strong>Also check, if install still fails:</strong></p>\n<ul dir=\"auto\">\n<li><strong>Settings, then Security:</strong> turn off <strong>Advanced Protection</strong> if it's on.</li>\n<li><strong>Xiaomi / Redmi / POCO:</strong> turn off the <strong>security scan before install</strong> option.</li>\n</ul>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">4. Install</h3><a id=\"user-content-4-install\" class=\"anchor\" aria-label=\"Permalink: 4. Install\" href=\"#4-install\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ol dir=\"auto\">\n<li>Tap <strong>app-debug.apk</strong> on your phone.</li>\n<li>If asked, allow <strong>Install unknown apps</strong> for that app (Files, Drive or Chrome).</li>\n<li>Tap <strong>Install</strong>. If warned, choose <strong>Install anyway</strong>.</li>\n</ol>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">5. Turn Play Protect back on</h3><a id=\"user-content-5-turn-play-protect-back-on\" class=\"anchor\" aria-label=\"Permalink: 5. Turn Play Protect back on\" href=\"#5-turn-play-protect-back-on\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">Go back to Play Protect settings and turn <strong>Scan apps with Play Protect</strong> on again.</p>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">First-time setup</h2><a id=\"user-content-first-time-setup\" class=\"anchor\" aria-label=\"Permalink: First-time setup\" href=\"#first-time-setup\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ol dir=\"auto\">\n<li><strong>Open Batch Notify</strong> and allow notifications when asked.</li>\n<li>Tap <strong>Open settings</strong> on the green card. Turn on access for <strong>Batch Notify</strong> and confirm.</li>\n<li>Go back. The green card disappears.</li>\n<li><strong>Pick your interval:</strong> 3h, 4h, 6h or 12h.</li>\n<li>Tap <strong>Important apps</strong> and switch on the ones that should always reach you (e.g. Phone, WhatsApp, your bank).</li>\n<li><strong>Set battery to Unrestricted:</strong> long-press the app icon, then App info, then Battery, then Unrestricted.\n<ul dir=\"auto\">\n<li>On Xiaomi, Oppo, Vivo, Realme: also turn on <strong>Autostart</strong>.</li>\n</ul>\n</li>\n</ol>\n<p dir=\"auto\">That's it. Put your phone down.</p>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">Using the app</h2><a id=\"user-content-using-the-app\" class=\"anchor\" aria-label=\"Permalink: Using the app\" href=\"#using-the-app\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">Home screen</h3><a id=\"user-content-home-screen\" class=\"anchor\" aria-label=\"Permalink: Home screen\" href=\"#home-screen\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ul dir=\"auto\">\n<li><strong>The ring</strong> fills up as the next batch gets closer.</li>\n<li><strong>The big number</strong> shows how many notifications are waiting.</li>\n<li><strong>Release now</strong> delivers everything immediately (your schedule stays the same).</li>\n<li><strong>See waiting</strong> lets you peek at held notifications without releasing them.</li>\n<li><strong>Deliver every</strong> changes the interval. The timer restarts.</li>\n<li><strong>Batching switch</strong> pauses the app. Held notifications are released, and new ones show normally.</li>\n</ul>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">Important apps</h3><a id=\"user-content-important-apps\" class=\"anchor\" aria-label=\"Permalink: Important apps\" href=\"#important-apps\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">Search for an app and flip its switch. Switched-on apps skip batching.</p>\n<div class=\"markdown-heading\" dir=\"auto\"><h3 class=\"heading-element\" dir=\"auto\">Waiting</h3><a id=\"user-content-waiting\" class=\"anchor\" aria-label=\"Permalink: Waiting\" href=\"#waiting\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\">Shows held notifications grouped by app, with times. Tap <strong>Release all now</strong> to get them.</p>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">Tips</h2><a id=\"user-content-tips\" class=\"anchor\" aria-label=\"Permalink: Tips\" href=\"#tips\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<ul dir=\"auto\">\n<li><strong>Start with 3 hours.</strong> Move to 6 or 12 once you're comfortable.</li>\n<li><strong>Keep the important list short.</strong> Every app you add is one more interruption.</li>\n<li><strong>Use \"Release now\"</strong> when you take a break, instead of checking each app.</li>\n</ul>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">Troubleshooting</h2><a id=\"user-content-troubleshooting\" class=\"anchor\" aria-label=\"Permalink: Troubleshooting\" href=\"#troubleshooting\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<markdown-accessiblity-table><table>\n<thead>\n<tr>\n<th>Problem</th>\n<th>Fix</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>\"App not installed\"</td>\n<td>Uninstall the old version, pause Play Protect, try again.</td>\n</tr>\n<tr>\n<td>Notifications aren't being held</td>\n<td>Notification access got turned off. Tap <strong>Open settings</strong> and turn it on.</td>\n</tr>\n<tr>\n<td>Batches come late or never</td>\n<td>Set battery to <strong>Unrestricted</strong>. On Xiaomi/Oppo/Vivo also enable <strong>Autostart</strong>.</td>\n</tr>\n<tr>\n<td>No summary after release</td>\n<td>Allow notifications for Batch Notify in App info.</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<p dir=\"auto\"><strong>Known limits:</strong> batches may arrive a few minutes late (Android saves battery). Summaries show text only, so buttons like \"Reply\" are not kept.</p>\n<hr>\n<div class=\"markdown-heading\" dir=\"auto\"><h2 class=\"heading-element\" dir=\"auto\">For developers</h2><a id=\"user-content-for-developers\" class=\"anchor\" aria-label=\"Permalink: For developers\" href=\"#for-developers\"><svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path></svg></a></div>\n<p dir=\"auto\"><strong>Stack:</strong> Java (core logic) + Kotlin / Jetpack Compose (UI) + WorkManager. Min SDK 26.</p>\n<markdown-accessiblity-table><table>\n<thead>\n<tr>\n<th>File</th>\n<th>Job</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>BatchListenerService.java</code></td>\n<td>Receives every notification. Lets it through, or hides and saves it.</td>\n</tr>\n<tr>\n<td><code>HeldStore.java</code></td>\n<td>Saves held notifications to a local file.</td>\n</tr>\n<tr>\n<td><code>Scheduler.java</code> + <code>DeliveryWorker.java</code></td>\n<td>Runs every N hours and releases the batch.</td>\n</tr>\n<tr>\n<td><code>Notifier.java</code></td>\n<td>Builds one summary notification per app.</td>\n</tr>\n<tr>\n<td><code>Prefs.java</code></td>\n<td>Settings: interval, on/off, important apps.</td>\n</tr>\n<tr>\n<td><code>ui/*.kt</code></td>\n<td>Home, Important apps and Waiting screens.</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<p dir=\"auto\"><strong>Build locally:</strong> open the folder in Android Studio, wait for Gradle sync, press <strong>Run</strong>.</p>\n<p dir=\"auto\"><strong>Build on GitHub:</strong> every push runs <code>.github/workflows/build.yml</code> and uploads the APK under <strong>Actions, then Artifacts</strong>.</p>\n<p dir=\"auto\"><strong>Quick test from a laptop</strong> (phone connected, USB debugging on):</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"adb shell cmd notification post -t &quot;Test title&quot; test1 &quot;Hello from test&quot;\"><pre class=\"notranslate\"><code>adb shell cmd notification post -t \"Test title\" test1 \"Hello from test\"\n</code></pre></div>\n<p dir=\"auto\">The notification should vanish and the waiting count should go up.</p>\n</article></div>","tree":{"fileCount":28,"dirCount":15,"truncated":false,"extensions":[{"ext":"kt","count":7},{"ext":"java","count":6},{"ext":"xml","count":4},{"ext":"kts","count":3},{"ext":"properties","count":2},{"ext":"yml","count":1},{"ext":"gitignore","count":1},{"ext":"md","count":1},{"ext":"jar","count":1},{"ext":"other","count":1},{"ext":"bat","count":1}],"topLevel":[{"name":".github","type":"dir"},{"name":"app","type":"dir"},{"name":"gradle","type":"dir"},{"name":".gitignore","type":"file"},{"name":"build.gradle.kts","type":"file"},{"name":"gradle.properties","type":"file"},{"name":"gradlew","type":"file"},{"name":"gradlew.bat","type":"file"},{"name":"README.md","type":"file"},{"name":"settings.gradle.kts","type":"file"}]}}