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:
| Prefix | Example | Description |
|---|---|---|
user: | user:you@allenai.org | Individual AI2 email |
group: | group:my-team@allenai.org | Google Group |
serviceAccount: | serviceAccount:sa@project.iam.gserviceaccount.com | Service account |
domain: | domain:allenai.org | All 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.
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"]
}
Custom domains must not collide with any other project's auto-generated or custom domains.