A unified communication app for Android — sync email, calendar, tasks, and messages across multiple accounts. Zero telemetry. Local-first. Encrypted by default.
Data structures first. Everything flows from the models: Account, Email, CalendarEvent, Task, Message, Conversation, UnifiedContact. No telemetry, no tracking, no data leaves your device without explicit consent.
Captured from the running app (debug build, light + dark themes, seeded demo data).
| Light | Dark | |
|---|---|---|
| Inbox | ![]() |
![]() |
| Email — Account Overview | ![]() |
— |
| Email — Unified Inbox | ![]() |
— |
| Calendar | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Messages | ![]() |
— |
| Settings | ![]() |
![]() |
| Add Account | ![]() |
— |
| Search | ![]() |
— |
| Feature | Providers | Key Capabilities |
|---|---|---|
| Google, Mailcow, Outlook, Yahoo, Exchange, iCloud, Generic IMAP/SMTP | Unified inbox, push, attachments, PGP, threading, flags | |
| 📅 Calendar | Google, CalDAV, Exchange, iCloud | Shared calendars, color preservation, invites (Yes/No/Maybe), RRULE recurrence |
| ✅ Tasks | CalDAV VTODO, Google Tasks | Subtasks, priorities (Low/Normal/High/Urgent), due dates, recurring |
| 💬 Messaging | UnifiedComms users only | Direct/group/broadcast conversations, rich sharing (emails, events, tasks, calendar invites) |
| 🔒 Security | — | Biometric lock, AES-256 for stored credentials (Android Keystore), zero telemetry |
| 🔔 Reminders | AlarmManager | Full-screen heads-up alerts with snooze/dismiss |
- Zero telemetry / zero analytics. The app ships no tracking, analytics, or crash-reporting SDKs (no Firebase, Crashlytics, Sentry, Mixpanel, etc.). A "No Telemetry" toggle exists in Settings and is on by default.
- Local-first. Account data, credentials, and sync state live on your device. Nothing is sent to a UnifiedComms server — the app talks only to the email/calendar/task providers you configure.
- Encrypted credentials. Stored credentials are protected with AES-256 in the Android Keystore.
- Secure transport. Cleartext HTTP is disabled; all network traffic uses HTTPS (enforced via network security config).
- Biometric lock. Optional biometric / device-credential unlock for the app.
- Open source. MIT-licensed. Builds reproducible from source; no proprietary dependencies.
- Android 12+ (API 31)
- Kotlin 1.9+, Gradle 8.9+, Java 17
- Android SDK 35
git clone https://github.com/Dvalin21/UnifiedComms.git
cd UnifiedComms
# Copy and configure local properties
cp local.properties.example local.properties
# Edit local.properties with your SDK path and signing keys
# Set OAuth credentials (environment variables or local.properties)
export GOOGLE_CLIENT_ID="your_google_client_id"
export MICROSOFT_CLIENT_ID="your_microsoft_client_id"
export YAHOO_CLIENT_ID="your_yahoo_client_id"
export APPLE_CLIENT_ID="your_apple_client_id"
export PUSH_API_KEY="your_push_server_key"
# Build debug APK
./gradlew assembleDebug
# Build release APK (requires signing config)
./gradlew assembleRelease
# Build release AAB
./gradlew bundleRelease# Debug
adb install app/build/outputs/apk/debug/app-debug.apk
# Or use Android Studio → Run → Run 'app'Settings → Accounts → Add Account
| Provider | Method | Required Info |
|---|---|---|
| OAuth 2.0 | Opens browser → grant permissions (Gmail, Calendar, Contacts, Tasks) | |
| Outlook / Hotmail | OAuth 2.0 | Opens browser → grant permissions (Mail, Calendar, Contacts, Tasks) |
| Yahoo Mail | OAuth 2.0 | Opens browser → grant permissions |
| iCloud | OAuth 2.0 | Opens browser → Apple ID login |
| Exchange / Office 365 | OAuth 2.0 (cloud) or Manual | For on-prem: server URL, email, password |
| Mailcow | Manual | Server URL (e.g., mail.example.com), email, password/app password |
| Generic IMAP/SMTP | Manual | IMAP host, SMTP host, ports, email, password |
| Generic CalDAV/CardDAV | Manual | CalDAV URL, CardDAV URL, email, password |
After adding:
- Choose sync options: Email, Calendar, Contacts, Tasks (per-account)
- Set as Default Account for new emails/events/tasks
- Configure sync interval (15 min default), Wi-Fi only, push notifications
Main Screen → Inbox Tab
- Unified view: All accounts in one list, color-coded by account
- Per-account folders: Tap account card → INBOX, Sent, Drafts, Trash, Spam, Archive
- Actions: Swipe or long-press → Star, Mark Read/Unread, Archive, Delete, Move, Flag
- Search: Top-app-bar search → queries subject, sender, body across all accounts
- Compose: FAB → New Email → auto-uses default account (or select)
- Attachments: View inline (images/PDFs), download, share
- Threading: Conversation view with expand/collapse
Keyboard Shortcuts (external keyboard):
| Key | Action |
|---|---|
C |
Compose new |
R |
Reply |
A |
Reply All |
F |
Forward |
E |
Archive |
# |
Delete |
! |
Mark Spam |
S |
Star/Unstar |
U |
Mark Unread |
/ |
Search |
J/K |
Next/Previous |
Main Screen → Calendar Tab
Views:
- Month — Color-coded dots per day, tap for day view
- Week — 7-day grid, scroll horizontally
- Day — Hourly slots (6 AM – 10 PM), all-day section at top
Creating Events:
- Tap + FAB or long-press time slot
- Fill: Title, Description, Location, Start/End time, All-day toggle
- Calendar Color — Pick from 18 Material colors (preserved from server)
- Attendees — Add email addresses (comma-separated)
- Each gets an invite via email + in-app notification
- Recipients see Yes / No / Maybe buttons
- Reminders — Default 1 hour (configurable: At time, 5/15/30 min, 1 hour, 1 day)
- Recurrence — Daily, Weekly, Monthly, Yearly, Custom (RRULE)
- Save → Invites sent automatically
Invite Responses:
- Yes → Green check, adds to calendar
- No → Red X, removed from calendar
- Maybe → Yellow clock, shows as tentative
Shared Calendars:
- Automatically synced from server
- Colors preserved exactly as on server
- Toggle visibility per-calendar in Settings → Accounts → [Account] → Calendars
Navigation:
- Swipe left/right: Previous/Next period
- Today FAB: Jump to today
- Search: Find events by title, location, description
Main Screen → Tasks Tab
Filters (chips at top):
| Filter | Shows |
|---|---|
| All | Every task |
| Active | Incomplete |
| Completed | Done |
| Starred | ⭐ flagged |
| Overdue | Past due date |
| Today | Due today |
Creating Tasks:
- Tap + FAB
- Title (required), Description, Due date, Priority (Low/Normal/High/Urgent)
- List — Personal, Work, Shopping, or custom
- Subtasks — Add hierarchical breakdown
- Save
Task Actions:
- Tap checkbox → Toggle complete (updates parent progress)
- Long-press → Star, Edit, Delete, Move to list
- Drag handle (⋮⋮) → Reorder within list
- Swipe right → Quick complete
- Swipe left → Quick delete
Progress Tracking:
- Parent tasks show
X/Y subtasksand percentage - Auto-completes parent when all subtasks done
- Starred tasks appear in widget and top of list
Main Screen → Messages Tab
Conversations:
- Direct — 1:1 with another UnifiedComms user
- Group — Multiple participants (admin controls)
- Broadcast — Read-only announcements
Starting a Chat:
- Tap + FAB → New Message
- Search by email or UnifiedComms ID
- Select contact → Opens conversation
Rich Sharing (in chat input bar):
| Button | Shares |
|---|---|
| 📎 | File from storage |
| 📅 | Calendar Invite — Creates event with Yes/No/Maybe buttons |
| ✅ | Task — Shares task with due date, priority |
| 📧 | Email — Shares email preview with sender/subject |
Features:
- Read Receipts — Double-check when delivered/read
- Push Notifications — Real-time where supported
- Mute — Per-conversation, custom duration
- Pin — Keep important chats at top
- Archive — Hide without deleting
Default: 1 hour before events
When reminder fires:
┌─────────────────────────────────────┐
│ ⏰ Event Reminder │
│ ┌─────────────────────────────────┐ │
│ │ 📅 Team Standup │ │
│ │ Tomorrow, 10:00 AM - 11:00 AM │ │
│ │ 📍 Conference Room A │ │
│ │ Weekly team sync... │ │
│ └─────────────────────────────────┘ │
│ [Snooze 5min] [Dismiss] [View Event]│
└─────────────────────────────────────┘
- Shows over lock screen — No unlock needed
- Turns screen on — Even if device asleep
- Snooze → Reschedules 5 minutes
- Dismiss → Removes reminder
- View Event → Opens calendar detail
- Also creates standard notification as backup
Configure: Settings → Notifications → Full-screen reminders (toggle), Default reminder time
Biometric Lock:
- Settings → Security → Biometric Lock → Enable
- Prompts on app launch, after timeout (configurable: 1/5/15/30 min)
Encryption:
- At Rest — AuthConfig credentials (passwords, tokens) encrypted with Android Keystore (AES-256-GCM)
- Keys — Stored in Android Keystore (hardware-backed)
- In Transit — TLS 1.3 for network sync
- Database — Standard Room database (no SQLCipher)
Zero Telemetry:
- No analytics SDKs (Firebase, Play Services analytics, etc.)
- No crash reporting (no Crashlytics, Sentry, etc.)
- No usage tracking
- No network calls except explicit sync/messaging
Data Control:
- Settings → Advanced → Clear All Data (wipes everything)
- Settings → Advanced → Backup & Restore (encrypted export/import)
- Auto-lock timeout: 1/5/15/30/60 min or Never
Auto-Sync:
- Interval: 15 min (default) / 30 min / 1 hour / Manual
- Wi-Fi only toggle
- Push: Real-time where supported (Gmail, Exchange, iCloud)
Manual Sync:
- Swipe down in any screen → Pull to refresh
- Settings → Accounts → [Account] → Test Connection / Sync Now
Conflict Resolution:
- Per-account: Server Wins / Client Wins / Merge / Prompt
- Default: Server Wins (safer for multi-device)
Attachments:
- Auto-download toggle
- Max size: 25 MB (configurable)
- Stored in app-private directory (encrypted)
| Variable | Required | Description |
|---|---|---|
GOOGLE_CLIENT_ID |
For Google OAuth | Google Cloud Console → Credentials |
MICROSOFT_CLIENT_ID |
For Outlook OAuth | Azure Portal → App Registrations |
YAHOO_CLIENT_ID |
For Yahoo OAuth | Yahoo Developer Network |
APPLE_CLIENT_ID |
For iCloud OAuth | Apple Developer → Services IDs |
PUSH_API_KEY |
For push notifications | Your push server API key |
KEYSTORE_PATH |
Release builds | Path to .jks file |
KEYSTORE_PASSWORD |
Release builds | Keystore password |
KEY_ALIAS |
Release builds | Key alias |
KEY_PASSWORD |
Release builds | Key password |
Google:
- Google Cloud Console → APIs & Services → Credentials
- Create OAuth 2.0 Client ID (Android)
- Add SHA-1 fingerprint
- Enable: Gmail API, Calendar API, People API, Tasks API
Microsoft (Outlook/Exchange):
- Azure Portal → App Registrations → New Registration
- Redirect URI:
unifiedcomms://oauth2redirect/outlook - API Permissions:
IMAP.AccessAsUser.All,SMTP.Send,Calendars.ReadWrite,Contacts.ReadWrite,Tasks.ReadWrite
Yahoo:
- Yahoo Developer Network → Create App
- Redirect URI:
unifiedcomms://oauth2redirect/yahoo - Scopes:
mail-r,mail-w,cal-r,cal-w,contacts-r,contacts-w
Apple (iCloud):
- Apple Developer → Certificates, Identifiers & Profiles → Identifiers → Services IDs
- Enable: Sign in with Apple
- Redirect URI:
unifiedcomms://oauth2redirect/icloud
app/
├── data/
│ ├── model/ # Account, Email, CalendarEvent, Task, Message, Conversation, UnifiedContact
│ ├── db/ # Room: Database, 9 DAOs, TypeConverters
│ └── repository/ # 7 Repositories (interfaces + impls)
├── sync/
│ ├── accounts/ # Authenticator, ContentProvider, SyncService
│ ├── EmailSyncEngineImpl # IMAP/SMTP + OAuth2
│ ├── CalendarSyncEngineImpl # CalDAV + Google + Exchange
│ ├── TaskSyncEngineImpl # CalDAV VTODO + Google Tasks
│ ├── ContactSyncEngineImpl # CardDAV + Google People
│ └── SyncManager # Orchestrates all engines
├── security/
│ ├── CryptoManager # AES-256-GCM (Keystore), encrypt AuthConfig secrets
│ └── BiometricManager # Fingerprint/Face ID auth
├── push/ # Push manager, device registration, topic subscriptions
├── messaging/ # MessagingService, Parcelables
├── reminder/ # AlarmManager exact alarms, FullScreenReminderActivity
├── ui/
│ ├── main/ # MainActivity, 6 screens (Inbox, Email, Calendar, Tasks, Messages, Settings)
│ ├── auth/ # AddAccountActivity (OAuth + manual), OAuthCallbackActivity
│ ├── search/ # Global search
│ ├── settings/ # Settings activity
│ └── theme/ # Material 3, dynamic colors, account color palette
└── util/ # PreferencesManager, NotificationHelper, InviteActionReceiver
Key Libraries:
Room 2.6,Compose 1.6,Glance 1.1JavaMail 1.6.7(IMAP/SMTP viaandroid-mail)OkHttp 4.12+Retrofit 2.11(REST)kotlinx-serialization 1.6(JSON)Coil 2.6(images)WorkManager 2.9(background)
# Set signing env vars (or use local.properties)
export KEYSTORE_PATH=/path/to/release.jks
export KEYSTORE_PASSWORD=your_store_password
export KEY_ALIAS=your_key_alias
export KEY_PASSWORD=your_key_password
# Build signed APK
./gradlew assembleRelease
# Or build signed AAB
./gradlew bundleRelease- Fork → Create feature branch (
git checkout -b feature/amazing-feature) - Follow Linus-style commits: small, focused, descriptive subjects
- Run tests:
./gradlew test - Submit PR with clear description
Code Style: 8-char tabs, K&R braces, 80-col, functions do ONE thing
MIT License — See LICENSE for details.
- Material 3 design system
- AndroidX: Room, Hilt, Compose, Glance, WorkManager, Biometric, Security-Crypto
- OkHttp, Retrofit, Kotlinx Serialization, Coroutines
- JavaMail for IMAP/SMTP
- Coil for image loading
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Security: Email
security@dvalin21.dev(PGP key available)
Made with ❤️ for privacy-conscious communicators.












