Skip to main content

project-config.json Reference

Each project registered with Skiff2 has a <name>.project-config.json file in the skiff2-projects/ directory of the skiff-commodore repo.

Example​

{
"name": "my-project",
"ai2Project": "my-ai2-project",
"primaryContact": "user:you@allenai.org",
"projectAdmins": ["group:my-team@allenai.org"],
"team": "my-team",
"repo": "allenai/my-repo",
"allenaiDomains": true,
"customDomains": []
}

Fields​

name (required)​

The project name. Must be unique across all Skiff2 projects. Maximum 19 characters (the GCP project ID ai2-skiff2-<name> cannot exceed 30 characters). Must contain only lowercase letters, numbers, and dashes, and must start with a letter.

This becomes the subdomain for your project:

  • <name>.pandajungle.org
  • <name>.allen.ai
  • <name>.apps.allenai.org

Type: string


ai2Project (required)​

The AI2 project this Skiff2 project belongs to. Must be one of the approved AI2 project tags.

Type: string


primaryContact (required)​

The primary contact for this project. Must be a prefixed contact string (see prefix table below). This contact is automatically added to projectAdmins.

Type: string

Example: "user:you@allenai.org"


projectAdmins​

Additional admins for the project. Used to grant admin access to the GCP project. The primaryContact is automatically included.

Type: string[] Default: []

Each entry must be prefixed with one of:

PrefixExampleDescription
user:user:you@allenai.orgIndividual AI2 email
group:group:my-team@allenai.orgGoogle Group
serviceAccount:serviceAccount:sa@project.iam.gserviceaccount.comService account
domain:domain:allenai.orgAll users in a domain

team (required)​

The AI2 team responsible for this project. Used for billing attribution.

Type: string

Must be one of the teams listed in shared-actions/project-config/teams.ts. If your team isn't listed, add it to that file in the same PR that registers your project.


repo (required)​

The GitHub repository for this project, in org/repo format.

Type: string

Example: "allenai/my-repo"

GitHub Actions variables (SKIFF2_PROJECT_ID, SKIFF2_WORKLOAD_IDENTITY_PROVIDER, SKIFF2_SERVICE_ACCOUNT) will be automatically set on this repo after provisioning.


remoteRepos​

An array of GitHub repositories for services deployed from repositories other than the one listed in repo, in org/repo format.

Type: string[]

Example: ["allenai/my-remote-repo", "allenai/another-remote-repo"]

GitHub Actions variables (SKIFF2_PROJECT_ID, SKIFF2_WORKLOAD_IDENTITY_PROVIDER, SKIFF2_SERVICE_ACCOUNT) will be automatically set on this repo after provisioning.


deployRefs​

The Git refs whose GitHub Actions runs may authenticate as the project's deploy service account (SKIFF2_SERVICE_ACCOUNT). Use full refs: refs/heads/<branch> for branch pushes and refs/tags/<tag> for tags. A pull request run has the ref refs/pull/<number>/merge.

Type: string[] Default: [] (every branch, tag and pull request of repo and remoteRepos)

Example:

{
"deployRefs": ["refs/heads/main"]
}

The deploy service account can change anything in the project. By default any workflow run in the repository can use it, including a pull request that edits a workflow or runs terraform plan on new code. Setting deployRefs to ["refs/heads/main"] limits it to code that has been merged.

warning

With deployRefs set, workflows on other refs cannot authenticate at all. Pull request plans (skiff2-plan-style workflows) and branch environments stop working, so remove or skip those workflows first.


allowDeletion​

When true, allows the GCP project and its resources to be deleted by Terraform. Defaults to false as a safety measure to prevent accidental deletion.

Type: boolean Default: false


allenaiDomains​

Whether to provision DNS records on allen.ai and apps.allenai.org. Set to false to opt out.

Type: boolean Default: true

When true, the following DNS records are created:

  • <name>.allen.ai
  • <name>.apps.allenai.org
  • *.<name>.allen.ai (wildcard for service subdomains)
  • *.<name>.apps.allenai.org (wildcard for service subdomains)

customDomains​

Additional DNS A records to create in the managed zones (allen.ai or apps.allenai.org). Only use this if you need a domain that differs from your project's auto-generated ones (e.g. myapp.allen.ai instead of my-project.allen.ai).

This field only controls DNS records. To actually route traffic and provision SSL certificates for a custom domain, you also need to add it to customDomains in the relevant service in your skiff2.json.

For external domains (e.g. myapp.com), do not use this field — set customDomains in skiff2.json only, and configure DNS with your domain registrar.

Type: string[] Default: []

Example:

{
"customDomains": ["myapp.allen.ai", "myapp.apps.allenai.org"]
}
note

Custom domains must not collide with any other project's auto-generated or custom domains.