Skip to main content
Tascarrel is alpha software and may break. We’re looking for your feedback — share it on GitHub.
Documentation

Configuration Reference

Tascarrel reads host-wide settings from $TASCARREL_HOME/config/server.toml and workspace settings from each workspace’s config.toml and settings.json. Unknown fields are rejected.

Server Configuration

The optional server.toml file uses kebab-case fields and is limited to 64 KiB. Hostd reads it at startup.

[remote-access]
public-origin = "https://tascarrel.example.com"

[authentication]
secret-file = "/run/secrets/tascarrel-auth"
FieldType and DefaultPurpose
remote-access.public-originHTTPS origin; unsetPublic UI origin and source of the HTTP-route DNS suffix
authentication.secret-filePath; generated key when absentExternal private 32-byte browser-authentication key

Relative authentication key paths resolve beside server.toml. Restart hostd after changing this file.

Workspace config.toml files use kebab-case fields and are limited to 4 MiB.

Virtual Machine and Features

FieldType and DefaultPurpose
vm.coresPositive integer; all available host coresVirtual CPUs
vm.memoryBinary size; one third of host memoryVM memory, such as "16G"
vm.diskBinary size; "1T"Sparse state disk; minimum 256 MiB
features.dockerBoolean; falseConfined Docker daemon in every pod
features.podmanBoolean; falseRootless Podman in every pod
features.virtualizationBoolean; false/dev/kvm in every pod
features.usbBoolean; falseDynamic Linux-host USB forwarding
nix.daemonBoolean; falsePersistent workspace-wide Nix daemon

Configure Tools and Processes

FieldTypePurpose
editors.code.extensionsArray of stringsMarketplace extensions installed before code-server starts
chat.commands.<name>.textStringText inserted by a slash command
env.<name>StringDefault process environment value; secret references use ${secrets.<provider>.<name>}

Image ENV values have the lowest precedence, followed by [env], .env, and per-process values. Tascarrel-owned identity and service variables take final precedence.

Secrets

FieldType and DefaultPurpose
secrets.providers.<name>.kind"sops"Select the current provider implementation
secrets.providers.<name>.fileRelative path; "secrets.json"SOPS-encrypted, string-valued JSON document

Initial secrets supplied by the workspace creation page are encrypted before the workspace is published. Hostd uses the user’s default id_ed25519 or id_rsa SSH key pair and requires its private-key file to work non-interactively.

Setup and Initialization

FieldType and DefaultPurpose
setup.steps[].scriptString; requiredSynchronous shell script run while preparing the reusable seed
init.steps[].scriptString; requiredShell script started for each new pod
init.steps[].waitBoolean; falseWait for this init step before continuing

Caches and Repositories

FieldTypePurpose
caches[].nameStringStable backing-subvolume name
caches[].pathAbsolute or ~-relative pathRead-write mount destination in every pod
repos."<path>".sourceStringUpstream URL for the host-owned checkout below /workspace/<path>
repos."<path>".branchOptional short branch nameBranch checked out instead of the upstream default
repos."<path>".gitGit policy tableComplete repository-specific replacement for the workspace policy

Runtime-owned paths and overlapping cache destinations are rejected.

Git Policy

FieldType and DefaultPurpose
git.default-policyallow, deny, or require-approval; require-approvalAction for unmatched refs
git.branches[].patternStringCase-sensitive glob matched against a short branch name
git.branches[].policyPolicy stringAction for the first matching branch rule
git.tags[].patternStringCase-sensitive glob matched against a short tag name
git.tags[].policyPolicy stringAction for the first matching tag rule

A single * stays within one slash-delimited component; ** crosses components.

Network Policy

FieldType and DefaultPurpose
network.host-portsIntegers or "<host>:<pod>" strings; emptyHost-loopback services made available at host.tascarrel.internal
network.defaultallow or deny; allowDefault egress action
network.allow-localBoolean; falsePermit local, private, link-local, and host-interface addresses
network.allow-addressesArray of IP strings; emptyAddresses admitted when the default is deny
network.deny-addressesArray of IP strings; emptyAddresses always rejected
network.allow-hostsArray of host patterns; emptyHTTP hosts admitted when the default is deny
network.deny-hostsArray of host patterns; emptyHTTP hosts always rejected
network.allow-portsArray of ports; [80, 443]Destination TCP ports available to pods
network.http-portsArray of ports; [80]Ports interpreted as HTTP
network.https-portsArray of ports; [443]Ports interpreted as HTTPS

Each [[network.secret-injection]] entry supports:

FieldType and DefaultPurpose
hostHost pattern; requiredExact host or subdomain pattern to match
methodsNon-empty array of strings; requiredCase-sensitive HTTP methods admitted for matching hosts
headerString; all eligible headersLimit placeholder lookup to one header
placeholderString; inferred from the secret nameValue to replace
secretProvider-qualified reference; requiredHost-owned value to insert

When a host matches one or more injection rules, the host proxy rejects a request unless at least one matching rule lists its method. Only rules listing the request method participate in secret injection.

Portable Interface Settings

The host-owned settings.json file contains portable interface preferences and the Tasci model catalog. It uses camelCase names and can be edited through Workspace → Settings.

Harness Model Preferences

The optional chat.harnesses object has codex and claudeCode entries. Each entry supports:

FieldPurpose
defaultModelModel and non-default options selected for new chats
modelOrderModel identifiers placed first in the specified order
hiddenModelsModels omitted from ordinary selection controls
favoriteModelsModels shown before other visible models

Tasci Endpoints and Models

Tasci is bundled with Tascarrel. Its chat.tasci settings map workspace-local model aliases to OpenAI-compatible Chat Completions endpoints:

{
  "chat": {
    "tasci": {
      "defaultModel": "development",
      "endpoints": {
        "local": {
          "protocol": "OpenAiChatCompletions",
          "baseUrl": "http://host.tascarrel.internal:18080/v1"
        }
      },
      "models": {
        "development": {
          "endpoint": "local",
          "model": "provider-model-id",
          "displayName": "Development Model",
          "toolCalls": true
        }
      }
    }
  }
}

An endpoint supports:

FieldPurpose
displayNameOptional interface label
protocolOpenAiChatCompletions; the only currently supported protocol
baseUrlAbsolute HTTP or HTTPS API URL without credentials, a query, or a fragment
authorizationOptional secret-backed authorization header

The token stays out of settings.json; authorization refers to a configured secret:

{
  "header": "Authorization",
  "prefix": "Bearer ",
  "credential": {
    "provider": "project",
    "secret": "MODEL_API_TOKEN"
  }
}

Tascarrel resolves that secret only for a selected Tasci session and delivers the complete header to its private pod process.

A model supports:

FieldPurpose
endpointAlias of the endpoint that serves the model
modelProvider-native model identifier
displayNameOptional interface label
contextWindowOptional positive context-window metadata
maxOutputTokensOptional positive output-limit metadata
toolCallsWhether the model supports structured tool calls
parallelToolCallsWhether it supports parallel structured calls
pricingOptional versioned token prices for cost calculation

pricing contains catalogVersion, a positive tokenCount, required input and output monetary amounts, and optional cacheReadInput and cacheWriteInput amounts. Each amount has an ISO 4217 currency and an integer amount in that currency’s minor unit.