Configuration
accd (environment variables)
Set them in /etc/default/accd (root:root, mode 0600), which systemd loads before switching to the acc account. Setup creates it privately; the installer also tightens existing files before reading them. deploy/accd.env.example is a commented starting point. Every variable has a neutral default, so nothing about one installation lives in the code.
| Variable | Default | Effect |
|---|---|---|
ACC_GROUPS_REMOTE / RYNHULT_GROUPS_REMOTE |
off | Enable the reviewed own-machine group account/placement path. Requires owner account approval and group project approval; remote delivery includes only the launcher's own remote-enabled keys. |
ACC_HA_AUTO_EVALUATE |
off | Only 1 enables owner-configured dry-run HA evaluation; no live telemetry adapter or automatic promotion. Authenticated owner status reads audit state changes. |
ACC_DATABASE_URL |
empty | Optional PostgreSQL URL; empty retains SQLite. Requires the postgres Python extra; one main by default, manual HA is explicit |
ACC_DATA_DIR |
/srv/acc/data |
Database and secrets |
ACC_RUN_DIR |
/srv/acc/run |
Per-session launch files and hook spools |
ACC_ROOT_RUN_DIR |
/srv/acc/run-root |
Hook spools of root's own (external) sessions, root-owned |
ACC_BROKER_SOCKET |
/srv/acc/sock/broker.sock |
Where to reach the broker |
ACC_CATALOG_LOCAL_DIR |
/srv/acc/catalog-local |
Catalog items added in the dashboard |
ACC_HOST_LABEL |
the machine's hostname | How the UI names this host |
ACC_AGENT_HOME |
/home/agent |
Home of the agent account new sessions and projects use; its name is that account |
ACC_BROKER_SOCKET_DIR |
One broker per agent account: <dir>/<account>.sock (/run/acc-broker). Unset: every account uses ACC_BROKER_SOCKET |
|
ACC_SERVICES_ACCOUNT |
the agent account | The user whose (rootless) Docker stacks ACC brings up; its broker runs nothing else |
ACC_PREVIEW_DOMAIN |
wildcard zone, otherwise ACC's first origin hostname | Private wildcard DNS suffix for isolated preview origins; must equal the wildcard zone in Cloudflare mode |
ACC_WILDCARD_ZONE |
Zone whose wildcard certificate covers published names | |
ACC_PUBLISH_ZONES |
the wildcard zone | Comma-separated zones names may be published in. Each zone's apex and www, and ACC's own hosts, are always refused. The publishing helper reads the same file |
ACC_LISTEN |
127.0.0.1:8740 |
host:port, unix:/path, or systemd (socket activation; what accd.service uses with accd.socket) |
ACC_ALLOWED_ORIGINS |
http://127.0.0.1:8740 |
Comma-separated exact origins the browser uses, e.g. https://acc.example.com; WebAuthn uses the verified origin hostname as its RP ID, with separate enrollment per hostname |
ACC_SSH_HOST |
the host of the first https origin |
The SSH host Open in editor links to (VS Code Remote-SSH); empty with no https origin hides the menu |
ACC_ORIGIN_PUBLIC_IP |
One-time bootstrap for the public Publishing address inventory; owners manage subsequent targets in Settings → Publishing | |
ACC_ORIGIN_INTERNAL_IP |
One-time bootstrap for the internal Publishing address inventory (e.g. 10.0.0.20) |
|
ACC_COOKIE_SECURE |
1 |
Set 0 only for local HTTP testing |
ACC_RETRY_BACKOFF |
0,30,120 |
Seconds before resume attempts 1–3 |
ACC_INGEST_INTERVAL, ACC_RECONCILE_INTERVAL |
1, 5 |
Supervisor loop timing (seconds) |
ACC_NODE_CA_FILE |
set by deploy/install.sh when Caddy signs ACC's certificate: /srv/acc/data/node-ca.pem |
The private root CA ACC's certificate chains to: Add machine pins it (--ca-fingerprint), GET /api/nodes/ca serves it, Settings → Certificate shows it and offers acc-root.crt and acc-root.mobileconfig. Unset: ACC's certificate is expected to be public |
ACC_GIT_DIR |
/srv/acc/git |
Git backups: one bare repository per project (acc 0700) |
ACC_BACKUP_URL |
the first https:// origin in ACC_ALLOWED_ORIGINS |
The address brokers (this machine's and nodes') push git backups to; with neither, git backups are off |
ACC_BACKUP_INTERVAL |
900 |
Seconds between looks for new commits per project (a stopped session triggers one at once) |
ACC_BACKUP_MAX_PUSH |
2147483648 |
Bytes one backup push may send |
ACC_SOURCE_URL |
ACC's own repository | Where the Source code link in Settings points (a fork that changes ACC can point it at its own source). On GitHub it also gives Add machine its links to this version's Windows and Mac installers (releases/download/v<version>/). Source of this version downloads data/bundle/acc-<version>.tar.gz |
Workstation sleep
Owners set node.idle_sleep_minutes through POST /api/nodes/{name}/policy: null (the default) disables it; 1–10080 selects minutes. Host enables it at 30 minutes. Omitted fields preserve this setting. Only active, connected Workstation nodes qualify; Always-on nodes ignore a saved duration. See Let a workstation sleep.
The supervisor evaluates after ingestion and reconciliation. Before an ordinary stop it rechecks the role, fresh screen, process output and hook spool under the stop lock. Unknown, incomplete or failed observations cannot authorize a pause. No OS power configuration changes or sleep commands are involved.
Broker
One per agent account, acc-broker@<account>.service, started from acc-broker@<account>.socket; settings in /etc/acc/broker/<account>.env, written by acc-agent-add.
| Variable | Default | Effect |
|---|---|---|
ACC_BROKER_ROLE |
agents |
agents runs that account's CLI sessions; services only brings Docker stacks up (compose_up, compose_ps) |
ACC_RUN_DIR |
/srv/acc/run |
Where its session folders go (/srv/acc/run/<account>) |
ACC_ALLOWED_UIDS |
uid of acc |
Who may use the socket |
ACC_ALLOWED_ROOTS |
/srv/acc/workspaces |
Folders the broker may work in (:-separated). Add ACC's own checkout to read its wiki as a read-only project |
ACC_PROVIDERS |
claude=claude,codex=codex |
CLI executables |
ACC_TMUX_SOCKET |
acc |
tmux socket name |
ACC_CATALOG_DIR, ACC_CATALOG_LOCAL_DIR |
Where catalog skills live (for Codex links) |
Root helpers
Personal Settings → Show advisory risk labels defaults on. The
risk_labels.<username> Setting stores enabled; authenticated
GET/PUT /api/preferences/risk-labels reads or changes only the caller's choice.
It hides advice in Inbox and Needs you, never changes guardrails or sessions.
There is no model-provider configuration for this feature.
Tool approval defaults on. Owner settings tools.person.<username> and
tools.project.<id> hold {"required": false} exemptions; either exemption
disables only the tool-change guard for newly launched sessions. The effective
value is frozen into guardrails.json; resuming an existing session does not
change its launch policy. Exempt direct installs are not inventoried.
The package helper and request CLI load the deployed sibling
acc-tool-policy.py (from acc.tooling); update both alongside the broker and
node. Tool manager executables must already exist. System operations use only
apt, snap and flatpak; account operations have fixed account-local destinations
and refuse root. See Host and Providers.
| Setting | Where | Effect |
|---|---|---|
ACC_SERVICES_ACCOUNT |
/etc/default/accd (the host snapshot loads it too) |
Whose Docker containers and user services the Host page shows |
ACC_HOSTSTATE_MOUNTS |
/etc/default/accd |
Space-separated mounts for the Host page's storage; default: every disk-backed filesystem |
ACC_BACKUP_DIR |
/etc/default/acc-backup |
Where daily backups go (default /var/backups/acc; best on another drive than /srv/acc) |
ACC_BACKUP_MIRRORS |
/etc/default/acc-backup |
user:/source:/dest;…: folders copied as their user (e.g. a project's own database dumps). Rerun deploy/install.sh after changing it: it renders the unit drop-in that makes each destination writable |
ACC_BACKUP_PASSPHRASE_FILE |
/etc/default/acc-backup |
A root-only (0600) file whose first line encrypts each day's secrets/ into secrets.tar.enc (openssl enc -aes-256-cbc -pbkdf2); unset: plain secrets/ next to acc.db. See Operations |
Setup (deploy/setup.sh) writes /etc/default/accd; the installer reads the owner, agent account, ACC's hostname and the zone from it.
Secrets (/srv/acc/data/secrets, readable only by acc)
vapid_private.pem (push notifications; created on first start), github_token (read views and repository creation), cloudflare_token (DNS), api_token (local CLI access), setup_token (first run only).
acc-node (on a node)
acc-node enroll writes /etc/acc-node.env (--config elsewhere); run and status read it. The path options take their defaults from the environment when given: ACC_NODE_CONFIG (--config), ACC_NODE_STATE_DIR (--state-dir) and ACC_NODE_SOCKET_DIR (--socket-dir of enroll, which writes it into the config file); the macOS launchd job uses these. An option on the command line wins, and an empty variable counts as unset. The state dir (--state-dir, default /var/lib/acc-node) holds the private key node.key (0600), the private CA ca.pem (trust ca only) and status.json, the last connection state that acc-node status shows.
| Variable | Effect |
|---|---|
ACC_NODE_PRIMARY |
The primary's URL, e.g. https://acc.example.com |
ACC_NODE_TRUST |
system (system CAs) or ca (only the primary's private CA); both check the hostname |
ACC_NODE_CA_FILE |
Trust ca: the CA root saved at enrollment (<state dir>/ca.pem) |
ACC_NODE_CA_FINGERPRINT |
Trust ca: SHA-256 of that root's DER, as given to --ca-fingerprint (for reference) |
ACC_NODE_ID |
The id the primary gave this node at enrollment |
ACC_NODE_NAME |
The node's name, as entered under Host → Machines |
ACC_NODE_SOCKET_DIR |
Where this node's broker sockets are (default /run/acc-broker) |
Optional WSL isolation is an explicit installer choice stored in /etc/wsl.conf,
not an environment setting. --update leaves it unchanged. Host reports effective
interop and agent-account drive access, not merely the saved configuration.
See the WSL isolation procedure.
Project and session database rows require an explicit account / run_as; there is no
built-in operator username. API creation paths select the configured default account.
Upgrades preserve existing assignments and remove the historical SQL defaults.
The bundled repository-protection ruleset is deploy/github/ruleset-protect-main.json.
ACC updates
Owners set the GitHub repository, automatic installation (off initially), daily server-local time and per-machine
following in Settings. Choices live in data/updates-config.json; check results and audit reconciliation live in
the setting table under updates. Empty repository disables checks. The default derives from ACC_SOURCE_URL
only for a GitHub URL. An optional private repository token is read from data/secrets/update_token (0600,
readable by accd and root), never returned or logged.
ACC_UPDATE_ROOT defaults to /srv/acc/updates; ACC_UPDATE_SOURCE defaults to the installed app source.
The root helper uses ACC_DATA for its data root (default /srv/acc/data) and ACC_UPDATE_GROUP for state-file
readers (default acc). Linux node service overrides set mode node, source /opt/acc/app, and group acc-node.
Node primary and CA trust come from /etc/acc-node.env; nodes never read a GitHub repository setting.
For isolated helper tests, root-controlled environment overrides also accept ACC_UPDATE_HEALTH_SOCKET,
ACC_UPDATE_BACKUP_COMMAND, ACC_NODE_CONFIG and ACC_NODE_STATE_DIR. None can be supplied in a dashboard
request or in the acc-owned updates configuration file.
ACC_UPDATE_REPOSITORY in root-owned /etc/default/accd authorizes the source root may install. Its default
is the GitHub repository derived from ACC_SOURCE_URL; an explicit empty value disables installation. A different
repository chosen in Settings can be checked, but cannot be installed until the root-owned setting matches it.
In node mode the root helper rechecks a private CA against the fingerprint in the root-owned enrollment file, and trusts that one certificate only. Appending another root to the acc-node-owned CA file cannot widen trust.
Preview network setup
Previews use preview-<project id>-<port>.<preview domain>. Run the normal root installer during deployment to render the updated Caddy templates; accd never writes Caddy configuration itself. DNS and certificate trust must be in place before the Preview tab can load an app.
- Cloudflare wildcard mode: with ACC at
acc.example.comandACC_WILDCARD_ZONE=example.com, the default preview domain isexample.com. Configure private wildcard DNS for*.example.comto ACC's LAN/VPN address. Caddy routes preview names inside its existing wildcard site and reuses the Cloudflare DNS-01 certificate. Do not create individual project DNS records. A configuredACC_PREVIEW_DOMAINmust equalACC_WILDCARD_ZONE; the installer refuses a different value. - Internal CA mode: with ACC at
acc.example.lan, the default is*.acc.example.lan. Configure that wildcard in private DNS and trust Caddy's root on client devices. The installer adds atls internalwildcard site; no public certificate or DNS record names a project. A configured private preview suffix may override the default. If ACC is opened by IP address, setACC_PREVIEW_DOMAINto a private DNS suffix instead.
Both modes apply the same private client allow list as ACC before proxying to the accd Unix socket. The existing root installer checks the private Caddy admin socket before reload. Publishing cannot use the reserved preview- namespace. Prefer a suffix on the same site as ACC; unrelated sites can encounter third-party cookie blocking in iframes.
Preview credentials last five minutes and are bound to the current browser sign-in, project, port and hostname. The gateway rechecks permissions on every request and every second during a WebSocket. Remote projects currently display an unavailable message: the machine link needs a general HTTP/WebSocket stream before they can be proxied safely.
Backup server
The encrypted backup server uses the existing ACC_DATA_DIR, ACC_CATALOG_LOCAL_DIR and ACC_GIT_DIR settings.
Its private service state is data/backup-service (0700), with signing key and independent repository-password
files (0600), target configuration, immutable staged generations and verified-result records. These
passwords are outside the DB/vault so offline recovery does not depend on opening the vault first. The recovery
kit is a confirmed owner download, not a stored session artifact.
Local target paths are provisioned by a local administrator with python -m acc.backup_server add-local as the
ACC service account; local target API actions accept IDs only. S3 setup accepts endpoint/bucket/region, never a filesystem destination. The qualified restic binary is /usr/local/bin/restic, installed
by acc-packages at /opt/acc-restic/versions/0.19.1/restic with committed checksums. Test-only/offline CLI use can
supply --restic to point at a separately verified temporary binary. Never use a backup-supplied executable.
Default policy: hourly schedule, two-hour stale threshold, 10 MiB/s transfer default, 48 hourly/30 daily/12 monthly
retention, 90-day owner drill reminder. Private payload staging is bounded to 20 GiB cumulatively (the in-flight capture
plus at most one retained failed upload), additionally limited by available free space with a 64 MiB reserve and scratch headroom. Uploads never prune automatically.
data/RESTORE-HOLD causes quarantine before ordinary startup; .update-in-progress blocks capture across updates.
The whole-capture .capture-update.lock is separate from the shorter DB mutation barrier.
See Backups for kit custody and exclusions.
Per-session containers
Container phase 0 prototype
Off by default; see docs/CONTAINERS.md ("Trusted launcher") for the design and the owner's qualification run.
| Setting | Where | Default | Effect |
|---|---|---|---|
ACC_CONTAINERS |
/etc/default/accd |
off | 1 lets owners switch projects to containers. The launcher's audit lines are copied even when off. Off: the project switch is refused, and a project still switched on refuses new sessions (never a native fallback) |
/etc/acc/containers/host-qualified.json |
root, written by sudo /srv/acc/app/.venv/bin/python -I -m acc.container_host_record record report.json |
absent | Containers are a Preview: switching a project on is refused (409, "containers are a Preview that needs a qualified host: …") until this root-owned record names a passing qualification report for this machine (/etc/machine-id). A record that isn't root-owned, sits in a folder others can write, names a failing report or another machine counts as absent. Switching off never needs it. A new session in a project already switched on is refused the same way (409, audited container.launch_refused); running sessions and resumes are left alone. python -I -m acc.container_host_record check shows the verdict |
ACC_CONTAINERS_ATTACH_QUALIFIED |
/etc/default/accd |
off | Until the container terminal attach path is qualified on a real machine, container sessions are refused with 409 "container sessions are not available yet: the terminal attach path is not qualified". Resumes, restarts and retries of existing container sessions fail with the same message. Set 1 only after that qualification run |
ACC_CONTAINERS_DIR |
/etc/default/accd |
/srv/acc/containers |
Where accd writes grants (grants/, acc:acc 0750) and reads the launcher's audit lines (audit/) |
ACC_CONTAINERS_POLICY_ID |
/etc/default/accd |
default |
Which pinned image (policy id) container sessions use |
ACC_ORGANIZATIONS |
/etc/default/accd |
off | 1 shows owners Settings → Company sign-in and mounts the OIDC routes. Company sign-in itself stays off until an owner turns it on; the redirect URI is the first https ACC_ALLOWED_ORIGINS entry plus /api/auth/oidc/callback |
ACC_CONTAINERS_ATTACH_ROOT |
/etc/acc/broker/<account>.env and the launcher's environment |
/run/acc-ct-attach |
Where each container unit's terminal relay listens (<digest>/attach.sock, a 0700 folder of the account's that the launcher makes and removes). The root itself is root's 0755 folder (the launcher sets a narrower mode back to 0755 and refuses a link or another owner). Both sides must agree |
ACC_CONTAINERS_SOCKET |
/etc/acc/broker/<account>.env |
/run/acc-containers.sock |
The launcher's socket, for the broker |
/etc/acc/containers/policy.json |
root, 0644 | absent | ACC's pinned images: {"version": 1, "images": {"default": {"image": "sha256:…", "network": "none", "providers": {"claude": "/usr/local/bin/claude"}}}}. Absent: every container launch is refused. Example: /etc/acc/containers/policy.example.json |
container_limits.<account> |
Setting (Settings → Container limits) | members 2 CPUs, 4096 MiB, 512 processes, 20 GiB, 4 sessions; owners none | Per-session cpus, memory_mib, pids, disk_gib, and sessions at once; null is no limit. Written for new accounts by create_account; otherwise the role's defaults apply |
The phase 0 qualification runner stays separate: scripts/qualify_containers.py --enable-prototype (add
--user-manager to run it through the account's lingering user manager, outside the broker's NoNewPrivileges).
It uses only the current non-root account and temporary runtime storage and always reports no-go; the repository's
scripts/container_qualification/README.md lists what it can't certify.
The launcher accepts only network: none. /etc/acc/containers/hooks.d is an empty, root-owned OCI hook directory
on a fresh installation. Helper processes share acc-launcher.slice (256 MiB, 4352 tasks: every admitted connection at its unit's limit, one CPU), separately from
session budgets; a launch request's service gets 256 tasks, since it runs Podman as the account for the image check
(refused as launcher_task_limit if that hits the limit). Audit buffers retain up to 16 MiB/day of lifecycle records and 64 KiB/day in each of 64 fixed uid refusal buckets of refusals for 30
days; saturation is reported to the journal. Disk scans refuse unsafe or excessively large directory trees.
It uses only the current non-root account and temporary runtime storage, prints
a JSON report and exits with no-go. Without the flag it performs no runtime work.
Optional --image (immutable sha256 image ID) and --image-archive arguments
import a reviewed archive into temporary storage for a fixed offline payload;
no images are downloaded. Never run as root or point it at another account's
runtime. The repository's scripts/container_qualification/README.md documents
prerequisites and the gates this script cannot certify. Phase 0 remains blocked
on rootless mapping in the restricted broker context, AppArmor, nested sandboxes,
real mandatory provider hooks and credential adapters. It grants no isolation
status or automatic native fallback.
DNS phase 1
Owner-only credentials and bindings are stored in the existing encrypted vault database/key pair; there are no
provider secret settings in project/session configuration. The production Publishing provider is cloudflare. azure and route53 have fixed credential forms and candidate adapters, with activation pending both live consumers.
The optional inactive root deployment uses /etc/acc-dns/policy.json (allowed zones), release.json (independently
reviewed binary manifest), /etc/caddy/acc-dns (0700 credential generations), /run/acc-dns/helper.sock (root:acc
0660, kernel peer UID check) and a root-only shared configuration lock. New helper requests have no path, endpoint,
module, service or executable overrides. The checked-in release remains pending CI artifacts and live qualification.
Installer and Publishing Caddy validation prefer the managed certificate EnvironmentFile after cutover, including when the legacy file has been removed. No credential is put in argv. The internal-CA installation path needs no provider. An operator activates the root socket and hourly retention timer deliberately; the helper installer does not start Caddy or the helper. See Caddy hardening for deployment and recovery gates.
The managed multicloud wildcard template is deploy/dns/wildcard-managed.caddy.in. An operator must deliberately
render it for the root-approved zone before first Azure/Route 53 apply. The root policy defaults to Cloudflare;
expanding its fixed providers list is a local reviewed operator action, never a portal request. The managed
EnvironmentFile contains a strictly regenerated provider block, not caller configuration. Both helper installers
install the same root-owned standalone credential parser; installer and Publishing validation consume it too.
Enrolled Linux backup targets
Enrolled Linux backup targets are prepared in Host → Backups → Set up. Target records bind the enrolled
node ID and restic repository ID; repository keys live in backup-service/keys, independent ciphertext
transport tokens in backup-service/transport (private 0600 files). No target maintenance credential is stored.
The owner installs root-owned /etc/acc/backup-target.json, /etc/acc/backup/writers and
acc-backup-receiver.service on the target using the exact rendered commands. The receiver uses target
loopback port 18762 and /var/lib/acc-backup, owned by the dedicated non-login acc-backup account;
acc-node gets no filesystem access. The unit drops all capabilities, allows only loopback addresses
(IPAddressDeny=any, IPAddressAllow=localhost) and uses the usual systemd sandboxing. Default repository
ceiling is saved as max_size_bytes when preparing a target: 1–10240 GiB, defaulting to half the reported free space on the receiver filesystem (whole GiB, rounded down), or 20 GiB when unavailable. Records without the field retain 100 GiB. This is not a filesystem quota. On the main, each job's adapter is a Unix socket in a private
acc-backup-* folder under the system temporary directory, removed when the job ends.
Official rest-server 0.14.0 amd64/arm64 archive checksums are committed in acc.backup_targets.
Database backend
ACC_DATABASE_URL defaults to empty, which uses SQLite at ACC_DATA_DIR/acc.db. A PostgreSQL URL such as postgresql+psycopg://db.example.lan/acc?sslmode=verify-full selects PostgreSQL and requires the postgres Python extra. Application, migration and transfer connections default to sslmode=verify-full when omitted; an explicit URL mode overrides it. Configure trusted database CA material and retain hostname verification. Protect this environment value as a secret. One main is the default; manual HA requires explicit setup and fencing. The source runbook docs/POSTGRESQL.md covers root-only offline transfer, checksums, search differences and independent PostgreSQL backups. ACC server-backup capture refuses PostgreSQL; it cannot protect that database.
Manual HA
ACC_HA_NODE_ID defaults to empty (single-main behavior). Set a distinct stable
lowercase main name on each PostgreSQL main to enable manual active/passive mode;
every process starts standby. SQLite refuses this setting. An initialized cluster
database requires it on all subsequent mains. ACC_NODE_ALTERNATE_PRIMARIES is an
optional whitespace-separated list of owner-approved HTTPS control endpoints on
execution nodes; it defaults to empty and uses the existing verified TLS trust.
It changes node reconnect attempts, not download/git/update endpoints. Read the
owner runbook before enabling either setting.
ACC_HA_AUTO_EVALUATE=1 opts into dry-run automatic evaluation; it defaults to
off and is not a promotion switch. Current production status has no witness,
heartbeat or replication telemetry, so enabled evaluation reports Telemetry
unavailable and Would promote now: No. Manual owner promotion and independent
fencing remain mandatory. See automatic evaluation.
S3 backup targets
Owner setup records endpoint, bucket, region, unique prefix, repository identity and infrastructure credential ID
in backup-service/targets.json. Provider s3, purpose backup-writer uses fixed access-key/secret-key/optional
session-token fields sealed in the infrastructure table; these are not general Keys or DNS credentials. Temporary
s3-job-* credential files are private and removed on job exit and startup reconciliation. There is no ambient
AWS identity, custom proxy or insecure TLS configuration. Timed credentials require owner replacement.
Retention inspections cap each XML response at 2 MiB and the complete paginated scan at 100,000 repository objects.
Compressed responses are refused before body reads, and paginated inspection has a 1,000-page/two-hour limit.
Captures record the minimum COMPLIANCE deadline; status requires at least 30 days still remaining and capture/check
ages below two hours, with an exported kit bound to the repository. Maintenance credentials are never configured in accd or its vault.
The opt-in independent-host acc-s3-maintain CLI accepts only explicit private target and purpose-tagged identity
files (at most 1 MiB each) and a durable private state directory. Writer-key history is bounded by that file
size rather than an arbitrary rotation count. Audit events identify the maintenance key ID, never its secret.
No main setting or timer enables it. Its defaults and limits are:
| Control | Default / bound |
|---|---|
| Mutation | Dry-run; --apply explicitly resumes the last reviewed plan |
| Extension rule | Below 35 UTC days remaining, extend to 60 days from inventory completion; never shorten |
--requests-per-second |
2; range 0.1–10 |
--max-updates |
1,000 attempts per apply; range 1–100,000 |
--max-extra-gib-days |
1,000; positive finite plan-wide added-storage ceiling |
--storage-usd-per-gib-month |
Unset/0 means unknown dollar estimate |
--requests-usd-per-1000 |
Unset/0 means unknown dollar estimate |
| Inventory | All surviving valid restic versions except locks; 100,000 inspected rows, 1,000 pages |
| Reviewed plan | Expires at 24 hours; bound to target and maintenance key ID |
| Private audit journal | 128 MiB maximum; owner archives independently |
| Main runway warning | Seven days until last version-bound minimum deadline falls below 30 days |
The CLI shares the bounded HTTPS/SigV4 client, without ambient AWS identity or insecure TLS options. A separate IAM principal, all writer key IDs and owner-reviewed effective policies are required; key-ID refusal alone cannot prove separation. See IAM policy, cost interpretation and owner commands.
Remote access preparation
The owner setting remote_access defaults to pairing_enabled: false, an empty
public hostname/private recovery origin and certificate_days: 90. Owners prepare
it in Settings → Remote access after recent verification on LAN. Certificate
lifetime can be shortened to 1–90 days. Saving preparation never enables public
access. Separate durable remote_access_runtime intent defaults off and records
the last verified helper result, revision, count and pending state. Remote
previews remain off. Apply requires the separately provisioned root policy and
qualification flag; HA enablement is refused.
Pairing links last five minutes. Approved import bundles and separate passwords
stay in memory for at most five more minutes and are removed on one download,
revocation or person removal. The root signer client uses only the fixed
/run/acc-device-ca.sock; rendering reads only the public device-ca.pem in
ACC's data directory. The apply client uses only /run/acc-remote-access.sock,
checks the root peer and has a 30-second deadline. A worker reconciles active
registry leaves and checks the loaded policy every 15 seconds. OFF needs no
recent verification, hostname or CA and is retried while pending. No helper,
service or CA is installed by these settings. See Device pairing.
Rynhult environment compatibility
Every ACC_* setting also accepts the same suffix under RYNHULT_*. The new
name wins when both are present, even when it is explicitly empty; the setting's
usual validation still applies. For example, RYNHULT_ALLOWED_ORIGINS=https://main.example.lan
is an alternative to ACC_ALLOWED_ORIGINS. Unrelated vendor variables keep their names.
acc.env.Environment is the shared Python reader for process environments and
parsed configuration files. Standalone helpers load the same dependency-free
module, installed beside them as acc_env.py. Shell installers/hooks use
deploy/lib/acc-env.sh; JavaScript readers use src/acc/env.mjs. The Windows
installer uses its shared Get-AccEnvironmentValue function. Subprocess/session
exports include both spellings with the resolved value. Both spellings of
RUN_DIR, SESSION_ID and GUARD_FILES are protected against project overrides,
including when the main delivers to an older broker. The vault reserves both
product prefixes and revalidates previously stored keys before delivery; the
compiler and broker also refuse overrides of these protected launch values.
Keep the existing configuration file as the single source of truth. Enrollment continues writing legacy keys so retained older node readers can load it. No second writable config file or database is created. Existing installations keep all paths, service accounts, authentication cookies and the CSRF header.
Public git backup consent
node.public_git_backup defaults to false for every machine, including existing machines upgraded by migration 0068. An owner enables it under Host → Machines → Machine settings → Allow git backups over the public address. Verified remote access and machine identities are also required; the private backup URL remains preferred. This is separate from the project’s git-backup switch. Opt-out closes public git streams and revokes pending/public capabilities without stopping private transfers.
Native mobile server APIs
ACC_MOBILE defaults off. 1, true or yes exposes the experimental native
lifecycle APIs and includes native leaves in edge policy. Native activation also
requires a separately owner-provisioned random assertion key in root edge policy
and the private main-owned secrets/mobile-edge-key file. No app, relay, public
bootstrap or service installation is included. Owner enrollment and renewal stay
on the configured private LAN origin. See Mobile devices.
Admin feature availability
The existing setting table's admin_features row stores choices and an integer revision; no migration is needed.
GET /api/admin-features and PUT /api/admin-features/{key} are owner-only. Changes use the revision to reject
stale tabs, serialize with database writer admission, audit admin_features.update, publish the committed snapshot
and then drain optional work. Enabling trust-widening features calls the same recent-verification check as other
sensitive settings. No request-controlled environment variables are introduced.
Explicit server configuration wins: RYNHULT_FEATURE_<ID> / ACC_FEATURE_<ID> (uppercase feature id), then the
legacy feature flag where one exists, then Settings.feature_overrides / explicitly constructed legacy Settings
flags. A present RYNHULT spelling wins over ACC, including empty values. These values lock the panel. Otherwise
DB choice wins over the original default. Supported IDs are returned by the owner API. Qualification flags and
per-project choices remain independent checks. Telemetry sharing consent and remote-access apply remain separate.
One main process owns the effective snapshot, shared by API and background workers without opening nested transactions. HA promotion reloads it before starting workers. Derived Settings retain dataclasses.replace compatibility. Orchestrator routers remain registered for hot enable; the shared request boundary, dynamic tool registry and per-slice checks refuse access while Off, including explicit deployment slice opt-outs.
This page is generated from docs/wiki/Internal/Configuration.md; the same page is under Guide inside Rynhult.