Configuration
Reference for the AIStor Memory mount configuration file. Covers the local staging store, endpoints and failover, health checks, request timeout, metadata caching, and FUSE and transfer settings.
This page lists every key in the mount configuration file. Pass the file to the
mount with --config <FILE>:
aimem my-memory-bucket /workspace --config /etc/aimem/mount.yaml- The Memory Bucket and the mountpoint are positional arguments.
- Signing credentials come from the environment (
AIMEM_ACCESS_KEYandAIMEM_SECRET_KEY), never from the file. - Everything else goes in the file, including the required
local:staging directory. Some keys also have a CLI flag or environment variable for one-off changes; see CLI flags vs config-file keys.
Every config file must set version: "1.0", as a quoted string. Without
quotes, YAML reads 1.0 as a number. A file with a missing or unknown version
is rejected. This release supports version 1.0.
AIStor Memory mounts only a Memory Bucket. A mount needs an endpoint_url,
signing credentials, and a Memory Bucket on a paid-tier AIStor server. See
Prerequisites. --config applies only to the
mount. The management commands (bucket, secret, search, bio) take
their own flags; see the CLI reference.
Minimum configuration
# /etc/aimem/mount.yaml
version: "1.0"
local: /var/cache/aimem
endpoint_url:
- http://aistor{1...4}:9000
region: us-east-1
agent: claude
metadata_ttl: indefiniteBecause local: is in the file, the command needs only the Memory Bucket, the
mountpoint, and --config:
aimem my-memory-bucket /workspace --config /etc/aimem/mount.yamlEvery mount needs a staging directory. Set it with the local: key, the
--local <DIR> flag, or the AIMEM_LOCAL environment variable.
Local store size
The local store holds two things: a staging file for each file open for
writing, and a cache of recently read objects. By default, the cache grows until
the filesystem under local is 95% full, as statfs reports it.
To cap both together, set local_size:
local_size: 10Gi- Cached objects are evicted, least recently used first, to stay under 95% of the cap.
- A write that does not fit under the cap fails with
ENOSPC. The file keeps every byte written before the failure, and the same descriptor can keep writing once there is room.
The value is in bytes, or a Kubernetes quantity: k, M, G, and T count in
powers of 1000, and Ki, Mi, Gi, and Ti in powers of 1024. A fraction
such as 1.5Gi rounds up to a whole byte. You can also set it with
--local-size <SIZE> or AIMEM_LOCAL_SIZE.
Set local_size when local is on a filesystem that cannot report the
directory's size. The usual case is a Kubernetes emptyDir with a sizeLimit:
statfs reports the whole node disk, and kubelet evicts the pod once the
directory passes the limit. Set local_size about 10% below the sizeLimit.
The margin covers what the cap does not count, such as filesystem blocks,
directories, and other files in the directory.
CLI flags vs config-file keys
These keys also have a CLI flag, and some have an environment variable:
local, local_size, endpoint_url, region, request_timeout,
health_path, tls_ca_file, tls_server_name, read_only, foreground,
agent, session_file, bio_agent, bio_endpoint_file, bio_session_key,
metadata_ttl, log_directory, debug, and no_log. The
CLI reference lists the flags.
Every other key on this page is set only in the file.
The file-only keys are advanced settings. Their defaults suit almost every deployment. Change them only when you have a specific reason.
To mount a sub-prefix, pass bucket/prefix/ (or s3://bucket/prefix/) as the
bucket argument. There is no prefix key.
Recognised keys
The tables below list every key, by area. Later sections show most of them in YAML examples.
Schema & staging
| Key | What it is | Default |
|---|---|---|
version | Config schema version. Required; must be "1.0" (quoted string). A missing or unknown value is rejected. | — |
local | Required local staging and read-cache directory. Also --local <DIR> / AIMEM_LOCAL; one of the three must be set. | — |
local_size | Cap on staging plus the read cache under local; see Local store size. Also --local-size <SIZE> / AIMEM_LOCAL_SIZE. | none: the cache fills the filesystem to 95% |
Connection & transport
| Key | What it is | Default |
|---|---|---|
endpoint_url | AIStor node URL or URLs. List several, or use a {1...N} brace range, for failover. | — |
region | Region used to sign requests (for example us-east-1). Also --region / AIMEM_REGION. | us-east-1 |
request_timeout | Deadline for each request, in seconds. When it passes, the request is retried on the next endpoint. | 30 (multi-endpoint) |
tls_ca_file | Extra CA bundle (PEM) to verify endpoint TLS. Also --tls-ca-file / AIMEM_TLS_CA_FILE. | — |
tls_server_name | Name to verify the endpoint's certificate against and send as SNI, while connecting to the endpoint_url host, such as a ClusterIP. Also --tls-server-name / AIMEM_TLS_SERVER_NAME. | — |
insecure_skip_tls_verify | Skip endpoint TLS certificate verification. | false |
virtual_host_style | Use virtual-hosted (bucket DNS) addressing. The default is path-style, which AIStor supports. | false |
user_agent_prefix | Text to add to the start of the User-Agent header. | — |
Mount & FUSE
| Key | What it is | Default |
|---|---|---|
read_only | Mount read-only. | false |
foreground | Keep AIStor Memory in the foreground instead of running in the background. | false |
auto_unmount | Unmount automatically when AIStor Memory exits. | false |
allow_root | Standard FUSE access control. Cannot be combined with allow_other. | false |
allow_other | Standard FUSE access control. Cannot be combined with allow_root. | false |
max_threads | Maximum FUSE worker threads. | 16 |
uid | Owner UID reported by stat(). | caller's UID |
gid | Owner GID reported by stat(). | caller's GID |
dir_mode | Directory permissions reported by stat() (octal). | 0755 |
file_mode | File permissions reported by stat() (octal). | 0644 |
shared_gid | Report every entry as owned by this group, with group permissions copied from the owner's. Every process in the group can then read and write files any user created. The CSI driver sets it to the pod's fsGroup. | unset |
selinux_context | SELinux context for every file in the mount, set as the context= mount option. Needs a kernel with SELinux enabled. The CSI driver sets it on SELinux nodes, such as OpenShift. | unset |
Agent features
| Key | What it is | Default |
|---|---|---|
agent | claude · codex · cursor · auto: which agent's memory files are warmed into the cache on mount. | — |
agent_manifest | Path to a custom warmup manifest that replaces the built-in memory paths for each agent. | — |
session_file | File that holds the current agent session ID. AIStor Memory reads it as each upload starts and stamps the session on the object. The agent launcher keeps it current. | — |
bio_agent | Agent ID whose telemetry the mount captures. Starts the aimem bio collector for the mounted bucket for the life of the mount. Requires bio_endpoint_file and bio_session_key, and the agent's own credential. | — |
bio_endpoint_file | File where the collector publishes its loopback OTLP endpoint. Point the agent's OpenTelemetry exporter at its contents. Set with bio_agent. | — |
bio_session_key | Attribute that carries the agent's session ID, as the agent record's capture_descriptors declare it. Set with bio_agent. | — |
Memory & metadata
| Key | What it is | Default |
|---|---|---|
max_memory_target | Soft cap (MiB) the prefetcher and buffer pool use to pace memory use. | 95% of RAM (512 MiB floor) |
metadata_ttl | How long the kernel caches file metadata: indefinite · minimal · seconds. | indefinite |
negative_metadata_ttl | How long "not found" results are cached: seconds · indefinite · minimal. | follows metadata_ttl |
metadata_dir_ttl | How long directory listings are cached: seconds · indefinite · minimal. | off unless set |
Transfer tuning
| Key | What it is | Default |
|---|---|---|
part_size | Part size for multipart GET and PUT, in bytes. | 16 MiB |
read_part_size | Part size for GET only. | part_size |
write_part_size | Part size for PUT only. | part_size |
upload_checksums | crc32c · off: checksum sent with each upload. | crc32c |
infer_content_type | Set Content-Type on upload from the file extension. | false |
storage_class | Storage class for new objects. | STANDARD |
io_retry_timeout | Seconds to keep retrying reads and writes through a short backend failure; 0 fails at once. | 60 |
Observability
| Key | What it is | Default |
|---|---|---|
log_directory | Write logs to files in this directory instead of to syslog. | — |
trace_log | Write a low-level trace log to this file. | — |
log_metrics | Write metric records to the log. | false |
otlp_endpoint | Export metrics over OTLP/HTTP to this endpoint. | — |
otlp_export_interval | Seconds between OTLP exports. | 60 |
no_log | Turn logging off. | false |
debug | Log everything at debug level. | false |
Health checks
| Key | What it is | Default |
|---|---|---|
health_path | HTTP path polled on each node to check that it is up. Required to turn on health checks. | — |
health_interval | Seconds between health checks on each node. | 5 |
health_timeout | Seconds to wait for each health-check response. | 10 |
health_optimistic | Poll only offline nodes; detect failures on healthy nodes from failed requests. | false |
health_interval, health_timeout, and health_optimistic are rejected
without health_path.
An unknown key stops the mount with unknown field 'X', so a typo is never
ignored.
Precedence
- For a key that is also a CLI flag, the flag (or its environment variable, such
as
AIMEM_LOCAL) wins. The file value applies only when the flag is not set. - A boolean key in the file can only turn a setting on. A YAML
falseis the same as leaving the key out; it cannot turn off a flag set on the command line. endpoint_urlin the file applies only when no--endpoint-urlis passed. One--endpoint-urlon the command line replaces the whole list.
Endpoints and load balancing
AIStor Memory spreads requests across AIStor nodes in turn (round-robin). List
each node under endpoint_url:
endpoint_url:
- http://aistor1:9000
- http://aistor2:9000
- http://aistor3:9000
- http://aistor4:9000A brace range is shorter and expands to the same list:
endpoint_url:
- http://aistor{1...4}:9000The range takes three dots ({1...4}, not {1..4}). You can mix both forms in
one list.
Health checks
To take an unresponsive node out of the rotation and bring it back when it
recovers, set health_path:
endpoint_url:
- http://aistor{1...4}:9000
health_path: /minio/health/ready
health_interval: 5
health_timeout: 10
health_optimistic: false- With
health_pathset, a node is marked offline as soon as a request to it fails with a connection error, and also when a periodic check fails. - With
health_optimistic: true, only offline nodes are polled. Failures on healthy nodes are detected from connection errors and request timeouts. - Without
health_path, nodes are never marked offline. A failed request is retried on the next endpoint, and the node stays in the rotation.
Per-request timeout
request_timeout sets a deadline on each request. When it passes, the request
is retried on the next endpoint:
endpoint_url:
- http://aistor{1...4}:9000
health_path: /minio/health/ready
request_timeout: 30- It needs two or more endpoints.
- With two or more endpoints, the default is
30seconds. - With
health_pathset, a node that times out is marked offline until a health check succeeds. Without it, the node stays in the rotation.
Metadata TTL
metadata_ttl: indefinite # or `minimal`, or seconds (for example 60)
negative_metadata_ttl: 60 # seconds, or `indefinite` / `minimal`metadata_ttl sets how long the kernel caches file metadata. A workspace
assumes one writer per mount (one agent per mount), so the default is
indefinite: the kernel does not look entries up again on each access.
- Set
minimal(a short, non-zero TTL) when other clients may change the bucket while it is mounted. - Set a number of seconds for a fixed cache window.
metadata_ttl: 0is deprecated. It is read asminimaland prints a warning.
"Not found" results follow metadata_ttl unless you set
negative_metadata_ttl. negative_metadata_ttl takes effect only when you also
set metadata_ttl. When metadata_ttl is not set, it is ignored.
FUSE / mount
read_only: false
auto_unmount: false
allow_root: false
allow_other: false
storage_class: STANDARD
max_threads: 16 # FUSE worker threads
uid: 1000 # owner UID reported by stat()
gid: 1000 # owner GID reported by stat()
dir_mode: "0755" # directory permissions (quoted octal string)
file_mode: "0644" # file permissions (quoted octal string)All of these except read_only are set only in the file.
Memory target
max_memory_target: 4096 # MiB; soft cap on AIStor Memory's memory useThe prefetcher and buffer pool use max_memory_target to pace memory use and
slow down when they reach it. The default is 95% of system memory, with a floor
of 512 MiB. Set it lower on a shared host where other processes need memory.
Upload checksums
upload_checksums: crc32c # or `off`The bucket's default encryption encrypts objects at rest. AIStor Memory does not set server-side encryption headers on each object.
Client tunables
user_agent_prefix: "my-app/1.0 "
virtual_host_style: false # default: path-style, which AIStor supports
part_size: 16777216 # 16 MiB, for GET and PUT
read_part_size: 16777216 # replaces part_size for GET only
write_part_size: 16777216 # replaces part_size for PUT only
io_retry_timeout: 60 # seconds to retry through a short backend failureLogging
debug: false
no_log: false
log_directory: /var/log/aimem
log_metrics: false
otlp_endpoint: http://otel-collector:4318
otlp_export_interval: 60
foreground: falseLogs go to syslog unless log_directory is set. In the foreground, logs also
go to stdout. To set the log filter directly, use AIMEM_LOG; see
Operations → Logging.
Workspace-specific keys
agent selects which agent's memory files (claude, codex, cursor, or
auto) are warmed into the local store on mount. See
How memory works for how warmup works.
The local store holds write staging and the read cache. Set it with the local:
key, the --local <DIR> flag, or the AIMEM_LOCAL environment variable. One
of the three is required, and the flag or environment variable wins over the
key.
The AIStor Memory skill needs no key. On every mount, AIStor Memory:
- adds a short preamble, in memory, to instruction files read from the mount
(
CLAUDE.md,AGENTS.md,.cursorrules); - installs the skill into
$HOME/.agents/skills/aimem/and$HOME/.claude/skills/aimem/.
To turn off the install, set AIMEM_INSTALL_SKILL=0. The install is also
skipped when $HOME is inside the mount. To turn off the preamble, set
AIMEM_PREAMBLE_OVERLAY=0. To install the Claude copy elsewhere, set
CLAUDE_CONFIG_DIR. For agents outside the sandbox, install the public skill
with npx skills add minio/skills/aimem. See the
SKILLS section for details.
Secrets have no config key. aimem secret provision gives granted secrets to
the agent as environment variables, from one source: --bucket for a Memory
Bucket, or --store-endpoint for a generic HTTP secret store.
aimem secret put, get, list, and delete manage secrets stored in a
Memory Bucket. See the Vault
and the CLI reference.
fstab
To mount at boot, add a line to /etc/fstab that points at the same YAML file:
my-memory-bucket /workspace fuse.aimem _netdev,config=/etc/aimem/mount.yaml 0 0The local: key in the file sets the staging directory. To set it in fstab
instead, add local=<dir> (the older staging_dir= and staging-dir= also
work). See Operations → fstab.
Operations
Run AIStor Memory in production. Mount a Memory Bucket in each sandbox runtime or at boot, collect logs, metrics, and agent telemetry, store secrets in the Vault, and fix common problems.
CLI reference
Every aimem command and flag. Mount a Memory Bucket, and manage buckets, secrets, search, version history, and the agent biography (bio).