Pro plugin

ChatGPT

Collects ChatGPT (unified ChatGPT/Codex desktop app) local threads, cached cloud conversations, automations, workspaces, MCP servers and hooks, logs, install attribution and preferences, plus ChatGPT Classic metadata

ai.chatgptPromacOS 12.0+v1.0.0aicommunicationuserexecution

Run this plugin

Trigger collection for ChatGPT on its own with the --plugin flag, or include it in a wider sweep by category.

# Just this plugin
macfor-pro collect --plugin ai.chatgpt --output ./evidence.zip

# Dry run — list what would be collected
macfor-pro collect --plugin ai.chatgpt --dry-run

Compatibility

  • macOS 12.0+

Licensing: ships in the macfor-pro binary. See Community vs Pro.

Options

Set an option with --plugin-opt ai.chatgpt.<name>=<value>. The flag is repeatable, and a value can be a literal, env:NAME (an environment variable), file:PATH (a file's contents), or literal:VALUE (a literal that starts with env: or file:). Use env: or file:for secrets so they stay out of shell history. Options are recorded in the container's manifest.json and chain of custody; values read from env: or file:, and values of secret-looking keys such as audit_key, are recorded only as [set].

macfor-pro collect --plugin ai.chatgpt \
  --plugin-opt ai.chatgpt.skip_content=true \
  --plugin-opt ai.chatgpt.include_cli_threads=true \
  --output ./evidence.zip

Requires v0.2.0+. --plugin-opt was added in collector v0.2.0. Without it the plugin runs with the defaults below.

Privacy defaults

  • Secrets are redacted in records. Every record passes through redaction: values under secret-like keys, URL credentials and secret query parameters, and token-shaped strings in free text (titles, prompts, log lines, tool arguments) become [REDACTED:sha256:<8 hex>], so equal secrets still correlate across records. OAuth tokens and API keys from auth.json are never emitted; the record only notes which fields are present. include_secrets turns redaction off.
  • Raw evidence files are copied byte-for-byte. Rollout JSONL files, the sqlx databases (state_N, thread_history_N, logs_N, …), LevelDB stores, desktop logs, the in-app browser History and the HTTP cache entries that are kept go into the container unmodified as original evidence. Redaction applies to records, not to these copies. skip_content hashes and records the content files instead of copying them.
  • Secret-bearing files are not copied without include_secrets. auth.json, shell snapshots, the Cookies, Login Data and Web Data databases are parsed into records (or only noted) but stay out of the container. config.toml, hooks.json and .codex-global-state.json are copied only when redaction changed nothing in them. This also applies to include_raw.
  • Cookie values (Chromium v10) are never decrypted or emitted, saved passwords are never read, and the Keychain is never read.
  • CLI threads are counted, not emitted. ~/.codex is shared with the Codex CLI. Threads that the CLI started belong to the planned ai.codex plugin: ai.chatgpt records them only as a count in chatgpt_thread_summary (owner_plugin ai.codex) unless include_cli_threads is set.
  • ChatGPT Classic is not collected yet. The legacy native app (com.openai.chat) is recorded in the install inventory, but its encrypted conversation cache is declared as planned. macfor does not decrypt it.

Content and secrets

OptionTypeDefaultEffect
skip_contentboolfalseMetadata only. Drops message, reasoning summary, tool-input, draft, prompt, memory, thread title and log text. Rollouts, databases, workspace files, cached responses and logs are hashed and recorded but not copied. Structure, counts, timestamps and tool names remain.
include_secretsboolfalseTurns off redaction and copies auth.json, shell snapshots, the cookie, Login Data and Web Data databases, and config and state files that redaction would have changed. Login Data usernames are emitted only with this option, and never under skip_content.
include_instructionsboolfalseEmits full base and developer instructions from rollouts. By default a SHA-256 and the first 2 KB are recorded.
include_rawboolfalseCopies the Codex/ application data tree and ~/.codex, file by file, minus app bundles, caches and secret-bearing files (unless include_secrets is set).
classic_keystringunsetPlanned (not used yet). The examiner-supplied key for decrypting ChatGPT Classic conversations. It is a secret: pass it with env: or file:; it is never logged, emitted or serialized. macfor never reads the Keychain to obtain it.

Scope

OptionTypeDefaultEffect
include_cli_threadsboolfalseAlso emits the records of threads the Codex CLI started (for when ai.codex is not run). By default they are only counted in chatgpt_thread_summary.
http_cache_all_hostsboolfalseIndexes every HTTP cache entry, not just chatgpt.com, openai.com and oaiusercontent.com hosts.

Skip artifacts

OptionTypeDefaultEffect
skip_http_cacheboolfalseSkips the HTTP cache (cached cloud conversations and generated images).
skip_workspacesboolfalseInventories ~/Documents/Codex (paths, sizes, hashes) without copying the files.
skip_logsboolfalseSkips desktop log files and the logs_N databases.
skip_cookiesboolfalseSkips cookie metadata.
skip_browserboolfalseSkips the in-app browser partition.
skip_storageboolfalseSkips Local and Session Storage.

Artifacts (17 collected, 1 planned)

Each row corresponds to an entry in the plugin's artifacts.yaml manifest. Optionalartifacts are often absent, and their absence isn't recorded as an error. Plannedartifacts are documented locations the plugin doesn't collect yet. Where a path shows a version range, macfor only tries it when the source's macOS or application version is in that range.

metadata

ArtifactFormatPathNotes
ChatGPT Installation
chatgpt_installOptionalSensitivehigh value
binary_plist/Applications/ChatGPT.app/Contents/Info.plist
+13 more
  • /Applications/Codex.app/Contents/Info.plist
  • /Applications/ChatGPT Classic.app/Contents/Info.plist
  • ~/Applications/ChatGPT.app/Contents/Info.plist
  • ~/Applications/Codex.app/Contents/Info.plist
  • ~/Applications/ChatGPT Classic.app/Contents/Info.plist
  • ~/Library/Application Support/com.openai.codex.installer/attribution.json
  • ~/Library/Application Support/com.openai.codex.installer/attribution-acknowledgment.json
  • ~/Library/Application Support/com.openai.codex/production-appcast-bootstrap.json
  • ~/Library/Application Support/Codex/Last Version
  • ~/Library/Application Support/Codex/Local State
  • ~/.codex/.codex-global-state.json
  • ~/.codex/installation_id
  • ~/Library/Preferences/com.openai.codex.installer.plist
Bundles recorded with kind unified (com.openai.codex named ChatGPT), codex (com.openai.codex named Codex) or classic (com.openai.chat), plus TCC usage strings. Installer created_at_ms, install ids and versions; first desktop use. Sensitive because install and installer ids identify the host.
ChatGPT Project-less Workspaces
chatgpt_workspacesOptionalSensitivehigh value
directory~/Documents/Codex/
+2 more
  • ~/Documents/Codex/*/*/outputs/
  • ~/Documents/Codex/*/*/work/
Files the agent wrote for project-less threads (outputs/) and its scratch area (work/). skip_workspaces inventories (hash, size, times) without copying.
ChatGPT Raw Application Data
chatgpt_rawOptionalSensitivemedium value
directory~/.codex/
+1 more
  • ~/Library/Application Support/Codex/
Opt-in raw copy of ~/.codex and the Codex user-data dir, excluding bundles, caches and secret-bearing files (auth.json, shell_snapshots, Cookies, Login Data) unless include_secrets.

config

ArtifactFormatPathNotes
ChatGPT/Codex Configuration
chatgpt_configOptionalSensitivehigh value
text~/.codex/config.toml
+1 more
  • ~/.codex/hooks.json
MCP servers (command, args, env — redacted), plugins, notify command and hooks (SessionStart … SubagentStop) are execution/persistence vectors. Shared with the Codex CLI; emitted with scope shared.
ChatGPT Preferences and Components
chatgpt_prefsOptionalSensitivemedium value
binary_plist~/Library/Preferences/com.openai.codex.plist
+20 more
  • ~/Library/Preferences/com.openai.codex.installer.plist
  • ~/Library/Preferences/com.openai.sky.CUAService.plist
  • ~/Library/Application Support/Codex/Default/Preferences
  • ~/Library/Application Support/Codex/statsig-state.json
  • ~/Library/Application Support/Codex/browser-sidebar-page-states.json
  • ~/Library/Application Support/Codex/sentry/scope_v3.json
  • ~/Library/Application Support/Codex/sentry/session.json
  • ~/Library/Application Support/Codex/sentry/queue/
  • ~/Library/Application Support/Codex/Crashpad/
  • ~/Library/Application Support/Codex/artifact-sessions/
  • ~/Library/Caches/com.openai.codex/org.sparkle-project.Sparkle/Installation/
  • ~/Library/Caches/com.openai.sky.CUAService/
  • ~/Library/Group Containers/2DC432GLL2.com.openai.sky.CUAService/
  • ~/Library/Application Support/OpenAI/Codex/NativeMessagingHosts/
  • ~/.codex/computer-use/
  • ~/.codex/plugins/cache/
  • ~/.codex/skills/
  • ~/.codex/visualizations/
  • ~/.codex/models_cache.json
  • ~/.codex/cache/
Sparkle settings and last check, staged update version, Sentry scope, computer-use, plugins, skills and native messaging hosts (chatgpt_component). The CUAService group container is TCC-protected: permission denied is recorded. Paths with no parser (Preferences, statsig-state.json, browser-sidebar-page-states.json, Crashpad/, artifact-sessions/, the CUAService cache, visualizations/, models_cache.json, ~/.codex/cache/) become chatgpt_file_inventory records and are copied as evidence: JSON files only when plugin redaction changes nothing, Crashpad minidumps and attachments only with include_secrets, content (visualizations, artifact sessions, sidebar pages, CUA cache, minidumps) not under skip_content; ~/.codex/cache/ is inventoried only.

credentials

ArtifactFormatPathNotes
ChatGPT/Codex Authentication
chatgpt_authOptionalSensitivehigh value
json~/.codex/auth.jsonauth_mode, account_id, token/API-key presence, last_refresh and non-secret JWT claims. Token, API key and signature values are never emitted; the file is copied only with include_secrets.
ChatGPT Shell Snapshots
chatgpt_shell_snapshotsOptionalSensitivemedium value
text~/.codex/shell_snapshots/
+1 more
  • ~/.codex/shell_snapshots/*.sh
Variable and function names, size, hash and mtime per snapshot. Snapshots routinely contain secrets: values are never emitted and files are copied only with include_secrets.

session

ArtifactFormatPathNotes
ChatGPT Threads
chatgpt_threadsOptionalSensitivehigh value
sqlite~/.codex/state_*.sqlite
+2 more
  • ~/.codex/sqlite/codex-dev.db
  • ~/.codex/session_index.jsonl
Local (desktop and CLI) threads and ChatGPT cloud conversations (host_kind chatgpt): titles, first user message, cwd, model, creator account, origin. Filename suffix is the schema generation. CLI-originated threads are counted, not emitted, unless include_cli_threads.
ChatGPT Desktop State
chatgpt_desktop_stateOptionalSensitivehigh value
json~/.codex/.codex-global-state.json
+1 more
  • ~/.codex/.codex-global-state.json.bak
Composer prompt drafts, prompt history, sidebar and Spaces state, thread activity times, project-less output directories, onboarding accounts. chatgpt-conversation-resume-tokens-v1 values are recorded as present only.
ChatGPT Memories, Goals and Queue
chatgpt_memoriesOptionalSensitivemedium value
sqlite~/.codex/memories_*.sqlite
+3 more
  • ~/.codex/goals_*.sqlite
  • ~/.codex/queue_*.sqlite
  • ~/.codex/thread_history_*.sqlite
Stage-1 memory outputs (raw_memory, rollout_summary), thread goals, queued prompts and realtime session events (thread_realtime_items in thread_history_N).

messaging

ArtifactFormatPathNotes
ChatGPT Thread Items
chatgpt_thread_itemsOptionalSensitivehigh value
jsonl~/.codex/sessions/
+3 more
  • ~/.codex/sessions/*/*/*/rollout-*.jsonl
  • ~/.codex/thread_history_*.sqlite
  • ~/.codex/archived_sessions/
Messages, reasoning (encrypted_content length only), tool calls, command executions, web searches, turns and token usage. Rollouts (sessions/ and archived_sessions/, where archived threads' rollouts are moved) are copied and parsed from the copy (the app may append while running).
ChatGPT Classic Conversations
chatgpt_classic_conversationsPlanned — not collected yetOptionalSensitivehigh value
binary~/Library/Application Support/com.openai.chat/
+12 more
  • ~/Library/Application Support/com.openai.chat/conversations-v2-*/*.data
  • ~/Library/Application Support/com.openai.chat/conversations-v3-*/*.data
  • ~/Library/Application Support/com.openai.chat/gizmos-*
  • ~/Library/Application Support/com.openai.chat/drafts-*
  • ~/Library/WebKit/com.openai.chat/
  • ~/Library/HTTPStorages/com.openai.chat/
  • ~/Library/HTTPStorages/com.openai.chat.binarycookies
  • ~/Library/Group Containers/group.com.openai.chat/
  • ~/Library/Application Scripts/group.com.openai.chat/
  • ~/Library/Preferences/ChatGPTHelper.plist
  • ~/Library/Caches/ChatGPTHelper/
  • ~/Library/Preferences/com.openai.chat.plist
Planned (MACFOR-CGPT-6.x). Conversation paths and cipher are [U]; decryption needs an examiner-supplied classic_key (never logged or emitted). Without it: metadata inventory with decrypted false.

cache

ArtifactFormatPathNotes
ChatGPT HTTP Cache
chatgpt_cacheOptionalSensitivehigh value
binary~/Library/Caches/Codex/Default/Cache/Cache_Data/
+5 more
  • ~/Library/Caches/Codex/Default/Partitions/*/Cache/Cache_Data/
  • ~/Library/Caches/com.openai.codex/Cache.db
  • ~/Library/Caches/com.openai.codex/fsCachedData/
  • ~/Library/HTTPStorages/com.openai.codex/
  • ~/Library/HTTPStorages/com.openai.codex.binarycookies
Cached conversation JSON (backend-api/conversation), account, memories, GPT pins, automations; estuary/content generated images extracted as files. Host filter chatgpt.com/openai.com/oaiusercontent.com unless http_cache_all_hosts. Partition cache location is [U]. NSURLCache Cache.db rows become chatgpt_update_event nsurlcache_entry records (same host filter plus the oaistatic.com appcast CDN); Cache.db, its companions and referenced fsCachedData bodies are copied by default (not under skip_content). HTTPStorages (NSURLSession cookies/HSTS) is inventoried and copied only with include_secrets.

persistence

ArtifactFormatPathNotes
ChatGPT Automations
chatgpt_automationsOptionalSensitivehigh value
sqlite~/.codex/sqlite/codex-dev.dbScheduled prompts (prompt, rrule, cwds, account) with run history and inbox items — a persistence and execution vector. *_at unit is [U] (believed ms).

logs

ArtifactFormatPathNotes
ChatGPT Logs
chatgpt_logsOptionalSensitivemedium value
text~/Library/Logs/com.openai.codex/
+2 more
  • ~/Library/Logs/com.openai.codex/*/*/*/codex-desktop-*.log
  • ~/.codex/logs_*.sqlite
Directory and filename dates are UTC; lines 'YYYY-MM-DDTHH:MM:SS.sssZ <level> <message>'. logs_N rows carry thread_id and process_uuid.

cookies

ArtifactFormatPathNotes
ChatGPT Cookies
chatgpt_cookiesOptionalSensitivemedium value
sqlite~/Library/Application Support/Codex/Default/Cookies
+1 more
  • ~/Library/Application Support/Codex/Default/Partitions/*/Cookies
Cookie host, name, path, times and flags. Values are safeStorage (v10) encrypted and never decrypted; the database is copied only with include_secrets.

history

ArtifactFormatPathNotes
ChatGPT In-App Browser
chatgpt_browserOptionalSensitivehigh value
sqlite~/Library/Application Support/Codex/Default/Partitions/codex-browser-app/History
+7 more
  • ~/Library/Application Support/Codex/Default/Partitions/codex-browser-app/Login Data
  • ~/Library/Application Support/Codex/Default/Partitions/codex-browser-app/Cookies
  • ~/Library/Application Support/Codex/Default/Partitions/codex-browser-app/Local Storage/leveldb/
  • ~/Library/Application Support/Codex/Default/History
  • ~/Library/Application Support/Codex/Default/Login Data
  • ~/Library/Application Support/Codex/Default/Web Data
  • ~/Library/Application Support/Codex/Default/Partitions/codex-mcp-app-sandbox%3Ashared/
In-app browser visits (url, title, visit_time, transition, partition) and saved logins (origin, username presence, use counts — never passwords). Login Data is copied only with include_secrets.

storage

ArtifactFormatPathNotes
ChatGPT Web Storage
chatgpt_web_storageOptionalSensitivemedium value
leveldb~/Library/Application Support/Codex/Default/Local Storage/leveldb/
+5 more
  • ~/Library/Application Support/Codex/Default/Session Storage/
  • ~/Library/Application Support/Codex/Default/IndexedDB/app_-_0.indexeddb.leveldb/
  • ~/Library/Application Support/Codex/Default/IndexedDB/app_-_0.indexeddb.blob/
  • ~/Library/Application Support/Codex/Default/WebStorage/QuotaManager
  • ~/Library/Application Support/Codex/Default/Partitions/*/Local Storage/leveldb/
Local Storage keys for origin app://- (codex.chatgpt-conversations.device-id, statsig.*). IndexedDB (codex-widget-resources) and its blob directory are inventoried (chatgpt_file_inventory: names, sizes, SHA-256) and copied only with include_secrets, like the Local Storage LevelDB; QuotaManager and its companions are copied as original evidence.