Add Flutter Docusaurus Locale
matthiasn/lotti
Add, complete, or audit a locale across a Flutter application's ARB catalogs and a localized Docusaurus manual, including generated localization code, locale selectors, native platform declarations…
Implement and extend routing with zenrouter's Coordinator, RouteManifest, and RouteBinding APIs.
$ npx skills add definev/zenrouter --skill zenrouter -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install definev/zenrouter zenrouter --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/zenrouter .claude/skills/zenrouter && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .claude/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/definev/zenrouter/tree/main/skills/zenrouterType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add definev/zenrouter --skill zenrouter -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install definev/zenrouter zenrouter --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/zenrouter .agents/skills/zenrouter && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .agents/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add definev/zenrouter --skill zenrouter -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install definev/zenrouter zenrouter --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/zenrouter .cursor/skills/zenrouter && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .cursor/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/definev/zenrouter.git --path skills/zenrouter--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add definev/zenrouter --skill zenrouter -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install definev/zenrouter zenrouter --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/zenrouter .gemini/skills/zenrouter && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .gemini/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install definev/zenrouter zenrouterInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add definev/zenrouter --skill zenrouter -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/zenrouter .github/skills/zenrouter && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .github/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add definev/zenrouter --skill zenrouter -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install definev/zenrouter zenrouter --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/definev/zenrouter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/zenrouter .opencode/skills/zenrouter && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "zenrouter" agent skill from https://github.com/definev/zenrouter/tree/main/skills/zenrouter into .opencode/skills/zenrouter/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "zenrouter", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
zenrouterImplement and extend routing with zenrouter's Coordinator, RouteManifest, and RouteBinding APIs.
Zenrouter is an agent skill from definev/zenrouter. Implement and extend routing with zenrouter's Coordinator, RouteManifest, and RouteBinding APIs. Use when adding a route, feature module, layout, redirect, guard, nested coordinator, deep link, or programmatic navigation. Triggers on: route, router, routing, coordinator, CoordinatorModular, RouteModule, RouteModuleBinding, RouteManifest, RouteManifestFragment, RouteBinding, RouteBindingRegistry, NavigationPath, IndexedStackPath, BranchedStackPath, RouteLayout, parentId, parentLayoutKey, layoutKey, bindLayout…
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `ADVANCED.md`, `MIXIN.md` and `NAVIGATION.md`).
It sits in Mobile, covering Cross-platform mobile apps. It works with Flutter. The repository describes itself as: The Ultimate Flutter/Dart Frontend Router for Every Navigation Pattern. The licence is Apache-2.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8c536fc. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dartFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
pub.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Zenrouter loads about 4.3k tokens when it runs. Until then it costs about 175 tokens; SKILL.md has 1,049 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from definev/zenrouter at commit 8c536fc, republished under its Apache-2.0 licence (© definev). 1,049 words, ~4,291 tokens.
.claude/skills/zenrouter/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.This project uses zenrouter. Coordinator
apps declare static topology in a RouteManifest and map IDs to
RouteTarget constructors with RouteBinding. For new graphs, do not
write a parseRouteFromUri switch.
Deep-dive references — read these only when you need the specific topic:
File When to read ADVANCED.md Fragments, typed IDs, deferred bindings, Coordinator-as-Module, tabs/branches, redirect/guard rules MIXIN.md RouteGuard,RouteRedirect,RouteDeepLink,RouteTransition,RouteQueryParameters,RouteRestorableNAVIGATION.md pushvsnavigatevsreplace, plus URI helpers (pushUri,recoverUri)
Inspect the repo, then follow one style:
| What you see | What to do |
|---|---|
@ZenRoute / @ZenLayout / routes.zen.dart | File-based. Add an annotated file under lib/routes/. Run dart run build_runner build. Never edit *.g.dart or routes.zen.dart. |
RouteModuleBinding | Manifest-bound. Add a manifest node, a binding, and a route class. |
parseRouteFromUri switch and no binding mixin | Parser-era. Add a switch case. Do not migrate onto a manifest unless asked. |
Import package:zenrouter/zenrouter.dart (re-exports zenrouter_core).
| Layer | Owns | Must not own |
|---|---|---|
RouteManifest | IDs, URI patterns, parentId, layout kinds | Widgets, constructors, BuildContext |
RouteBinding | ID → RouteTarget factory from RouteManifestMatch | Topology, matching order |
RouteTarget | build(), layout, redirects, guards | URI matching |
Matching and manifest.location(...) share the same pattern. toUri() must
delegate to that helper — never hand-build a parallel path string.
| Type | Purpose |
|---|---|
RouteTarget + RouteUnique | Presentation route; required for Flutter coordinator routes |
RouteManifest<I> | Immutable graph of routes + layouts; owns matching and reverse routing |
RouteManifestFragment<I> | One module's contribution; composed by CoordinatorModular |
RouteBinding<I, T> | Adapter from a matched ID to a RouteTarget |
RouteBindingRegistry<I, T> | Validated complete set of bindings for one manifest |
RouteModuleBinding<T, I> | Mixin on RouteModule / Coordinator — parseRouteFromUri = routeBindings.resolve |
Coordinator<T> | Flutter hub: paths, layouts, MaterialApp.router |
CoordinatorModular<T> | Delegates parsing to modules and composes their fragments |
RouteModule<T> | One feature's paths, layouts, and (via binding) URI parsing |
NavigationPath<T> | Mutable stack; one per layout group |
IndexedStackPath<T> / BranchedStackPath<T> | Tabs / stateful-shell branches — see ADVANCED.md |
RouteLayout<T> | Shell that wraps child routes |
RouteNotFound | Marker mixin — not-found route keeps the requested URI |
Every manifest path starts with / and has no query or fragment.
| Pattern | Matches | Binding reads |
|---|---|---|
/shop | /shop | — |
/products/:id | /products/42 | match.pathParameters['id']! |
/docs/...:slugs | /docs, /docs/a/b | match.restParameters['slugs']! (List<String>) |
/docs/...:slugs/:id | /docs/a/b/start | rest slugs + path id |
:name — one segment. ...:name — zero or more segments. At most one rest parameter.^[A-Za-z_][A-Za-z0-9_]*$. No duplicate names in one pattern.Query strings are not part of the pattern. Read match.uri.queryParameters in the binding if needed.
abstract class AppRoute extends RouteTarget with RouteUnique {
@override
Widget build(covariant Coordinator coordinator, BuildContext context);
}Use when the app is one graph (no feature modules). Mix
RouteModuleBinding and do not override parseRouteFromUri.
enum AppRouteId { home, product }
class AppCoordinator extends Coordinator<AppRoute>
with RouteModuleBinding<AppRoute, AppRouteId> {
static final manifest = RouteManifest<AppRouteId>(
name: 'app',
idCodec: RouteIdCodec.enumValues(AppRouteId.values),
routes: [
RouteManifestRoute(id: AppRouteId.home, path: '/'),
RouteManifestRoute(id: AppRouteId.product, path: '/products/:id'),
],
);
static const location = AppCoordinatorLocation();
@override
late final routeBindings = manifest.bind<AppRoute>(
bindings: [
RouteBinding(id: AppRouteId.home, create: (_) => HomeRoute()),
RouteBinding(
id: AppRouteId.product,
create: (match) => ProductRoute(id: match.pathParameters['id']!),
),
],
notFound: NotFoundRoute.new,
);
}
final class AppCoordinatorLocation {
const AppCoordinatorLocation();
Uri get home => AppCoordinator.manifest.location(AppRouteId.home);
Uri product(String id) => AppCoordinator.manifest.location(
AppRouteId.product,
pathParameters: {'id': id},
);
}
// Wire up:
MaterialApp.router(routerConfig: AppCoordinator())Rules:
RouteManifestRoute must have exactly one binding. Layout IDs must not be bound.notFound is required on a standalone registry so unmatched URIs still produce a route. That class mixes RouteNotFound.RouteIdCodec.enumValues. Generated file-based IDs are class-name strings.Split parsing across RouteModules with RouteModuleBinding. The app
coordinator mixes only CoordinatorModular — never also
RouteModuleBinding (the two both override parseRouteFromUri).
enum ShopRouteId { layout, home, product }
class ShopModule extends RouteModule<AppRoute>
with RouteModuleBinding<AppRoute, ShopRouteId> {
ShopModule(super.coordinator);
static final manifest = RouteManifest<ShopRouteId>(
name: 'shop',
idCodec: RouteIdCodec.enumValues(ShopRouteId.values),
routes: [
RouteManifestRoute(
id: ShopRouteId.home,
path: '/shop',
parentId: ShopRouteId.layout,
),
RouteManifestRoute(
id: ShopRouteId.product,
path: '/shop/products/:id',
parentId: ShopRouteId.layout,
),
],
layouts: [
RouteManifestLayout.stack(id: ShopRouteId.layout, path: '/shop'),
],
);
@override
late final routeBindings = manifest.bind<AppRoute>(
bindings: [
RouteBinding(id: ShopRouteId.home, create: (_) => ShopHomeRoute()),
RouteBinding(
id: ShopRouteId.product,
create: (match) => ProductDetailRoute(id: match.pathParameters['id']!),
),
],
// no notFound — unmatched URIs must return null so other modules can claim them
);
late final shopStack = NavigationPath<AppRoute>.createWith(
coordinator: coordinator, // inherited field = root coordinator
label: 'shop',
)..bindLayout(ShopLayout.new);
@override
List<StackPath> get paths => [shopStack];
}
class AppCoordinator extends Coordinator<AppRoute>
with CoordinatorModular<AppRoute> {
@override
Iterable<RouteModule<AppRoute>> defineModules() => [
AuthModule(this),
ShopModule(this),
];
@override
AppRoute notFoundRoute(Uri uri) => NotFoundRoute(uri: uri);
}Rules:
defineModules() is matching order. Duplicate module runtime types throw.defineModules() is snapshotted once — return a fixed iterable, not a rebuilt factory.notFound. Only the root notFoundRoute (or a standalone registry's notFound) handles misses.coordinator in NavigationPath.createWith.bindLayout(LayoutClass.new) takes the constructor, not an instance.CoordinatorModular composes every module routeManifestFragment and validates the full graph (cross-module parentId, cycles, ambiguous paths).parseRouteFromUri on the modular coordinator.A module that only references a layout declared by another module must
override routeManifestFragment instead of a self-contained RouteManifest.
See Fragments in ADVANCED.md.
Nested feature groups: Coordinator as Module.
class ShopHomeRoute extends AppRoute {
@override
Type? get layout => ShopLayout;
@override
Uri toUri() => ShopModule.manifest.location(ShopRouteId.home);
@override
Widget build(covariant AppCoordinator coordinator, BuildContext context) {
return ShopHomePage(
onProductTap: (id) => coordinator.push(ProductDetailRoute(id: id)),
);
}
}
class ProductDetailRoute extends AppRoute {
ProductDetailRoute({required this.id});
final String id;
@override
List<Object?> get props => [id];
@override
Type? get layout => ShopLayout;
@override
Uri toUri() => ShopModule.manifest.location(
ShopRouteId.product,
pathParameters: {'id': id},
);
@override
Widget build(covariant AppCoordinator coordinator, BuildContext context) =>
ProductDetailPage(id: id);
}
class NotFoundRoute extends AppRoute with RouteNotFound {
NotFoundRoute(this.uri);
final Uri uri;
@override
Uri toUri() => uri;
@override
List<Object?> get props => [uri];
@override
Widget build(covariant AppCoordinator coordinator, BuildContext context) =>
NotFoundPage(uri: uri);
}Rules:
layout / parentLayoutKey is the runtime shell — the RouteLayout Type (default layoutKey is runtimeType).parentId is the static parent ID (ShopRouteId.layout or 'ShopLayout'). It is not the same value as layout; they must refer to the same shell.props for every constructor parameter.location helper on the coordinator when one exists (coordinator.location.product(id)).Redirect-only routes: RedirectRule.
class ShopLayout extends AppRoute with RouteLayout<AppRoute> {
@override
StackPath<AppRoute> resolvePath(covariant AppCoordinator coordinator) =>
coordinator.getModule<ShopModule>().shopStack;
@override
Widget build(covariant AppCoordinator coordinator, BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Shop')),
body: buildPath(coordinator),
);
}
}Rules:
buildPath(coordinator) — do not call super.build().resolvePath returns the exact path that was bindLayout-ed.RouteManifestLayout.stack / .indexed / .branched) and at runtime (bindLayout).coordinator.push(ProductDetailRoute(id: '42'));
coordinator.navigate(ShopHomeRoute());
coordinator.replace(SettingsRoute());
coordinator.pop();
// Same graph, no RouteTarget instance:
await coordinator.location.product('42').recoverWith(coordinator);
await coordinator.pushUri(ShopModule.manifest.location(
ShopRouteId.product,
pathParameters: {'id': '42'},
));Redirect rules run on every navigation call.
Method choice and URI helpers: NAVIGATION.md.
When the project already uses zenrouter_file_generator:
// lib/routes/shop/products/[id].dart → /shop/products/:id
@ZenRoute()
class ProductIdRoute extends _$ProductIdRoute {
ProductIdRoute({required super.id});
@override
Widget build(covariant AppCoordinator coordinator, BuildContext context) =>
ProductPage(id: id);
}| File | URL |
|---|---|
index.dart | /path |
about.dart | /path/about |
[id].dart | /path/:id |
[...slugs]/ | /path/* |
_layout.dart | layout only |
(group)/ | layout group, not a URL segment |
shop.products.[id].dart | /shop/products/:id (dot nesting) |
@ZenLayout(type: LayoutType.stack|indexed|branched) on _layout.dart.
Generated AppCoordinator already mixes RouteModuleBinding<AppRoute, String>
and exposes AppCoordinator.location / pushProductId(id).
lib/src/router/
├── coordinator.dart ← Root Coordinator or Coordinator-as-Module
├── route.dart ← Base route type (e.g. AppRoute)
├── _public.dart ← Barrel: public routes + rules
├── rules/
│ ├── auth_required.dart
│ └── force_redirect.dart
└── routes/
├── (auth)/ ← Layout group (not a URI segment)
│ ├── _layout.dart
│ ├── sign_in.dart ← /sign-in
│ └── forgot_password.dart
├── (dashboard)/
│ ├── _layout.dart
│ ├── _index.dart
│ └── transactions/
│ ├── _index.dart ← /transactions
│ └── [id].dart ← /transactions/:id
│ └── blog/
│ ├── _layout.dart
│ └── [...slug].dart ← /blog/...:slug
└── not_found.dartKeep the file name, manifest path, and location helper in lockstep.
rules/ holds reusable RedirectRules.
| Pattern | Example | When |
|---|---|---|
<Feature>Route | SignInRoute | Standard page |
<Feature>DetailRoute | TransactionDetailRoute | [id] / :id page |
<Feature>IndexRoute | DashboardIndexRoute | Index / redirect-only |
<Feature>Tab | HomeTab | Indexed-stack tab |
NotFoundRoute | NotFoundRoute | 404; mix in RouteNotFound |
| Pattern | Example | When |
|---|---|---|
<Feature>Layout | ShopLayout | Shell |
<Feature>Module | ShopModule | RouteModule |
<Feature>Coordinator | ShopCoordinator | Coordinator-as-Module |
<Feature>RouteId | ShopRouteId | Hand-written manifest IDs (enum) |
<Condition>Rule | AuthRequiredRule | Redirect / guard rule |
Kebab-case segments. Singular resource details (/transaction/:id).
NavigationPath labels: 'auth', 'dashboard', 'shop-products'.
File-based: add the annotated file → build_runner → navigate via generated pushX / location.
Manifest-bound:
RouteManifestRoute with the generated class-name string).parentId if it lives under a layout).RouteBinding that reads pathParameters / restParameters.layout, toUri() via manifest.location, props, build()._public.dart if other features navigate to it.RouteManifestLayout.* + NavigationPath/IndexedStackPath/BranchedStackPath + bindLayout + RouteLayout class + paths.RouteModule + RouteModuleBinding, register in defineModules().| Mistake | Fix |
|---|---|
parseRouteFromUri switch on new work | Use RouteModuleBinding |
Mixing RouteModuleBinding with CoordinatorModular | Modular root uses only CoordinatorModular; child modules use RouteModuleBinding |
Module binding sets notFound | Omit it so other modules can match |
| Binding a layout ID, or leaving a route unbound | Bind every RouteManifestRoute; never bind a layout |
toUri() via Uri.parse('/…') | manifest.location(id, pathParameters: …) |
parentId / layout disagree | Manifest parentId and runtime layout must name the same shell |
Overriding parseRouteFromUri on a binding or modular coordinator | Don't — the mixin owns it |
Forgetting ...super.paths | Always spread super.paths |
File-based: editing routes.zen.dart | Add a source file; regenerate |
| Parser-era coordinator: rewriting onto a manifest unasked | Add a switch case instead |
© definev, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files in skills/zenrouter of definev/zenrouter.
Open the folder on GitHubat commit 8c536fc
Zenrouter next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Zenrouter this skilldefinev/zenrouter | 102 | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Add Flutter Docusaurus Localematthiasn/lotti | 1.2k | — | ~1.2k | Automated safety check: Pass | GPL-3.0 | |
| Tm Launcher DesignFar-Se/tabame | 372 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Flutter Initbear2u/my-skills | 933 | — | ~2.5k | Automated safety check: Pass | None | |
| Mobile App UI Designceorkm/mobile-app-ui-design | 403 | — | ~2k | Automated safety check: Pass | None | |
| Marionette Flutter Drive Appleancodepl/marionette_mcp | 482 | — | ~11k | Automated safety check: Pass | Apache-2.0 |
matthiasn/lotti
Add, complete, or audit a locale across a Flutter application's ARB catalogs and a localized Docusaurus manual, including generated localization code, locale selectors, native platform declarations…
Far-Se/tabame
Create or revise Tabame's Flutter launcher designs: frames, search bars, result rows, palettes, typography, and action dialogs.
bear2u/my-skills
A skill your agent uses when user wants to create a new Flutter project (Todo/Habit/Note/Expense/Custom domain) with Clean Architecture, Riverpod 3.0, Drift, and modern Flutter stack
ceorkm/mobile-app-ui-design
Design high-quality mobile app UI/UX screens, flows, and components.
leancodepl/marionette_mcp
Set up and drive a running Flutter app (debug or profile) with Marionette — an AI agent's hands and eyes for the app.
JustLookAtNow/pt_mate
Capture and show two Flutter UI screenshots for this project: one landscape/large-screen preview and one portrait/mobile preview, without using Flutter Web.
Works with
Categories
Implement and extend routing with zenrouter's Coordinator, RouteManifest, and RouteBinding APIs. Zenrouter is an agent skill from definev/zenrouter. Implement and extend routing with zenrouter's Coordinator, RouteManifest, and RouteBinding APIs.
Zenrouter fits situations like: nested coordinator; programmatic navigation; coordinatorModular; routeModuleBinding.
Run `npx skills add definev/zenrouter --skill zenrouter -a claude-code`. Or copy the skill folder (skills/zenrouter in definev/zenrouter) into .claude/skills/zenrouter in your project. Claude Code loads it when a task matches its description.
Run `npx skills add definev/zenrouter --skill zenrouter -a codex`. Or copy the skill folder (skills/zenrouter in definev/zenrouter) into .agents/skills/zenrouter in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add definev/zenrouter --skill zenrouter -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/zenrouter, .gemini/skills/zenrouter, .github/skills/zenrouter and .opencode/skills/zenrouter in your project.
Going by SKILL.md and its folder, Zenrouter needs the command-line tools its instructions call (dart).
SKILL.md names 1 domain. As links in the text: pub.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Zenrouter is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Zenrouter: Add Flutter Docusaurus Locale (matthiasn/lotti, 1.2k stars), Tm Launcher Design (Far-Se/tabame, 372 stars), Flutter Init (bear2u/my-skills, 933 stars) and Mobile App UI Design (ceorkm/mobile-app-ui-design, 403 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
definev (a GitHub user) maintains it in definev/zenrouter, which has 102 GitHub stars. The repository was last updated on October 2, 2026.
Source: definev/zenrouter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.