Skip to main content

Configuration

tinx configuration is split across workspace manifests, provider package manifests, lock files, and tinx home state.

Workspace manifest

Workspace manifests live in the workspace root and are normally saved as tinx.yaml.

apiVersion: tinx.io/v1
kind: Workspace
workspace: dev
metadata:
name: dev
providers:
node:
source: core/node
kubectl:
source: ghcr.io/acme/setup-kubectl:v1.31.0
plainHTTP: false

Workspace fields

FieldMeaning
apiVersionMust be tinx.io/v1
kindMust be Workspace
workspaceWorkspace name written to the manifest
metadata.nameOptional explicit display name
providersAlias to provider source mapping
providers.<alias>.sourceOCI registry reference or local OCI layout path
providers.<alias>.plainHTTPAllow plain HTTP registry access for that provider

A provider entry may be a string shorthand:

providers:
node: core/node

Provider package manifest

Provider manifests also use tinx.yaml, but their kind is Provider.

The current built-in runtime actively uses Tool, Bundle, Asset, and Environment resources. Some additional fields are parsed into package metadata for future expansion; those are called out explicitly below.

apiVersion: tinx.io/v1
kind: Provider
metadata:
namespace: acme
name: node-toolchain
version: v20.19.0
description: Node.js runtime provider
spec:
tools:
- name: node
default: true
runtime: oci
from: bundle.node
provides:
- node
- npm
- npx
capabilities:
build:
description: Run the build
environments:
- default-env
bundles:
- name: node
layers:
- platform:
os: darwin
arch: arm64
mediaType: application/vnd.tinx.tool.binary
source: bin/darwin/arm64/node
- platform:
os: linux
arch: amd64
mediaType: application/vnd.tinx.tool.binary
source: bin/linux/amd64/node
- name: node-assets
type: asset
platforms:
- os: any
arch: any
source: assets
assets:
- name: node-assets
from: bundle.node-assets
mount:
path: assets
environments:
- name: default-env
variables:
NODE_EXTRA_CA_CERTS: ${provider_assets}/certs/root.pem
export:
- NODE_EXTRA_CA_CERTS
path:
- tools/bin

Provider document fields

FieldMeaning
metadata.namespaceProvider namespace
metadata.nameProvider name
metadata.versionProvider version
spec.contentsOptional ordered list of exported resources; synthesized when omitted
spec.toolsInline tool resources
spec.bundles or spec.bundleInline bundle resources
spec.assetsInline asset resources
spec.environmentsInline environment resources
spec.dependenciesParsed into package metadata; current runtime does not auto-resolve provider-to-provider dependencies
spec.secretsParsed into package metadata; current runtime does not inject them automatically
spec.workspacesParsed into package metadata; current runtime does not create workspaces from them automatically

Tool fields

FieldMeaning
defaultMarks the tool as the provider default
runtime.typeRuntime plugin: oci, script, or local
source.typeSource type used by the selected runtime
source.refBundle reference or local runtime reference
source.pathLocal path for local tools
source.scriptInstall script for script tools
fromShortcut for source, such as bundle.node
install.strategyInstall policy; current runtime defaults to lazy
install.toolInstaller tool for managed-install targets
install.pathRelative binary path to create under the tool install root
providesCommand names exported into the workspace shell
dependsOnOther tools that must be available before this tool runs
environmentsEnvironment resources attached to the tool
capabilitiesOptional metadata about supported actions
envTool-specific environment variables
pathTool-specific path additions

The current built-in runtime and source combinations are:

  • oci + bundle
  • script + script
  • local + source.path or source.ref
  • local + install.tool and install.path for managed-install targets

Bundle fields

FieldMeaning
typeOptional bundle type; asset defaults layers to a tar media type
layersExplicit layer list with platform, mediaType, and source
platformsShorthand layer list with os, arch, source, and optional mediaType

Asset and environment fields

FieldMeaning
assets[].fromShortcut for a bundle-backed asset source such as bundle.node-assets
assets[].mount.pathMount root inside the provider store
environments[].variablesVariables exported into the workspace shell
environments[].exportExplicit allow-list of exported keys
environments[].pathAdditional path entries relative to the provider store

Managed-install pattern

Setup-style providers model the user-facing command as a normal tool and let tinx install it through another tool:

tools:
- name: setup-kubectl
runtime: oci
from: bundle.setup-kubectl
provides:
- setup-kubectl
- name: kubectl
default: true
runtime: local
install:
tool: setup-kubectl
path: bin/kubectl
dependsOn:
- tool: setup-kubectl
provides:
- kubectl

In that model, kubectl has its own tool identity, shim, and inventory entry even though setup-kubectl creates the binary lazily.

Multi-document form

Provider packages can also be authored as multiple YAML documents. The canonical runtime-active kinds are:

  • Provider
  • Tool
  • Bundle
  • Asset
  • Environment

Secret and provider-local Workspace kinds are parsed into package metadata, but the current workspace sync and runtime do not consume them automatically.

That multi-document form is useful when a provider has many tools or when you want cleaner diffs between resources.

Legacy compatibility manifest

tinx still accepts the legacy single-tool shorthand:

apiVersion: tinx.io/v1
kind: Provider
metadata:
namespace: acme
name: node
version: v20.19.0
spec:
runtime: binary
entrypoint: node
platforms:
- os: darwin
arch: arm64
binary: bin/darwin/arm64/node
env:
NODE_EXTRA_CA_CERTS: ${provider_assets}/certs/root.pem
path:
- tools/bin
layers:
assets:
root: assets

Internally, tinx normalizes that into a default Tool, a Bundle, an Environment, and an Asset mount when assets are declared.

Lock file

Each workspace sync writes tinx.lock:

apiVersion: tinx.io/v1
kind: WorkspaceLock
workspace: dev
providers:
- alias: node
provider: core/node
source: core/node
version: v20.19.0
resolved: ghcr.io/acme/node-provider@sha256:...
store: 4f3f...

Use the lock file as generated state. tinx rewrites it during sync.

Global tinx home config

tinx stores shared state in $TINX_HOME/config.yaml:

aliases:
node: core/node@v20.19.0
activeWorkspace: /abs/path/to/workspace
workspaces:
dev: /abs/path/to/workspace

That file tracks aliases, the active workspace, and registered workspace roots.