Skip to main content
A meow project has a small, legible footprint. You edit two files; meow generates the rest as derived artifacts you never hand-edit.

A scaffolded project

hello-meow/
├── meow.config.json      # ← you edit: runtime behavior & toolchain config
├── package.json          # ← you edit: dependencies, scripts, metadata
├── meow.lock.jsonl       # generated: the resolved dependency graph (commit it)
├── main.ts               # your code
├── tsconfig.json         # generated shim: { "extends": "./.meow/tsconfig.json" }
├── .meow/                # generated shadow config (gitignored)
│   ├── tsconfig.json     #   the real tsconfig tsc/editors consume
│   ├── strict-web.d.ts   #   ambient types for the strict-web globals
│   └── types/meow/       #   declarations for meow:http, meow:ui, …
└── node_modules/         # materialized dependencies (gitignored)
    └── .meow/            #   content-addressed package store + edge links

What to commit

Commit these

  • meow.config.json — your one config file
  • package.json — dependency authority
  • meow.lock.jsonl — the exact resolved graph
  • tsconfig.json — the one-line shim (so editors resolve types on clone)
  • your source files

Ignore these

  • .meow/ — regenerated by meow sync
  • node_modules/ — regenerated by meow install
A meow-aware .gitignore lists /.meow/ and node_modules/.

The files you edit

A single closed-schema config that sets your mode, lint rules, formatter style, type strictness, and workspace globs. It replaces the usual pile of .eslintrc / .prettierrc / test configs. Full reference: meow.config.json.
Your standard, npm-compatible manifest. meow reads dependencies, devDependencies, peerDependencies, overrides, scripts, and workspaces. It only ever writes the dependency sections, on add/remove/install <pkg> — your scripts and metadata are yours. Reference: package.json.

The generated shadow config

Editors, language servers, and tsc are hardwired to look for a tsconfig.json. Rather than make you maintain one, meow generates it:
  • .meow/tsconfig.json is the real config, derived from your meow.config.json. It sets the strict-web-correct compiler options (module: esnext, moduleResolution: bundler, verbatimModuleSyntax, erasableSyntaxOnly, noEmit, lib: ["esnext"]) and wires up the meow:* and ambient web types.
  • tsconfig.json at the root is a one-line shim — { "extends": "./.meow/tsconfig.json" } — committed so a fresh clone gets working editor types immediately.
Regenerate the shadow whenever you change meow.config.json:
meow sync
meow sync rewrites .meow/tsconfig.json, .meow/strict-web.d.ts, the bundled meow:* declarations under .meow/types/meow/, and the root tsconfig.json shim. It never touches your package.json.
Because .meow/ is byte-stable for the same input, regenerating it produces no spurious diffs. It’s safe to delete and rebuild at any time — which is exactly why it’s gitignored.

The global store

Outside your project, meow keeps one global tree at ~/.meow (relocatable via MEOW_HOME). Packages download once into the content-addressed cache there and project into each workspace’s node_modules via copy-on-write or hardlinks — so a package shared by ten projects occupies disk once. See node_modules & materialization.

Next: the configuration reference

Every key in meow.config.json.