Configure a Workspace
Tascarrel owns one configuration directory for each workspace and exposes its files through Workspace → Settings:
$TASCARREL_HOME/config/workspaces/<name>/
├── config.toml
├── settings.json
├── image/
│ └── Dockerfile
├── agents/
│ ├── AGENTS.md
│ ├── CLAUDE.md -> AGENTS.md
│ └── skills/
├── .sops.yaml # Optional SOPS policy
├── secrets.json # Optional SOPS-encrypted values
├── overlay/ # Optional
├── hooks/
│ ├── setup/ # Optional
│ └── init/ # Optional
└── .env # Optional
The installer defaults TASCARREL_HOME to $HOME/.tascarrel.
config.toml is limited to 4 MiB and rejects unknown or malformed fields.
See the configuration reference for
the complete schema.
When a workspace is created through the UI, the setup page generates
config.toml, image/Dockerfile, and agents/AGENTS.md from the selected
repositories, runtimes, capabilities, developer services, resources, and
network policy. It creates agents/CLAUDE.md as a relative symlink to
AGENTS.md, giving Claude Code the same workspace guidance.
These files remain ordinary workspace configuration and can be edited here
afterward. The generated agent guidance explains repository instruction
precedence and how to publish HTTP development servers. It recommends Nix for
ad-hoc tools only when the Nix daemon is selected. Initial developer-service
tokens are supplied separately and encrypted before the workspace is
published; they never appear in the generated files. Tascarrel supplies its
interactive shell separately, so the generated image does not install or
configure a shell.
Size the Workspace VM
[vm]
cores = 8
memory = "16G"
disk = "200G"
Without overrides, Tascarrel uses all available host CPU cores, one third of
host memory, and a 1 TiB sparse disk. Increasing disk grows existing state;
decreasing it does not shrink the disk. Resource changes require a workspace
restart.
Set the Process Environment
Declare non-sensitive values in config.toml:
[env]
NODE_ENV = "development"
RUST_BACKTRACE = "1"
The optional .env file overrides image ENV and [env] values. Per-process
values override .env; Tascarrel-owned identity and service variables have
final precedence. A fresh .env snapshot is read whenever a process starts.
Use host-owned secrets instead of storing plaintext credentials.
Add Seed Files
Files below overlay/ are copied into /workspace while the reusable seed is
prepared:
overlay/
└── product/
└── local.example.toml
Overlay content becomes ordinary pod data and is visible to coding agents.
Share a Cache
[[caches]]
name = "pnpm-store"
path = "~/.cache/pnpm"
The named cache persists across pod lifetimes and is mounted read-write into every pod in the workspace. Any pod can modify or poison it, so never use a shared cache for secrets or mutually untrusted work.
Configure the Web Editor
[editors.code]
extensions = [
"dbaeumer.vscode-eslint",
"rust-lang.rust-analyzer",
]
The Code view uses a workspace-level profile, so settings and extensions are
reused across pods. Model preferences live in settings.json. Edit Codex and
Claude Code preferences under Settings → Harnesses and Tasci endpoints and
models under Settings → Tasci.
Configuration that changes the VM requires a restart. Image, seed, and initialization changes apply to newly created pods after their inputs are rebuilt.