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.0aicommunicationuserexecutionRun 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-runCompatibility
- 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.zipRequires 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 fromauth.jsonare never emitted; the record only notes which fields are present.include_secretsturns 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_contenthashes and records the content files instead of copying them. - Secret-bearing files are not copied without
include_secrets.auth.json, shell snapshots, theCookies,Login DataandWeb Datadatabases are parsed into records (or only noted) but stay out of the container.config.toml,hooks.jsonand.codex-global-state.jsonare copied only when redaction changed nothing in them. This also applies toinclude_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.
~/.codexis shared with the Codex CLI. Threads that the CLI started belong to the plannedai.codexplugin:ai.chatgptrecords them only as a count inchatgpt_thread_summary(owner_pluginai.codex) unlessinclude_cli_threadsis 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
| Option | Type | Default | Effect |
|---|---|---|---|
skip_content | bool | false | Metadata 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_secrets | bool | false | Turns 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_instructions | bool | false | Emits full base and developer instructions from rollouts. By default a SHA-256 and the first 2 KB are recorded. |
include_raw | bool | false | Copies the Codex/ application data tree and ~/.codex, file by file, minus app bundles, caches and secret-bearing files (unless include_secrets is set). |
classic_key | string | unset | Planned (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
| Option | Type | Default | Effect |
|---|---|---|---|
include_cli_threads | bool | false | Also 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_hosts | bool | false | Indexes every HTTP cache entry, not just chatgpt.com, openai.com and oaiusercontent.com hosts. |
Skip artifacts
| Option | Type | Default | Effect |
|---|---|---|---|
skip_http_cache | bool | false | Skips the HTTP cache (cached cloud conversations and generated images). |
skip_workspaces | bool | false | Inventories ~/Documents/Codex (paths, sizes, hashes) without copying the files. |
skip_logs | bool | false | Skips desktop log files and the logs_N databases. |
skip_cookies | bool | false | Skips cookie metadata. |
skip_browser | bool | false | Skips the in-app browser partition. |
skip_storage | bool | false | Skips 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Installation chatgpt_installOptionalSensitivehigh value | binary_plist | /Applications/ChatGPT.app/Contents/Info.plist+13 more
| 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
| 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
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT/Codex Configuration chatgpt_configOptionalSensitivehigh value | text | ~/.codex/config.toml+1 more
| 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
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT/Codex Authentication chatgpt_authOptionalSensitivehigh value | json | ~/.codex/auth.json | auth_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
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Threads chatgpt_threadsOptionalSensitivehigh value | sqlite | ~/.codex/state_*.sqlite+2 more
| 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
| 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
| Stage-1 memory outputs (raw_memory, rollout_summary), thread goals, queued prompts and realtime session events (thread_realtime_items in thread_history_N). |
messaging
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Thread Items chatgpt_thread_itemsOptionalSensitivehigh value | jsonl | ~/.codex/sessions/+3 more
| 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
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT HTTP Cache chatgpt_cacheOptionalSensitivehigh value | binary | ~/Library/Caches/Codex/Default/Cache/Cache_Data/+5 more
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Automations chatgpt_automationsOptionalSensitivehigh value | sqlite | ~/.codex/sqlite/codex-dev.db | Scheduled prompts (prompt, rrule, cwds, account) with run history and inbox items — a persistence and execution vector. *_at unit is [U] (believed ms). |
logs
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Logs chatgpt_logsOptionalSensitivemedium value | text | ~/Library/Logs/com.openai.codex/+2 more
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Cookies chatgpt_cookiesOptionalSensitivemedium value | sqlite | ~/Library/Application Support/Codex/Default/Cookies+1 more
| Cookie host, name, path, times and flags. Values are safeStorage (v10) encrypted and never decrypted; the database is copied only with include_secrets. |
history
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT In-App Browser chatgpt_browserOptionalSensitivehigh value | sqlite | ~/Library/Application Support/Codex/Default/Partitions/codex-browser-app/History+7 more
| 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
| Artifact | Format | Path | Notes |
|---|---|---|---|
ChatGPT Web Storage chatgpt_web_storageOptionalSensitivemedium value | leveldb | ~/Library/Application Support/Codex/Default/Local Storage/leveldb/+5 more
| 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. |