GameBoost is a native Android application that, while the user plays a chosen mobile game (eFootball, FC Mobile, or any installed game the user selects), cuts the internet off completely for every other application on the device while keeping the selected game connected directly — with no intermediary server — for the lowest possible ping. The product is delivered as a complete, buildable Android project that produces an installable APK running on a real phone.
The audience is competitive mobile gamers on Android who want one thing during a match: everyone else's internet dead, their match alive. The app is Arabic-first (RTL) with English parity, dark-first, and neon-signalled.
This document is the System Requirements Document for the project named gameboost-vpnservice. It specifies the product's features and workflows in full, together with the technical, design, performance, and delivery constraints the requester stated.
Delivery intent. The requester asked for a complete Android project delivered as a full project tree followed by every file at its full path with its complete code and no abbreviation or ..., including AndroidManifest and build.gradle.kts; the APK build commands (./gradlew assembleDebug → app/build/outputs/apk/debug/app-debug.apk); the release signing procedure with a keystore producing a signed APK; adb installation steps and real-phone blocking test steps; and a checklist confirming the project builds without errors. Implementation proceeds in stages — the base version first (VPN + blocking + game selection), then the remaining features — with each stage confirmed complete before the next begins.
GameBoost is a single native Android application (Kotlin, Jetpack Compose, Material 3) built on MVVM + Clean Architecture with data / domain / ui layers, Hilt injection, Coroutines and Flow, DataStore for settings, and Room for the session log. Its core engine is a local VpnService with no external server: it calls addDisallowedApplication for the selected game, the app itself, and the excepted applications, so every other application's packets are routed into the TUN interface and discarded (blackhole) — their internet is fully cut — while the game connects directly with no intermediary. Routes 0.0.0.0/0 and ::/0 are added so no connection leaks over IPv6. The service runs as a Foreground Service with a persistent notification carrying a "Stop" button and the live ping, restarts automatically on failure, and handles VPN-permission revocation and network switching (Wi-Fi ↔ mobile data) through ConnectivityManager.NetworkCallback.
Around that engine the app provides: a home screen for choosing the installed game (with icons) and a large animated circular "Start Playing" button that enables blocking and then opens the game; game open/close detection via UsageStatsManager with automatic blocking stop after the game closes; an exceptions list (WhatsApp for calls, messaging, …); per-second Ping, Jitter, and Packet Loss measurement against a user-chosen server with a live Canvas chart and no heavy libraries; a WifiLock in WIFI_MODE_FULL_LOW_LATENCY during the session; an optional Do Not Disturb request (NotificationManager.Policy); a Quick Settings Tile for fast start; a session log with average ping and settings including auto-start with the game; and an alert when the connection switches from Wi-Fi to mobile data.
Actors. The only active human actor is the Player (لاعب). The Android platform (VPN consent dialog, Usage Access settings screen, notification permission prompt, Do Not Disturb access screen, Quick Settings panel) is a non-persona system actor that owns the permission-granting surfaces; the selected game application is an external destination the app launches; the measurement server is an external network endpoint the Player chooses.
Delivery and infrastructure. The product itself is the Android application. The provisioned scaffold inventory — a shared FastAPI backend process, a MariaDB database, and a React frontend — is infrastructure inventory only; it does not add product requirements, does not change any access decision, and does not justify domain entities, authentication, or an ER diagram. GameBoost's blocking engine is explicitly local with no external server, and the app is explicitly native Android only. The Android app is therefore the sole product surface; the scaffold services are recorded in the Tech Stack as provisioned-but-unused-by-product-behavior infrastructure.
Removed from scope
GameBoost is delivered as a native Android APK. Everything the Player does happens on the phone: choosing the game, granting permissions, starting and stopping the block, watching live telemetry, and reviewing the session log. The blocking engine is a local VpnService; the selected game's traffic never passes through any GameBoost-operated server, and no account, sign-in, or cloud identity is part of the product. The app's own identity is the Android application itself; the durable state it owns (selected game, exceptions list, measurement server, auto-start preference, Do Not Disturb preference, onboarding completion, session history) lives on the device in DataStore and Room.
Access to the app's working screens is gated by the platform permissions the Player grants through Android's own surfaces — VPN consent, Usage Access, notification permission, and package visibility — plus the three-screen onboarding that explains each permission before it is requested. These are journey prerequisites owned by the Android platform, not GameBoost account features. The public entry (Landing) and Onboarding are reachable before any permission is granted; the working screens become usable once the required permissions are in place.
The provisioned FastAPI backend, MariaDB database, and React frontend are infrastructure inventory. They are not product surfaces, they carry no GameBoost behavior, and they do not introduce accounts, roles, or server-side state. If a future requirement needs server-side behavior, it would extend the shared backend rather than add a new service; no current requirement does.
#070B0E pitch block occupying the top 60% of the viewport with faint centre-circle and penalty-box line art bleeding off the bottom edge; stacked flush-left headline (flush-right in RTL) with the second line in #00FF9C; shield glyph as the product mark.BIND_VPN_SERVICE) — why GameBoost needs to create a local VPN tunnel to cut other apps' internet. Screen 2 explains Usage Access (PACKAGE_USAGE_STATS) — why GameBoost needs to detect when the chosen game opens and closes so blocking stops automatically. Screen 3 explains notifications (POST_NOTIFICATIONS) and package visibility (QUERY_ALL_PACKAGES) — why the persistent notification with the Stop button and live ping must be shown, and why the installed-games list needs to see installed apps. Each screen carries a step indicator (1/3, 2/3, 3/3), an ALL-CAPS permission chip, the plain-language reason, and a "Grant" control that opens the corresponding Android surface.addDisallowedApplication alongside the selected game and GameBoost itself. A short explanation states that excepted apps (for example WhatsApp for calls and messages) keep their internet during a session.BIND_VPN_SERVICE, PACKAGE_USAGE_STATS, QUERY_ALL_PACKAGES, FOREGROUND_SERVICE + FOREGROUND_SERVICE_SPECIAL_USE, POST_NOTIFICATIONS, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE), with the current granted state of each.Each story carries provenance: explicit (stated by the requester), basic_default (accepted default), or required_inference (indispensable mechanics needed to make an accepted outcome usable).
FR-1 — Native Android project foundation. As a Player I should have GameBoost built as a native Android app in Kotlin with Jetpack Compose and Material 3, MVVM + Clean Architecture (data / domain / ui), Hilt, Coroutines and Flow, DataStore for settings, Room for the session log, minSdk 26, targetSdk 35, and Gradle Kotlin DSL with a Version Catalog, so that the product runs on a real phone. Provenance: explicit. Acceptance: the project compiles with those exact settings; no code exists for iOS, Flutter, or React Native.
FR-2 — Local VpnService with no external server. As a Player I should have GameBoost create a local VpnService with no external server, so that blocking happens entirely on my phone. Provenance: explicit. Acceptance: the service is created locally; no remote VPN endpoint is contacted.
FR-3 — Disallowed applications and blackhole. As a Player I should have the service call addDisallowedApplication for the selected game, the GameBoost app itself, and the excepted applications, so that every other application's packets are routed into the TUN interface and discarded (blackhole) — their internet fully cut — while the game connects directly with no intermediary. Provenance: explicit. Acceptance: with a session active, a non-excepted app has no internet; the selected game and excepted apps do.
FR-4 — Full IPv4 and IPv6 routes. As a Player I should have routes 0.0.0.0/0 and ::/0 added, so that no connection leaks over IPv6. Provenance: explicit. Acceptance: both routes are present in the VPN builder.
FR-5 — Foreground Service notification. As a Player I should see a persistent notification while the service runs, carrying a "Stop" button and the live ping. Provenance: explicit. Acceptance: the notification is ongoing; tapping "Stop" ends the session; the ping value is displayed and updates.
FR-6 — Automatic restart and network resilience. As a Player I should have the service restart automatically on failure, and have VPN-permission revocation and network switching (Wi-Fi ↔ mobile data) handled through ConnectivityManager.NetworkCallback. Provenance: explicit. Acceptance: a service failure triggers restart; revoking VPN permission is handled without a crash; a network switch is observed through the callback.
FR-7 — Home screen game selection and Start. As a Player I should choose my game from the installed apps (with icons) on the home screen and press a large animated circular "Start Playing" button that enables blocking and then opens the game. Provenance: explicit. Acceptance: installed games are listed with their real icons; the selected game is persisted; pressing Start enables blocking and then launches the game.
FR-8 — Game open/close detection. As a Player I should have GameBoost detect the game opening and closing via UsageStatsManager and stop blocking automatically after the game closes. Provenance: explicit. Acceptance: closing the game ends the session without a manual stop.
FR-9 — Exceptions list. As a Player I should manage a list of excepted applications (WhatsApp for calls, messaging, …) that keep their internet during a session. Provenance: explicit. Acceptance: toggling an app adds/removes it from the exceptions list; excepted apps are passed to addDisallowedApplication.
FR-10 — Per-second telemetry and live Canvas chart. As a Player I should have Ping, Jitter, and Packet Loss measured every second against a server I choose, with a live chart drawn on Canvas without heavy libraries. Provenance: explicit. Acceptance: the three metrics update each second; the chart is Canvas-drawn; no heavy charting dependency is present.
FR-11 — WifiLock during session. As a Player I should have a WifiLock in WIFI_MODE_FULL_LOW_LATENCY held during the session. Provenance: explicit. Acceptance: the lock is acquired on session start and released on session end.
FR-12 — Optional Do Not Disturb. As a Player I should be able to optionally request Do Not Disturb mode via NotificationManager.Policy. Provenance: explicit. Acceptance: the request is optional and only made when the Player chooses it.
FR-13 — Quick Settings Tile. As a Player I should have a Quick Settings Tile for fast start. Provenance: explicit. Acceptance: the tile starts a session from the Quick Settings panel.
FR-14 — Session log, average ping, and auto-start setting. As a Player I should review a session log with average ping and configure settings including auto-start with the game. Provenance: explicit. Acceptance: sessions are stored in Room with their average ping; the auto-start toggle persists in DataStore and, when on, starts a session with the game.
FR-15 — Wi-Fi to mobile-data alert. As a Player I should be alerted when the connection switches from Wi-Fi to mobile data. Provenance: explicit. Acceptance: the switch produces a visible alert.
FR-16 — Dark gaming UI with neon palette and bilingual support. As a Player I should see a dark gaming interface with neon green #00FF9C and cyan #00D4FF, with Arabic (RTL) and English supported through strings.xml. Provenance: explicit. Acceptance: both locales render from strings.xml; RTL mirrors the layout; the palette matches.
FR-17 — Three-screen onboarding with permission reasons. As a Player I should see a three-screen onboarding that explains the permissions before they are requested, and I should find the reason for each permission explained inside the app. Provenance: explicit. Acceptance: exactly three onboarding screens precede permission requests; each declared permission has an in-app explanation.
FR-18 — Declared permissions. As a Player I should have GameBoost declare BIND_VPN_SERVICE, PACKAGE_USAGE_STATS, QUERY_ALL_PACKAGES, FOREGROUND_SERVICE (+ FOREGROUND_SERVICE_SPECIAL_USE), POST_NOTIFICATIONS, ACCESS_NETWORK_STATE, and ACCESS_WIFI_STATE. Provenance: explicit. Acceptance: all are present in the manifest.
FR-19 — Performance and quality. As a Player I should have no memory leaks, no heavy work on the main thread, low battery consumption, ProGuard/R8 enabled in release, and unit tests for the ViewModels and the exceptions logic. Provenance: explicit. Acceptance: release build has R8 enabled; unit tests exist for ViewModels and exceptions logic; no main-thread heavy work.
FR-20 — Complete delivery artifacts. As the requester I should receive the full project tree followed by every file at its full path with complete code and no abbreviation or ..., including AndroidManifest and build.gradle.kts; the APK build commands (./gradlew assembleDebug → app/build/outputs/apk/debug/app-debug.apk); the release signing procedure with a keystore producing a signed APK; adb installation and real-phone blocking test steps; and a build checklist. Provenance: explicit. Acceptance: every listed artifact is delivered in full.
FR-21 — Staged implementation. As the requester I should have the base version (VPN + blocking + game selection) delivered first, then the remaining features in stages, with each stage confirmed complete before the next. Provenance: explicit. Acceptance: stage completion is confirmed before proceeding.
FR-22 — VPN consent before blocking. As a Player I should grant the VPN permission (BIND_VPN_SERVICE) before blocking can be activated, through the Android consent surface. Provenance: required_inference. Acceptance: pressing Start without consent opens the Android VPN consent dialog; blocking activates only after consent; denial leaves the session inactive with a visible reason and a retry path.
FR-23 — Usage Access before game detection. As a Player I should grant Usage Access (PACKAGE_USAGE_STATS) so that game open/close detection works. Provenance: required_inference. Acceptance: without Usage Access, automatic stop after game close is unavailable and the app states why and links to the Android Usage Access screen.
FR-24 — Notification permission before the persistent notification. As a Player I should grant POST_NOTIFICATIONS so the persistent notification with the Stop button and live ping can be shown. Provenance: required_inference. Acceptance: without it, the app states the notification cannot be shown and links to the Android prompt.
FR-25 — Package visibility before the installed-games list. As a Player I should have QUERY_ALL_PACKAGES in effect so the installed-games list can be populated. Provenance: required_inference. Acceptance: the installed-games list is populated from installed applications with icons.
FR-26 — Onboarding completion before permission requests. As a Player I should complete the three onboarding screens before the permissions are requested. Provenance: required_inference. Acceptance: permission requests are reachable from the onboarding screens; onboarding completion is recorded in DataStore.
FR-27 — Session record with average ping. As a Player I should have each session recorded with its game, start and end time, duration, and average ping, so the session log is meaningful. Provenance: required_inference. Acceptance: a completed session appears in السجل with those fields.
Product context. The Player is a competitive mobile gamer on Android who plays eFootball, FC Mobile, or another installed game and wants the match to have the best possible ping by removing every other app's internet during play. They are Arabic-first or English-speaking and use the app in a dark, neon-lit gaming register.
Primary goal. Keep the chosen game alone connected, directly, at the lowest possible ping, while every other application is cut off — and see proof of the connection quality while playing.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which game to select; which apps to except; which measurement server to use; whether to enable auto-start; whether to request Do Not Disturb; whether to stop a session manually (from the app or the notification's "Stop" button) or let it stop automatically when the game closes.
Interactions with other accepted participants. The Player interacts with the Android platform for permission grants (VPN consent, Usage Access, notification permission, Do Not Disturb access) and with the Quick Settings panel for the tile. The selected game is launched as an external destination. The measurement server is an external network endpoint the Player chooses. No other human participant exists in the product.
Observable success. The selected game is connected while other apps are cut off; the shield state reads LOCKED during a session; ping/jitter/loss update every second; the session ends automatically when the game closes; the session appears in the log with its average ping; and a Wi-Fi→mobile-data switch produces an alert.
BIND_VPN_SERVICE) and why GameBoost needs a local tunnel to cut other apps' internet.PACKAGE_USAGE_STATS) and why game open/close detection needs it. "Grant" opens the Android Usage Access settings screen; returning with access granted flips the chip.POST_NOTIFICATIONS (the persistent notification with Stop and live ping) and QUERY_ALL_PACKAGES (the installed-games list). "Grant" opens the Android notification prompt.VpnService as a Foreground Service, calls addDisallowedApplication for the selected game, GameBoost itself, and every excepted app, adds routes 0.0.0.0/0 and ::/0, and holds a WifiLock in WIFI_MODE_FULL_LOW_LATENCY. Every other app's packets are routed into the TUN interface and discarded; the game connects directly with no intermediary.UsageStatsManager.VpnService ends, the WifiLock is released, and the shield state returns to IDLE.WifiLock is released, the notification is dismissed, and the shield state returns to IDLE.addDisallowedApplication alongside the selected game and GameBoost itself, so it keeps its internet while every other app is cut off.VpnService engine, and the persistent notification appears with the Stop button and live ping.ConnectivityManager.NetworkCallback observes the switch.The creative direction is authoritative for this section. The muse is Haraldur Thorleifsson; the headline is "CUT THE NOISE. / KEEP THE MATCH." — big-hearted boldness for a shield that lets you play alone.
Mode. Dark-first, end to end. No light mode.
Colour tokens (exact hex, by role).
| Role | Hex | Use |
|---|---|---|
| Background / pitch | #070B0E | Fills ~70% of every screen |
| Surface / raised panel | #101820 | Cards, tiles, notification body |
| Hairline | #1E2C33 | 1px border on raised panels |
| Text | #EAF6F2 | Body text on #070B0E (~17:1 contrast) |
| Muted | #7C8F92 | Labels only at 14px+ semibold |
| Primary (action signal) | #00FF9C | The circular Start button, the live ping number, the shield state — the single action signal |
| Accent (instrument) | #00D4FF | Jitter/loss readouts and the live Canvas chart stroke — never used for a button |
| Status error | #FF4D6D | "Blocked / error" only |
No third hue. Neon green and cyan are the only signals in a near-black stadium.
Typography. Headings: Sora — Sora ExtraBold 800, tight −0.03em tracking, sentence case for screen titles, ALL-CAPS micro-labels at 12px with +0.14em tracking for permission and status chips. The ping figure is Sora 800 tabular with a smaller unit suffix. Body: Manrope. Scale: 1.25 modular on a 4pt baseline — display 48/40/32, title 28/24/20, body 16/15/14, label 13/12/11. Arabic uses the same sizes with 1.15 line-height compensation. Inter, Roboto, Arial, Poppins, and system-ui are excluded for headings and body.
Shape language. Chunky rounded blocks: 20–28px radii on panels, 999px pill buttons and chips, a 200–240px perfect circle for the Start control with a 3px neon ring and an inner glow. Section boundaries are hard colour blocks, not soft gradients; the only curves are the circle and the card corners.
Spacing rhythm. 4pt baseline; single-column mobile-first stack with a fixed bottom action dock; one idea per block; big tappable rows.
Layout. Home = hero block (game identity + shield state) → the giant circular Start button centred on a dark pitch with faint centre-circle line art → horizontal scrolling row of installed games as rounded tiles with icons → live telemetry strip (ping/jitter/loss) → session log. Settings, Exceptions, and Onboarding (3 screens) reuse the same block rhythm: full-bleed colour header, one idea per block, big tappable rows. RTL mirrors the whole flow; icons and numbers stay LTR.
Imagery style. No stock photos. The visual world is built from the app's own data and geometry: a faint pitch centre-circle and penalty-box line drawing behind the hero, a neon shield glyph as the product mark, and the live Canvas ping chart as the only "illustration". Game tiles use the real installed app icons on rounded dark chips.
Readability rule. Headlines, wordmarks, labels, numbers, cards' text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (for example clamp(...) with its mobile size) to fit; no other element covers any part of them. Decoration and motion may bleed, overlap, or be cropped; readable text and controls never are.
The public entry (Landing) is a matchday poster, not a SaaS hero. A full-bleed #070B0E pitch block fills the top 60% of the viewport. An oversized two-line headline in Sora 800 — "CUT THE NOISE." over "KEEP THE MATCH." — is stacked flush-left (flush-right in RTL) and spans the full width at clamp(40px, 11vw, 72px), with the second line in #00FF9C. The faint pitch centre-circle line art bleeds off the bottom edge and partially overlaps the headline block without covering any readable text. The neon shield glyph sits as the product mark. A single neon-green pill "Get started" control sits in the fixed bottom action dock, with a secondary text link for returning Players. No centred subheadline-plus-blue-button stack, no gradient blob, no glassmorphism.
The same poster language carries into الرئيسية: the selected game sits as a wide rounded chip with its real icon and package name, and directly under it the 220px neon-ringed circular Start control dominates the centre with "START MATCH" in Sora 800 inside, the game icon docked at its centre. The live ping figure (#00D4FF, Sora 800, tabular) and a one-line "others blocked" status sit above the button on the right edge in RTL-aware alignment.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
#070B0E pitch block, headline stacked flush-left (flush-right in RTL) with the second line in #00FF9C, shield glyph visible, "Get started" pill in the bottom dock — every readable element whole and inside the viewport.prefers-reduced-motion — no pulse, no sweep, no count animation, no chart draw-in; the poster, the shield state, the numbers, and the controls remain fully readable and usable, and the game row wraps or scrolls so each item can be brought fully into view.WifiLock is held only during a session and released on stop. Provenance: explicit.VpnService is local with no external server; the game connects directly with no intermediary. Provenance: explicit.0.0.0.0/0 and ::/0 are always added so no connection leaks over IPv6. Provenance: explicit.ConnectivityManager.NetworkCallback without crashing. Provenance: explicit.strings.xml; the layout mirrors in RTL while icons and numbers stay LTR. Provenance: explicit.prefers-reduced-motion, a usable static arrangement is provided. Provenance: explicit (creative direction).data / domain / ui layers. Provenance: explicit.minSdk 26, targetSdk 35. Provenance: explicit../gradlew assembleDebug → app/build/outputs/apk/debug/app-debug.apk; release signing with a keystore producing a signed APK; ProGuard/R8 enabled in release. Provenance: explicit.VpnService (addDisallowedApplication, routes 0.0.0.0/0 and ::/0), Foreground Service with FOREGROUND_SERVICE_SPECIAL_USE, UsageStatsManager, ConnectivityManager.NetworkCallback, WifiManager WifiLock in WIFI_MODE_FULL_LOW_LATENCY, NotificationManager.Policy, Quick Settings Tile service, Canvas drawing. Provenance: explicit.BIND_VPN_SERVICE, PACKAGE_USAGE_STATS, QUERY_ALL_PACKAGES, FOREGROUND_SERVICE (+ FOREGROUND_SERVICE_SPECIAL_USE), POST_NOTIFICATIONS, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE. Provenance: explicit.Assumptions.
Constraints.
VpnService is local with no external server; the game connects directly with no intermediary. Provenance: explicit.data/domain/ui), Hilt, Coroutines and Flow, DataStore, Room, minSdk 26, targetSdk 35, Gradle Kotlin DSL with Version Catalog. Provenance: explicit.0.0.0.0/0 and ::/0 must be added to prevent IPv6 leaks. Provenance: explicit...., every file at its full path. Provenance: explicit.#00FF9C and cyan #00D4FF; no third hue; status red #FF4D6D only for blocked/error. Provenance: explicit.strings.xml. Provenance: explicit.gameboost-vpnservice.VpnService.Builder call that excludes an app from the tunnel; used for the selected game, GameBoost itself, and excepted apps.WIFI_MODE_FULL_LOW_LATENCY) — the Wi-Fi lock held during a session to keep the radio in low-latency mode.NotificationManager.Policy) — the optional interruption-suppression mode the Player may request.
While you play, the internet is cut entirely for every other app on your phone, and your chosen game alone stays connected directly — no intermediary server in between — for the lowest possible ping.
Built for competitive mobile gamers oneFootballFC Mobileأو أي لعبةinstalled on your device.

While you play, the internet is cut entirely for every other app on your phone, and your chosen game alone stays connected directly — no intermediary server in between — for the lowest possible ping.
Built for competitive mobile gamers oneFootballFC Mobileأو أي لعبةinstalled on your device.
No comments yet. Be the first!