Native Android app for managing Fastmail masked emails
Features • Screenshots • Installation • Setup • Tech Stack • Architecture • Contributing
FastMask is a native Android application that lets you manage your Fastmail masked email addresses directly from your phone. Masked emails are disposable addresses that forward to your real inbox, helping you protect your privacy and reduce spam.
| Feature | Description |
|---|---|
| View All Masks | Browse your masked emails in a clean, searchable list |
| Create New | Generate new masked addresses with custom descriptions |
| Enable/Disable | Toggle masks on or off without deleting them |
| Edit Details | Update description, domain, and URL associations |
| Quick Copy | One-tap copy to clipboard |
| Archive | Disable masks reversibly (mail bounces, restorable later) |
| Search & Filter | Find specific masks instantly, filter by Active / Off / Archived |
| Sorted by Activity | Newest mail at the top, not just newest creation |
| Warm-Ink Design | Custom parchment/ink palette, Instrument Serif + JetBrains Mono typography |
| Light & Dark | Both modes follow system theme |
| 20 Languages | Full localization with in-app language picker |
| Settings | Language selection, contact/feedback, and logout |
Screenshots coming soon
- Go to the Releases page
- Download the latest APK file
- Enable "Install from unknown sources" if prompted
- Install the APK
# Clone the repository
git clone https://github.com/pawelorzech/FastMask.git
cd FastMask
# Build debug APK
./gradlew assembleDebug
# Or build release APK
./gradlew assembleReleaseThe APK will be generated in app/build/outputs/apk/
- Android 8.0 (API 26) or higher
- Fastmail account with API access
- Log in to Fastmail
- Navigate to Settings → Privacy & Security → Integrations → API tokens
- Click New API token
- Name it (e.g., "FastMask")
- Select scope: Masked Email (read/write)
- Copy the generated token
- Open the app
- Paste your API token
- Tap "Log in"
Your token is stored securely using Android's EncryptedSharedPreferences.
| Category | Technology |
|---|---|
| Language | Kotlin 100% |
| UI Framework | Jetpack Compose (BOM 2024.09) |
| Design System | Custom warm-ink palette on top of Material 3 primitives |
| Typography | Instrument Serif (display) + Inter Tight (text) + JetBrains Mono (mono), via Google Fonts |
| DI | Hilt |
| Networking | Retrofit + OkHttp |
| Serialization | Kotlinx Serialization |
| Async | Coroutines + Flow |
| API Protocol | JMAP (Fastmail's native protocol) |
The app follows Clean Architecture principles with MVVM pattern:
app/
├── data/ # Data layer
│ ├── api/ # JMAP API service & models
│ ├── local/ # Secure token storage
│ └── repository/ # Repository implementations
│
├── domain/ # Business logic layer
│ ├── model/ # Domain models
│ ├── repository/ # Repository interfaces
│ └── usecase/ # Use cases
│
├── di/ # Dependency injection modules
│
└── ui/ # Presentation layer
├── auth/ # Login screen
├── list/ # Masked email list
├── create/ # Create new mask
├── detail/ # View/edit mask details
├── settings/ # Settings screen
├── components/ # Reusable UI components
├── navigation/ # Navigation setup
└── theme/ # Material 3 theming
- Local Storage Only: Your API token is stored locally using Android's EncryptedSharedPreferences
- Direct API Communication: The app communicates directly with Fastmail's servers - no intermediary servers
- No Tracking: Zero analytics, telemetry, or data collection
- Open Source: Full source code available for audit
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Install Android Studio (latest stable)
- Clone the repository
- Open the project in Android Studio
- Sync Gradle and run on an emulator or device
- Follow Kotlin coding conventions
- Use meaningful commit messages
- Write tests for new features when applicable
- Redesign: Complete UI overhaul to a warm-ink visual language — parchment background, Instrument Serif display type, JetBrains Mono labels, single amber accent
- New typography: Three Google Fonts (Instrument Serif, Inter Tight, JetBrains Mono) replace the Material default
- Sort by activity: List defaults to most recently active mask at the top (uses
lastMessageAt, falls back tocreatedAt) - Archive instead of Delete: Destructive action renamed to "Archive" with restorable copy ("Mail sent here will bounce. You can restore it later.")
- New custom components:
PillButton,PillIconButton,StateDot,StatePill,DesignCard,DesignInputreplacing M3 stock variants - Filter pills with counts: Active / Off / Archived show live count next to the label
- Performance: Removed per-item animations and pre-computed timestamps for smoother scrolling on large libraries (100+ masks)
- Removed: Material You / dynamic color (replaced by fixed warm palette)
- Fixed: R8/ProGuard rules for Retrofit suspend functions and kotlinx.serialization on release builds
- i18n: English and Polish strings rewritten for the new design language; other 18 locales fall back to English for new keys
- New: Settings screen with language picker, contact button, and logout
- New: Localization support for 20 languages (English, Chinese, Spanish, Hindi, Arabic, Portuguese, Bengali, Russian, Japanese, French, German, Korean, Italian, Turkish, Vietnamese, Polish, Ukrainian, Dutch, Thai, Indonesian)
- New: In-app language override using AppCompatDelegate
- Improved: All UI strings now use centralized string resources
- Fixed: Choppy navigation transitions between Settings and List screens
- Fixed: Language preference now persists correctly across app restarts
- Improved: Navigation animations simplified (slide-only, 220ms with FastOutSlowInEasing)
- Improved: Soft refresh prevents shimmer loading when returning from Settings
- Fixed: Login crash caused by
ParameterizedTypecasting error at runtime - Improved: TokenStorage now uses lazy initialization for EncryptedSharedPreferences
- Stability: Deferred crypto initialization prevents reflection errors during Hilt injection
- Fixed: ProGuard/R8 minification crash with
ParameterizedTypecasting error - Improved: Added proper ProGuard rules for Google Tink (security-crypto dependency)
- Stability: Release builds now work correctly with code minification enabled
- Manage Fastmail masked emails
- Create, edit, enable/disable, and delete masks
- Material 3 dynamic theming
- Secure token storage with EncryptedSharedPreferences
- Add screenshots to README
- Widget for quick mask creation
- In-app accent picker (amber / ink / sage / plum / cobalt)
- Bulk archive
- Custom design system (warm-ink palette, serif/mono typography)
- Sort by latest activity
- Localization support (20 languages)
- Settings screen with language picker
This project is licensed under the MIT License - see the LICENSE file for details.
- Fastmail for their excellent email service and JMAP API
- JMAP for the open standard specification
- The Android and Kotlin communities for amazing tools and libraries
Made with Kotlin and Jetpack Compose
