package.json, resolves the same npm packages, and runs the same
frameworks. This page maps what you already type onto meow, then calls out the few
things that are deliberately different.
Command cheat sheet
The omni-router
meow infers intent from bare invocations, so most habits keep working without therun verb. When the first argument isn’t a known command, meow routes it:
| You type | meow runs | Because |
|---|---|---|
meow build | meow run build | build is a standard script name |
meow ./app.ts | meow run ./app.ts | it’s a file path |
meow dev | meow run dev | dev is a script |
meow create-next-app | meow x create-next-app | unknown → ephemeral package |
--shell, --silent, --no-warnings)
and Deno-style run flags (-A, --allow-all, --unstable-*) so scripts copied
from other ecosystems don’t crash the parser. Full details in
Running code.
The node shim
When meow runs your scripts, it puts shims for node, npm, pnpm, yarn,
bun, npx, pnpx, and bunx first on PATH. So when a framework (Next.js,
Vite, Jest workers) shells out to node, it transparently re-enters meow. You
don’t have to change how tools invoke each other.
File-for-file
| Node ecosystem | meow | Notes |
|---|---|---|
package.json | package.json | Same file. meow reads dependencies, devDependencies, scripts, overrides, workspaces. It only edits dependency sections on add/remove. |
package-lock.json / pnpm-lock.yaml | meow.lock.jsonl | A strict, sorted, merge-resistant JSON-Lines lockfile. See the lockfile. |
node_modules/ | node_modules/ | Still real directories (no symlinked package contents), materialized via copy-on-write/hardlinks. |
.eslintrc, .prettierrc, tsconfig.json, test config | meow.config.json | One config. meow generates the tsconfig.json editors expect. See configuration. |
tsc, eslint, prettier, jest/vitest | meow check / lint / fmt / test | Built in. No separate installs. |
webpack/esbuild/rollup | meow bundle | Powered by Rolldown over meow’s resolver. |
meow can also write a tiny
package-lock.json compatibility marker so
framework detectors that look for it still light up — meow install --compat-lockfile.
Your meow.lock.jsonl stays the source of truth.What’s genuinely different
These are intentional. Knowing them up front saves surprises.Runs are deterministic by default (in strict-web mode)
Runs are deterministic by default (in strict-web mode)
A fresh
meow init project runs in strict-web mode: the clock is frozen,
Math.random/crypto.getRandomValues are seeded, and the timezone is pinned to
UTC. Code that reads Date.now() expecting real wall-clock time will see a fixed
value until you grant the real clock with --allow-clock (or switch to
node-compat). This is what makes tests and CI reproducible. See
Determinism.Host access is a grant, not a given (in strict-web mode)
Host access is a grant, not a given (in strict-web mode)
In
strict-web, environment variables are invisible and node:fs/node:process
throw ERR_STRICT_WEB_WITHDRAWN. You opt back in with --allow-env, --allow-clock,
--allow-random, or --trust. In node-compat mode (use it for Node apps and
frameworks) the full host surface is available like Node. See Permissions.Bare versions are exact, like npm — not caret, like Cargo
Bare versions are exact, like npm — not caret, like Cargo
"zod": "3.23.8" means exactly 3.23.8. "3.23" means >=3.23.0 <3.24.0,
"3" means >=3.0.0 <4.0.0. ^, ~, ||, and hyphen ranges all behave the
npm way. npm aliases (npm:pkg@range) and dist-tags (latest) are supported.No global mutable state between tools
No global mutable state between tools
There is no
.eslintcache, no per-tool daemon, no separate tsc --watch server.
meow holds one syntax graph in memory for the lifetime of a command and feeds every
tool from it.A typical migration
Drop meow into the repo
Keep your
package.json. Add a meow.config.json:meow.config.json
node-compat is the safe starting point for an existing Node app — full Node
surface, host access, real clock.Install
meow.lock.jsonl, and
materializes node_modules.Generate editor shims
.meow/tsconfig.json and a root tsconfig.json shim so your editor and
meow check agree on the type surface.Next: the two runtime modes
The single most important concept when moving a project to meow.