FUTURE.md had become a 648-line archaeological record: six shipped roadmap items, two dropped, two implemented, an investigation trail for each, and a backlog closed as not needed — with the two genuinely planned items buried at the bottom. It is now 139 lines, planned work first. - Archives the old file verbatim as FUTURE-ARCHIVE.md. It carries the recon behind decisions now recorded in one line each — why Brave cookie extraction is not viable, why the ChatGPT token's expiry cannot be read client-side, how the drift canary was designed — which would be expensive to rediscover. - Roadmap is now two items: the StartOS service (including the 2026-08-18 decision that clients upload to StartOS storage and the service owns the Joplin connection), and the README split. - Everything shipped or dropped is off the roadmap. Decisions not to build survive as a one-line table so they are not re-proposed. - Status notes for v0.7.0 and v0.8.0 move into Completed, joined by v0.9.0. Releases v0.9.0: pyproject 0.8.0 -> 0.9.0, and the changelog's [Unreleased] section becomes [0.9.0] - 2026-08-18. Covers the Codex provider, the launcher scripts, `sync`, daily scheduling on Linux and Windows, ntfy notifications, gizmo_id project attribution and the `projects` command, and the splitlines data-loss fix in both local providers. Whitelists FUTURE-ARCHIVE.md in .gitignore. `*.md` is ignored on purpose — exported conversations are Markdown and may contain private content — with each doc re-included by name, so a new doc is silently untracked rather than rejected. The archive would not have been committed at all. Recorded in the README-split roadmap item, since `docs/*.md` will hit exactly this. Also refreshes the package description, which still named only ChatGPT and Claude after two local providers were added. Carries the documentation and table-of-contents work from earlier today.
130 lines
5.9 KiB
Bash
130 lines
5.9 KiB
Bash
# ============================================================
|
|
# 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-<ID>-<slug>/project → copy "g-p-<ID>"
|
|
# 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
|