Skip to main content
This documentation is for the federal deployments of Devin. Back to Devin Docs
The air-gapped CLI and Desktop keep all of their state in a small set of files with documented, stable formats. This page lists where each file lives, which ones you author, and the exact schema of the audit log so you can forward it to your SIEM.

File locations

Files you author

These are the machine-wide inputs. Each has a default path and an environment variable that overrides it; the variable must be set in the environment the agent starts from (see API key environment variables for how to do that for Desktop). The defaults are the same on macOS and Linux. On Windows the license, models file, and auth file default to C:\ProgramData\Devin\ (license.devin-onprem-license, models.json, auth.json), the machine-wide policy file is C:\ProgramData\Devin\system.json, and the override variables are the same; lock the folder down before placing files in it. The CLI reads these files and never writes to them, so you can manage them with your configuration-management tooling and make them read-only.

Per-user state written by the CLI

The CLI follows the XDG base-directory layout on both macOS and Linux (it does not use ~/Library for its own state). XDG_CONFIG_HOME and XDG_DATA_HOME are honored when set. cli-federal is the product subdirectory used by the air-gapped build; it keeps this state separate from any standard Devin CLI install on the same machine, which uses cli. On Windows the CLI does not read XDG_* variables. It keeps the same files under %APPDATA%\devin\, and its cache under %LOCALAPPDATA%\devin\:

Desktop-specific state

The Desktop application is isolated from any other Devin Desktop or Windsurf install on the same machine: The symlink is created at Desktop startup only if nothing exists at ~/.devin-airgap-config/devin/config.json. If a regular file is already there, Desktop leaves it alone and the bundled agent uses that file instead of the shared one; the Devin ACP output channel logs a WARNING: … is a regular file, not a symlink line. Delete the file and restart Desktop to restore the link. On Windows there is no symlink. Desktop’s bundled agent and the CLI share %APPDATA%\devin\config.json directly, and Desktop does not load the user’s %APPDATA%\devin\mcp_config.json. Desktop user data is in %APPDATA%\Devin - Airgap\. Only ~/.devin-airgap-config/ and ~/.devin-airgap/ are safe to delete for a clean-slate reinstall. ~/.config/devin/ and ~/.local/share/devin/ also belong to the standalone CLI.

Audit log

The air-gapped CLI writes a local, append-only, structured audit log. It is always on (there is no toggle), does not exist in any other Devin build, and is written to the workstation for your own review and SIEM ingestion.

Location and rotation

Ship rotated files to your SIEM before they age out if you need unbounded retention. Because the CLI only ever appends and never rewrites existing lines, a standard file-tailing collector is sufficient; see Forward the audit log to your SIEM.

Redaction guarantees

Events carry paths and metadata only. The log never contains prompts, model responses, code, file contents, secret values, API keys, or full shell command lines: for shell tools only the program name (the first token) is recorded.

Envelope (schema version 1)

Every line carries this envelope; per-event fields are flattened alongside it. Configure your parser to ignore unknown fields and unknown event values: new fields and event types may be added without a schema_version bump.

Event types

session_start

Emitted when an agent session begins (new or resumed root session).

session_end

Emitted when the session ends or the agent shuts down.
Every session_start is paired with exactly one session_end for the same session_id on clean exit. The CLI runs the agent in a child process that it terminates on teardown, so the parent process records the child session’s session_end (reason other) when the session finishes. A session killed by SIGKILL or power loss cannot write a final event; treat a session_start with no matching session_end as an abnormal termination.

tool_call

Emitted after each tool the agent executes.

file_read and file_write

Emitted in addition to tool_call, once per path in the tool’s resolved permission scope. They describe the access the tool was scoped to, not verified I/O: a tool approved with read scope over several paths emits a file_read per path even if it touched only some of them, and the events are emitted whether or not the tool call succeeded.

model_call

Emitted after each inference request to a model endpoint from your models file. Token fields are omitted when the endpoint does not report usage.

auth

actor object

Identity attribution is the OS user, the local git identity, and (when SSO is configured) the identity from the validated ID token. Fields are omitted when unavailable. The SSO fields are present on every auth event that has a validated token at hand (sso_login, sso_refresh, sso_logout, sso_login_denied), on sso_revalidation_failed for the login the process validated (or, when it validated none, the login still in the token cache), and on session_start and identity_resolved for the login the running process validated at startup. tool_call, file_read, file_write, and model_call carry no actor; attribute them through session_id to their session_start.
sso_groups records each user’s IdP group memberships on the local machine. The audit directory and files are owner-only; include them in your data-handling review if group names are sensitive in your environment.

Forward the audit log to your SIEM

Devin does not send audit records anywhere. To aggregate usage across workstations, point the log collection agent your SIEM already uses (for example a Splunk universal forwarder or Elastic Agent) at the audit directory on each workstation. No Devin setting is involved. Configure the agent’s file input with these settings:
The audit directory and files are readable only by the user who owns them, and Devin resets these permissions each time it opens the log. Run the collection agent as root or as the user. Do not change the file permissions to give another account access; the change does not persist.
Each user’s workstation keeps the active file plus at most 10 rotated files of 10 MiB each, about 110 MiB in total. Records older than that are deleted, so a workstation that produces more than this between collections loses its oldest records. To confirm collection is working, start and end a Devin session on a workstation, then search your SIEM for a session_start and a session_end record with the same session_id.

Example: Splunk universal forwarder

Deploy these two files in an app on each forwarder (for example $SPLUNK_HOME/etc/apps/devin_audit/local/). Use only the monitor stanza that matches the workstation’s operating system, and replace devin with the index you want to use.
inputs.conf
props.conf
props.conf must be on the forwarder, not only on the indexers, because INDEXED_EXTRACTIONS is applied where the file is read. Leave crcSalt unset: the forwarder then recognizes a rotated file by its content and does not read it again under its new name. Every directory in the wildcard path must be readable by the account the forwarder runs as; a forwarder installed as a non-root service account cannot read the owner-only audit directories. Fields arrive as indexed fields with their JSON names, so actor.sso_user, model, and input_tokens are searchable directly:

Example: Elastic (Filebeat or Elastic Agent)

Add this filestream input to filebeat.yml. Keep only the path for the workstation’s operating system.
filebeat.yml
The ndjson parser puts every record under a devin. prefix (devin.event, devin.session_id, devin.actor.sso_user). Do not set target: "": the record’s event field is a string, which conflicts with the event object in the Elastic Common Schema and makes Elasticsearch reject the documents. The timestamp processor copies ts into @timestamp; Elastic marks this processor as beta, so if you prefer, drop it and set @timestamp from devin.ts in an ingest pipeline instead. The id must be unique among your filestream inputs. Filebeat’s default file identity is a fingerprint of the start of the file, which follows a file across the rename that rotation performs, so no rotation setting is needed. The fingerprint length is lowered from the default 1024 bytes to 64 because Filebeat 9.0 to 9.4 ignores a file until it is at least that long, which would skip a workstation with only a few records. The first 64 bytes of an audit file contain the first record’s ts and pid, which keeps fingerprints distinct. Changing the length later makes Filebeat read every file again. With Elastic Agent, add the Custom Logs (Filestream) integration to the agent policy, enter the same paths, and put the parsers and processors blocks above in the integration’s custom configuration field.
Cognition has not run these examples against a Splunk or Elastic deployment. Validate them in your environment, and check the vendor documentation for your installed version before deploying them to workstations.
Useful fields to index or search on: Only session_start and auth records name the user. To attribute tool_call, file_read, file_write, and model_call records to a user, join them to the session_start record with the same session_id.

Diagnostics report

devin diagnostics writes a redacted, plain-text report you can review before sending it to Cognition support. It contains only versions, configuration shape (whether each file exists and parses), model names, whether each API-key variable is set, and audit-log statistics; it never contains prompts, code, file contents, secret values, endpoint URLs, or environment-variable values.
Use --output <path> to choose the file name. The report is written owner-only (0600). See Troubleshooting for what to include in a support request.