
Open-source Android client for VirusTotal. Scan files, URLs, and installed apps against 70+ antivirus engines. View detailed reports with hashes, threat classifications, YARA matches, and sandbox behaviors. No tracking or ads.
Free and open source. Bring your own VirusTotal API key to scan files, links, and installed applications against over 70 engines, built with a Material 3 interface. No accounts, no tracking, no ads.
Veto is an Android client for VirusTotal. Submit a file, a link, or an installed application to view real-time analysis results. The application displays a clear report ranging from a single unified verdict to the complete set of fields returned by the service.
The project is free and open source, containing no user accounts, tracking systems, or advertising. Because users supply their own VirusTotal API key, all scans run directly under their personal account without being routed through intermediate third-party servers.
![]() | ![]() | ![]() |
ScanManager serves as the centralized source of truth for all scanning states. This ensures that the user interface remains synchronized whether the app is active in the foreground, suspended in the background, or destroyed by the operating system./analyses/{id} endpoint using a six-minute wall clock cap. If a rate limit response is encountered, the process waits rather than failing. The report is re-fetched until the results are populated, returning a structured failure state if the timeout limit is reached.ScanState resides within the ScanManager to survive Activity destruction, ScanService maintains the process lifecycle during active operations and manages ongoing and completion notifications.attributes JSON is retained via a custom serializer. This allows the Detailed report view to render all returned fields, including any new fields added to the API payload over time.└── app/src/main/java/com/quantum_prof/vtscansuite/
├── data/ # Models, remote API, and repository implementation
├── domain/ # Repository interface and business use cases
├── di/ # Hilt dependency injection modules
├── scan/ # ScanManager, ScanService, and system notifications
└── ui/ # UI components and presentation layers
├── intro/ # Splash screen and API key configuration
├── dashboard/ # Navigation hub: link, file, and app scanning modules
├── results/ # Quick and Detailed report visualizers
├── components/# Reusable UI elements and layouts
├── theme/ # Color, shapes, typography, and motion configurations
└── util/ # Haptic feedback, gestures, and deep linking utilities
fastlane/metadata/android/en-US/.docs/store/svg/.docs/store/export.html.Clone the repository and compile the debug build using the command line:
git clone https://github.com/ProfessorQuantumUniverse/VTScan.git
cd VTScan
./gradlew :app:assembleDebug
Alternatively, open the root directory inside Android Studio and select the Run configuration.
On the initial launch, enter your VirusTotal API key in the introduction setup screen. The key is stored locally on your device, encrypted with an AES-256-GCM key from the Android Keystore, and excluded from cloud backup and device to device transfer. Free API keys are typically subject to a limit of four lookups per minute.
The application communicates exclusively with the VirusTotal API using the credentials you provide. Uploaded files, submitted URLs, and dynamic results are sent directly to VirusTotal's servers. The API key is stored locally on your device, encrypted with an AES-256-GCM key from the Android Keystore, and is excluded from cloud backup and device to device transfer, so it never leaves the device. HTTP logging is limited to debug builds and redacts the key header. Veto does not collect analytics data and contains no advertising SDKs.
This project is licensed under the terms of the GNU General Public License v3.0.
For more details, please see the LICENSE file in this repository.
![]() | ![]() |
| Layer | Technology | Role in Project |
|---|
| Language | Kotlin | Primary programming language |
| UI Framework | Jetpack Compose | Declarative UI structure |
| Design System | Material 3 | Visual styling, dynamic systems coloring, and extended icons |
| Dependency Injection | Hilt | Dependency management |
| Networking | Retrofit & OkHttp | HTTP communication with the VirusTotal API |
| Serialization | kotlinx.serialization | Type-safe JSON parsing and custom attribute preservation |
| Asynchrony | Kotlin Coroutines | Asynchronous programming and background processing |
| Persistence | Jetpack DataStore | Dynamic settings storage and saved scan reports |
| Compatibility | SDK 30 to 36 | Compiled with JDK 17, minSdk 30, targetSdk 36 |