Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ jobs:
src/content.js
icons/icon-48.png
icons/icon-96.png
icons/icon-16-active.png
icons/icon-32-active.png
icons/icon-48-active.png
icons/icon-128-active.png
)
MISSING=0
for f in "${REQUIRED[@]}"; do
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@ test-results/
# Personal test input for the PDF-importer debug toy — real chat exports,
# never meant to land in the repo.
debug/input/
debug/playonwords
debug/rendertest.pdf
166 changes: 166 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
# Changelog

All notable changes to Inkpour are documented here, one section per released
version (matching `manifest.json`'s `version` field and the `vX.Y.Z.W` git
tag). Loosely follows [Keep a Changelog](https://keepachangelog.com/).

This file is the single source of truth for "what's new" release-note text:
Batch 10 (automated store publishing, see `planning/TODOs.md`) will read the
section matching the tag being published and pass it as the release notes /
"recent changes" text for the Firefox (AMO) and Chrome Web Store listings.
**Keep each entry short and user-facing** — this is what an end user reviewing
an update sees, not an engineering changelog. When cutting a release, add a
new section here in the same commit as the version bump.

## [Unreleased]

### Added
- Notion export — send a conversation straight to a Notion page (bring your
own integration token + page ID).
- Direct-to-vault saving (Chrome/Edge) — write exports straight to a folder
on disk instead of downloading, via a one-time folder picker.
- Batch export (ChatGPT + Claude) — tick several past conversations from
the platform's own history sidebar and export them all as one ZIP.
**Pending a live end-to-end test before this is fully verified.**

### Fixed
- ChatGPT Canvas code blocks now get a language tag on the code fence.
- Google AI Mode: fixed every turn appearing duplicated in exports.
- Footnote numbering no longer collides across messages in the same export.
- Missing `api.notion.com` permission needed for the new Notion export.

### Changed
- Settings now autosave (no more losing changes by navigating away before
hitting Save).
- Settings page sections are now collapsible, for easier scanning.
- Context-menu export entries only appear on supported chat sites.
- Obsidian-flavored front matter now always includes a `type: ai-chat` key.
- The toolbar icon now turns green on supported AI chat sites, replacing
the old small "ON" badge — much easier to spot at a glance.
- The popup's export buttons are now a compact picker: Copy MD and ZIP stay
one click away as before, and every other format is chosen from a
dropdown, then run with a separate Export button — picking a format no
longer fires it immediately, so there's always a chance to change your
mind before a Gist/Notion upload (or any other export) actually runs.
- Renamed "Copy HTML" to "Copy" and moved it directly under the HTML
option in that dropdown, so it reads as the clipboard version of the
HTML export rather than an unrelated action.
- The export dropdown's caret is now bigger and flips direction while
open, and every option now shows a small icon (download / copy / upload)
indicating where it goes, instead of a few options spelling that out
in words.

## [0.4.28.1] - 2026-07-17
### Fixed
- Google AI Mode turn-duplication bug.
### Added
- Settings page autosave + sticky save bar.
### Docs
- README links to the published Firefox/Chrome store listings.

## [0.4.28.0] - 2026-07-17
### Fixed
- Verified and corrected several experimental extractors (Perplexity,
NotebookLM, Venice); dropped Phind (site changed); added meta.ai/arena.ai
domains.

## [0.4.27.4] - 2026-07-16
### Fixed
- Minor fixes from the PDF-import debug pass.

## [0.4.27.3] - 2026-07-16
### Fixed
- Small stability fixes.

## [0.4.27.2] - 2026-07-16
### Added
- Debug-mode PDF import: paste a printed/exported PDF of an AI chat back in
through the import button.

## [0.4.27.1] - 2026-07-13
### Fixed
- A stale pending import no longer overrides a live, currently-open
supported chat tab.

## [0.4.27.0] - 2026-07-12
### Added
- Clipboard-paste import — paste a copied chat transcript in and Inkpour
reconstructs the conversation.
- Gist exports now include copy/share links.
### Fixed
- An i18n locale-override bug; a History-persistence bug.

## [0.4.26.1] - 2026-07-12
### Fixed
- Resolved an unresolved `__MSG_x__` placeholder appearing in release
titles.

## [0.4.26.0] - 2026-07-12
### Added
- Full interface translation: 26 locales, with right-to-left layout support
for Arabic/Persian.

## [0.4.25.0] - 2026-07-11
### Fixed
- Manifest cleanup (resolved leftover merge-conflict markers).

## [0.4.24.2] - 2026-07-11
### Fixed
- Replaced unsafe `innerHTML` assignments with safe DOM APIs; fixed the
Perplexity, Mistral, Pi.ai, Character.AI, Venice, and lmarena extractors.

## [0.4.24.1] - 2026-07-11
### Fixed
- Release script housekeeping.

## [0.4.24.0] - 2026-07-07
### Added
- In-page scroll progress indicator during export.
- Obsidian vault path setting.
- NotebookLM inline citation numbers in exports.

## [0.4.23.4] - 2026-07-07
### Fixed
- Replaced an `innerHTML` assignment for the Gist URL with a safe DOM API;
hardened history's stored Gist URL handling.

## [0.4.23.3] - 2026-07-07
### Fixed
- Firefox AMO manifest: corrected `data_collection_permissions` to
`required: ["none"]` per spec.

## [0.4.23.2] - 2026-07-07
### Fixed
- Firefox AMO manifest: added required `data_collection_permissions` field.

## [0.4.23.1] - 2026-07-07
### Fixed
- Firefox AMO (Manifest V3) compliance: added the required
`browser_specific_settings` Gecko ID.

## [0.4.2] - 2026-07-06
### Added
- Four new extractors: lmarena, Character.AI, Cohere, Pi.ai.
- Safari scaffold (manual Xcode build, not store-published).
- Fuzzy search in export history; parallel multi-format export; DOCX
polish (nested lists, tables, hyperlinks); HTML export from the in-page
floating button.
### Fixed
- Tracking parameters (UTM, gclid, fbclid, msclkid, …) are now stripped
from the recorded source URL.
- Safari downloads polyfill for browsers without the native downloads API.

## [0.2.3] - 2026-07-05
### Added
- DOCX export, export history with search, GitHub Gist upload, webhook-on-
export, a personal notes field, reading-time estimate, lifetime export
stats.
- New extractors: z.ai, Google AI Search, Groq Playground.
- Smart export-title fallback; filename tokens (`{msgcount}`, `{words}`,
`{time}`).

## [0.2.0] - 2026-07-05
### Added
- Initial public release (as "Babelfish Exporter", renamed to Inkpour
shortly after). Cross-browser support (Chrome/Edge/Brave), settings page,
Markdown/PDF/HTML export of AI chat conversations.
8 changes: 6 additions & 2 deletions PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ Inkpour is a browser extension that exports AI chat conversations to Markdown, P
- Reads the DOM of AI chat pages you visit (ChatGPT, Claude, Gemini, Copilot, and others) when you click Export or use a keyboard shortcut.
- Converts that content to your chosen format and saves it directly to your device via the browser's native download API.
- Optionally uploads a Gist to GitHub if you configure a GitHub token and explicitly trigger the Upload to Gist action — the token is stored locally in your browser's extension storage and is never sent anywhere other than `api.github.com`.
- Optionally appends to a Notion page if you configure a Notion integration token + page ID and explicitly trigger the Notion export action — the token is stored locally and is never sent anywhere other than `api.notion.com`.
- Optionally writes exported files directly to a folder on your device (Chrome/Edge only) if you choose one via the "Direct-to-vault" setting — this uses the browser's File System Access API, stays entirely local, and involves no network request at all.
- Optionally calls a webhook URL of your choosing if you configure one in Settings — this is entirely opt-in and you control the endpoint.

## What Inkpour does not do
Expand All @@ -25,10 +27,11 @@ Inkpour is a browser extension that exports AI chat conversations to Markdown, P

Inkpour stores the following data in your browser's local extension storage (`chrome.storage.local` / `browser.storage.local`):

- Your export settings (format, filename template, webhook URL, GitHub token).
- Your export settings (format, filename template, webhook URL, GitHub token, Notion token/page ID).
- A local export history log (titles, timestamps, word counts) used for the in-extension history view.
- If you choose a direct-to-vault folder (Chrome/Edge only), a reference to that folder (a `FileSystemDirectoryHandle`) is kept in a separate local IndexedDB store so it doesn't need to be re-picked every time — this reference never leaves your device and grants no access beyond the one folder you explicitly chose.

This data never leaves your device unless you configure a GitHub token or webhook, in which case only the content you explicitly export is sent to those endpoints.
This data never leaves your device unless you configure a GitHub token, Notion token, or webhook, in which case only the content you explicitly export is sent to those endpoints.

## Permissions explained

Expand All @@ -41,6 +44,7 @@ This data never leaves your device unless you configure a GitHub token or webhoo
| `contextMenus` | Add right-click Export and Upload to Gist menu items |
| Host permissions (AI chat sites) | Read conversation DOM on supported platforms |
| `api.github.com` | Upload to GitHub Gist (only when you trigger it) |
| `api.notion.com` | Append to a Notion page (only when you trigger it) |

## Contact

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ Click **⏱ History** in the popup footer to see the last 20 exports. Filter by

### Integrations
- **GitHub Gist** — add a Personal Access Token (gist scope) in Settings to unlock the "Gist ↑" popup button and `Alt+Shift+G` shortcut. Created Gists open in a new tab.
- **Notion** — add an integration token + target page ID in Settings to unlock the "Notion ↑" popup button. Appends the export as native Notion blocks (paragraphs, headings, code, quotes, flat lists) to the page you specify. v1 scope — nested lists and tables aren't converted yet.
- **Direct-to-vault (Chrome/Edge only)** — pick a folder once in Settings via the browser's File System Access API, then MD/DOCX/ZIP exports can write straight there instead of through Downloads. Not available in Firefox/Safari, which keep using the Downloads-subfolder option instead.
- **Webhook** — POST export metadata to any URL after each export (n8n, Zapier, Make.com, custom endpoints). Toggle "Include content" to send the full exported text.

### Markdown quality
Expand Down Expand Up @@ -209,7 +211,7 @@ Feature-rich Tampermonkey userscript covering ChatGPT, Claude, Copilot, Gemini,

## Privacy

Inkpour collects no data and makes no external requests unless you explicitly configure a GitHub token or webhook. See [PRIVACY.md](./PRIVACY.md) for full details.
Inkpour collects no data and makes no external requests unless you explicitly configure a GitHub token, Notion token, or webhook. Direct-to-vault saving (Chrome/Edge only) writes to a folder you choose and involves no network request at all. See [PRIVACY.md](./PRIVACY.md) for full details.

Works in temporary/incognito chat modes too (verified on ChatGPT's Temporary Chat) — extraction is purely DOM-based, so it doesn't care whether the platform is persisting the conversation on its end.

Expand Down
78 changes: 73 additions & 5 deletions _locales/ar/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,19 +114,19 @@
"message": "نسخ MD"
},
"popupBtnCopyHtml": {
"message": "نسخ HTML"
"message": "نسخ"
},
"popupBtnZip": {
"message": "ZIP"
},
"popupBtnGist": {
"message": "Gist"
"message": "Gist"
},
"popupBtnNotion": {
"message": "Notion"
"message": "Notion"
},
"popupBtnExportAll": {
"message": "تصدير الكل (MD + DOCX + ZIP)"
"message": "تصدير الكل (MD + DOCX + ZIP)"
},
"popupIncrementalBtnTitle": {
"message": "تصدير الرسائل المضافة منذ آخر تصدير فقط",
Expand Down Expand Up @@ -610,7 +610,7 @@
"message": "رمز تكامل Notion"
},
"settingsNotionTokenDesc": {
"message": "رمز تكامل داخلي — يفعّل زر \"Notion\" في النافذة المنبثقة، ويُلحق الصادرات بالصفحة أدناه."
"message": "رمز تكامل داخلي — يفعّل زر \"Notion\" في النافذة المنبثقة، ويُلحق الصادرات بالصفحة أدناه."
},
"settingsNotionTokenLink": {
"message": "أنشئ رمزًا ←"
Expand Down Expand Up @@ -1035,5 +1035,73 @@
},
"popupBtnReportBug": {
"message": "الإبلاغ عن خطأ"
},
"popupBatchExportToggle": {
"message": "📦 تصدير دفعي للمحادثات السابقة…"
},
"popupBatchExportStartBtnTitle": {
"message": "تصدير المحادثات المحددة كملف ZIP واحد"
},
"popupBatchExportStartBtn": {
"message": "تصدير المحدد كملف ZIP"
},
"popupBatchExportCount": {
"message": "$1 من $2 محدد",
"placeholders": {
"1": {
"content": "$1"
},
"2": {
"content": "$2"
}
}
},
"popupBatchExportNoneSelected": {
"message": "حدد محادثة واحدة على الأقل أولًا"
},
"popupBatchExportStarting": {
"message": "جارٍ تصدير $1 محادثة…",
"placeholders": {
"1": {
"content": "$1"
}
}
},
"popupBatchExportProgress": {
"message": "جارٍ تصدير $1 من $2: $3",
"placeholders": {
"1": {
"content": "$1"
},
"2": {
"content": "$2"
},
"3": {
"content": "$3"
}
}
},
"popupBatchExportDone": {
"message": "اكتمل التصدير الدفعي: نجح $1، وتم تخطي $2",
"placeholders": {
"1": {
"content": "$1"
},
"2": {
"content": "$2"
}
}
},
"popupBatchExportFailed": {
"message": "فشل التصدير الدفعي"
},
"popupExportMoreOptions": {
"message": "المزيد من خيارات التصدير"
},
"popupBtnAllShort": {
"message": "الكل"
},
"popupExportGoBtn": {
"message": "تصدير"
}
}
Loading
Loading