npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ankhorage/navigator

v3.3.14

Published

Standalone manifest-driven navigator capability for Expo Router across React Native and React Native Web.

Readme

NAVIGATOR

license: MIT npm: v3.3.14 runtime: bun typescript: strict eslint: checked prettier: checked build: checked tests: checked docs: paradox

Standalone manifest-driven Navigator capability for cataloging, validating, planning, generating, and verifying Expo Router navigation.

Usage

Catalog → Validate → Plan → Generate → Verify

Manifest navigation consumes only an AppNavigatorManifest, narrow module bindings, and target context. A separate workspace layout consumes runtime destinations from its owning application, without persisting that workspace into AppManifest.navigator. Neither capability needs the complete AppManifest, themes, secrets, infrastructure, deployment data, or Studio state. @ankhorage/contracts/navigator owns structural parsing; Navigator owns semantic target validation, capability metadata, planning, generation, and Navigator-specific evidence.

The taxonomy stays orthogonal:

| Dimension | Examples | | --- | --- | | Topology | Slot, Stack, Tabs, Drawer, Split View, registered Custom | | Implementation | native, JavaScript, headless, experimental | | Presentation | bottom, top, rail, sidebar, adaptive, custom, two-column, three-column | | Preset | drawer, stack-tabs, stack-tabs-stack, drawer-tabs-stack |

Tabs are always Tabs; top and bottom are presentations. drawer is a complete root preset with direct routes. Presets resolve to ordinary recursive manifest input. Navigator has no flow field: onboarding, survey, setup, checkout, and authentication are app-owned routes, nested navigators, guards, and state. For example, stack-tabs-stack can represent a neutral pre-main sequence followed by Tabs whose branches own Stacks without encoding application semantics.

The programmatic example below returns stable relative files and contents, dependency requirements, diagnostics, support, the resolved plan, and capability IDs. It performs no writes. To materialize the same contract into an Expo app, save the manifest and bindings as JSON and run:

ankh navigator catalog
ankh navigator validate --manifest navigator.json --bindings navigator.bindings.json --platform web --expo-router-version "$EXPO_ROUTER_VERSION"
ankh navigator plan --manifest navigator.json --platform web --expo-router-version "$EXPO_ROUTER_VERSION" --json
ankh navigator generate --manifest navigator.json --bindings navigator.bindings.json --platform web --expo-router-version "$EXPO_ROUTER_VERSION" --target ./my-app
ankh navigator verify --manifest navigator.json --bindings navigator.bindings.json --platform web --expo-router-version "$EXPO_ROUTER_VERSION"
bun --cwd ./my-app expo start

Human-readable output is the default; --json emits the stable versioned envelope. Generation requires an explicit target. Custom navigator registries are executable consumer modules passed with --custom-navigators; screen, guard, icon-resolver, and custom Tabs-presentation bindings remain narrow JSON module/symbol records.

Navigator also publishes a deterministic catalog of 22 standalone applications under the repository-root examples/<stable-example-id>/ directories:

drawer, drawer-split-view, drawer-stack, drawer-tabs, drawer-tabs-stack, drawer-tabs-top, registered-custom, slot, split-view-three-column, split-view-two-column, stack, stack-drawer, stack-drawer-stack, stack-drawer-tabs, stack-drawer-tabs-stack, stack-tabs, stack-tabs-stack, stack-tabs-top, tabs, tabs-bottom-tabs-top, tabs-split-view, and tabs-stack.

Generate or compare one app with --id, or omit it for the complete catalog:

ankh navigator examples generate --target .
ankh navigator examples verify --target .
ankh navigator examples generate --id drawer --target .
ankh navigator examples verify --id drawer --target . --json

Each example owns its manifest, narrow bindings, package metadata, and lockfile and uses only registry dependencies. Repository acceptance extends deterministic CLI verification with fresh frozen installs, strict typechecks, the Devtools-managed examples lint configuration, every supported or testing-only Expo export target, and browser runtime checks:

bun run examples:acceptance

Capability metadata separates support, stability, and each verification layer. Experimental Stack and iOS Split View are testing-only. A non-iOS Slot fallback is explicitly not Split View. The checked-in catalog does not turn the existence of a plan into runtime evidence: CI executes install, export, and browser acceptance independently. Simulator and physical-device claims stay unverified until those native environments record evidence.

Studio and future composers read getNavigatorCatalog() and getNavigatorExampleCatalog(), author manifest.navigator, and invoke this same lifecycle. They do not own a second capability or examples table.

Source: docs/readme-usage.ts

import type {
  AppNavigatorManifest,
  NavigatorGenerationBindings,
} from '@ankhorage/contracts/navigator';
import expoRouterPackage from 'expo-router/package.json';

import {
  createNavigatorPlan,
  generateNavigator,
  getNavigatorCatalog,
  getNavigatorExampleCatalog,
  validateNavigator,
  verifyNavigator,
} from '@ankhorage/navigator';

const manifest = {
  type: 'drawer',
  initialRouteName: 'index',
  routes: [
    { name: 'index', label: 'Home', screenId: 'home' },
    { name: 'settings', label: 'Settings', screenId: 'settings' },
  ],
} as const satisfies AppNavigatorManifest;

const bindings = {
  screens: {
    home: { module: '@/screens/HomeScreen', exportName: 'HomeScreen' },
    settings: { module: '@/screens/SettingsScreen', exportName: 'SettingsScreen' },
  },
  guards: {},
} as const satisfies NavigatorGenerationBindings;

const target = {
  platform: 'web',
  expoRouterVersion: expoRouterPackage.version,
} as const;

const diagnostics = validateNavigator(manifest, bindings, target);
const plan = createNavigatorPlan(manifest, target);
const generation = generateNavigator(plan, bindings);
const verification = verifyNavigator(plan, bindings);

console.log({
  catalog: getNavigatorCatalog(),
  examples: getNavigatorExampleCatalog(),
  diagnostics,
  plan,
  generation,
  verification,
});

Generated documentation