Axonpack
Reference

Navigation tab

Toolbar, the navigator tree, history, filters, the move detail sheet and the Open screen sheet.

Every move the navigator made, newest first, under a tree of every navigator that is mounted. Holds the 200 most recent moves.

[⏺] [⊘] │ [Filter] [Open screen]
● root
├ Home
└ ◉ Details  id: 42   on screen  [Back]
History 12                     [⧉] [⤓]

The tab is in the panel only when expo-router or @react-navigation/native is installed. How it finds a navigator is in the Navigation guide.

Waiting state

Before a navigator is attached, the tab shows what it is waiting for instead of an empty list.

Router foundWhat it says
Expo RouterWaiting for Expo Router. The navigator is picked up once the router's root has mounted.
React NavigationWaiting for a navigation container, with a snippet showing both ways in: the provider inside the container, or useDevtoolsNavigation(ref).

An empty ref handed to the hook is checked again every 250 ms for 20 seconds, since a container can mount after the effect that handed it over.

Toolbar

ControlWhat it does
Record / ClearAs on the panel. Paused, the tree still follows the app; only the history stops.
FilterShows the filter fields under the History header.
Open screenOpens the Open screen sheet.

navigation.disabledByDefault opens the tab paused. See the provider reference.

Every container is drawn as a track. A container handed over from a screen of another container hangs under that screen instead of starting its own track.

ElementMeaning
Container chipThe container's name, at the top of its track. Each container has its own colour, used for its rail and chip.
Route nodeOne per route in a navigator. Filled for a route on the path to the current screen, hollow for the rest.
On screenThe larger node with a ring and an on screen pill: the active route of the deepest active navigator.
ParamsUp to three key: value pairs on the route's line, then +n more. Tap the route to open its params as a tree.
Hosted flowA route that holds another container draws that container's track under it. Tap the route to show or hide it. Shown by default when the route is on the path to the current screen.
BackBeside the on-screen route. Goes back in that route's container. Dimmed when there is nothing to go back to; pressing it then says so.

A navigator inside an inactive route is not drawn, because it is not mounted. A container with no navigator in it yet reads root: no navigator mounted in it yet.

History

The History header carries the row count and two buttons. Tap the header to collapse the list.

ButtonWhat it does
Copy as MarkdownCopies the filtered rows, oldest first, with the current route on top and how long each screen stayed. Names the container on each line when there is more than one.
ExportThe filtered rows as JSON through the OS share sheet, oldest first, under a schemaVersion. iOS offers it as a file named navigation-log-<time>.json; Android shares the text.

Filters

FieldWhat it does
Search boxMatches the action, the container, both route names, the path, the params and the payload. Match case, whole word and regex modes.
ContainerAll (n) and one chip per container with its count. Shown only when the history has more than one container.

Filters and the open or closed state of History are kept when you leave the tab.

A move row

ElementMeaning
IconThe kind of move. Accent for forward moves (Navigate, Push, Preload, Jump to), muted for backward ones (Go back, Pop, Pop to, Pop to top) and Set params, warning colour for Replace and Reset.
ActionThe action's type in words: GO_BACK reads Go back. A container's first row is Start. A state change with no action ahead of it is Changed.
ContainerA badge with the container's name, once the history has more than one.
no changeThe action left the state as it was, such as navigating to the screen already on top. The row is faded.
TimeWall-clock time of the move.
TitleFrom → To, or only the destination on a container's first row.
PathThe route's URL path, when linking gives it one. Expo Router sets one on every route.
ParamsA one-line JSON preview, cut at 120 characters.
Call sitefile:line of the code that dispatched the move, the nearest frame that is your own code. Raw until the dev server has answered.
On screenHow long the screen this move landed on stayed on top. The newest row reads on screen.

Search matches are highlighted in the title and the params.

Move detail sheet

Tap a row. The header carries the title, Go here again (↻) and Copy as JSON.

FieldWhat it shows
TimeWhen the move happened.
ContainerThe container that moved.
ActionThe action's type in words.
FromThe route on top before the move, or (none).
ToThe route on top after it.
PathThe URL path of the destination, when it has one.
On screenHow long it stayed, still for the newest row, no change for a no-op.
SectionWhat it holds
ParamsThe destination's params as a tree. Open.
Action payloadWhatever the action carried, as a tree. Collapsed.
Dispatched fromThe call stack that dispatched the move, symbolicated against the dev server, with the source around the first frame it can map. Collapsed.
State afterThe whole navigator state after the move. Collapsed.

Go here again navigates the same container to the row's destination with the row's params. If the navigator refuses, an alert says why.

Open screen sheet

FieldWhat it does
ContainerOne chip per attached container, shown when there is more than one. Starts on the container of the screen on screen.
Route nameThe route to open. Suggestion chips below it list the names that container's navigators declare and the routes its history has visited.
Params (JSON)Optional. Must be a JSON object. Picking a suggestion fills it with the params that route had last time, when the field is empty.
Open screenCalls navigate(name, params) on the chosen container.
Deep linkA URL such as myapp://details/42.
Open linkHands the URL to the OS with Linking.openURL, so it reaches your router the way a real link does.

An error from either button, or invalid params, shows under the fields. The sheet closes on success.

What reaches the store

navigation.redact runs on every move before anything stores it. Its result is what the history, the tree, copy, export and crash reports all read. It returns the move or null, and a move it drops, or one it throws on, never updates the tree. The guide has an example.

Moves are readable from code through devtools.navigationStore, newest first. See Hooks and Exported types.

On this page