A production-oriented Android flight & travel companion — built to demonstrate modern Kotlin, Compose, and clean architecture.
Portfolio project by ALI Mohammadzadeh — Android developer focused on scalable architecture, polished UX, and maintainable Kotlin codebases.
Open to opportunities across Europe (EU/EEA) · Remote or relocation.
AtlasFly is not a tutorial clone. It is a deliberately structured Android application that mirrors how I build software in professional teams:
- Modular boundaries that scale with team size and feature velocity
- Unidirectional data flow (MVI-style) for predictable UI state
- Security-first auth with Firebase-managed sessions, encrypted metadata, and OAuth providers
- Modern Android stack aligned with what EU product companies expect in 2026
If you are a recruiter, hiring manager, or fellow Android developer, this repository is meant to answer one question quickly: Can this engineer design, implement, and document a real Android product?
Placeholder: Add your screen recording to
docs/videos/atlasfly-demo.mp4
Recommended: 60–90 seconds covering splash → auth → email verification → home navigation.
Suggested hosting options: YouTube (unlisted), Loom, or GitHub release assets.
| Splash & branding | Authentication | Email verification |
|---|---|---|
![]() |
![]() |
![]() |
| Splash screen | Login / Sign up | Verify email flow |
| Social sign-in | Deep link handling | Home (WIP) |
|---|---|---|
![]() |
![]() |
![]() |
| Google & GitHub OAuth | Email link opens app | Main destination |
Placeholder: Drop PNG/WebP files into
docs/screenshots/.
Seedocs/media/README.mdfor naming conventions and capture tips.
| Area | What to look at |
|---|---|
| Architecture | 17-module Clean Architecture organized across app, feature, service, and core |
| UI pattern | Compose + MVI (UiState / UiIntent / Event) in ViewModels |
| Auth | Email/password, Google, GitHub via Supabase Auth |
| Security | Auth tokens encrypted with Google Tink + DataStore |
| Navigation | Type-safe routes with Navigation 3 |
| Deep links | Email verification handled in MainActivity → AtlasFlyViewModel |
| DI | Hilt modules across network, local, and auth layers |
| Build hygiene | Gradle Version Catalog, KSP, Kotlin DSL |
- 17-module project scaffold (
app,core,feature,service) - Jetpack Compose UI with Material 3
- Splash screen, auth gate, and main app shell with bottom navigation
- Email/password sign-up and sign-in
- Google OAuth through Supabase Auth
- GitHub OAuth login
- Sign-up email verification screen with resend
- Supabase deep links for email verification, OAuth, and password recovery
- Encrypted auth token persistence (Tink + DataStore)
- Ktor HTTP client with debug network inspection (Chucker)
- Hilt dependency injection across layers
- Use-case driven domain layer (
LoginUseCase,SignUpUseCase, …)
- Explore destinations and flight discovery
- Trip management and itinerary planning
- Planner workflows
- Offline caching strategy
- Unit & UI test coverage expansion
- CI pipeline (build, lint, test)
AtlasFly follows Clean Architecture with explicit module boundaries and a feature-first organization. The app module assembles the application, feature modules own user-facing destinations, service modules implement product-level domain and data concerns, and core modules provide reusable foundations.
┌─────────────────────────────────────────────────────────────┐
│ :app │
│ Compose UI · Navigation · Deep links · Hilt entry point │
└──────────────────────────┬──────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌───────────┐ ┌────────────┐ ┌─────────────┐
│ :feature │ │ :service │ │ :core │
│ auth │ │ domain │ │ network │
│ home │ │ data │ │ local │
│ search … │ │ (Supabase) │ │ navigation │
└───────────┘ └────────────┘ └─────────────┘
User action → UiIntent → ViewModel → UseCase → Repository → DataSource
↑ │
└──────── StateFlow<UiState> ←─────────────────┘
AtlasFly/
├── app/ # Application entry point, app shell, and feature assembly
├── core/
│ ├── data/ # Shared data-layer abstractions
│ ├── design-system/ # Reusable Compose theme, tokens, and components
│ ├── domain/ # Shared domain-layer abstractions
│ ├── lib/ # Framework-independent shared Kotlin utilities
│ ├── local/ # Encrypted DataStore and Tink-based local storage
│ ├── navigation/ # Serializable, type-safe Navigation 3 routes
│ ├── network/ # Ktor client, serialization, logging, and Chucker
│ └── presentation/ # Shared Compose and ViewModel utilities
├── feature/
│ ├── auth/ # Login, signup, OAuth, and email verification
│ ├── explore/ # Destination and travel discovery UI
│ ├── home/ # Home destination UI
│ ├── planner/ # Trip-planning UI
│ ├── profile/ # Profile and settings UI
│ └── trips/ # Saved and active trips UI
├── service/
│ ├── domain/ # Auth use cases, models, repository contracts
│ └── data/ # Supabase Auth, local/remote data sources
└── gradle/libs.versions.toml
| Category | Technology |
|---|---|
| Language | Kotlin 2.4.10 |
| UI | Jetpack Compose, Material 3 |
| Architecture | Clean Architecture, MVI-style UDF, multi-module |
| DI | Hilt 2.60.1, KSP 2.3.10 |
| Navigation | Navigation 3 (type-safe routes) |
| Auth | Supabase Auth, Google & GitHub OAuth |
| Networking | Ktor 3.5.x (OkHttp engine), kotlinx-serialization |
| Image loading | Coil 3.5.x |
| Local storage | DataStore 1.2.1, Google Tink 1.23.0 |
| Debug tooling | Sanitized Ktor request/header logging |
| Build | AGP 9.2.1, Gradle 9.5.0, Version Catalog |
| Min / Target SDK | 24 / 37 |
Dependency versions are centralized in gradle/libs.versions.toml.
These map directly to common EU Android job requirements:
| Skill | Evidence in this repo |
|---|---|
| Kotlin | Coroutines, Flow, sealed interfaces, extension functions |
| Jetpack Compose | Declarative UI, state hoisting, lifecycle-aware collection |
| Clean Architecture | Domain use cases, repository pattern, module separation |
| Dependency Injection | Hilt modules for network, local storage, auth |
| Security awareness | Firebase-managed tokens, encrypted metadata, OAuth, and deep-link validation |
| Modern Gradle | Version catalog, Kotlin DSL, multi-module builds |
| Product thinking | Auth gate, verification UX, error messaging, loading states |
- Android Studio Ladybug (2024.2) or newer
- JDK 17+
- Android SDK 37
- Enable Email, Google, and GitHub providers in Supabase Authentication
- Add
atlasfly://authto Authentication → URL Configuration → Redirect URLs - Configure the Google and GitHub provider client credentials in Supabase
- Add the project publishable key to the ignored
local.propertiesfile:
SUPABASE_PUBLISHABLE_KEY=sb_publishable_your_keyOnly use a publishable key in the Android app. Never add a secret or service-role key.
Add the AtlasFly Supabase publishable key to the ignored local.properties file, or provide the
same name as a Gradle property or environment variable:
SUPABASE_PUBLISHABLE_KEY=sb_publishable_your_keyOnly a publishable key belongs in the Android application. Never use a Supabase secret or legacy
service_role key in this property.
./gradlew assembleDebug
./gradlew installDebug./gradlew test
./gradlew connectedAndroidTest- Package scheme:
dev.alimmz.atlasfly.{layer}.{module} - Feature modules own their screens, ViewModels, and UI components
- Service modules encapsulate backend integration (Supabase Auth)
- Core modules provide shared infrastructure consumed by features
- Use cases expose single-responsibility domain operations
- Version catalog: bump dependencies in
gradle/libs.versions.toml, reference vialibs.*
ALI Mohammadzadeh — Android Developer
Building AtlasFly to showcase how I approach real-world Android development: modular architecture, thoughtful UX, and code that teams can maintain and extend.
| GitHub | Alimmzdev |
| Location | Open to EU opportunities (remote / relocation) |
| Focus | Kotlin · Jetpack Compose · Clean Architecture · Product-quality UX |
Recruiters: A video walkthrough and screenshots significantly improve first impressions — see
docs/media/README.mdfor the asset checklist.
MIT License
Copyright (c) 2026 ALI Mohammadzadeh
See LICENSE for full text.





