Skip to main content

Nova Config Reference

The nova.config.json file lives at the monorepo root and drives every Nova command. This page documents each section and its fields.

Use the nova utility initialize wizard to create or update this file interactively.

project

Describes the project identity, display info, and build metadata.

FieldTypeDescription
name.slugstringURL-safe project identifier. Letters, numbers, hyphens, and underscores only. The 214-character npm limit is enforced by the nova utility initialize wizard; the parser only requires a non-empty trimmed string.
name.titlestringHuman-readable project name for display.
description.shortstringOne-line summary used in package.json and meta tags.
description.longstringExtended description for README and documentation pages.
keywordsstring[]Search keywords (max 50 characters each).
legalNamestringLegal entity name used in LICENSE and copyright notices.
pronounsstringControls first-person wording in generated files. One of "business" (we/our) or "personal" (I/my).
platformsstring[]Supported platforms for bug report dropdowns. One or more of "nodejs", "swift", "android", "java", "kotlin", "csharp", "php", "python", "macos", "linux", "windows". Unknown values are dropped.
startingYearnumberYear the project began (integer >= 1970). Used in LICENSE copyright ranges.
licensestringLicense identifier. One of "AGPL-3.0", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "BSL-1.0", "CC0-1.0", "EPL-2.0", "GPL-2.0", "GPL-3.0", "LGPL-2.1", "MIT", "MPL-2.0", "Proprietary", or "Unlicense".
json
{
  "project": {
    "name": {
      "slug": "example",
      "title": "Example"
    },
    "description": {
      "short": "A sample Nova project.",
      "long": "Extended description for documentation and README files."
    },
    "keywords": ["example", "nova"],
    "legalName": "Example Author LLC",
    "pronouns": "business",
    "platforms": ["nodejs", "macos", "linux", "windows"],
    "startingYear": 2025,
    "license": "MIT"
  }
}

entities

An array of people and organizations associated with the project.

FieldTypeDescription
namestringDisplay name.
emailstringContact email (must contain @ and a domain).
urlstringProfile or organization URL (http:// or https://).
rolesstring[]One or more of "author", "contributor", "supporter".
json
{
  "entities": [
    {
      "name": "Example Author",
      "email": "[email protected]",
      "url": "https://example.com/author",
      "roles": ["author"]
    },
    {
      "name": "Example Collaborator",
      "email": "[email protected]",
      "url": "https://example.com/collaborator",
      "roles": ["contributor", "supporter"]
    }
  ]
}

emails

Canonical contact addresses referenced by tools and metadata.

FieldTypeDescription
bugsstringEmail for bug reports and support.
json
{
  "emails": {
    "bugs": "[email protected]"
  }
}

github

Identifies the GitHub repository and configures repository-level metadata that the GitHub recipes synchronize. Consumed by the nova recipe github commands.

FieldTypeDescription
ownerstringRepository owner (user or organization). Must match /^[A-Za-z0-9-]+$/.
repostringRepository name. Must match /^[A-Za-z0-9._-]+$/.
recipesobjectOptional. Toggles for repository-level sync recipes. See Recipes Fields below.
topicsstring[]Optional. Repository topics. An empty array is preserved and clears topics on sync.
featuresobjectOptional. Toggles for repository features (issues, wiki, projects, discussions). See Features Fields below.
policiesobjectOptional. Repository policy settings (visibility, default branch, merge methods, branch deletion). See Policies Fields below.

Recipes Fields

Booleans that enable or disable each repository-level sync recipe.

FieldTypeDescription
sync-identitybooleanOptional. Synchronizes repository description, homepage, and topics.
sync-featuresbooleanOptional. Synchronizes the repository feature toggles in features.
sync-policiesbooleanOptional. Synchronizes the repository policy settings in policies.

Features Fields

Booleans controlling which repository features are enabled. Each field is optional; omitted fields leave the corresponding GitHub setting untouched.

FieldTypeDescription
issuesbooleanOptional. Enables the Issues tab.
wikibooleanOptional. Enables the Wiki tab.
projectsbooleanOptional. Enables the Projects tab.
discussionsbooleanOptional. Enables the Discussions tab.

Policies Fields

Repository policy settings. Each field is optional.

FieldTypeDescription
visibilitystringOptional. One of "public", "private", or "internal".
defaultBranchstringOptional. Default branch name (e.g., "main").
mergeMethodsobjectOptional. Per-method enablement: merge, squash, rebase. Each is a boolean.
autoDeleteHeadBranchbooleanOptional. When true, GitHub deletes the head branch after a pull request is merged.
json
{
  "github": {
    "owner": "example-org",
    "repo": "example-project",
    "recipes": {
      "sync-identity": true,
      "sync-features": true,
      "sync-policies": true
    },
    "topics": ["nova", "monorepo", "typescript"],
    "features": {
      "issues": true,
      "wiki": false,
      "projects": false,
      "discussions": true
    },
    "policies": {
      "visibility": "public",
      "defaultBranch": "main",
      "mergeMethods": {
        "merge": false,
        "squash": true,
        "rebase": false
      },
      "autoDeleteHeadBranch": true
    }
  }
}

workflows

An array of GitHub Actions workflow entries consumed by nova generate github workflows. Each entry maps to one generated .yml file.

FieldTypeDescription
templatestringName of a bundled workflow template: "publish", "lock-inactive-issues", or "check-sponsor-gated-issues".
namestringRequired label appended to the output filename and workflow name. Must be unique within the same template.
triggersarrayTriggers for the template. Each is a bare string or an object such as { "name": "push", "branches": ["main"] }.
buildstring[]Optional. Workspace paths (keys from workspaces) that the check / build step should filter to.
deployobject[]Optional. Publish destinations for the publish template. Each destination has to, path, after, with.
withobjectOptional. Key-value pairs that remap secret / variable names or supply values for literal template variables.

Field names changed in the rebuilt generator: suffix is now name, scopes is now build, targets is now deploy, and settings is now with. The former top-level depends-on moved onto the workflow-run trigger object as a workflows array.

Deploy Fields

Each entry in the deploy array pins one publish destination to a workspace.

FieldTypeDescription
tostringOne of: "npm", "github-action", "github-packages", "docker-hub", "ghcr", "cloudflare-pages-docusaurus", "cloudflare-workers", "github-pages-docusaurus", "vercel-nextjs".
pathstringPath to the workspace that owns the destination (e.g., "./packages/nova").
afterstring[]Optional. Paths of other same-type destinations that must finish publishing before this one starts.
withobjectOptional. Key-value pairs for this destination that remap names or supply literal values, overriding the workflow-level with.

Variable Formats

Each template declares variables with one of three formats. The format determines how values in with are used:

FormatWhat happens
secretProduces ${{ secrets.NAME }} in the YAML. A with value remaps the secret name.
varProduces ${{ vars.NAME }} in the YAML. A with value remaps the variable name.
literalReplaces the placeholder with the exact string from with. Must be provided or the entry is skipped.

Output Filenames

Generated files follow the pattern nova-{template}-{name}.yml under .github/workflows/.

json
{
  "workflows": [
    {
      "template": "lock-inactive-issues",
      "name": "project",
      "triggers": ["schedule-weekly"]
    },
    {
      "template": "publish",
      "name": "project",
      "triggers": ["release"],
      "build": [
        "./packages/core",
        "./packages/preset",
        "./apps/docs"
      ],
      "deploy": [
        {
          "to": "npm",
          "path": "./packages/core"
        },
        {
          "to": "npm",
          "path": "./packages/preset",
          "after": ["./packages/core"]
        },
        {
          "to": "cloudflare-pages-docusaurus",
          "path": "./apps/docs"
        }
      ]
    }
  ]
}

urls

Canonical links with validation and normalization.

FieldTypeDescription
homepagestringProject homepage URL.
repositorystringSource repository URL. Accepts git:, git+https:, git+ssh:, git+http:, http://, https://.
bugsstringIssue tracker URL.
licensestringLicense file URL.
logostringProject logo URL.
documentationstringDocumentation site URL.
npmstringnpm package page URL.
dockerstringDocker image registry page URL.
fundSourcesstring[]Funding URLs (entered comma-separated in the wizard, saved as a list).
privacyPolicystringPrivacy policy URL. Appears in generated GitHub issue templates.
termsOfUsestringTerms of use URL. Appears in generated GitHub issue templates.
json
{
  "urls": {
    "homepage": "https://example.com",
    "repository": "https://github.com/example/example-project",
    "bugs": "https://github.com/example/example-project/issues",
    "license": "https://github.com/example/example-project/blob/main/LICENSE",
    "logo": "https://example.com/assets/logo.svg",
    "documentation": "https://docs.example.com/project",
    "npm": "https://www.npmjs.com/package/example-project",
    "docker": "https://hub.docker.com/r/example/example-project",
    "fundSources": [
      "https://github.com/sponsors/example",
      "https://opencollective.com/example"
    ],
    "privacyPolicy": "https://example.com/privacy",
    "termsOfUse": "https://example.com/terms"
  }
}

workspaces

A map of relative paths to workspace definitions. Each key is a path from the monorepo root (e.g., "./", "./apps/docs", "./packages/nova").

FieldTypeDescription
namestringPackage name for package.json. Must follow the naming pattern for its role. See Workspace Rules for details.
displayNamestringOptional. Human-readable label used by Nova commands and tooling (e.g., status output, generated docs).
rolestringWorkspace role: "project", "docs", "config", "app", "package", "tool", or "template". See Workspace Rules for details.
policystringWorkspace policy: "freezable", "trackable", or "distributable". See Workspace Rules for details.
recipesobjectOptional. Enabled recipes and their settings, keyed by recipe name. Each value is a tuple: [enabled] or [enabled, settings].
dotenvobjectOptional. Environment variables for the workspace's generated .env files and, on a publish build scope, its build-time environment. See Dotenv Fields below.

Dotenv Fields

warning

Retired — use environment instead

The per-workspace dotenv block is retired. Environment variables and secrets now live in the top-level environment block, classified by a required secret flag and delivered by a required buildOnly flag. A config that still declares dotenv, visibility, or from is a load-time error. The fields below document the old shape for reference only.

A dotenv block holds a variables array, and each entry describes one environment variable. The nova generate must-haves dotenv command reads these to write .env and .env.sample, while the publish workflow reads the visibility to decide what gets baked into a static build.

FieldTypeDescription
keystringEnvironment variable name written to the workspace's .env files.
defaultValuestringValue written to .env.sample; the .env entry is left blank so real secrets stay out of version control.
visibilitystringOptional. "public" bakes the value into the build; "private" never bakes it. Required on any variable of a publish build scope.
fromstringOptional. On a public variable, the GitHub Variable its value is read from at build time (defaults to key). On a private variable, the GitHub Secret its value syncs from at deploy time — required and explicit on cloudflare-workers and vercel-nextjs.

A public variable is client-exposed and read from a GitHub Variable when the publish build job writes the scope's .env, so it suits values that ship to the browser (analytics IDs, public site keys). A private variable is a backend or runtime secret that Nova never bakes into the build.

On a cloudflare-workers or vercel-nextjs deploy, a private variable must declare a from and Nova syncs its value from that GitHub Secret into the platform's runtime-secret store. See Runtime Secret Sync for the reconcile and full-authority behavior.

Set from on a public variable when two apps declare the same key but need different per-app values, so each points at its own GitHub Variable.

json
{
  "workspaces": {
    "./": {
      "name": "example-project",
      "role": "project",
      "policy": "freezable",
      "recipes": {
        "cleanup": [true, { "removeUnknownKeys": true, "reorderKeys": true }],
        "normalize-dependencies": [true, { "pinDependencyVersions": true }],
        "sync-identity": [true],
        "sync-ownership": [true]
      }
    },
    "./packages/nova": {
      "name": "@company/example",
      "displayName": "Example Core",
      "role": "package",
      "policy": "distributable",
      "recipes": {
        "cleanup": [true, { "removeUnknownKeys": true, "reorderKeys": true }],
        "sync-identity": [true, { "description": true, "keywords": true }],
        "sync-ownership": [true, { "homepage": true, "bugs": true, "author": true }]
      }
    },
    "./apps/docs": {
      "name": "example-docs",
      "role": "docs",
      "policy": "freezable"
    }
  }
}

environment

Every environment variable and secret in the repository lives here, classified by a required secret flag and grouped by namespace. The nova generate must-haves dotenv command reads environment.apps to write each app's .env and .env.sample, and the publish workflow delivers each value by kind.

FieldTypeDescription
globalobjectOptional. Account-wide keys (deploy credentials, managed-only secrets) under one shared prefix. See Global Fields.
appsobjectOptional. Per-app environment values, keyed by the app's workspace path. See Apps Fields.
workflowsobjectOptional. Workflow-config prefixes, keyed by workflow name. See Workflows Fields.

Each group declares a prefix that Nova joins to every key to form its GitHub name (for example, CBN_ joined to PUBLIC_SITE_KEY becomes CBN_PUBLIC_SITE_KEY). Prefixes must be disjoint, must not reuse the reserved GITHUB_ namespace, and a key must not repeat its own prefix.

Global Fields

global holds account-wide keys under a single prefix. Its variables are managed-only — provisioned on GitHub but not delivered to a build or server — so each carries only secret. Account-scoped deploy credentials (such as a Cloudflare API token) also derive their GitHub name from this prefix.

FieldTypeDescription
prefixstringRequired. The uppercase namespace joined to every key.
variablesarrayOptional. Managed-only values, each with a key and a secret flag.

Apps Fields

apps is keyed by an app workspace path that matches a workspaces entry. Each app declares a prefix and the variables delivered to its build and servers.

FieldTypeDescription
prefixstringRequired. The uppercase namespace joined to every key.
variablesarrayOptional. App environment values. See Value Fields.

Value Fields

FieldTypeDescription
keystringEnvironment variable name, joined to the group's prefix to form the GitHub name.
secretbooleanRequired. true stores the value as a GitHub Secret (encrypted); false as a GitHub Variable (plaintext).
buildOnlybooleanRequired on an app value. true delivers it to the build; false syncs it to every server-bearing deploy target. See Environment Variables and Secrets.
defaultValuestringOptional, non-secret only. Seeds .env.sample; on a buildOnly: true value it is also the build fallback. Rejected on a secret: true value.

Workflows Fields

workflows is keyed by a workflow name and gives that workflow's config keys their own prefix.

FieldTypeDescription
prefixstringRequired. The uppercase namespace joined to every key.
json
{
  "environment": {
    "global": {
      "prefix": "ACCT_",
      "variables": [
        { "key": "NPM_TOKEN", "secret": true }
      ]
    },
    "apps": {
      "./apps/web": {
        "prefix": "WEB_",
        "variables": [
          { "key": "PUBLIC_ANALYTICS_ID", "secret": false, "buildOnly": true, "defaultValue": "" },
          { "key": "AMAZON_REGION", "secret": false, "buildOnly": false, "defaultValue": "us-east-1" },
          { "key": "STRIPE_SECRET_KEY", "secret": true, "buildOnly": false }
        ]
      }
    },
    "workflows": {
      "sponsor-check": {
        "prefix": "SGI_"
      }
    }
  }
}