---
title: "Template questions"
description: "Every question that copier copy asks, from copier.yml."
---

This page is generated. Do not edit it: change the source it names, and the next build changes this page. The source is `copier.yml`.

The environment file answers `vault_command` and `forge` for every repo. A question with no default needs an answer: each one is a decision.

| Question | What it asks | Default |
|---|---|---|
| `project_name` | The project name, lowercase with hyphens (it becomes the OTel service namespace). | none |
| `description` | One line on what the project is. | none |
| `kind` | What it is. Choices: `service`, `library`, `cli`, `app`. | none |
| `tenants_now` | How many tenants (separate sets of data, a person's or a company's) the first release holds. Choices: `one`, `many`. | none |
| `tenants_later` | How many tenants it will hold later (many builds the isolation shape now). Choices: `one`, `many`. | none |
| `users_now` | How many people sign in to the first release. Choices: `one`, `many`. | none |
| `users_later` | How many people will sign in later, sharing a tenant's data. Choices: `one`, `many`. | none |
| `languages` | The languages it is written in. Choices: `dotnet`, `python`, `typescript`, `rust`, `shell`. | none |
| `nextjs` | Does it have a Next.js front end? Asked only when `{{ 'typescript' in languages }}`. | `false` |
| `vault_command` | The command that reads a secret on a workstation, for example your password manager's CLI. | none |
| `forge` | The forge that hosts the repo. Choices: `onedev`, `github`. | none |
| `onedev_project` | The OneDev project path, for example team/app. Asked only when `{{ forge == 'onedev' }}`. | `"{{ project_name }}"` |
| `python_dir` | The folder of the Python project (the one with pyproject.toml), or . for the repo root. Asked only when `{{ 'python' in languages }}`. | `"."` |
| `rust_dir` | The folder of the Rust project (the one with Cargo.toml), or . for the repo root. Asked only when `{{ 'rust' in languages }}`. | `"."` |
| `rust_version` | The Rust toolchain that rust-toolchain.toml and the CI image pin, for example 1.89.0. Asked only when `{{ 'rust' in languages }}`. | `"1.89.0"` |
| `dotnet_dir` | The folder of the .NET solution, or . for the repo root. Asked only when `{{ 'dotnet' in languages }}`. | `"."` |
| `node_dir` | The folder of the TypeScript project (the one with package.json), or . for the repo root. Asked only when `{{ 'typescript' in languages }}`. | `"."` |
| `dotnet_test_runner` | The test runner. Microsoft.Testing.Platform suits TUnit and xUnit v3 (the house default). VSTest suits xUnit v2, NUnit and older MSTest; the Microsoft.Testing.Platform setting in global.json breaks them. Choices: `mtp`, `vstest`. Asked only when `{{ 'dotnet' in languages }}`. | `mtp` |
| `dotnet_lock_files` | Restore from NuGet lock files (packages.lock.json) and fail when they are stale? Say no when a package comes from a feed that only CI can read. Asked only when `{{ 'dotnet' in languages }}`. | `true` |
| `nuget_feed` | A private NuGet feed to take some packages from, or empty for none. For example https://nuget.pkg.github.com/<owner>/index.json. Asked only when `{{ 'dotnet' in languages }}`. | `""` |
| `nuget_feed_name` | The feed's key in nuget.config (its login comes from NUGET_<NAME>_USERNAME and _PASSWORD). Asked only when `{{ 'dotnet' in languages and nuget_feed }}`. | `private` |
| `nuget_feed_packages` | The package ID patterns to take from the feed, as a list, for example [Cleipnir.ResilientFunctions*]. Asked only when `{{ 'dotnet' in languages and nuget_feed }}`. | `[]` |
| `npm_allow_scripts` | The npm packages whose install scripts you approved, as a list, for example [sharp, protobufjs]. Every other install script is refused. Asked only when `{{ 'typescript' in languages }}`. | `[]` |
| `shell_exclude` | Folders of vendored or retired shell scripts that the gate must not check (shellcheck and shfmt). A gate script in them is not a second gate. As a list, for example [.ralph, archive]. | `[]` |
| `gate_budget_reason` | Why a gate section needs more time than its default budget (fast 5 s), or empty to keep the default. Written in the answers file so a reviewer sees it. Needed only when a budget below is raised. | `""` |
| `gate_fast_budget` | The most seconds a section may take in gate.sh --fast. | `5` |
| `gate_full_budget` | The most seconds a section may take in the full gate (--full and CI), or 0 for no budget. | `0` |
| `test_folders` | Folders whose files count as tests in the gate's line of source lines against test lines, as a list, for example [spec, e2e]. A file named like a test, and any file under a tests folder, already counts. | `[]` |
| `python_floor` | The oldest Python it supports (the oldest still in bugfix support for a new repo). Asked only when `{{ 'python' in languages }}`. | `"3.13"` |
| `adr_dir` | Where ADRs live. Keep them out of any published docs site (for example design/adr). | `docs/adr` |
| `private_index` | A private package index to install some packages from, or empty for none. For example https://<forge-url>/<project>/~pypi/simple/. Asked only when `{{ 'python' in languages }}`. | `""` |
| `private_index_name` | The index's name in uv config (uv reads its login from UV_INDEX_<NAME>_USERNAME and _PASSWORD). Asked only when `{{ 'python' in languages and private_index }}`. | `"{{ private_index.split('/')[3] if private_index.split('/') \| length > 4 else 'private' }}"` |
| `private_packages` | The packages to take from the private index, as a list, for example [comfyui-core]. Asked only when `{{ 'python' in languages and private_index }}`. | `[]` |
