Skip to content
Back to skills

Web Router

ASecurity

How to use @owlmeans/web-router — the DEFAULT OwlMeans in-browser routing plugin (History API + pure matcher + React provider/outlet/hooks). Auto-invoked when wiring web routing or importing the browser plugin.

  • 3 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 22, 2026
developmenttypescriptgoreactnodeapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add owlmeans/common --skill web-router --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Web Router?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Web Router
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/owlmeans-web-router/badge)](https://www.skillsdirectory.com/skills/owlmeans-web-router)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: web-router
description: How to use @owlmeans/web-router — the DEFAULT OwlMeans in-browser routing plugin (History API + pure matcher + React provider/outlet/hooks). Auto-invoked when wiring web routing or importing the browser plugin.
user-invocable: false
---

# @owlmeans/web-router

**Layer:** Web (React), build level L2
**Install:** `"@owlmeans/web-router": "^0.1.18-rc.50"` in `dependencies`

This package **is the default OwlMeans in-browser router** — a minimal, react-router-free
implementation of standard URL routing over the browser History API. It registers itself as a
`RouterPlugin` on the `@owlmeans/router` host. (react-router is the separate opt-in
`@owlmeans/web-router-react-router` package.)

## Key Exports

| Export | Description |
|--------|-------------|
| `appendWebRouter(ctx)` | Register the OwlMeans browser plugin on a context's router host (idempotent via `ensureRouterService`). Called transparently by `@owlmeans/web-client`. |
| `makeBrowserRouterPlugin()` | The `RouterPlugin` itself (alias `BROWSER_ROUTER`, priority 0). |
| `BROWSER_ROUTER` | The plugin's alias string, `'owlmeans-browser-router'` — name the constant rather than the literal when selecting or overriding the plugin. |
| `makeWebRouterService()` | Back-compat: a host pre-loaded with the browser plugin. |
| `BrowserRouterProvider`, `Outlet` | React provider/outlet components. |
| `RouteChain` | Renders the matched chain from a given depth, skipping `Component`-less matches (used by the provider and `Outlet`). |
| `useParams` / `useLocation` / `useNavigate` / `useSearchParams` | The plugin's hooks (usually reached via `context.router().…`). |
| `createBrowserHistory()` | History API wrapper (push/replace/go/popstate). |

## How it works

- `compile(routes)` flattens + ranks the neutral `RouteObject[]` into matchable branches (using the
  `@owlmeans/router` matcher). No async, no react-router.
- `BrowserRouterProvider` subscribes to history, re-matches on navigation, and renders the match
  chain via `RouteChain`; `<Outlet/>` renders the next-deeper match (depth tracked via context).
  Composes unchanged with the `@owlmeans/client` route renderer (parent components emit `<Outlet/>`).
- **Component-less matches are pass-through** — exactly like react-router's implicit `<Outlet/>` for
  element-less routes. `@owlmeans/client` emits `RouteObject`s with no `Component` for entrypoints
  that have no handler (grouping entrypoints such as `client-authentication` →
  `client-authentication:authentication`), so rendering only the exact node at a depth would blank
  the whole subtree. `RouteChain` walks down to the first match that has a `Component`, and the
  `OutletContext` depth it publishes is that match's depth, so nested outlets stay aligned.
- Supported route syntax: static segments, `:param`, nested (parent/child), index (`default:true`).
  **No splat/optional yet** (a seam is reserved).

## Usage

Wired transparently by `@owlmeans/web-client` / `@owlmeans/web-panel`. To switch an app to
react-router instead, call `appendReactRouter(ctx)` from `@owlmeans/web-router-react-router` in
your `makeContext` — its higher priority wins the cascade.

```typescript
import { appendWebRouter } from '@owlmeans/web-router'
appendWebRouter(context) // default; OwlMeans browser routing
```

## Depends On

- `@owlmeans/router` (host + matcher), `@owlmeans/context`
- peer `react` (no react-router)

## Related

- [[router]] (host) · [[router-plugins]] (authoring) · `web-router-react-router` (opt-in RR plugin)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…