Get started Migrating from tfv

Migrating from tfv

tfv is now teriac. What changed in the CLI, the server, the image and the chart, and how to move over step by step.

teriac is the new name of tfv. It's published as a new project: a new npm package, image, chart and repo. Nothing from tfv is read or reused, so tfv keeps working as it is until you switch, and you can run both side by side while you move over.

What changed

CLI

tfv teriac
npm install -g tfv npm install -g @marcdomain/teriac
tfv <command> teriac <command>
~/.tfv/ ~/.teriac/ (or TERIAC_HOME)
~/.tfv/bin on PATH ~/.teriac/bin on PATH
TFV_HASHICORP_MIRROR, TFV_GITHUB_MIRROR TERIAC_HASHICORP_MIRROR, TERIAC_GITHUB_MIRROR
eval "$(tfv shell-init zsh)" eval "$(teriac shell-init zsh)"
postinstall script none: setup runs on the first teriac run

The commands, flags and version files are the same. .terraform-version, .opentofu-version, .terragrunt-version, .tool-versions and the rest are tool files, not tfv files, so your repos need no changes.

Server, image and chart

tfv teriac
ghcr.io/marcdomain/tfv-server ghcr.io/marcdomain/teriac-server
oci://ghcr.io/marcdomain/charts/tfv-server oci://ghcr.io/marcdomain/charts/teriac-server
TFV_* environment variables TERIAC_* environment variables
tfv plan, tfv apply in PR comments teriac plan, teriac apply
tfv.yaml in a repo teriac.yaml (or teriac.yml)
# tfv:watch … # teriac:watch …
tfv_watch = [...] in Terragrunt locals teriac_watch = [...]
check runs named tfv: <project> teriac: <project>
brand/tfv-avatar.png brand/teriac-avatar.png

Move the CLI over

1. Install teriac and run it once, so it sets up ~/.teriac and your PATH:

npm install -g @marcdomain/teriac
teriac --version

2. Reinstall the versions you use. Downloads are cached per version and checked against their checksums, so this is quick:

tfv list                         # what you had
teriac install 1.9.0
teriac install 1.8.0 -p tofu
teriac install 1.2.1 -p tg
teriac use 1.9.0

Or, inside a project, let teriac pick the version for you with teriac auto-switch.

3. Swap the shell hook in your shell config:

- eval "$(tfv shell-init zsh)"
+ eval "$(teriac shell-init zsh)"

4. Rename mirror variables, if you use them:

- export TFV_HASHICORP_MIRROR=https://artifactory.example.com/artifactory/hashicorp
+ export TERIAC_HASHICORP_MIRROR=https://artifactory.example.com/artifactory/hashicorp

5. Restart your terminal and check:

teriac doctor
teriac current

doctor warns you if terraform still resolves to ~/.tfv/bin/terraform.

6. Remove tfv once you're happy:

npm uninstall -g tfv
rm -rf ~/.tfv

Then delete tfv's PATH block from your shell configs (the line that adds ~/.tfv/bin, and the comment above it), and ~/.config/fish/conf.d/tfv.fish if you use fish.

Move the server over

The server keeps locks, history and saved plans in SQLite on its data volume. teriac server starts with a fresh one, so plan the switch for a quiet moment:

  1. Apply or unlock open PRs on the tfv server, so no locks are left behind.
  2. Rename settings: every TFV_* variable becomes TERIAC_*, for example TFV_GITHUB_APP_ID → TERIAC_GITHUB_APP_ID and TFV_REPO_ALLOWLIST → TERIAC_REPO_ALLOWLIST. Secrets in files keep working with the _FILE suffix (TERIAC_GITHUB_PRIVATE_KEY_FILE). Chat tokens referenced from repos.yaml with token_env or webhook_url_env can keep their names, but renaming them to TERIAC_* keeps things consistent.
  3. Keep repos.yaml. Its format hasn't changed; point TERIAC_REPOS_CONFIG at it, or put it in the chart's repos value.
  4. Rename tfv.yaml to teriac.yaml in each repo, and tfv:watch / tfv_watch to teriac:watch / teriac_watch. Merge this before you switch, since teriac reads teriac.yaml from the base branch.
  5. Deploy teriac server with the quick start or the Helm chart. You can reuse the same GitHub App: point its webhook at the new server, and upload brand/teriac-avatar.png as its logo.
  6. Update branch protection if it requires check runs by name: tfv: <project> is now teriac: <project>.
  7. Tell your team to comment teriac plan instead of tfv plan.

Helm values

The chart's values are the same apart from names. A typical diff:

  github:
    appId: "123456"
-   existingSecret: tfv-github
+   existingSecret: teriac-github
  httpRoute:
-   hostnames: [tfv.acme.dev]
+   hostnames: [teriac.acme.dev]
  extraEnvFrom:
-   - secretRef: { name: tfv-chat-tokens }
+   - secretRef: { name: teriac-chat-tokens }
helm install teriac oci://ghcr.io/marcdomain/charts/teriac-server --version 0.2.1 -n teriac -f values.yaml
helm uninstall tfv -n tfv      # once teriac is running