Skip to content
AlimmzdevPublic

About

Offline-First Travel Planner for Android

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

AtlasFly

A production-oriented Android flight & travel companion — built to demonstrate modern Kotlin, Compose, and clean architecture.

Kotlin Jetpack Compose Architecture License

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.


Why this project exists

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?


Demo

Video walkthrough

AtlasFly demo video

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.


Screenshots

Splash & branding Authentication Email verification
Splash screen placeholder Auth screen placeholder Email verification placeholder
Splash screen Login / Sign up Verify email flow
Social sign-in Deep link handling Home (WIP)
Social login placeholder Deep link placeholder Home placeholder
Google & GitHub OAuth Email link opens app Main destination

Placeholder: Drop PNG/WebP files into docs/screenshots/.
See docs/media/README.md for naming conventions and capture tips.


Highlights for reviewers

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

Features

Implemented

  • 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, …)

Roadmap

  • 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)

Architecture

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 │
   └───────────┘    └────────────┘    └─────────────┘

Data flow (MVI-style)

User action → UiIntent → ViewModel → UseCase → Repository → DataSource
                ↑                                              │
                └──────── StateFlow<UiState> ←─────────────────┘

Module map

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

Tech stack

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.


Skills demonstrated

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

Getting started

Prerequisites

  • Android Studio Ladybug (2024.2) or newer
  • JDK 17+
  • Android SDK 37

Supabase setup (required for auth)

  1. Enable Email, Google, and GitHub providers in Supabase Authentication
  2. Add atlasfly://auth to Authentication → URL Configuration → Redirect URLs
  3. Configure the Google and GitHub provider client credentials in Supabase
  4. Add the project publishable key to the ignored local.properties file:
SUPABASE_PUBLISHABLE_KEY=sb_publishable_your_key

Only use a publishable key in the Android app. Never add a secret or service-role key.

Supabase Edge Function setup

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_key

Only a publishable key belongs in the Android application. Never use a Supabase secret or legacy service_role key in this property.

Build & run

./gradlew assembleDebug
./gradlew installDebug

Run tests

./gradlew test
./gradlew connectedAndroidTest

Project conventions

  • 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 via libs.*

About the author

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.md for the asset checklist.


License

MIT License

Copyright (c) 2026 ALI Mohammadzadeh

See LICENSE for full text.

About

Offline-First Travel Planner for Android

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages