Fast, Private & Seamless Contact Sharing
A privacy-first, offline-capable contact transfer utility built to move specific contacts instantly with zero cloud storage, 4-digit PIN security, and optical/P2P transfer.
Active Open-Source Project — Qiwii is built with a modern Warm Almond & Orange Ember design system, featuring offline transfers, PIN encryption, Android deep linking, live camera scanning, gallery image decoding, and an automated web redirector.
Qiwii is a cross-platform Flutter utility designed to solve a fundamental mobile pain point: sharing specific contacts between devices quickly, privately, and without syncing entire address books to third-party cloud servers.
With Qiwii, users select the exact contacts they wish to share, set an optional 4-digit security PIN, and generate either a high-density direct QR code or an ultra-compact encrypted transfer link. The receiver simply scans the QR code or opens the link, enters the PIN, and reviews/imports the contacts with built-in duplicate detection.
Traditional contact sharing is clunky, invasive, or insecure:
- All-or-Nothing Cloud Syncing: Syncing contacts requires Google or iCloud accounts, uploading entire address books to remote databases.
- Fragmented vCard Files: Exporting
.vcffiles through messaging apps produces messy attachments that require multiple steps to import and clutter file managers. - Privacy Leaks in Public Transfers: Sharing contact details in groups or public spaces leaves numbers exposed without PIN protection or expiration limits.
- Duplicate Clutter: Importing contacts often creates duplicate entries with inconsistent formatting and broken country codes.
Qiwii provides a frictionless, zero-cloud transfer workflow that keeps data strictly between the two communicating devices:
- Selective Sharing: Pick 1 or 500+ contacts—only what you choose leaves your screen.
- End-to-End PIN Protection: Encrypt payloads using PBKDF2 HMAC-SHA256 and AES-GCM-256 with a 4-digit PIN.
- Dual-Tier Transport Protocol: Direct optical QR compression for small batches (works in Airplane Mode) and encrypted local P2P hotspot streams for large batches.
- Smart Duplicate Resolution: Automatically normalizes phone numbers to E.164, detects existing contacts, and provides 1-tap duplicate skipping.
- Universal Deep Linking & Web Bridge: Clicking a shared link in Messenger or WhatsApp seamlessly redirects into the app via GitHub Pages with auto-clipboard detection.
- PBKDF2 Key Derivation: Derives 256-bit AES keys using HMAC-SHA256 with 10,000 iterations and cryptographic salts.
- Ultra-Compact Binary Packing: Formats ciphertext into
[IV (16B) + HMAC Tag (32B) + CipherText (NB)], dropping link length by >70% (~300 chars for 14 contacts). - Brute-Force Lockout: Prevents unauthorized guessing with a 5-attempt threshold, visual shake animations, and error lockout modals.
-
Tier 1 (Direct QR Mode
$\le 5$ contacts): Encodes compressed contact payloads directly into the visual QR matrix. 100% offline with zero network connectivity needed. -
Tier 2 (Bulk P2P Mode
$> 5$ to$500+$ contacts): Spawns an ephemeral encrypted local HTTP server over local Wi-Fi or Mobile Hotspot for instant high-speed transfers.
- Live Camera Scanner: High-performance viewfinder with target reticle laser beam animation, torch toggle, and haptic feedback.
- Gallery & Screenshot Picker: Upload QR images from device photos or file managers, powered by
qr_code_dart_decoderfor cross-platform web and mobile decoding. - Auto-Clipboard Detection: Automatically detects Qiwii transfer codes in the clipboard on app launch or resume, prompting an instant Unlock & Import Contacts sheet.
- Duplicate Prevention: Compares normalized E.164 phone numbers and case-insensitive emails against existing device contacts.
- Selective Batch Import: Review contacts before saving with a 1-tap Skip All Duplicates resolution filter.
- Background Isolate Processing: Parses and sorts hundreds of contacts off the UI thread via background Dart
compute()isolates.
- GitHub Pages Landing Page (
docs/index.html): Resolves in-app browser DNS blocks in Messenger/WhatsApp, launching the app instantly via customqiwii://URL scheme with manual clipboard fallback.
contactqr_flutter/
├── lib/
│ ├── core/
│ │ ├── constants/ # Protocol identifiers, timeouts, and limits
│ │ ├── theme/ # Material 3 Warm Almond & Orange Ember design system
│ │ ├── utils/ # CryptoUtils, QrCodec, PhoneNormalizer, NetworkHelper
│ │ └── widgets/ # Shell, Header, ActionTile, StatusPill, ErrorDialog
│ ├── data/
│ │ ├── models/ # AppContact, TransferSession, TransferMode domain models
│ │ └── repositories/ # ContactRepository (Native OS contact isolate parsing)
│ ├── features/
│ │ ├── home/ # HomeScreen, deep link stream listeners, clipboard watcher
│ │ ├── contacts/ # SendScreen, ReviewScreen, search & multi-select state
│ │ ├── qr/ # QrScreen, ScannerScreen, SetPinModal, EnterPinModal
│ │ ├── transfer/ # LocalTransferServer, LocalTransferClient, TransferProvider
│ │ ├── import/ # ReceivedScreen, SaveSheet, duplicate resolution filter
│ │ └── info/ # PrivacyPolicyScreen, LicensesScreen
│ └── main.dart # Root ProviderScope application entry
├── test/ # Comprehensive unit, widget, and scalability benchmarks
└── docs/ # Live GitHub Pages redirector and assets
| Layer | Technology |
|---|---|
| Framework | Flutter 3.13+ (Dart 3.0+) |
| State Management | Flutter Riverpod 2.6 |
| Design System | Custom Material 3 (Warm Almond #FAF1E8 & Orange Ember #FF7A1A) |
| Camera & Barcode | mobile_scanner + qr_flutter |
| Image & QR Decoding | image_picker + qr_code_dart_decoder |
| Cryptography | AES-GCM-256 + PBKDF2 HMAC-SHA256 (crypto) |
| Deep Linking | app_links (qiwii://, contactqr://, GitHub Pages) |
| Native Contacts | flutter_contacts with background isolates |
- Flutter SDK 3.13+
- Android SDK (API 21+) / Physical Device / Chrome for Web
- Git
Verify your Flutter environment:
flutter doctorgit clone https://github.com/kuroi17/Qiwii-Easy-Contact-Share-QR.git
cd Qiwii-Easy-Contact-Share-QR/contactqr_flutterflutter pub get# Verify 0 analysis issues
flutter analyze
# Run all 30 unit, integration, and benchmark tests
flutter test# Launch on Android Device / Emulator
flutter run
# Launch on Chrome Web Browser
flutter run -d chromeThe project includes an automated test suite verifying correctness, cryptography, and scalability:
flutter test- Crypto Tests: AES authenticated encryption, PBKDF2 key derivation, tampering resistance.
- Normalizer Tests: E.164 standardization, fuzzy phone comparison, case-insensitive email matching.
- Protocol Codec Tests: URL encoding/decoding, binary cipher unpacking, 10-minute expiry validation.
- Importer Tests: Selective contact saving, duplicate flags, metrics calculation.
-
Scalability Benchmarks: Transfers 1, 5, 20, 100, and 500 contacts in
$< 2$ seconds.
Qiwii is built on a Zero-Cloud Guarantee:
- No user accounts or registrations.
- No analytics, telemetry, or tracker SDKs.
- No remote servers—all transfers occur peer-to-peer or optically.
- Ephemeral memory cleansing wipes keys and sockets after transfer completion.
Read the full PRIVACY.md document for details.
Contributions are welcome! Please follow these steps:
- Fork the repository.
- Create a feature branch (
git checkout -b feature/MyFeature). - Ensure all tests pass (
flutter testandflutter analyze). - Commit your changes (
git commit -m 'feat: add some feature'). - Push to the branch (
git push origin feature/MyFeature). - Open a Pull Request.
This project is licensed under the MIT License.
Built for seamless, private contact sharing · Qiwii