---
title: "Charting a Course from Android Compose Navigation 2 to Navigation 3"
source: "/writing/charting-a-course-from-android-compose-navigation-2-to-navigation-3/"
---

Article

# Charting a Course from Android Compose Navigation 2 to Navigation 3

Lucas Kivi

July 27, 2026

A toucan on a boat holding a map that desribes how to navigate the migration from Nav2 to Nav3!

The goal of this article, which is the first in a series, is to serve as a guide for Android developers in their migration from Navigation 2.0 to Navigation 3.0, a potentially harrowing but extremely worthwhile journey.

Android Navigation 2.0 has been with us since 2019, and it was thought up before Compose even existed. It is chock full of complex implicit behavior and extremely abstract methods because it was built to civilize Fragment-era navigation. This feels clumsy in the Jetpack Compose-era of descriptive Kotlin-based UI where you have complete ownership of screens and their entry points.

The [foundational principles](https://android-developers.googleblog.com/2025/05/announcing-jetpack-navigation-3-for-compose.html) Navigation 3.0 is based on are:

-   **You own the back stack:** The back stack is just a list you can modify at will.
-   **Get out of your way:** Give developers the wheel! Nav3 is open and extensible, not a black box.
-   **Pick your building blocks:** Instead of embedding all behavior in the library, give the developers building blocks so they can build their own opinionated solutions.

This all boils down to more explicit control and that gets me fired up.

### Should I Migrate?

The short answer is _absolutely_! It is [stable](https://android-developers.googleblog.com/2025/11/jetpack-navigation-3-is-stable.html?utm_source=chatgpt.com) as of November 19th, 2025. This is the way of the future and we all know how that works. Nav2 will gradually be deprecated and migration will become necessary. And lastly, it is simply much better. I know, because I already completely migrated an enterprise app with millions of users.

### My Experience

To me, the past few navigation frameworks felt confusing and abstract due to their overwhelmingly implicit nature.

-   What the hell are `navOptions`, what do they do, and what are they doing to my back stack?
-   Why don't I have a simple window into what is on my back stack?
-   Navigate _up_?
-   With Compose Nav2 I can't start the nav graph with multiple entries???

With Nav3, those issues drift out to sea. We get explicit control over stack behavior, which sounds simple, but in practice it changes the whole feel of the API. It feels closer to how navigation actually works in my head, and that makes it much easier to reason about. There is still abstraction behind the component, of course, but it feels better placed. It feels less like "call a magic controller method and hope the stack does what you hoped," and more like "model the stack and interactions you actually want."

I will give credit where it is due: **Google really seems to have nailed this one**. Android navigation APIs have been a common source of frustration for a long time, so it is worth saying plainly when something feels like a real step forward. Every other iteration has come with gotchas, but I have not yet found any in these waters. Nav3 is a meaningful improvement.

### Setting Sail

The goal of migrating to Nav3 is not just to swap APIs, but to adopt the patterns the new systems imply. Some of these changes require some thought. This guide documents some of the more interesting architectural decisions I encountered. Click the following articles to learn more!

1.  [Move navigation arguments out of](/writing/charting-a-course-from-android-compose-nav2-to-nav3-manually-inject-navigation-arguments) `[SavedStateHandle](/writing/charting-a-course-from-android-compose-nav2-to-nav3-manually-inject-navigation-arguments)` .
2.  Use metadata to control navigation animations. (Coming soon)
3.  Rework bottom sheet navigation destinations. (Coming soon)
4.  ... more to come here.

### Conclusion

Migrating from Nav2 to Nav3 went swimmingly for me, so I hope you all have a similar experience using this guide for buoyancy while navigating these waters. Nav3 is a much nicer system to work with than Nav2. The library design gives you direct back stack control, in practice you can make all of the changes you want, and those changes result in the behavior you expect.

_Lucas navigates Android infested waters at Livefront._

-   Lucas Kivi

    Software Engineer

    [More from Lucas](/team/lucas-kivi/)

    Lucas Kivi

### Tags

[Mobile Apps](/insights/all/?topic=mobile-apps)

### Share

-   Copied

## View these next.

[See all](/insights/all/?type=writing)

-   [

    Article

    How To Sabotage Your Project Using Inconsistency

    Collin Flynn

    ](/writing/how-to-sabotage-your-project-using-inconsistency/)
-   [

    Article

    Unit Testing race conditions by creating chaos (Swift)

    Sean Berry

    ](/writing/unit-testing-race-conditions-by-creating-chaos-swift/)
-   [

    Article

    UIApplicationDelegate call sequence reference

    Sean Berry

    ](/writing/uiapplicationdelegate-call-sequence-reference/)
