All notable changes to csctf (Chat Shared Conversation to File) are documented here.
Versions follow Semantic Versioning. Each tagged version has a corresponding GitHub Release unless noted otherwise. Commit links point to the canonical repository at Dicklesworthstone/chat_shared_conversation_to_file.
Unreleased (after v0.4.5)
Changes on main since the v0.4.5 tag, not yet part of any release.
- Add ACFS checksum dispatch and notification workflow (
92244ec,c515391) - Skip ACFS dispatch when
ACFS_TOKENis missing (e451907)
- Update Node.js dependencies to latest stable versions (
0998dd6) - Add GitHub social preview image (
1aa3b5c) - Update AGENTS.md with project context (
ff994cd,8fd16ef)
v0.4.5 -- 2026-01-03 (Release)
GPT-5.2 compatibility and CLI hardening.
- GPT-5.2 role detection: OpenAI changed the share page DOM to use visible "You said:" / "ChatGPT said:" text headers instead of
data-message-author-roleattributes. Added text-based role detection with anchored regex patterns, alternating-role fallback, and header artifact stripping so conversations render correctly again (c5a1819)
- Argument validation for
--outfile/--output-dir: previouslycsctf --outfile --quiet <url>would silently create a file named--quiet.md; now throws a clear error when the required path is missing or looks like a flag. Also removed undocumented--formatfrom usage text (3153181) - Quiet-mode consistency: Chrome tab restoration messages now respect
--quiet(fd50d85)
v0.4.4 -- 2025-12-19 (Release)
Complete Claude provider support and output normalization across extraction modes.
- Handle Claude's unique
"Title | Claude"suffix instripProviderPrefix(), and add Claude toheadingPrefixso both CDP and Playwright modes show "Claude Conversation:" instead of defaulting to "ChatGPT" (6d6fe57)
- CDP mode now produces the same Markdown format as Playwright mode: proper heading, blockquote metadata with ISO date, and consistent whitespace. Previously CDP output had raw page titles and locale-formatted dates (
6d6fe57)
- Pass
cdpEndpointandquietarguments through toscrape()-- they were parsed from CLI flags but silently dropped (6d6fe57) - Add
grok.x.aitosharePatternso Grok's alternate domain passes URL validation (6d6fe57) - Route all progress output to stderr so only file paths reach stdout, per AGENTS.md specification (
811f250)
v0.4.3 -- 2025-12-19 (Release)
Fixes for CDP extraction fidelity and resource management.
- Message ordering: CDP extraction previously collected all user messages first, then all assistant messages, producing garbled conversation order. Now uses combined CSS selectors and determines roles from element attributes, preserving DOM order (
4693e9b)
- Fix
BrowserContextvariable scoping so it is accessible in the catch block during CDP fallback (4693e9b) - Close
BrowserContextin the finally block when using Playwright persistent-context mode; previously leaked (4693e9b)
v0.4.2 -- 2025-12-19 (Release)
- Make CDP extraction provider-aware for all providers, not just Claude. Selectors and role-detection logic now adapt to the detected provider when using the CDP path (
121e487)
v0.4.1 -- 2025-12-19 (Release)
- Automatic CDP fallback: when Playwright is blocked (Cloudflare challenge, bot detection), the tool now automatically retries via Chrome DevTools Protocol instead of failing outright (
2991865)
v0.4.0 -- 2025-12-19 (Release)
Major feature release: Claude.ai support.
- Full Claude.ai share-link support via Chrome DevTools Protocol (CDP). Claude.ai uses Cloudflare protection that blocks standard headless automation; csctf now copies your Chrome session cookies to a temporary profile, launches Chrome with remote debugging, and connects via CDP to extract the conversation (
0bc3661) - Chrome session restoration: if Chrome is already running, offers to save open tabs, restart Chrome with debugging, and restore tabs afterward (
0bc3661)
- Add AGENTS.md and update README for Claude.ai support (
3063b74)
v0.3.0 -- 2025-12-07 (Release)
Anti-bot stealth overhaul for ChatGPT scraping.
- Browser fingerprint spoofing: realistic
navigatorproperties,pluginsarray, WebGL vendor/renderer strings (da0f824) - Canvas fingerprint randomization to defeat tracking (
da0f824) - Chrome 131 user-agent with proper
sec-ch-uaheaders (da0f824) window.chromeruntime shim withloadTimes()andcsi()(da0f824)
- Smarter Cloudflare challenge detection: no longer false-positives on conversations that merely mention "cloudflare"; only triggers on actual challenge pages (short body text, specific titles) (
da0f824) - Progressive wait times (3 s, 5 s, 8 s, 10 s, 12 s) instead of fixed timeouts (
da0f824)
--use-chrome-profile-- leverage real Chrome session cookies to bypass authentication challenges (da0f824)--stealth-- explicitly enable enhanced stealth (now on by default) (da0f824)--headful-- run with a visible browser window (da0f824)
- When headless mode is blocked, the tool automatically retries with a visible browser window (
da0f824)
- Fix ESLint
Functiontype error in WebGL proxy handler (55686ea) - Fix TypeScript errors in stealth script (
fa0b069)
v0.2.9 -- 2025-12-06 (Release)
- Playwright bundling for
bun build --compile: fixed "Cannot find module playwright-core/package.json" error in pre-built binaries. Playwright'srequire.resolve()bakes absolute paths from the build machine; a postinstall patch now inlines the required values (coreDir, Playwright version, language binding version,packageJSON) so binaries are self-contained (bd2e090)
- Add verification step to ensure Playwright patch is applied before building; add test step to verify built binaries run without errors (
bd2e090)
v0.2.8 -- 2025-12-06 (Release)
- Ensure
bun compilebuilds succeed; bump version (5aeadc1)
- Add cache-busting timestamp to install command in README (
4a1f8d6)
v0.2.7 -- 2025-12-06 (Release)
- Update Bun to 1.3.3 for release bundling (
93f599e)
v0.2.6 -- 2025-12-06 (Release)
- Bundle all dependencies into compiled binaries so they are fully self-contained (
0a95aeb)
v0.2.5 -- 2025-12-06 (Release)
- Fix macOS ARM64 (
aarch64/arm64) install mapping -- the installer was downloading the wrong binary for Apple Silicon (463a800)
v0.2.4 -- 2025-12-06 (Release)
- Refactor TurndownService rules for
<pre>and<code>elements to properly distinguish inline code from fenced code blocks, fixing syntax highlighting edge cases in HTML output (03011ca)
- Add simplified
--publish-to-gh-pagesflag for one-command publishing; update argument parsing and usage text (3dee412)
v0.2.3 -- 2025-12-06 (Release)
- Escape
<script>and<style>tags in rendered HTML so code examples display correctly instead of executing (ce28173) - Create
.nojekyllfiles in the publish directory to prevent GitHub Pages Jekyll processing (27d79c6) - Replace Google Fonts (
Inter,JetBrains Mono) with system font stacks to eliminate external requests and improve load performance (dda8603) - Remove scroll-to-top button and its inline JavaScript to keep HTML output strictly zero-JS (
029e91b)
- Introduce CSS variables for theming; add code-block headers with colored dots; improve card layout and hero section in the index renderer (
e717f80)
- Switch GitHub Pages publishing from token-based auth to
gh auth, and update the installer hint accordingly (ea9c58b)
- Temporarily remove Claude support (re-added in v0.4.0); restrict providers to ChatGPT, Gemini, and Grok (
8c394d1)
v0.2.2 -- 2025-12-06 (Release)
- Fix duplicate-upload issue in release asset list (
489f7c4)
v0.2.1 -- 2025-12-06 (Release)
- Fix ESLint issues introduced during rapid v0.2.0 development (
69353a5)
v0.2.0 -- 2025-12-06 (Tag only -- no GitHub Release)
First tagged version. This tag captures the full initial development sprint (30 commits in a single day) that took the project from zero to a feature-complete multi-provider CLI.
- Headless Playwright Chromium with stealth configuration (spoofed navigator properties, realistic headers) (
2818a9b) - Double-navigate strategy (
domcontentloadedthennetworkidle) to tame late-loading assets (2818a9b) - Provider auto-detection from URL hostname; provider-specific CSS selector chains with fallback (
9389865) - Shadow DOM traversal for Gemini web components (
dba0ecb) - Bot-blocking fast-fail detection and retry with backoff (
30ea5ca,f1ebba7) - OS-aware Chromium executable resolution (
5a52794)
- ChatGPT (
chatgpt.com/share) -- initial and primary target (2818a9b) - Claude (
claude.ai/share) -- initial support (later removed in v0.2.3, re-added properly in v0.4.0) (9389865) - Gemini (
gemini.google.com/share) (f1185a7,4c8a0a2) - Grok (
grok.com/share) (7b79207)
- Turndown with custom fenced-code rule; language detected from
class="language-*"(2818a9b) - Citation pill and
data-start/data-endattribute stripping (2818a9b) - Newline normalization (Unicode LS/PS removal, excessive blank-line collapse) (
c4e8acd) - Artifact and badge-like token filtering for cleaner output (
c74c8c9,3ae3864)
- Slugify function: lowercase, non-alphanumerics to
_, trim, max 120 chars, Windows reserved-name suffixing (b6a01c0) - Collision-proof unique paths with
_2,_3, ... suffixes (b6a01c0) - Provider-prefix stripping from titles (
4ef9b7b)
- Static HTML twin with Markdown-it + highlight.js rendering, inline CSS for light/dark/print, zero JavaScript (
7f62819) - Table of contents with de-duplicated heading slugs; metadata pills (
1b04cec) - Language badges on code blocks (
7f62819)
- One-command publish: clone (or create via
gh), copy files, regeneratemanifest.jsonandindex.html, commit + push (1b04cec) --remember/--forget-gh-pagesfor persistent repo/branch/dir config under~/.config/csctf/config.json(1b04cec)--dry-runto build index without pushing (96146e9)--yes/--no-confirmto skip thePROCEEDconfirmation gate (bad1e05)- Auto-install
ghvia--gh-install(brew/apt/dnf/yum/winget/choco) (21f87f9)
--timeout-ms,--outfile,--output-dir,--quiet,--check-updates,--version(bad1e05,9d0930c)--no-html/--md-only/--html-onlyoutput format switches (bad1e05)--debug,--wait-for-selector(9d0930c)- Clipboard copy and file-open after export (
dff1fab) - Colorized, step-based console output via
chalk(2818a9b) - Secure
readSecretfunction for GitHub token input with masking (f1ebba7)
- Atomic writes via temp + rename pattern (
ae0c579) MessageRoletype for type-safe role handling (4ef9b7b)
curl | bashinstaller with OS/arch detection, optional--verifychecksum,DEST/VERSIONoverrides (e057e41,b6a01c0)- Detailed PATH update instructions per platform (
9389865)
- Cross-platform binary targets: macOS ARM64/x64, Linux x64/ARM64, Windows x64 (
65649c8) - ESLint + TypeScript (
tsc --noEmit) linting (65649c8) - CI: lint, typecheck, unit tests, matrix builds, binary verification, artifact upload (
c4e8acd) - E2E tests with per-provider default URLs and configurable timeout (
e057e41,332a858) - Playwright browser caching in CI (
8b7adf6) - Tagged pushes (
v*) create GitHub Release with binaries andsha256.txt(7f2a974)
- Renamed CLI binary from
csctmtocsctf; updated all scripts, docs, and config paths (66f71fc)