Go to https://claude.ai/chat/new (or any other chat you had in the past).
Then run this code:
function printClaude() { // (C) 2024 by ZeroWw. If you use this code, just give me some credit.
const centralPart = document.querySelector('.flex-1.flex.flex-col.px-4.max-w-3xl.mx-auto.w-full.pt-1');
if (centralPart) {
// Expand all "show more" buttons
document.querySelectorAll('button').forEach(button => {
const text = button.textContent.toLowerCase();
if (text.includes('show more') || text.includes('continue') || text.includes('expand')) {
button.click();
}
});
// Wait for content to expand
setTimeout(() => {
const printWindow = window.open('', '_blank', `width=${window.screen.width * 0.85},height=${window.screen.height * 0.85}`);
if (!printWindow) {
alert('Pop-up blocked! Please allow pop-ups for this site and try again.');
return;
}
// Get page stylesheets
const styles = Array.from(document.styleSheets).map(styleSheet => {
try {
return Array.from(styleSheet.cssRules).map(rule => rule.cssText).join('\n');
} catch (e) {
return '';
}
}).join('\n');
// Essential color variables - must stay in HSL format
const cssVars = `:root{--text-000:49 6.9% 5.5%;--text-100:49 19.6% 13.3%;--text-200:49 18.8% 20%;--text-300:49 9% 30%;--text-400:49 7% 37%;--text-500:51 7.5% 42.1%;--accent-main-000:15 52.7% 43.9%;--accent-main-100:16 53.8% 47.5%;--accent-main-200:15 55.6% 52.4%;--accent-secondary-000:210 74.2% 42.1%;--accent-secondary-100:210 74.8% 49.8%;--accent-secondary-200:210 74.8% 57%;--accent-secondary-900:210 68.8% 93.3%;--accent-pro-000:251 34.2% 33.3%;--accent-pro-100:251 40% 45.1%;--accent-pro-200:251 61% 72.2%;--accent-pro-900:253 33.3% 91.8%;--oncolor-100:0 0% 100%;--bg-000:60 6.7% 97.1%;--bg-100:50 23.1% 94.9%;--bg-200:49 26.8% 92%;--bg-300:49 25.8% 87.8%;--bg-400:46 28.3% 82%;--bg-500:47 27% 71%;--accent-main-900:15 48% 90.2%;--border-100:48 12.5% 39.2%;--border-200:48 12.5% 39.2%;--border-300:48 12.5% 39.2%;--oncolor-200:60 6.7% 97.1%;--oncolor-300:60 6.7% 97.1%;--border-400:48 12.5% 39.2%;--danger-000:5 74% 28%;--danger-100:5 73.9% 37.7%;--danger-200:5 49.5% 58%;--danger-900:0 40.3% 89%;--white:0 0% 100%;--black:0 0% 0%;--kraft:25 49.7% 66.5%;--book-cloth:15 52.3% 58%;--manilla:40 54% 82.9%}`;
printWindow.document.write(`<html><head><title>Claude_${new Date().getTime()}</title><style>${cssVars}${styles}</style></head><body>${centralPart.innerHTML}</body></html>`);
// Cleanup: remove UI elements not needed in print
const firstLink = printWindow.document.getElementsByTagName('a')[0];
if (firstLink) firstLink.parentElement.removeChild(firstLink);
const replyBox = printWindow.document.getElementsByClassName('border-0.5 border-border-300 flex');
if (replyBox.length > 0) {
const last = replyBox[replyBox.length - 1];
if (last) last.parentElement.removeChild(last);
}
['absolute -bottom-0 -right-1.5 sm:right-2', 'absolute -bottom-0 left-[2.3rem]', 'sticky bottom-0 mx-auto w-full pt-6'].forEach(className => {
Array.from(printWindow.document.getElementsByClassName(className)).forEach(elem => elem.parentElement.removeChild(elem));
});
setTimeout(() => printWindow.print(), 3000);
}, 1000);
} else {
console.error('Central part not found!');
}
}
printClaude();
For the less technical folks who come here in search of a solution to saving a Claude chat:
The JavaScript function above can be pasted into the URL of a bookmark to create a "bookmarklet", a mini app, applet, in the bookmark. That's a really cool way of customizing your browser without adding an extension.
BUT the browser need to be told how to interpret that pasted text by telling it what protocol to use. Most of the time, browsers use the "http:" or "https:" protocol, and if you are opening a local file instead of a remote one, it uses the "file:" protocol.
When you create your new bookmark, in the New Bookmark dialog, give it a name and when you get to the URL or Location field, first preceed the above JavaScript function with the protocol identifier, "javascript:". That's the only "modification" to the above code that you need, just tell the browser what it is. I've tested this in Chrome, Brave, and Firefox. That's it. Just tell the browsere that this is JavaScript and not the name of a local file or an HTTP URL, and paste in the above code.
Some people recommend first running the above code through a minify utility to make it smaller (removing extra spaces etc. that help human readability) but that isn't necessary; this is a relatively small applet.
I hope this helps.