Skip to main content
Every Clawker project has a .clawker.yaml file in the project root. Create one with:
clawker project init

How Configuration Works

Clawker uses a layered configuration system that discovers, loads, and merges YAML files from multiple locations. Understanding this system is key to using Clawker effectively — especially in monorepos, shared environments, or when you want per-directory overrides.

Discovery and Merge

When you run any Clawker command, the configuration engine:
  1. Walk-up discovery — Starting from your current working directory, walks up the directory tree to the registered project root, probing for config files at each level.
  2. Explicit paths — Checks the user config directory (~/.config/clawker/) for additional config files.
  3. Defaults — Applies built-in defaults as the lowest-priority base layer.
Files found closer to CWD have higher priority than files found further up the tree. This means a .clawker.yaml in a subdirectory overrides values from the one at the project root. Merge rules:
  • Scalars (strings, numbers, booleans): closest-to-CWD wins.
  • Maps (objects): recursively merged — keys from higher-priority files override, but unmentioned keys from lower-priority files are preserved.
  • Slices (arrays): replaced entirely by higher-priority files, unless the field is tagged for union merge (e.g., firewall add_domains).

File Placement

At each directory level during walk-up, the engine checks two placement styles:
StylePathWhen
Directory form.clawker/clawker.yamlWhen a .clawker/ directory exists
Flat dotfile form.clawker.yamlWhen no .clawker/ directory exists
The directory form takes precedence. Both .yaml and .yml extensions are accepted.
Walk-up discovery is bounded — it never walks past the registered project root and never reaches ~/.config/clawker/. Home-level configs are loaded separately via the explicit path mechanism.

Local Overrides

Clawker also discovers clawker.local.yaml (or .clawker.local.yaml / .clawker/clawker.local.yaml) files alongside the main config. These are intended for machine-specific or developer-specific settings that shouldn’t be committed to version control. At each directory level, both clawker.yaml and clawker.local.yaml are discovered. The local file merges at the same priority level but is loaded after the main file, so its values win.
.clawker.yaml              # Committed to git
.clawker.local.yaml        # In .gitignore -- personal overrides

Precedence (Highest to Lowest)

1. .clawker.yaml in CWD (or .clawker/clawker.yaml)
2. .clawker.local.yaml in CWD
3. .clawker.yaml in parent directory
4. .clawker.local.yaml in parent directory
5. ... (continues up to project root)
6. .clawker.yaml at project root
7. .clawker.local.yaml at project root
8. ~/.config/clawker/clawker.yaml (user-level overrides)
9. Built-in defaults

Project Registration

Walk-up discovery requires your project to be registered in the project registry. This is how Clawker knows where to stop walking up:
# Register during project init
clawker project init

# Or register an existing project
clawker project register
If CWD is not within a registered project, walk-up is skipped entirely and only the user config directory and defaults are used. The registry lives at ~/.local/share/clawker/registry.yaml and maps project names to filesystem paths (managed via clawker project commands):
projects:
  - name: "my-app"
    root: "/Users/dev/my-app"
    worktrees:
      feature-auth:
        path: "/Users/dev/.local/share/clawker/worktrees/my-app-auth-a1b2c3d4e5f6"
        branch: "feature/auth"

Monorepo Support

The layered merge system enables monorepo workflows. Place a shared .clawker.yaml at the repo root with common settings, then add per-service overrides in subdirectories:
monorepo/
├── .clawker.yaml           # Shared: base image, firewall rules, common packages
├── services/
│   ├── api/
│   │   └── .clawker.yaml   # Override: add Python packages, different image
│   └── web/
│       └── .clawker.yaml   # Override: add Node packages, different env vars
To create a subdir config, run clawker init from inside the subdirectory. It detects that you’re inside an existing project and skips project registration — going straight to preset selection and config file creation. The resulting file layers on top of the root config.
cd services/api
clawker init          # Interactive: pick a preset, customize
clawker init --yes    # Non-interactive: Bare preset defaults
When you run clawker run from services/api/, the engine merges:
  1. services/api/.clawker.yaml (highest priority)
  2. .clawker.yaml at repo root
  3. ~/.config/clawker/clawker.yaml (if exists)
  4. Built-in defaults
Only the fields you specify in the subdirectory config are overridden. Everything else inherits from the parent.

Writes

When Clawker writes configuration changes (e.g., via clawker project init), each field is routed back to the file it originally came from (provenance tracking). New fields that didn’t come from any file are written to the highest-priority discovered file. All writes are atomic (temp file + fsync + rename) with advisory file locking for cross-process safety.

Project Configuration Schema

The complete .clawker.yaml schema with all fields and nested object structures. Descriptions are shown as comments.
build:
  # Starting Docker image (e.g. node:20-slim, python:3.12); clawker layers tools on top
  image: <string>  # default: n/a | required: false
  # Use your own Dockerfile instead of clawker's generated one; ignores image, packages, and instructions
  dockerfile: <string>  # default: n/a | required: false
  # System packages (apt/apk) needed by your project that aren't in the base image
  packages:  # default: ripgrep | required: false
    - <string>
  # Directory to use as Docker build context when using a custom Dockerfile (relative to project root)
  context: <string>  # default: n/a | required: false
  instructions:
    # Bake config files or credentials into the image (e.g. .npmrc, SSH config)
    copy:
      # File or directory to copy from your project
      - src: <string>  # default: n/a | required: false
        # Where to place it inside the container
        dest: <string>  # default: n/a | required: false
        # Set file ownership (e.g. claude:claude)
        chown: <string>  # default: n/a | required: false
        # Set file permissions (e.g. 0644)
        chmod: <string>  # default: n/a | required: false
    # Environment variables baked into the image; use agent.env for runtime-only vars
    env:  # default: n/a | required: false
      <key>: <value>
    # Custom Docker labels for image metadata or tooling integration
    labels:  # default: n/a | required: false
      <key>: <value>
    # Build-time variables resolved during docker build (ARG); not available at runtime
    args:
      # Build argument name (referenced as $NAME in Dockerfile instructions)
      - name: <string>  # default: n/a | required: false
        # Value used when not overridden by --build-arg at build time
        default: <string>  # default: n/a | required: false
    # Setup commands that run as the container user (e.g. npm install -g, pip install)
    user_run:  # default: n/a | required: false
      - <string>
    # Setup commands that need root privileges (e.g. system config, additional repos)
    root_run:  # default: n/a | required: false
      - <string>
  inject:
    # Add Dockerfile instructions while root with only the base image — e.g. apt sources, proxy config, or CA certs that package installation depends on
    after_from:  # default: n/a | required: false
      - <string>
    # Add Dockerfile instructions while root with system packages available — e.g. compile native libraries or install tools that need those packages
    after_packages:  # default: n/a | required: false
      - <string>
    # Add Dockerfile instructions while root with the claude user created — e.g. set up directories, fix permissions, or configure services
    after_user_setup:  # default: n/a | required: false
      - <string>
    # Add Dockerfile instructions as the claude user — e.g. install dotfiles, configure your shell, or set up user-level tools
    after_user_switch:  # default: n/a | required: false
      - <string>
    # Add Dockerfile instructions as the claude user with Claude Code available — e.g. add MCP servers, install plugins, or extensions
    after_claude_install:  # default: n/a | required: false
      - <string>
    # Add Dockerfile instructions at the very end — e.g. final environment tweaks or cleanup that must happen after everything else
    before_entrypoint:  # default: n/a | required: false
      - <string>
agent:
  # Load environment variables from .env-style files (e.g. .env.local)
  env_file:  # default: n/a | required: false
    - <string>
  # Pass specific host env vars into the container (e.g. AWS_PROFILE, GITHUB_TOKEN)
  from_env:  # default: n/a | required: false
    - <string>
  # Set container env vars directly; use from_env to forward host values instead
  env:  # default: n/a | required: false
    <key>: <value>
  # Editor for git commits and interactive editing inside the container
  editor: <string>  # default: n/a | required: false
  # Visual editor ($VISUAL) for the container
  visual: <string>  # default: n/a | required: false
  claude_code:
    config:
      # How to initialize Claude Code config: copy syncs host settings/plugins, fresh starts clean
      strategy: <string>  # default: copy | required: false
    # Let the container use your host API keys so you don't have to re-authenticate
    use_host_auth: <boolean>  # default: true | required: false
  # Share files between host and container via ~/.clawker-share (read-only in container)
  enable_shared_dir: <boolean>  # default: false | required: false
  # Shell commands run after container starts but before Claude Code launches (e.g. install MCP servers)
  post_init: <string>  # default: n/a | required: false
workspace:
  # bind mounts your project live (edits sync); snapshot copies it (isolated, disposable)
  default_mode: <string>  # default: bind | required: true
security:
  firewall:
    # Shorthand: domains the container can reach over HTTPS (converted to TLS rules)
    add_domains:  # default: n/a | required: false
      - <string>
    # Full egress rules with protocol, port, and path control
    rules:
      # Domain or IP the container needs to reach (e.g. api.github.com, registry.npmjs.org)
      - dst: <string>  # default: n/a | required: false
        # Connection protocol: tls (HTTPS, default), tcp (plain), or http (MITM-inspected)
        proto: <string>  # default: n/a | required: false
        # Override the default port (443 for TLS, 80 for HTTP)
        port: <integer>  # default: n/a | required: false
        # Allow or deny traffic to this destination (default: allow)
        action: <string>  # default: n/a | required: false
        # Fine-grained HTTP path filtering when proto is http (requires MITM inspection)
        path_rules:  # default: n/a | required: false
          # URL path prefix to match (e.g. /v1/api, /repos/myorg)
          - path: <string>  # default: n/a | required: false
            # Whether to allow or deny requests matching this path
            action: <string>  # default: n/a | required: false
        # What to do with HTTP paths that don't match any path rule (allow or deny)
        path_default: <string>  # default: n/a | required: false
  # Mount the host Docker socket (DooD, not DinD) — lets the container manage sibling containers but is a security risk
  docker_socket: <boolean>  # default: false | required: true
  # Linux capabilities granted to the container; NET_ADMIN and NET_RAW are required — removing them will break the firewall
  cap_add:  # default: NET_ADMIN,NET_RAW | required: false
    - <string>
  # Run a proxy for browser-based auth flows and credential forwarding from the host
  enable_host_proxy: <boolean>  # default: true | required: false
  git_credentials:
    # Let git clone/push use your host HTTPS credentials (via host proxy)
    forward_https: <boolean>  # default: true | required: false
    # Let git use your host SSH keys for cloning and pushing
    forward_ssh: <boolean>  # default: true | required: false
    # Let git sign commits using your host GPG keys
    forward_gpg: <boolean>  # default: true | required: false
    # Sync your host .gitconfig (aliases, user.name, user.email) into the container
    copy_git_config: <boolean>  # default: true | required: false
loop:
  # Hard cap on iterations to prevent runaway loops
  max_loops: <integer>  # default: n/a | required: false
  # Stop early if this many consecutive loops make no progress
  stagnation_threshold: <integer>  # default: n/a | required: false
  # Kill the loop after this long regardless of progress
  timeout_minutes: <integer>  # default: n/a | required: false
  # Throttle API calls to control cost
  calls_per_hour: <integer>  # default: n/a | required: false
  # Quality score at which the task is considered done
  completion_threshold: <integer>  # default: n/a | required: false
  # Discard loop state after this many hours of inactivity
  session_expiration_hours: <integer>  # default: n/a | required: false
  # Stop if the same error repeats this many times (stuck in a loop)
  same_error_threshold: <integer>  # default: n/a | required: false
  # Stop if output quality drops by this amount between iterations
  output_decline_threshold: <integer>  # default: n/a | required: false
  # Stop if the agent only runs tests for this many loops without code changes
  max_consecutive_test_loops: <integer>  # default: n/a | required: false
  # Pause between iterations (e.g. to avoid rate limits)
  loop_delay_seconds: <integer>  # default: n/a | required: false
  # Minimum safety score required before marking a task complete
  safety_completion_threshold: <integer>  # default: n/a | required: false
  # Run Claude Code with --dangerously-skip-permissions for fully autonomous loops
  skip_permissions: <boolean>  # default: n/a | required: false
  # Script called on loop events (start, complete, error) for custom integrations
  hooks_file: <string>  # default: n/a | required: false
  # Extra instructions appended to Claude's system prompt in each loop iteration
  append_system_prompt: <string>  # default: n/a | required: false

Project Configuration Reference

The following tables are auto-generated from the schema struct tags in internal/config/schema.go. Each section corresponds to a top-level key in .clawker.yaml.

build

FieldTypeDefaultDescription
imagestringStarting Docker image (e.g. node:20-slim, python:3.12); clawker layers tools on top
dockerfilestringUse your own Dockerfile instead of clawker’s generated one; ignores image, packages, and instructions
packagesstring listripgrepSystem packages (apt/apk) needed by your project that aren’t in the base image
contextstringDirectory to use as Docker build context when using a custom Dockerfile (relative to project root)

instructions

FieldTypeDefaultDescription
copyobject listBake config files or credentials into the image (e.g. .npmrc, SSH config)
envkey-value mapEnvironment variables baked into the image; use agent.env for runtime-only vars
labelskey-value mapCustom Docker labels for image metadata or tooling integration
argsobject listBuild-time variables resolved during docker build (ARG); not available at runtime
user_runstring listSetup commands that run as the container user (e.g. npm install -g, pip install)
root_runstring listSetup commands that need root privileges (e.g. system config, additional repos)

inject

FieldTypeDefaultDescription
after_fromstring listAdd Dockerfile instructions while root with only the base image — e.g. apt sources, proxy config, or CA certs that package installation depends on
after_packagesstring listAdd Dockerfile instructions while root with system packages available — e.g. compile native libraries or install tools that need those packages
after_user_setupstring listAdd Dockerfile instructions while root with the claude user created — e.g. set up directories, fix permissions, or configure services
after_user_switchstring listAdd Dockerfile instructions as the claude user — e.g. install dotfiles, configure your shell, or set up user-level tools
after_claude_installstring listAdd Dockerfile instructions as the claude user with Claude Code available — e.g. add MCP servers, install plugins, or extensions
before_entrypointstring listAdd Dockerfile instructions at the very end — e.g. final environment tweaks or cleanup that must happen after everything else

agent

FieldTypeDefaultDescription
env_filestring listLoad environment variables from .env-style files (e.g. .env.local)
from_envstring listPass specific host env vars into the container (e.g. AWS_PROFILE, GITHUB_TOKEN)
envkey-value mapSet container env vars directly; use from_env to forward host values instead
editorstringEditor for git commits and interactive editing inside the container
visualstringVisual editor ($VISUAL) for the container
enable_shared_dirbooleanfalseShare files between host and container via ~/.clawker-share (read-only in container)
post_initstringShell commands run after container starts but before Claude Code launches (e.g. install MCP servers)

claude_code

FieldTypeDefaultDescription
strategystringcopyHow to initialize Claude Code config: copy syncs host settings/plugins, fresh starts clean
use_host_authbooleantrueLet the container use your host API keys so you don’t have to re-authenticate

workspace

FieldTypeDefaultDescription
default_modestringbindbind mounts your project live (edits sync); snapshot copies it (isolated, disposable) (required)

security

FieldTypeDefaultDescription
docker_socketbooleanfalseMount the host Docker socket (DooD, not DinD) — lets the container manage sibling containers but is a security risk (required)
cap_addstring listNET_ADMIN,NET_RAWLinux capabilities granted to the container; NET_ADMIN and NET_RAW are required — removing them will break the firewall
enable_host_proxybooleantrueRun a proxy for browser-based auth flows and credential forwarding from the host

firewall

FieldTypeDefaultDescription
add_domainsstring listShorthand: domains the container can reach over HTTPS (converted to TLS rules)
rulesobject listFull egress rules with protocol, port, and path control

git_credentials

FieldTypeDefaultDescription
forward_httpsbooleantrueLet git clone/push use your host HTTPS credentials (via host proxy)
forward_sshbooleantrueLet git use your host SSH keys for cloning and pushing
forward_gpgbooleantrueLet git sign commits using your host GPG keys
copy_git_configbooleantrueSync your host .gitconfig (aliases, user.name, user.email) into the container

loop

FieldTypeDefaultDescription
max_loopsintegerHard cap on iterations to prevent runaway loops
stagnation_thresholdintegerStop early if this many consecutive loops make no progress
timeout_minutesintegerKill the loop after this long regardless of progress
calls_per_hourintegerThrottle API calls to control cost
completion_thresholdintegerQuality score at which the task is considered done
session_expiration_hoursintegerDiscard loop state after this many hours of inactivity
same_error_thresholdintegerStop if the same error repeats this many times (stuck in a loop)
output_decline_thresholdintegerStop if output quality drops by this amount between iterations
max_consecutive_test_loopsintegerStop if the agent only runs tests for this many loops without code changes
loop_delay_secondsintegerPause between iterations (e.g. to avoid rate limits)
safety_completion_thresholdintegerMinimum safety score required before marking a task complete
skip_permissionsbooleanRun Claude Code with —dangerously-skip-permissions for fully autonomous loops
hooks_filestringScript called on loop events (start, complete, error) for custom integrations
append_system_promptstringExtra instructions appended to Claude’s system prompt in each loop iteration

Interactive Editing

Instead of editing YAML by hand, you can use Clawker’s built-in interactive editor:
# Edit project configuration (.clawker.yaml)
clawker project edit

# Edit user settings (settings.yaml)
clawker settings edit
The editor opens a TUI with your configuration fields grouped into tabs. You can browse fields, see their current values and defaults, edit them inline, and save. When you save a field, you choose which config layer to write it to — for example, saving to a local override file instead of the committed project config. The editor also shows which file each value comes from, so you can see exactly how the layered merge is working.

User Settings Schema

The complete settings.yaml schema.
logging:
  # Write structured logs to disk for debugging and diagnostics
  file_enabled: <boolean>  # default: true | required: false
  # Rotate the log file when it exceeds this size
  max_size_mb: <integer>  # default: 50 | required: false
  # Delete rotated logs older than this
  max_age_days: <integer>  # default: 7 | required: false
  # Number of rotated log files to keep
  max_backups: <integer>  # default: 3 | required: false
  # Gzip rotated logs to save disk space
  compress: <boolean>  # default: true | required: false
  otel:
    # Send logs to the OTEL collector for Grafana/Loki visibility
    enabled: <boolean>  # default: true | required: false
    # Give up on an export batch after this long
    timeout_seconds: <integer>  # default: 5 | required: false
    # Buffer this many log records before dropping (increase if you see gaps)
    max_queue_size: <integer>  # default: 2048 | required: false
    # How often to flush buffered logs to the collector
    export_interval_seconds: <integer>  # default: 5 | required: false
monitoring:
  # Override the auto-detected OTEL collector URL (e.g. for a remote collector)
  otel_collector_endpoint: <string>  # default: n/a | required: false
  # Host port for the OTEL HTTP receiver
  otel_collector_port: <integer>  # default: 4318 | required: false
  # Hostname for reaching the collector from the host
  otel_collector_host: <string>  # default: localhost | required: false
  # Docker network hostname containers use to reach the collector
  otel_collector_internal: <string>  # default: otel-collector | required: false
  # Host port for the OTEL gRPC receiver
  otel_grpc_port: <integer>  # default: 4317 | required: false
  # Host port for Loki log ingestion
  loki_port: <integer>  # default: 3100 | required: false
  # Host port for Prometheus metrics UI
  prometheus_port: <integer>  # default: 9090 | required: false
  # Host port for Jaeger tracing UI
  jaeger_port: <integer>  # default: 16686 | required: false
  # Host port for Grafana dashboards
  grafana_port: <integer>  # default: 3000 | required: false
  # Host port for Prometheus internal metrics
  prometheus_metrics_port: <integer>  # default: 8889 | required: false
  telemetry:
    # OTEL collector HTTP path for metrics
    metrics_path: <string>  # default: /v1/metrics | required: false
    # OTEL collector HTTP path for logs
    logs_path: <string>  # default: /v1/logs | required: false
    # How often Claude exports metrics (lower = more granular, higher = less overhead)
    metric_export_interval_ms: <integer>  # default: 10000 | required: false
    # How often Claude exports logs (lower = more real-time, higher = less overhead)
    logs_export_interval_ms: <integer>  # default: 5000 | required: false
    # Capture full tool call inputs/outputs in telemetry (verbose but useful for debugging)
    log_tool_details: <boolean>  # default: true | required: false
    # Capture user prompts in telemetry (disable for privacy)
    log_user_prompts: <boolean>  # default: true | required: false
    # Tag telemetry with your Anthropic account ID (useful for multi-user setups)
    include_account_uuid: <boolean>  # default: true | required: false
    # Tag telemetry with session ID to correlate events across a single run
    include_session_id: <boolean>  # default: true | required: false
host_proxy:
  manager:
    # Local port the host proxy listens on (change if 18374 conflicts)
    port: <integer>  # default: 18374 | required: false
  daemon:
    # Local port the proxy daemon binds to
    port: <integer>  # default: 18374 | required: false
    # How often to check if containers still need the proxy
    poll_interval: <duration>  # default: 30s | required: false
    # How long to keep the proxy alive after the last container stops
    grace_period: <duration>  # default: 60s | required: false
    # Restart the proxy daemon after this many consecutive failures
    max_consecutive_errs: <integer>  # default: 10 | required: false
firewall:
  # Master switch for the Envoy firewall; when off, containers have unrestricted network access
  enable: <boolean>  # default: true | required: true

User Settings Reference

Global settings live at ~/.config/clawker/settings.yaml. The following tables are auto-generated from the schema struct tags.

logging

FieldTypeDefaultDescription
file_enabledbooleantrueWrite structured logs to disk for debugging and diagnostics
max_size_mbinteger50Rotate the log file when it exceeds this size
max_age_daysinteger7Delete rotated logs older than this
max_backupsinteger3Number of rotated log files to keep
compressbooleantrueGzip rotated logs to save disk space

otel

FieldTypeDefaultDescription
enabledbooleantrueSend logs to the OTEL collector for Grafana/Loki visibility
timeout_secondsinteger5Give up on an export batch after this long
max_queue_sizeinteger2048Buffer this many log records before dropping (increase if you see gaps)
export_interval_secondsinteger5How often to flush buffered logs to the collector

monitoring

FieldTypeDefaultDescription
otel_collector_endpointstringOverride the auto-detected OTEL collector URL (e.g. for a remote collector)
otel_collector_portinteger4318Host port for the OTEL HTTP receiver
otel_collector_hoststringlocalhostHostname for reaching the collector from the host
otel_collector_internalstringotel-collectorDocker network hostname containers use to reach the collector
otel_grpc_portinteger4317Host port for the OTEL gRPC receiver
loki_portinteger3100Host port for Loki log ingestion
prometheus_portinteger9090Host port for Prometheus metrics UI
jaeger_portinteger16686Host port for Jaeger tracing UI
grafana_portinteger3000Host port for Grafana dashboards
prometheus_metrics_portinteger8889Host port for Prometheus internal metrics

telemetry

FieldTypeDefaultDescription
metrics_pathstring/v1/metricsOTEL collector HTTP path for metrics
logs_pathstring/v1/logsOTEL collector HTTP path for logs
metric_export_interval_msinteger10000How often Claude exports metrics (lower = more granular, higher = less overhead)
logs_export_interval_msinteger5000How often Claude exports logs (lower = more real-time, higher = less overhead)
log_tool_detailsbooleantrueCapture full tool call inputs/outputs in telemetry (verbose but useful for debugging)
log_user_promptsbooleantrueCapture user prompts in telemetry (disable for privacy)
include_account_uuidbooleantrueTag telemetry with your Anthropic account ID (useful for multi-user setups)
include_session_idbooleantrueTag telemetry with session ID to correlate events across a single run

host_proxy

manager

FieldTypeDefaultDescription
portinteger18374Local port the host proxy listens on (change if 18374 conflicts)

daemon

FieldTypeDefaultDescription
portinteger18374Local port the proxy daemon binds to
poll_intervalduration30sHow often to check if containers still need the proxy
grace_periodduration60sHow long to keep the proxy alive after the last container stops
max_consecutive_errsinteger10Restart the proxy daemon after this many consecutive failures

firewall

FieldTypeDefaultDescription
enablebooleantrueMaster switch for the Envoy firewall; when off, containers have unrestricted network access (required)
You can also place a clawker.yaml in ~/.config/clawker/ to set user-level project config defaults. This file is merged as the lowest-priority project config layer (just above built-in defaults), so any project-level .clawker.yaml overrides it.

Directory Structure

Clawker follows the XDG Base Directory Specification. Files are organized across three directories:
DirectoryDefault PathContents
Config~/.config/clawker/settings.yaml, clawker.yaml (user-level project overrides)
Data~/.local/share/clawker/registry.yaml, worktree directories, .clawker-share
State~/.local/state/clawker/Log files, PID files, loop sessions, update cache
Override with environment variables: CLAWKER_CONFIG_DIR, CLAWKER_DATA_DIR, CLAWKER_STATE_DIR.