Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 77 additions & 82 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,70 @@
# FlowState

**A modern, intuitive task management app built with Jetpack Compose and Clean Architecture**
**Tasks, habits and notes — all in one place. Free, open-source, 100% offline.**

[![Kotlin](https://img.shields.io/badge/Kotlin-2.2.10-blue.svg)](https://kotlinlang.org)
[![Compose](https://img.shields.io/badge/Compose-1.10.1-blue)](fhttps://developer.android.com/jetpack/compose)
[![Room](https://img.shields.io/badge/Room-2.8.4-green)](https://developer.android.com/training/data-storage/room)
[![Hilt](https://img.shields.io/badge/Hilt-2.57.2-red)](https://dagger.dev/hilt/)
No accounts, no ads, no tracking, no servers. Your data never leaves your phone.

[![Release](https://img.shields.io/github/v/release/Markel15/FlowState)](https://github.com/Markel15/FlowState/releases/latest)
[![License](https://img.shields.io/github/license/Markel15/FlowState)](LICENSE)
[![Android](https://img.shields.io/badge/Android-12%2B_(API_31)-3DDC84?logo=android&logoColor=white)](https://www.android.com)

## Download

**Get the latest APK — no store, no sign-up:**

[![Download FlowState APK](https://img.shields.io/badge/⬇_Download-FlowState_APK-2ea44f?style=for-the-badge&logo=android&logoColor=white)](https://github.com/Markel15/FlowState/releases/latest/download/app-release.apk)

1. Download the APK (Android 12 or newer).
2. Open it and tap **Install** — Android will ask you to allow installs from your browser once.
3. That's it. Updates install on top of the previous version and the data remains.

> 💡 **Tip:** use [Obtainium](https://obtainium.imranr.dev/) to get automatic updates straight from these GitHub releases.
> Older versions and changelogs live in [Releases](https://github.com/Markel15/FlowState/releases).

## Screenshots

<p align="center" width="100%">
<img src="screenshots/Frame1.png" width="32%" /><img src="screenshots/Frame2.png" width="32%" /><img src="screenshots/Frame3.png" width="32%" /><img src="screenshots/Frame4.png" width="32%" /><img src="screenshots/Frame5.png" width="32%" /><img src="screenshots/Frame6.png" width="32%" />
<img src="screenshots/Frame1.png" width="32%" alt="Task list" /><img src="screenshots/Frame2.png" width="32%" alt="Misc" /><img src="screenshots/Frame3.png" width="32%" alt="Calendar" /><img src="screenshots/Frame4.png" width="32%" alt="Habits" /><img src="screenshots/Frame5.png" width="32%" alt="Habit details" /><img src="screenshots/Frame6.png" width="32%" alt="Habit details" />
</p>

## Features

### Implemented
- **Task Management**: Create, edit and delete tasks
- **Priority System**: Set task priorities (High, Medium, Low, None)
- **Sub-tasks**: Break down tasks into manageable sub-tasks
- **Swipe Actions**: Swipe to delete tasks with smooth animations
- **Drag & Drop**: Reorder tasks via intuitive drag handles
- **Auto-save**: Changes are saved automatically when editing a task
- **Material 3**: Modern design
- **Task Scheduling**: With due dates and reminders
- **Calendar** view
- **Habit Tracking**: Build daily routines and track streaks
- **Widgets** for basic habits

### In Development
- **Widgets**: More widgets
- **Mood Tracking**: Log daily emotions and view trends
- **Improve UX**: with the subtasks
- Any new **suggestion**
**Tasks**
- Create, edit and delete tasks with **sub-tasks**, priorities and due dates
- Swipe actions and drag & drop reordering
- Auto-save while editing and reminders

**Habits**
- Boolean and **numeric** habits (kilometers, glasses of water, minutes…)
- Streaks and progress statistics
- Home-screen **widgets**

**Notes, checklists & ideas** — quick capture built in

**Calendar view** of your schedule

**Make it yours**
- Material 3 Expressive design with **Material You** dynamic colors
- Pure black/white theme options and system font support
- Reorderable category tabs — organize the app your way
- English & Spanish

**Privacy by design**
- 100% offline: no accounts, no analytics, no tracking
- Local database only, with **backup & restore**

### Planned / in progress
- More widgets
- Mood tracking
- Your suggestions → [open an issue](https://github.com/Markel15/flowstate/issues)

## Motivation

I wanted to build a fully-featured Android app completely **free**, **ad-free**, and **privacy-focused** — no servers, no tracking, no data collection, works 100% offline.
This project was mainly a way for me to learn modern **Kotlin** (coming from a Java-only background) while creating something truly **customizable** that I (and others) can easily modify, extend and adapt to different needs.
I wanted to build a fully-featured Android app that is completely **free**, **ad-free** and **privacy-focused** — no servers, no tracking, no data collection, working 100% offline.
This project was also a way for me to learn modern **Kotlin** (coming from a Java-only background) while creating something truly **customizable** that others can easily modify, extend and adapt.

## Getting Started
<details>
<summary><b>Build from source</b></summary>

### Prerequisites
- Android Studio
Expand All @@ -52,59 +76,14 @@ This project was mainly a way for me to learn modern **Kotlin** (coming from a J
```bash
git clone https://github.com/Markel15/flowstate.git
cd flowstate

2. **Open in Android Studio**

-Open Android Studio

-Select "Open an Existing Project"

-Navigate to the cloned directory

3. **Build and Run**

-Connect an Android device or start an emulator (API 31+)

-Click the Run button
```
2. **Open in Android Studio** → *Open an Existing Project* → select the cloned directory.
3. **Build and Run** on a device or emulator running API 31+.

## How to Contribute
</details>

We welcome contributions! Here's how you can help:

### Reporting Bugs
1. Check the [Issues](https://github.com/Markel15/flowstate/issues) to avoid duplicates
2. Create a new issue with:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- Screenshots/videos if possible
- Device/OS information

### Suggesting Features
1. Check existing feature requests
2. Create an issue with:
- Use case description
- Mockups/wireframes if applicable
- Priority justification

### Submitting Code
1. **Fork the repository**
2. **Create a feature branch**
```bash
git checkout -b feature/amazing-feature
3. **Make your changes**

- Write tests when possible
- Update documentation when possible
4. **Commit your changes**
```bash
git commit -m 'Add some amazing feature'
5. Push to the branch
```bash
git push origin feature/amazing-feature
6. Open a Pull Request

## Architecture
<details>
<summary><b>Architecture & tech stack</b></summary>

FlowState follows **Clean Architecture** with a clear separation of concerns:

Expand All @@ -117,17 +96,14 @@ UI Layer (Presentation)
Domain Layer (Business Logic)
├── Use Cases (Interactors)
├── Repository Interfaces
└── Domain Models (Task, SubTask, Priority)
└── Domain Models (Task, SubTask, Habit)

Data Layer (Infrastructure)
├── Repository Implementations
├── Local Data Source (Room)
└── Data Models (Entities)
```


## Tech Stack

| Component | Technology |
|----------------|---------------------------|
| **UI Framework** | Jetpack Compose |
Expand All @@ -137,3 +113,22 @@ Data Layer (Infrastructure)
| **Async** | Kotlin Coroutines |
| **Navigation** | Navigation 3 |
| **Animations** | Compose Animation APIs |

[![Kotlin](https://img.shields.io/badge/Kotlin-2.2.10-blue.svg)](https://kotlinlang.org)
[![Compose](https://img.shields.io/badge/Compose-1.10.1-blue)](https://developer.android.com/jetpack/compose)
[![Room](https://img.shields.io/badge/Room-2.8.4-green)](https://developer.android.com/training/data-storage/room)
[![Hilt](https://img.shields.io/badge/Hilt-2.57.2-red)](https://dagger.dev/hilt/)

</details>

## How to contribute

Contributions are welcome!

- **Found a bug?** Check the [Issues](https://github.com/Markel15/flowstate/issues) to avoid duplicates, then open one with a clear description, steps to reproduce, expected vs actual behavior, and screenshots/device info if possible.
- **Have an idea?** Open an issue describing the use case (mockups welcome).
- **Want to code?** Fork the repo, create a feature branch (`git checkout -b feature/amazing-feature`), make your changes (tests and docs when possible), and open a Pull Request.

## License

FlowState is open-source software licensed under the [Apache License 2.0](LICENSE).
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import com.markel.flowstate.feature.settings.AboutScreen
import com.markel.flowstate.feature.settings.AppearanceScreen
import com.markel.flowstate.feature.settings.BackupScreen
import com.markel.flowstate.feature.settings.BottomNavConfigScreen
import com.markel.flowstate.feature.settings.AchievementsScreen
import com.markel.flowstate.feature.settings.CategoriesScreen
import com.markel.flowstate.feature.settings.SettingsScreen

Expand Down Expand Up @@ -170,6 +171,7 @@ fun FlowStateNavDisplay(
onNavigateToAppearance = { navigator.navigate(FullScreenKey.Appearance) },
onNavigateToBottomNavConfig = { navigator.navigate(FullScreenKey.BottomNavConfig) },
onNavigateToCategories = { navigator.navigate(FullScreenKey.Categories) },
onNavigateToAchievements = { navigator.navigate(FullScreenKey.Achievements) },
onNavigateToIntegrations = { navigator.navigate(FullScreenKey.Integrations) },
onNavigateToAbout = { navigator.navigate(FullScreenKey.About) },
notificationsEnabled = notificationsEnabled,
Expand Down Expand Up @@ -278,6 +280,12 @@ fun FlowStateNavDisplay(
) {
CategoriesScreen(onBack = { navigator.goBack() })
}

entry<FullScreenKey.Achievements>(
metadata = fullScreenVerticalSlide()
) {
AchievementsScreen(onBack = { navigator.goBack() })
}
}

CompositionLocalProvider(LocalSharedTransitionScope provides sharedTransitionScope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ sealed interface FullScreenKey : NavKey {
@Serializable data object BottomNavConfig : FullScreenKey
@Serializable data object Integrations : FullScreenKey
@Serializable data object Categories : FullScreenKey
@Serializable data object Achievements : FullScreenKey
}

// ─────────────────────────────────────────────────────────────────────────────
Expand Down
Loading
Loading