Skip to content

Configuration Format

JSON Schema: https://thingstead.io/tilde/config-schema/v1.json
Schema version: 1

tilde.config.json is the declarative configuration file for tilde. It describes your entire developer environment so that tilde can reproduce it on any machine.

{
"$schema": "https://thingstead.io/tilde/config-schema/v1.json",
"version": "1",
"os": "macos",
"shell": "zsh",
"packageManager": "homebrew",
"versionManagers": [{ "name": "vfox" }],
"languages": [
{ "name": "node", "version": "22.0.0", "manager": "vfox" }
],
"workspaceRoot": "~/Developer",
"dotfilesRepo": "~/Developer/personal/dotfiles",
"contexts": [
{
"label": "personal",
"path": "~/Developer/personal",
"git": { "name": "Jane Doe", "email": "[email protected]" },
"github": { "username": "janedoe" },
"authMethod": "gh-cli",
"envVars": []
}
],
"tools": ["ripgrep", "fzf", "bat"],
"configurations": {
"git": true,
"vscode": false,
"aliases": false,
"osDefaults": false,
"direnv": true
},
"secretsBackend": "1password"
}

FieldTypeRequiredDescription
$schemastringnoJSON Schema URL for editor tooling
version"1"yesSchema version — always "1"
os"macos"yesTarget OS — only macos supported
shell"zsh" | "bash" | "fish"yesPrimary shell
packageManager"homebrew"yesPackage manager — only homebrew supported
versionManagersVersionManager[]yesList of version managers to install
languagesLanguage[]yesLanguage runtimes to install
workspaceRootstringyesRoot directory for all projects (e.g. ~/Developer)
dotfilesRepostringyesPath to your dotfiles repository (absolute or ~/-prefixed)
contextsDeveloperContext[]yesOne or more developer contexts (at least one required)
toolsstring[]noHomebrew packages to install
configurationsConfigurationDomainsyesFeature flags for which dotfiles to manage
accountsAccount[]noService account references
secretsBackend"1password" | "keychain" | "env-only"yesWhere to store/retrieve secrets

{ "name": "vfox" }
FieldTypeValues
namestring"vfox", "nvm", "pyenv", "sdkman"

{ "name": "node", "version": "22.0.0", "manager": "vfox" }
FieldTypeDescription
namestringLanguage identifier (e.g. node, python, java)
versionstringVersion string (e.g. 22.0.0, 3.12.0)
managerstringMust match a name in versionManagers

Validation: languages[].manager must reference a manager listed in versionManagers.


A context maps a filesystem path to a git identity and optional tooling configuration.

{
"label": "work",
"path": "~/Developer/work",
"git": { "name": "Jane Doe", "email": "[email protected]" },
"github": { "username": "jane-acme" },
"authMethod": "gh-cli",
"envVars": [
{ "key": "NPM_TOKEN", "value": "op://Work/NPM/token" }
],
"vscodeProfile": "work",
"isDefault": false
}
FieldTypeRequiredDescription
labelstringyesUnique identifier for this context
pathstringyesWorkspace path this context applies to
git.namestringyesGit author name
git.emailstringyesGit author email
github.usernamestringnoGitHub username for gh CLI
authMethod"gh-cli" | "https" | "ssh"yesGit authentication method
envVarsEnvVarReference[]noEnvironment variables to load in this context
vscodeProfilestringnoVS Code profile name for this context
isDefaultbooleannoMark as the default context

Validation: Context labels must be unique across all contexts.


Environment variables must use secrets backend references — raw secrets are rejected at validation time.

{ "key": "GITHUB_TOKEN", "value": "op://Personal/GitHub/token" }
FieldTypeDescription
keystringEnvironment variable name
valuestringBackend reference (e.g. op://Vault/Item/Field) or plain value

Security: Values matching ghp_, sk-, AKIA, or xox[bp]- are blocked — use a secrets backend reference instead.


Controls which dotfiles and integrations tilde manages:

{
"git": true,
"vscode": false,
"aliases": false,
"osDefaults": false,
"direnv": true
}
FieldTypeDescription
gitbooleanWrite ~/.gitconfig and per-context gitconfigs
vscodebooleanWrite VS Code settings per context
aliasesbooleanWrite shell aliases file
osDefaultsbooleanApply macOS defaults write settings from defaults.json
direnvbooleanInstall direnv and generate .envrc files

{ "service": "npm", "identifier": "[email protected]", "secretRef": "op://Personal/NPM/token" }
FieldTypeRequiredDescription
servicestringyesService name
identifierstringyesUsername or email
secretRefstringnoSecrets backend reference for credentials

ValueDescription
"1password"Use 1Password CLI (op) for secret references
"keychain"Use macOS Keychain
"env-only"No secrets backend; environment variables only

When tilde writes dotfiles, they go into your dotfilesRepo:

DotfileLocation in repo
Global .gitconfiggit/.gitconfig
Per-context gitconfiggit/.gitconfig-{label}
.zshrcshell/.zshrc
VS Code settingsvscode/{label}-settings.json
macOS defaultsdefaults.json (read from repo)

Symlinks are created from ~/.gitconfig{dotfilesRepo}/git/.gitconfig, etc.


VariableEquivalentDescription
TILDE_CONFIG--configPath to tilde.config.json
TILDE_CI--ciNon-interactive mode (1 or true)
TILDE_NO_COLORDisable color output
TILDE_STATE_DIROverride ~/.tilde/ state directory

Every tilde.config.json written by tilde includes a schemaVersion integer field:

{
"schemaVersion": 1,
...
}
ValueMeaning
1Baseline schema — current version

When tilde loads a config with an older schemaVersion, it automatically runs all applicable migration steps, rewrites the config atomically, and prints a notification. No manual action is required.

If tilde reads a config with a schemaVersion higher than the installed version supports, it prints a warning and opens the config in read-only mode (no rewrite). To resolve: upgrade tilde to the latest version.


Re-open the full configuration wizard with all existing values pre-populated as defaults:

Terminal window
tilde --reconfigure

Behaviour:

  • Loads the existing tilde.config.json from the path specified by --config (or the default location)
  • Opens the full 14-step wizard with every field pre-filled from the stored config
  • On completion, atomically overwrites the config file with the updated values
  • On early exit (Ctrl-C or Cancel), the original config file is not modified

Error cases:

  • No config found: tilde exits with a message directing you to run tilde (without --reconfigure) to create your initial configuration
  • Invalid config: tilde displays each invalid field by name before opening the wizard; those fields use their wizard defaults. All other fields remain pre-populated from the stored config.
  • Early exit (Escape or Cancel): the original config file is not modified. tilde exits with code 5 to indicate user cancellation.