# ============================================================ # AI Chat Exporter — Configuration # ============================================================ # Copy this file to .env and fill in your values. # NEVER commit .env to git. It contains secrets. # --- ChatGPT --- # How to get: open chatgpt.com in Chrome → F12 → Application tab # → Cookies → https://chatgpt.com → find the two cookie chunks: # __Secure-next-auth.session-token.0 (starts with "eyJ") → CHATGPT_SESSION_TOKEN # __Secure-next-auth.session-token.1 (the remainder) → CHATGPT_SESSION_TOKEN_1 # Token type: JWE. Typically valid for ~7 days. CHATGPT_SESSION_TOKEN= CHATGPT_SESSION_TOKEN_1= # ChatGPT Projects (optional): comma-separated list of project gizmo IDs. # Project conversations are NOT included in the default /conversations listing. # How to find: open chatgpt.com → click a Project → look at the browser URL: # https://chatgpt.com/g/g-p--/project → copy "g-p-" # Example: CHATGPT_PROJECT_IDS=g-p-68c2b2b3037c8191890036fb4ae3ed9f,g-p-anotherproject CHATGPT_PROJECT_IDS= # --- Claude --- # How to get: open claude.ai in Chrome → F12 → Application tab # → Cookies → https://claude.ai → find "sessionKey" → copy Value # Token type: opaque string. Typically valid for ~30 days. CLAUDE_SESSION_KEY= # --- Claude Code (local agent sessions) --- # The claude-code provider reads local Claude Code transcripts. By default it # scans ~/.claude/projects/ (plus $CLAUDE_CONFIG_DIR/projects when that is set). # To scan additional roots — e.g. other machines' sessions copied onto this box — # set a ':'-separated list of projects roots. Sessions are merged by folder. #CLAUDE_CODE_DIR=~/.claude/projects:/mnt/backup/laptop/.claude/projects # # Session titles are tagged with the git repos they touched, e.g. # "Resume StartWRT work [start-technologies]". To never tag specific repos, # list their names here (comma-separated). #CLAUDE_CODE_REPO_TAG_IGNORE=some-repo,another-repo # --- Codex (local agent sessions) --- # The codex provider reads local Codex CLI rollout files. By default it scans # ~/.codex/sessions/ (plus $CODEX_HOME/sessions when CODEX_HOME is set). # To scan additional roots, set a ':'-separated list of sessions roots. #CODEX_DIR=~/.codex/sessions:/mnt/backup/laptop/.codex/sessions # # As with Claude Code, session titles are tagged with the git repos they # touched. To never tag specific repos, list their names here (comma-separated). #CODEX_REPO_TAG_IGNORE=some-repo,another-repo # --- Launcher --- # Read by the ai-chat-exporter wrapper scripts, not by the Python code. The # wrapper warns when run from outside the repo, because cache/ and exports/ # resolve against the current directory and the wrong one silently starts a # separate archive. Set to 1 to silence that warning. #AI_CHAT_EXPORTER_QUIET_CWD=1 # --- Notifications (ntfy) --- # Push the result of a run to ntfy so an unattended archive reports back — the # log file, the systemd journal and Task Scheduler's exit code are all pull-only. # Unset NTFY_TOPIC disables notifications entirely. #NTFY_TOPIC=my-archive-topic # # Self-hosting? Point at your own server. #NTFY_SERVER=https://ntfy.sh # # Bearer token, for access-controlled topics. A topic on public ntfy.sh is # readable by anyone who knows its name — notifications therefore carry counts # and a machine name only, never conversation titles. #NTFY_TOKEN= # # always (default) — notify on every run; failure — only when something failed; # off — never. #NTFY_NOTIFY=always # --- Output --- # Where exported Markdown files are written (default: ./exports) EXPORT_DIR=./exports # Output folder structure. Options: # provider/project/year (default) → exports/claude/my-project/2024/file.md # provider/project → exports/claude/my-project/file.md # provider/year → exports/claude/2024/file.md (ignores projects) OUTPUT_STRUCTURE=provider/project/year # What to do with content that was invisible in the provider's web UI # (file-retrieval tool dumps, hidden context like Custom Instructions). # These dumps can be 90% of a conversation's bytes. Options: # placeholder (default) → one-line placeholder with tool name and size # full → keep everything (pre-v0.6.0 behavior) # omit → drop entirely (still counted in the run summary) EXPORTER_HIDDEN_CONTENT=placeholder # Download conversation assets (images, audio) next to the Markdown, into a # media/ folder, and inline them. Options: # images (default) → images only # all → also audio/voice clips and other files # off → keep text placeholders, download nothing # Downloaded media is uploaded to Joplin as resources on the next `joplin` run. EXPORTER_DOWNLOAD_MEDIA=images # Cap how many conversations are downloaded per export run (per provider). # Runs are resumable — a capped run continues where it stopped next time. # Keeps big backfills from looking like scraper traffic. Unset = unlimited. #MAX_CONVERSATIONS_PER_RUN=25 # Seconds between consecutive API requests (small random jitter is added). # Default 1.0; set 0 to disable pacing. #REQUEST_DELAY=1.0 # --- Joplin --- # Automate importing exported conversations into Joplin as notes. # Requires Joplin desktop running with the Web Clipper service enabled. # How to get the token: # Joplin → Tools → Options → Web Clipper → copy "Authorization token" JOPLIN_API_TOKEN= # API URL (default port is 41184; change only if you've customised it) JOPLIN_API_URL=http://localhost:41184 # Request timeout in seconds (default: 30). Increase if Joplin times out on # large conversations. Example: JOPLIN_REQUEST_TIMEOUT=60 # JOPLIN_REQUEST_TIMEOUT=30 # --- Cache --- # Where the sync manifest is stored (default: ./cache, inside the install directory) CACHE_DIR=./cache # --- Logging --- # Log file path. Set to "none" to disable file logging. LOG_FILE=./cache/logs/exporter.log