context-attachment-manager
Claude Desktop용 플러그인, 다음 메시지에 사용할 과거 이미지 선택 가능
ChatGPT·Claude·Gemini 답변이나 전체 대화를 문서로 변환하는 무료 브라우저 확장 프로그램
A free browser extension that turns any ChatGPT, Claude or Gemini answer, or a whole chat, into a clean OpenDocs link and a PDF. Math, tables, code and sources included. No account needed.
플러그인TypeScript · JavaScriptGitHub @opendocs-cc온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Publish ChatGPT, Claude and Gemini answers and chats as OpenDocs documents: a clean link and a PDF.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Publish any ChatGPT, Claude or Gemini answer, or a whole chat, as a clean OpenDocs document: a link you can share and a PDF. No account needed to try it; sign in to keep documents in your workspace, include images and update them at the same link.
Install it from opendocs.cc/extension.
Each site has a reader in src/sites/<site>/:
| Site | Main source | Fallback |
|---|---|---|
| ChatGPT | The conversation data the site itself loads (/backend-api/conversation/<id>): the model's own Markdown, the branch on screen, citations, canvases | The rendered page |
| Claude | /api/organizations/<org>/chat_conversations/<id>: Markdown blocks and artifacts at their final version | The rendered page |
| Gemini | The rendered page, with math from data-math |
Readers run in the page, with the site's session, and only after a click.
src/markdown/ turns what they read into the document: LaTeX to $…$,
citations to numbered footnotes, images to uploads (signed in) or a note
(signed out), questions as quotes.
When a reader fails, the extension sends OpenDocs a failure ping with the
site, the step and an error code, never content
(POST /api/v1/extension/events), so breakage after a site redesign shows up
quickly.
The service worker (entrypoints/background.ts) is the only part that holds
tokens or calls OpenDocs. It signs in with OAuth 2.1 and PKCE through
chrome.identity.launchWebAuthFlow, using the client metadata document at
https://opendocs.cc/oauth/clients/browser-extension.json, and calls
api.opendocs.cc, which answers the extension's origin with CORS. The
extension has no host permission for OpenDocs, so the install dialog names
only the three chat sites.
| Permission | Why |
|---|---|
| Content scripts on chatgpt.com, claude.ai, gemini.google.com | Show the Publish button and read the chat you publish |
identity | The sign-in window |
storage | Settings, sign-in tokens, recent publishes |
sidePanel | The side panel |
Requires Node.js 20+.
npm install
npm run dev # Chrome with hot reload
npm run build # .output/chrome-mv3, load it unpacked in chrome://extensions
npm test # unit tests (Vitest)
npm run test:e2e # end-to-end (Playwright: builds the extension, runs it in Chromium)
npm run typecheck
Development builds carry the key in keys/dev.pub, so the unpacked
extension always gets the ID pmpocloilkjljlpelbkngppeaagmaccc, which
OpenDocs knows (sign-in redirect URL and CORS).
Run the OpenDocs web app and API locally, register a sign-in client (Better Auth only accepts https client metadata URLs, so locally it's a registered one):
curl -X POST http://localhost:3150/api/auth/oauth2/register -H 'Content-Type: application/json' \
-d '{"client_name":"OpenDocs extension (local)","redirect_uris":["https://pmpocloilkjljlpelbkngppeaagmaccc.chromiumapp.org/"],"token_endpoint_auth_method":"none","grant_types":["authorization_code","refresh_token"],"response_types":["code"],"scope":"docs:read docs:write offline_access"}'
Copy .env.example to .env.local with that client_id, then npm run dev.
tests/e2e/local-stack.spec.ts runs the whole flow (anonymous publish, sign
in through the consent page, claim, workspace publish, PDF) against such a
stack.
npm run release:chrome # .output/opendocs-extension-<version>-chrome.zip
npm run release:edge # .output/opendocs-extension-<version>-edge.zip
Store packages leave out the development key; each store assigns its own
extension ID. When a store ID is new, add it to EXTENSION_IDS on the OpenDocs
servers (sign-in redirect and CORS), or to DEFAULT_EXTENSION_IDS in
packages/shared/src/extension/config.ts. After the first Chrome Web Store
upload, put the store item's public key in keys/dev.pub so development builds
share the store ID.
store/ has the listing text, the privacy answers for each store and the
screenshots (SCREENSHOTS=1 npx playwright test screenshots).
MIT