Skip to main content
Use project.json to name a project and declare its runnable targets. Workspace-wide defaults live in isox.json.

Project definitions

Each project has a project.json. Its location determines the project root. The entries under targets are the commands you can run with Isox:
This example belongs in apps/web/project.json and requires @isox-sh/js. Install @isox-sh/core directly to use the shown editor schema path, or omit $schema. Isox validates project definitions against its bundled schema either way.

project.json reference

All top-level project fields are optional. The directory containing project.json is the project root; a custom root property does not override it. Core exports ProjectDefinition and ExecutorConfiguration TypeScript types. Projects using the former executors field should rename it to targets. Plugin executors.json registries and nx.executors settings keep their names. Project and command objects allow additional properties for use by custom executors and other tools. Isox preserves them in the workspace cache and executor context: read them through context.project and context.command. The exported TypeScript interfaces expose additional fields as unknown, so consumers can narrow them to their own types. Defined Isox fields are still validated. See named configurations for option overrides and Nx project conversion for existing Nx files.

Target reference

A target lives at project.json.targets.<name>. The same optional fields can be supplied by isox.json.targetDefaults.<target-or-executor>. Defaults only apply to targets already declared by projects; every project target needs its own executor. The defaults below apply after workspace and project settings merge. configurations.<name> contains executor options directly. It is not another target definition: placing cache, dependsOn, or inputs there passes those keys to the executor instead of changing task scheduling or caching. Nested option objects and arrays are replaced when overrides merge. See target defaults for the full precedence order. For example, this target uses a prerequisite, caching, and two shell-command configurations:
This example uses the workspace’s production input set from the workspace configuration example. The build script must write to the declared output directory and every file it reads must be included in the inputs. Add script files outside project roots to a shared set. Executor option references: shell commands, TypeScript, ESLint, Vitest, and release automation.

Input reference

namedInputs belongs at the top level of isox.json or project.json. Each value is an array using the same entries as target inputs. Set names start with a letter or underscore, followed by letters, digits, underscores, or hyphens. An empty array defines an empty set. Sets can reference other sets. Cycles and missing dependency set names fail. A local set replaces the workspace set with the same name; other workspace sets remain available. default falls back to ["{projectRoot}/**/*"] when undefined. sharedGlobals has no special behavior: include it from another set to use it. Dependency references prefixed with ^ replace automatic dependency source selection for that task. They do not remove dependency configuration, manifests, or declared build artifacts from the cache key. Inputs select cache content and affected tasks; dependsOn schedules tasks. See named inputs for examples and cache keys for automatic inputs and path restrictions. The same input resolution controls affected and each target in plan, including shared paths outside the project root. Targets without explicit inputs or a customized default set retain conservative owner/dependent selection. Automatic project metadata and dependency artifacts still participate; Git selection cannot detect environment or runtime changes. affected.ignoreFiles applies first, then global-file rules, then target inputs and prerequisite inputs. See target selection. Back to workspace configuration.