skills/dicklesworthstone/csctf/SKILL.md
Chat Shared Conversation To File - Convert ChatGPT, Gemini, Grok, and Claude share links to clean Markdown + HTML transcripts. Preserves code fences with language detection, deterministic filenames, GitHub Pages publishing. Bun-native CLI.
npx skillsauth add aiskillstore/marketplace csctfInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A Bun-native CLI that turns public ChatGPT, Gemini, Grok, and Claude share links into clean Markdown + HTML transcripts with preserved code fences, stable filenames, and optional GitHub Pages publishing.
Copy/pasting AI share links often:
CSCTF fixes this with:
# Install
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/chat_shared_conversation_to_file/main/install.sh | bash
# Convert any share link
csctf https://chatgpt.com/share/69343092-91ac-800b-996c-7552461b9b70
csctf https://gemini.google.com/share/66d944b0e6b9
csctf https://grok.com/share/bGVnYWN5_d5329c61-f497-40b7-9472-c555fa71af9c
csctf https://claude.ai/share/549c846d-f6c8-411c-9039-a9a14db376cf
Output:
<conversation_title>.md — Clean Markdown with preserved code fences<conversation_title>.html — Styled static HTML (zero JavaScript)| Provider | URL Pattern | Method | Notes |
|----------|-------------|--------|-------|
| ChatGPT | chatgpt.com/share/* | Headless Chromium | Public shares only |
| Gemini | gemini.google.com/share/* | Headless Chromium | Public shares only |
| Grok | grok.com/share/* | Headless Chromium | Public shares only |
| Claude | claude.ai/share/* | Your Chrome session | Requires login |
Claude.ai uses Cloudflare protection that blocks standard browser automation. CSCTF handles this automatically:
Requirements: Chrome installed + logged into claude.ai in your regular Chrome session.
| Principle | Implementation | |-----------|----------------| | Determinism | Explicit slugging and collision handling | | Minimal network | Only share URL fetched (update checks/publish opt-in) | | Safety | Static HTML (inline CSS/HLJS), no scripts emitted | | Clarity | Colorized step-based logging, confirmation gates | | Atomicity | Temp+rename writes prevent partial files |
1. Launch headless Playwright Chromium with stealth config
(spoofed navigator properties, realistic headers)
2. Navigate twice (domcontentloaded → networkidle) for late-loading assets
3. Detect provider from URL hostname
4. Wait for provider-specific selectors with retry/fallback
5. Extract each role's inner HTML (assistant/user), traverse Shadow DOM
6. Clean pills/metadata, run Turndown with fenced-code rule
7. Normalize whitespace and newlines
8. Write Markdown to temp file, rename atomically
9. Render HTML twin with inline CSS/TOC/HLJS
1. Copy Chrome session cookies to temporary profile
2. Launch Chrome with remote debugging
3. Connect via Chrome DevTools Protocol
4. Extract conversation HTML
5. Process through same Turndown/normalization pipeline
6. Clean up temporary profile
Provider-specific selectors with fallback chains:
article [data-message-author-role]share-turn-viewer, response-container)data-testid patterns[data-testid="user-message"] and streaming indicatorsEach has multiple fallbacks tried with short timeouts.
class="language-*"data-start/data-end attributes\nTitle → lowercase → non-alphanumerics → "_" → trim → max 120 chars
→ Windows reserved-name suffix → collision suffix (_2, _3, ...)
csctf <share-url> [options]
| Flag | Default | Description |
|------|---------|-------------|
| --outfile <path> | auto | Override output path |
| --no-html / --md-only | off | Skip HTML output |
| --html-only | off | Skip Markdown output |
| --quiet | off | Minimal logging |
| --timeout-ms <ms> | 60000 | Navigation + selector timeout |
| Flag | Default | Description |
|------|---------|-------------|
| --publish-to-gh-pages | off | Publish to GitHub Pages |
| --gh-pages-repo <owner/name> | my_shared_conversations | Target repo |
| --gh-pages-branch <branch> | gh-pages | Target branch |
| --gh-pages-dir <dir> | csctf | Subdirectory in repo |
| --remember | off | Save GH settings |
| --forget-gh-pages | off | Clear saved settings |
| --dry-run | off | Simulate publish (build index, no push) |
| --yes / --no-confirm | off | Skip PROCEED confirmation prompt |
| --gh-install | off | Auto-install gh CLI |
| Flag | Description |
|------|-------------|
| --check-updates | Print latest release tag |
| --version | Print version and exit |
# Conversation: <Title>
**Source:** https://chatgpt.com/share/...
**Retrieved:** 2026-01-08T15:30:00Z
## User
How do I sort an array in Python?
## Assistant
Here's how to sort an array in Python:
```python
# Sort in place
my_list.sort()
# Return new sorted list
sorted_list = sorted(my_list)
### HTML Features
- **Standalone** — No external dependencies
- **Zero JavaScript** — Safe for any hosting
- **Inline CSS** — Light/dark mode via `prefers-color-scheme`
- **Syntax highlighting** — highlight.js themes inline
- **Table of contents** — Auto-generated from headings
- **Language badges** — Code block language indicators
- **Print-friendly** — Optimized print styles
## Filename Generation
"How to Build a REST API" → how_to_build_a_rest_api.md "Python Tips & Tricks!" → python_tips_tricks.md "File exists already" → file_exists_already_2.md
Rules:
- Lowercase
- Non-alphanumerics → `_`
- Trimmed leading/trailing `_`
- Max 120 characters
- Windows reserved names suffixed
- Collisions: `_2`, `_3`, ...
## GitHub Pages Publishing
### Quick Recipe
```bash
# Publish with defaults
csctf <url> --publish-to-gh-pages --yes
# Creates: <gh-username>/my_shared_conversations repo
# Branch: gh-pages
# Directory: csctf/
# First time: save settings
csctf <url> --publish-to-gh-pages --remember --yes
# Subsequent: just use --yes
csctf <url> --yes
# Clear remembered settings
csctf --forget-gh-pages
csctf <url> --publish-to-gh-pages \
--gh-pages-repo myuser/my-chats \
--gh-pages-branch main \
--gh-pages-dir exports \
--yes
gh) installed and authenticatedgh auth statusgh)manifest.json and index.htmlcsctf <url> --md-only --quiet --outfile /tmp/chat.md
csctf <url> --html-only --outfile site/chat.html
csctf <url> --timeout-ms 90000
PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright csctf <url>
for url in $URLS; do
csctf "$url" --outfile ~/archive/ --quiet
done
gh) for publishing—no tokens stored~/.config/csctf/config.json| Phase | Time | |-------|------| | First run (Chromium download) | 30-60s | | Subsequent runs | 5-15s | | Claude.ai (uses local Chrome) | 5-10s |
| Symptom | Fix |
|---------|-----|
| "No messages found" | Link is private or layout changed; verify public share, retry with --timeout-ms 90000 |
| Bot detection / challenge page | Stealth techniques used; retry or verify link in browser |
| Timeout or blank page | Raise --timeout-ms, verify connectivity |
| Publish fails (auth) | Ensure gh auth status passes |
| Publish fails (branch/dir) | Pass --gh-pages-branch / --gh-pages-dir; use --remember |
| Filename collisions | Expected; tool appends _2, _3, ... |
| Claude.ai Cloudflare challenge | Complete verification in Chrome window, press Enter |
| Claude.ai won't load | Ensure logged into claude.ai in Chrome; close Chrome if prompted |
| Variable | Description |
|----------|-------------|
| PLAYWRIGHT_BROWSERS_PATH | Reuse cached Chromium bundle |
| Variable | Description | Default |
|----------|-------------|---------|
| VERSION | Pin release tag | latest |
| DEST | Install directory | ~/.local/bin |
| CHECKSUM_URL | Override checksum location | — |
| Path | Purpose |
|------|---------|
| ~/.local/bin/csctf | Binary |
| ~/.config/csctf/config.json | GitHub Pages settings |
| ~/.cache/ms-playwright/ | Playwright Chromium cache |
# One-liner (recommended)
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/chat_shared_conversation_to_file/main/install.sh | bash
# Pin version
VERSION=v1.0.0 curl -fsSL .../install.sh | bash
# Custom directory
DEST=/opt/bin curl -fsSL .../install.sh | bash
# Verify checksum
curl -fsSL .../install.sh | bash -s -- --verify
bun install
bun run build
# Binary at dist/csctf
| Feature | Copy/Paste | csctf | |---------|------------|-------| | Code blocks preserved | Often broken | Always preserved | | Language hints | Lost | Detected and kept | | Filenames | Random/messy | Deterministic slugs | | HTML output | None | Styled, no-JS twin | | GitHub Pages | Manual | One command | | Collision handling | Overwrite | Auto-suffix |
| Tool | Integration | |------|-------------| | CASS | Archive conversations for session search | | CM | Extract procedural memory from exported chats | | Agent Mail | Attach conversation exports to agent messages | | NTM | Export multi-agent session transcripts |
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.