{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/posts/save-chatgpt-conversations-as-pdf",
    "result": {"data":{"markdownRemark":{"html":"<h2 id=\"overview\" style=\"position:relative;\"><a href=\"#overview\" aria-label=\"overview permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Overview</h2>\n<p>The way I work with AI has quietly become part of my daily routine. I brainstorm ideas, debug code, draft documents, and research unfamiliar topics, and more often than not, the most valuable output of that work lives inside a single ChatGPT conversation. Some of those threads run for hours. They hold the reasoning behind a decision, the exact snippet that finally fixed a bug, or a carefully refined draft that took a dozen back-and-forth messages to get right. The problem starts the moment I want to keep that conversation, hand it to someone else, or attach it to something more permanent. A long, carefully built thread is genuinely useful, but it is also surprisingly hard to take with me once I close the tab.</p>\n<p>I kept running into the same small frustration. I would finish a great session, want to save it properly, and end up taking a pile of screenshots or copying raw text into a document where all the formatting fell apart. Code blocks lost their structure, tables collapsed into messy lines, and the clean rhythm of the conversation disappeared. There had to be a better way to turn a living chat into something I could actually file away and reuse.</p>\n<p>This is where <strong>Save ChatGPT as PDF</strong> steps in, an open-source project that turns any public ChatGPT share link into a clean, faithfully formatted PDF in a single click. Just paste a link in the form of <code class=\"language-text\">https://chatgpt.com/share/&lt;uuid></code>, and the entire conversation, including markdown, code blocks, tables, math, and ChatGPT's familiar turn-by-turn layout, is rendered into a document you can download, archive, and share anywhere. No sign-up, no browser extension, and no fiddling with print settings. You can try it live at <a href=\"https://save-chatgpt-as-pdf.membasuh.com\">save-chatgpt-as-pdf.membasuh.com</a>.</p>\n<h2 id=\"why-save-chatgpt-as-pdf\" style=\"position:relative;\"><a href=\"#why-save-chatgpt-as-pdf\" aria-label=\"why save chatgpt as pdf permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Save ChatGPT as PDF?</h2>\n<p>ChatGPT already offers a built-in <strong>Share Link</strong> feature, and for quick, casual sharing it works well enough. You generate a link, send it to a friend, and they open it in their browser. For a throwaway conversation, that is perfectly fine. But the moment a conversation needs to travel beyond a browser tab, or needs to last longer than a passing moment, the limitations of a share link become obvious:</p>\n<ul>\n<li><strong>Links can expire or be revoked.</strong> A share link is tied to the original account and can be deleted at any time. The recipient who opens it next week, or next year, may find nothing there at all.</li>\n<li><strong>Recipients need internet access and a valid ChatGPT session.</strong> Just to read a shared link, the other person often needs to be online and signed in. That is a poor fit for offline review, for regulated environments where outside logins are blocked, or for anyone who simply does not have an account.</li>\n<li><strong>Links are awkward to keep.</strong> They are not easy to archive, attach to an email, submit inside a report, or store in a document management system. A URL is not a document. It is a pointer to something that lives on someone else's server, entirely outside your control.</li>\n<li><strong>Links say nothing on their own.</strong> A row of share URLs in a folder tells you almost nothing about what each one contains. There is no preview, no page count, and no way to skim the content without opening every single one.</li>\n</ul>\n<p>A PDF solves all of this in one step. <strong>A PDF file is universally accessible, permanently shareable, printable, and documentable.</strong> It opens on any device, survives long after the original link is gone, and slots naturally into the places where real work is stored and reviewed. It can be searched, highlighted, annotated, signed, and dropped into a folder alongside everything else that matters. Think about attaching an AI conversation to a <strong>job application</strong> as proof of how you approached a take-home assignment, including a research thread in a <strong>thesis appendix</strong>, dropping a troubleshooting session into a <strong>client report</strong> so the whole team can follow the reasoning, or embedding a planning discussion into a <strong>Notion page</strong> that lives next to the rest of your project notes. In every one of those cases, a share link is a fragile dependency, while a PDF is a self-contained artifact that you fully own.</p>\n<p>Save ChatGPT as PDF treats the export not as a screenshot or a rough dump, but as a proper document. That shift, from a temporary link to a durable file, is exactly the upgrade that makes an AI conversation suitable for professional, academic, and archival use. The conversation stops being something locked behind a login and becomes something you can keep forever, exactly as it looked when it mattered.</p>\n<h2 id=\"how-does-it-work\" style=\"position:relative;\"><a href=\"#how-does-it-work\" aria-label=\"how does it work permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Does It Work?</h2>\n<p>At its core, the project is built on <strong>Next.js 15</strong>, <strong>React 19</strong>, and <strong>TypeScript</strong>, with a clean interface styled using <strong>Tailwind v4</strong> and <strong>shadcn/ui</strong>. From the outside, the flow could not be simpler. You paste a public share link, the app fetches and reads the conversation, and a few moments later a polished PDF is ready to download. Underneath that simplicity, though, there is a deliberate pipeline designed to keep the output faithful and the service safe.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/98a430bb1f497cde6c1a155ab48416d5/29114/screen-app.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.49999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVQoz42Sa2sTURCG+///hxZE7CeL+NEKJWortCVKlCaFXDbdzW52z/2WR3Zj4jat1YHhDGdmnvMOZ46iVRx6EjVpPiV+/0YY3mBGQ/TohvjjmjQZkvIpSdUPejbe0JQFR8lpOrd6C7MKt8q5enfK8OQNl8fHDF6+4PL1K8bvT7l+e8L4yzno5i/A35DUVyhr1OSW/NOA7OwDy49nFINzis8Dyquv+OWMpJrnFe5hTmOVQK0rZH5PbGqSaIiiIUnBxjtaS9Hv6x8D++qcRgrBarWirCqsc4QY2bC1mBf40U9CWRK92fc+qXB3equxWmKVxBm9da3wzqLvJsiLC2y2IAX73Mh/oEEJojPEYAmy2eaCI2jZ3adWaXBPj3y4Mm2izBbk2QJnDbIqyaZTlBSdytn4lrLISd79Y216L9VVyXI+Q4kGowTLxbyDeGso7pc064r0vwrbAq8l3kiSt11s6gojakJb047sLbG3GXshZf4YuIPuft9rgRNrbFN1cToA9XuclvwCMedM5DOwYRgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"screen app\"\n        title=\"screen app\"\n        src=\"/static/98a430bb1f497cde6c1a155ab48416d5/5a190/screen-app.png\"\n        srcset=\"/static/98a430bb1f497cde6c1a155ab48416d5/772e8/screen-app.png 200w,\n/static/98a430bb1f497cde6c1a155ab48416d5/e17e5/screen-app.png 400w,\n/static/98a430bb1f497cde6c1a155ab48416d5/5a190/screen-app.png 800w,\n/static/98a430bb1f497cde6c1a155ab48416d5/c1b63/screen-app.png 1200w,\n/static/98a430bb1f497cde6c1a155ab48416d5/29007/screen-app.png 1600w,\n/static/98a430bb1f497cde6c1a155ab48416d5/29114/screen-app.png 1920w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>The most interesting decision sits at the very first step: how the conversation is actually read. Rather than scraping the rendered page or capturing images of it, the app reads ChatGPT's own embedded <strong>React Router turbo-stream payload</strong>, the same structured data the page itself uses to render the conversation. This matters more than it might sound. Screen scraping is brittle, because the moment the page markup changes, the scraper breaks and the output silently degrades. By working from the structured payload instead, the app gets the real content: every message, its role, its order, and its original formatting, exactly as ChatGPT intended it. That means the resulting PDF is reconstructed from genuine data, not a fragile copy of the DOM, so formatting stays accurate and complete.</p>\n<p>Once the conversation data is parsed, it moves into the rendering stage. The document is produced with <strong><code class=\"language-text\">@react-pdf/renderer</code></strong>, which gives precise, code-level control over typography, spacing, page breaks, and layout. For anything that needs richer handling, <strong><code class=\"language-text\">pdfjs-dist</code></strong> comes into play, helping ensure the final file behaves like a true PDF rather than a flattened image. The renderer rebuilds the familiar ChatGPT reading experience on the page: user turns and assistant turns are visually distinct, code keeps its monospaced styling and syntax highlighting, tables keep their columns, and math renders as math rather than broken symbols. The goal throughout is fidelity, so that opening the PDF feels like reading the original conversation, just in a format you own.</p>\n<p>To keep the experience fast, the project uses an optional <strong>Upstash Redis</strong> cache. The first time a particular conversation is rendered, the result can be stored, so any repeat visit to the same link returns almost instantly instead of running through the whole pipeline again. Because it is optional, you can run the app entirely without it and everything still works, which keeps local setup and self-hosting friendly.</p>\n<p>Finally, the whole thing is built to run at the edge. It deploys to <strong>Cloudflare Workers via OpenNext</strong>, which places the app close to users around the world and keeps it lightweight and scalable. The entire experience is designed to be effortless from the user's side: no sign-up, no configuration, just a link and a download.</p>\n<h3 id=\"key-functionalities\" style=\"position:relative;\"><a href=\"#key-functionalities\" aria-label=\"key functionalities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Key Functionalities</h3>\n<ol>\n<li><strong>Faithful PDF Rendering</strong>: Conversations are reproduced with full fidelity, including markdown formatting, code blocks with syntax highlighting, tables, emoji, and math or LaTeX, all wrapped in ChatGPT's familiar turn-by-turn layout. The aim is for the document to read like the original chat, not a degraded copy of it.</li>\n<li><strong>One-Click Simplicity</strong>: There is nothing to install and nothing to learn. You paste a public share link, and the app handles fetching, parsing, rendering, and packaging the PDF for you. The complexity stays under the hood where it belongs.</li>\n<li><strong>Instant Repeat Visits</strong>: An optional <strong>Upstash Redis</strong> cache stores rendered results, so opening the same conversation again is near-instant instead of being reprocessed from scratch. This is especially handy for links that get shared and opened many times.</li>\n<li><strong>Themed Output</strong>: Choose from four themes (<strong>Light</strong>, <strong>Dark</strong>, <strong>AMOLED</strong>, and <strong>Brand</strong>) to match how you want the final document to look, whether that is a clean printable page, a comfortable dark read, or something that fits your own visual identity.</li>\n<li><strong>Privacy by Design</strong>: There is no sign-up and no persisted user data. The app also ships with three layers of <strong>SSRF protection</strong> and <strong>rate limiting</strong> to keep the service safe, fair, and abuse-resistant.</li>\n<li><strong>Installable PWA</strong>: Full Progressive Web App support means you can install it like a native app and reach it instantly whenever you need an export, even adding it to your home screen or dock for one-tap access.</li>\n</ol>\n<h2 id=\"built-with-privacy-and-safety-in-mind\" style=\"position:relative;\"><a href=\"#built-with-privacy-and-safety-in-mind\" aria-label=\"built with privacy and safety in mind permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Built with Privacy and Safety in Mind</h2>\n<p>A tool that accepts arbitrary URLs and turns them into documents has to be careful, and this is an area I genuinely cared about while shaping the project. Two principles guide it: take in as little as possible, and keep what comes in from causing harm.</p>\n<p>On the data side, the approach is simple. There is <strong>no sign-up and no persisted user data</strong>. You do not create an account, you do not hand over personal details, and your conversations are not quietly stored to build a profile of you. The app does the job you asked for and then gets out of the way. The optional cache exists purely to speed up repeat rendering, not to collect anything about who you are.</p>\n<p>On the safety side, the app includes <strong>three layers of SSRF protection</strong>. Server-Side Request Forgery is a class of attack where a malicious user tricks a server into making requests it should not, for example reaching into internal networks or private addresses. Because this tool deliberately fetches a remote URL on the server, that risk has to be taken seriously, and the layered checks are there to make sure only legitimate public ChatGPT share links are ever fetched. On top of that, <strong>rate limiting</strong> keeps any single source from overwhelming the service, so it stays responsive and fair for everyone. None of this is visible to a normal user, and that is exactly the point: the safe path is the default path.</p>\n<h2 id=\"tech-stack\" style=\"position:relative;\"><a href=\"#tech-stack\" aria-label=\"tech stack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tech Stack</h2>\n<p>The project is built using the following tools and frameworks:</p>\n<ul>\n<li><a href=\"https://nextjs.org/docs\">Next.js 15</a></li>\n<li><a href=\"https://react.dev\">React 19</a></li>\n<li><a href=\"https://www.typescriptlang.org/docs\">TypeScript</a></li>\n<li><a href=\"https://tailwindcss.com/docs\">Tailwind CSS v4</a></li>\n<li><a href=\"https://ui.shadcn.com/docs\">shadcn/ui</a></li>\n<li><a href=\"https://react-pdf.org\">@react-pdf/renderer</a></li>\n<li><a href=\"https://mozilla.github.io/pdf.js\">pdfjs-dist</a></li>\n<li><a href=\"https://upstash.com/docs/redis\">Upstash Redis</a> (optional)</li>\n<li><a href=\"https://developers.cloudflare.com/workers\">Cloudflare Workers</a> via <a href=\"https://opennext.js.org/cloudflare\">OpenNext</a></li>\n</ul>\n<h2 id=\"real-world-use-cases\" style=\"position:relative;\"><a href=\"#real-world-use-cases\" aria-label=\"real world use cases permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Real-World Use Cases</h2>\n<p>The value of a clean, permanent export becomes clearest when you picture the moments people actually reach for it. A few that come up again and again:</p>\n<ul>\n<li><strong>Job applications and portfolios</strong>: Candidates increasingly use AI as part of how they think and build. Attaching the conversation behind a take-home assignment, as a tidy PDF, shows your process honestly and professionally in a way a fragile link never could.</li>\n<li><strong>Academic work and research</strong>: Students and researchers can preserve the exact AI exchanges that informed a paper, then drop them into a thesis appendix or a supervisor's review. The document stays readable and citable long after the original link would have expired.</li>\n<li><strong>Client reports and consulting</strong>: When a conversation contains the reasoning behind a recommendation, exporting it lets the whole team follow along offline, attach it to a deliverable, or file it with the rest of the project record.</li>\n<li><strong>Team documentation and knowledge bases</strong>: A troubleshooting session or design discussion can be saved straight into a shared drive, a wiki, or a Notion page, where it becomes a lasting reference instead of a link someone has to chase down.</li>\n<li><strong>Personal archives</strong>: Sometimes you just want to keep a conversation that mattered, whether it helped you learn something, solve a problem, or work through an idea. A PDF makes that effortless and gives you a copy that is genuinely yours.</li>\n</ul>\n<h2 id=\"benefits\" style=\"position:relative;\"><a href=\"#benefits\" aria-label=\"benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Benefits</h2>\n<h3 id=\"for-professionals-and-students\" style=\"position:relative;\"><a href=\"#for-professionals-and-students\" aria-label=\"for professionals and students permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>For Professionals and Students</h3>\n<ul>\n<li><strong>Permanent and portable</strong>: Keep a conversation forever, free from expiring links or login walls. The file lives on your device and goes wherever you go.</li>\n<li><strong>Ready for the real world</strong>: Attach exports to job applications, theses, client reports, or internal documentation without reformatting. The output is already clean and presentable.</li>\n<li><strong>Universally readable</strong>: A PDF opens cleanly on any device and prints exactly as it appears, which makes it ideal for archives, submissions, and any situation where the other person may not have a ChatGPT account at all.</li>\n<li><strong>Searchable and reviewable</strong>: Because the text is real text and not an image, you can search inside it, highlight passages, and annotate it just like any other document.</li>\n</ul>\n<h3 id=\"for-developers\" style=\"position:relative;\"><a href=\"#for-developers\" aria-label=\"for developers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>For Developers</h3>\n<ul>\n<li><strong>Modern, familiar stack</strong>: Built on Next.js 15, React 19, TypeScript, and Tailwind v4, the codebase is easy to read, run, and extend, with patterns most web developers will recognize immediately.</li>\n<li><strong>Robust by default</strong>: SSRF protection, rate limiting, and an optional Redis cache come built in, so production concerns are handled thoughtfully out of the box rather than bolted on later.</li>\n<li><strong>A clean reference for hard problems</strong>: The turbo-stream parsing approach and the PDF rendering pipeline are useful examples in their own right for anyone tackling structured data extraction or document generation.</li>\n<li><strong>Edge-ready deployment</strong>: It runs on Cloudflare Workers via OpenNext, and the source is fully open for you to study, self-host, fork, or contribute to.</li>\n</ul>\n<h2 id=\"how-to-get-started\" style=\"position:relative;\"><a href=\"#how-to-get-started\" aria-label=\"how to get started permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Get Started</h2>\n<p>The fastest way to try it is simply to visit <a href=\"https://save-chatgpt-as-pdf.membasuh.com\">save-chatgpt-as-pdf.membasuh.com</a>, paste a public ChatGPT share link, and download your PDF. There is genuinely nothing else to it for everyday use. If you would rather run it yourself, study the code, or self-host your own instance, getting started locally is straightforward:</p>\n<ol>\n<li>\n<p><strong>Clone the Repository</strong></p>\n<p>Start by cloning the project from GitHub:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"command-line-prompt\"><span data-user=root data-host=localhost></span></span><span class=\"token function\">git</span> clone git@github.com:fyvri/save-chatgpt-as-pdf.git <span class=\"token operator\">&amp;&amp;</span> <span class=\"token builtin class-name\">cd</span> save-chatgpt-as-pdf</code></pre></div>\n</li>\n<li>\n<p><strong>Install Dependencies</strong></p>\n<p>Install everything the project needs:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"command-line-prompt\"><span data-user=root data-host=localhost></span></span><span class=\"token function\">npm</span> <span class=\"token function\">install</span></code></pre></div>\n</li>\n<li>\n<p><strong>Set Up Your Environment</strong></p>\n<p>Copy the example environment file and adjust it to your needs. The Upstash Redis cache is optional, so you can leave those values empty to run without caching while you are getting started.</p>\n</li>\n<li>\n<p><strong>Run the Application</strong></p>\n<p>Launch the development server locally:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\"><span class=\"command-line-prompt\"><span data-user=root data-host=localhost></span></span><span class=\"token function\">npm</span> run dev</code></pre></div>\n</li>\n</ol>\n<p>Then open <code class=\"language-text\">http://localhost:3000</code>, paste a public ChatGPT share link such as <code class=\"language-text\">https://chatgpt.com/share/&lt;uuid></code>, and watch the conversation turn into a polished PDF. When you are ready to put it online, the project is set up to deploy to Cloudflare Workers through OpenNext, so your own edge-hosted instance is only a few steps further.</p>\n<h2 id=\"join-the-community\" style=\"position:relative;\"><a href=\"#join-the-community\" aria-label=\"join the community permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Join the Community</h2>\n<p>Save ChatGPT as PDF is more than a quick utility. It is a small step toward making AI conversations something you truly own: durable, portable, and ready for serious use. Whether you are a student archiving research, a professional documenting work, or a developer who wants to explore and extend the project, there is something here for you. The project is open source, and that openness is an invitation. Ideas, bug reports, and improvements are all welcome, and every contribution helps make the tool better for the next person who needs it.</p>\n<p>Dive into the <a href=\"https://github.com/fyvri/save-chatgpt-as-pdf\">GitHub repository</a>, try it out at <a href=\"https://save-chatgpt-as-pdf.membasuh.com\">save-chatgpt-as-pdf.membasuh.com</a>, and feel free to open an issue or a pull request.</p>\n<h2 id=\"final-thoughts\" style=\"position:relative;\"><a href=\"#final-thoughts\" aria-label=\"final thoughts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Final Thoughts</h2>\n<p>We are generating more valuable conversations with AI than ever before, yet most of them quietly vanish the moment we close the tab. Save ChatGPT as PDF exists to fix that small but real problem, turning a fleeting share link into a clean document you can keep, share, and rely on. It started as a personal itch, the simple wish to hold on to the good conversations, and grew into a tool I hope makes that just as easy for you. If even one important chat ends up safely saved because of it, the project has done its job. Together, let's make every great conversation worth keeping.</p>","excerpt":"Overview The way I work with AI has quietly become part of my daily routine. I brainstorm ideas, debug code, draft documents, and research…","tableOfContents":"<ul>\n<li>\n<p><a href=\"#overview\">Overview</a></p>\n</li>\n<li>\n<p><a href=\"#why-save-chatgpt-as-pdf\">Why Save ChatGPT as PDF?</a></p>\n</li>\n<li>\n<p><a href=\"#how-does-it-work\">How Does It Work?</a></p>\n<ul>\n<li><a href=\"#key-functionalities\">Key Functionalities</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#built-with-privacy-and-safety-in-mind\">Built with Privacy and Safety in Mind</a></p>\n</li>\n<li>\n<p><a href=\"#tech-stack\">Tech Stack</a></p>\n</li>\n<li>\n<p><a href=\"#real-world-use-cases\">Real-World Use Cases</a></p>\n</li>\n<li>\n<p><a href=\"#benefits\">Benefits</a></p>\n<ul>\n<li><a href=\"#for-professionals-and-students\">For Professionals and Students</a></li>\n<li><a href=\"#for-developers\">For Developers</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#how-to-get-started\">How to Get Started</a></p>\n</li>\n<li>\n<p><a href=\"#join-the-community\">Join the Community</a></p>\n</li>\n<li>\n<p><a href=\"#final-thoughts\">Final Thoughts</a></p>\n</li>\n</ul>","fields":{"slug":"/save-chatgpt-conversations-as-pdf"},"frontmatter":{"title":"Save ChatGPT Conversations as PDF","date":"June 02, 2026","date_modified":"June 02, 2026","tags":["chatgpt","pdf","convert","download"],"categories":["Article"],"description":"Paste a public ChatGPT share link and download the whole conversation as a clean, formatted PDF in one click.","comments_off":false,"thumbnail":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAFfElEQVQ4y0WVa2xUZRrHn5kTJRYVAmTFIFhgQiy0ULvQxSJlakXbFRZaireV5cNao9028ZJ4N37xgihCUTRmN2qyCZgoJrvswtBboK29TC30wnSmM3N6Zs6cmTn3c9rOTAtzPH8zLdY3+eX95/3wy/PkffO8JISDNHZ1gHyDXtIE3jklJZkc04rETCsyk1LnSWsKk9FU5rquMVlDY65Pmk7VNEg1TZoydFpYkXCAnn3tBYKmk5GMU0qV50hrKmV0jTKGRjM5dJVmrs9QFiAbmNtBRB0AqQDJJz6ZF3IhPwGgjCyTFhfKU4rUkFak+rSqPJfR1PqMptRnDK0+o2v1mSmzfhZ49gbQMANUoKpyTsoDpJRunRcm2ZAzGQ6RMB54SI6wUIQolDg/h5qIzaEJUZgJAal4DDP//AqZ+r9j5stTyLChypmOdpr58SwjbS+9KQyPM0k2RHzA97LEBqFd8c7qA72W/nPfPN5eS7k2bClx3lL/8bwlL7nDUg89PWveswrm9tLzWLqE4CASyrbPC+NBPyOpIglcuEm44kXw4H5rouphe2JPlT2xt9qeqCi3pX9/a0f6uu343XfZ4s4dttzWYqd2lUNdl2+b5WWFRtk2MrYWOxcqFLkwCUF/oxgeh3Cp3RJaPXa8vQXxjlbEWj3QfSMY/eEMuGVLEG5qgJqZts3XX4W+ZhWMXTuKjK3FZNxf9JswwCiaRInoRKNwdQChgzVWpHq3HdlbDX5PNaJVuxH7cxXGfjiD7p2l4JYtBX+w1tJXr4LsWns+TUS/5DrdXEQLQjFys8KQH/E2j5W48D874fk/Eq0XwPd0ItbXDZkNovvMt+ioLMOw694s2/AclP7eN9TvTpP4eTMjutbRM3l580JZlynBTzQKg/0I7a22uIqdNrurDLEn66AF/VBzNx8eh8gG4R/ywtfXlRWFKKYnjXfSAE1dG2GM6kfIqCi/WWE4QELA1yjzHETfiCVd8dri0CDUa8OYjE4sYEZYTPEcpoRodlrgkTKNt61/fUUNRKTV7iNj90NEUnickTLTFE8KjfJ/ziK1f4+V/dtf7RsHDyBTV4vM/r8gXbsPqScOYLquBqlcrtlnpx+vQ+rhitjUA9tOic/XL04eepq0RyuJhjs8zGCcoxEu2HT1sUcg56+2ki822dKBGhirVkIuLIC8bg2kO/MgrVwBybUW4n0uSJs32UrpVkwWF2KyZMuDs3/cQqnc02k//TVzrusiXe6/3NTj3oHg4UMW+8XnNnv0CBJ1tRh78zWMvvIS+LfeQOT4MbDvvmOHmo/b3IlPEXz1lRv65k2Yvs+1K7thPaULC5zU/t03zH972ujSQFeT110G/5ZCK/jhe7Z8+Bk7tj7fDrp32oHizbb/0d12wF1u+/60zQ6XP4jYuvxfONfarO7Kx2RJUcVsSRGligqc1HPue6ZnuJ9+vtL74vnDT2DgFsf1vhVLrJFld1qjS2+3hm5fZA3dcZs1lHeLNbR4kXU1lxcvyo6uXA7/PSsRzV8dlos3rta2FFCywOWg0Z8uObmxEQoNDxZ1nft+0nPyI7Qcew+eT9/HxeMfoKX5CDwnPkTLyaNoPXkUbZ99jLZTx9DafCTz41M1ta8T5Sm5qbUh34H7C4jEoX4SWb8jNjZMcoRdExG4ylAi6g7HI2428TsTiYibS0bdnMi7uUS0UgHWny3eSM233kpsSZGD25BPKNlIxPd0UJILEO8fdkjJGAm6SFFDoqguEm/KxJsS8YZEMVMmwVRImFJJMGWSAPJscjkvrlju6C7bTu1/WEZn711L1NN2gaDHCHKEfH2dDn9/p9PXe3mOsb5Op69vPufO/f1dTr+32xnwdjv93p8cv039gc5LC1/Ar1Ox2WJYVIN+AAAAAElFTkSuQmCC","width":75,"height":75,"src":"/static/eccde63416b1e4f5436122aa713a8dc3/f937a/thumbnail.png","srcSet":"/static/eccde63416b1e4f5436122aa713a8dc3/f937a/thumbnail.png 1x,\n/static/eccde63416b1e4f5436122aa713a8dc3/40943/thumbnail.png 1.5x,\n/static/eccde63416b1e4f5436122aa713a8dc3/92ab1/thumbnail.png 2x"}}}}}},"pageContext":{"slug":"/save-chatgpt-conversations-as-pdf","previous":{"id":"345b8608-bed0-5a4e-8918-c16ea51fc585","frontmatter":{"title":"Jogja: A Journey Through Stories and Celebrations","tags":["jogja","travel","trip","wedding"],"categories":["Note"],"template":"post"},"fields":{"slug":"/journey-through-stories-and-celebrations"}},"next":null}},
    "staticQueryHashes": []}