The AI Summarizer Bookmarklet distills lengthy web content into concise, actionable summaries.
With one click, this bookmarklet analyzes the page text and extracts the most important sentences — no API keys, no external services, fully offline.
Perfect for researchers, students, and professionals who need to quickly understand articles, reports, and long-form content without reading every word.
javascript:!function(){try{if(window._aiSumPanel)return window._aiSumPanel.remove(),void(window._aiSumPanel=null);const t=new Set(["the","a","an","and","or","but","in","on","at","to","for","of","with","by","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","this","that","these","those","it","its","i","we","you","he","she","they","me","him","her","us","them","my","your","his","our","their","what","which","who","whom","when","where","how","why","not","no","nor","so","if","then","than","too","very","just","about","also","more","most","other","some","such","only","own","same","than"]);function e(e){const n=e.replace(/\n+/g," ").split(/(?<=[.!?])\s+/).filter((e=>e.trim().length>20)),o={};return(e.toLowerCase().match(/\b[a-z]{3,}\b/g)||[]).forEach((e=>{t.has(e)||(o[e]=(o[e]||0)+1)})),n.map(((e,t)=>{const i=e.toLowerCase().match(/\b[a-z]{3,}\b/g)||[],r=i.reduce(((e,t)=>e+(o[t]||0)),0)/Math.max(i.length,1),s=t<.3*n.length?1.3:1;return{sentence:e.trim(),score:r*s,index:t}}))}const n=function(){const e=document.querySelector('article,main,[role="main"],.content,.post-content,.entry-content,.article-body');if(e)return e.innerText;const t=document.querySelectorAll("p");return t.length>3?Array.from(t).map((e=>e.innerText)).join("\n\n"):document.body.innerText}(),o=Math.max(3,Math.min(10,Math.floor(.15*n.split(/(?<=[.!?])\s+/).length))),i=function(t,n){const o=e(t);return o.length<=n?o.map((e=>e.sentence)).join(" "):(o.sort(((e,t)=>t.score-e.score)),o.slice(0,n).sort(((e,t)=>e.index-t.index)).map((e=>e.sentence)).join(" "))}(n,o),r=function(t,n){const o=e(t);return o.length<=n?o.map((e=>e.sentence)):(o.sort(((e,t)=>t.score-e.score)),o.slice(0,n).sort(((e,t)=>e.index-t.index)).map((e=>e.sentence)))}(n,3),s=n.split(/\s+/).length,a=Math.ceil(s/200),d=document.createElement("div");d.id="ai-sum-panel",window._aiSumPanel=d,d.style.cssText="position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-height:80vh;background:#fafafa;border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,0.2);z-index:999999;font-family:system-ui,-apple-system,sans-serif;overflow:hidden;display:flex;flex-direction:column;";const l=r.map((e=>`<div style="padding:10px 14px;background:#fff;border-left:3px solid #6366f1;border-radius:0 8px 8px 0;margin-bottom:8px;font-size:13px;color:#374151;line-height:1.5;">${e}</div>`)).join("");d.innerHTML=`\n <div style="padding:18px 20px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;display:flex;justify-content:space-between;align-items:center;flex-shrink:0;">\n <div>\n <div style="font-size:16px;font-weight:700;">✨ AI Summarizer</div>\n <div style="font-size:12px;opacity:0.8;margin-top:2px;">Extractive summarization — no API needed</div>\n </div>\n <button id="ais-close" style="background:none;border:none;color:#fff;font-size:20px;cursor:pointer;opacity:0.8;">✕</button>\n </div>\n <div style="padding:16px 20px;display:flex;gap:16px;border-bottom:1px solid #e5e7eb;flex-shrink:0;">\n <div style="text-align:center;flex:1;">\n <div style="font-size:22px;font-weight:700;color:#4f46e5;">${s.toLocaleString()}</div>\n <div style="font-size:11px;color:#9ca3af;text-transform:uppercase;">Words</div>\n </div>\n <div style="text-align:center;flex:1;">\n <div style="font-size:22px;font-weight:700;color:#4f46e5;">${a}m</div>\n <div style="font-size:11px;color:#9ca3af;text-transform:uppercase;">Read Time</div>\n </div>\n <div style="text-align:center;flex:1;">\n <div style="font-size:22px;font-weight:700;color:#4f46e5;">${o}</div>\n <div style="font-size:11px;color:#9ca3af;text-transform:uppercase;">Key Points</div>\n </div>\n </div>\n <div style="overflow-y:auto;flex:1;padding:16px 20px;">\n <div style="margin-bottom:20px;">\n <div style="font-size:13px;font-weight:700;color:#374151;margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px;">📝 Summary</div>\n <div style="font-size:14px;color:#4b5563;line-height:1.7;padding:14px;background:#fff;border-radius:10px;box-shadow:0 1px 3px rgba(0,0,0,0.06);">${i}</div>\n </div>\n <div>\n <div style="font-size:13px;font-weight:700;color:#374151;margin-bottom:10px;text-transform:uppercase;letter-spacing:0.5px;">🔑 Key Highlights</div>\n ${l}\n </div>\n </div>\n <div style="padding:12px 20px;border-top:1px solid #e5e7eb;display:flex;gap:8px;flex-shrink:0;">\n <button id="ais-copy" style="flex:1;padding:10px;border:none;border-radius:8px;background:#4f46e5;color:#fff;font-size:13px;font-weight:600;cursor:pointer;">📋 Copy Summary</button>\n <button id="ais-copy-full" style="flex:1;padding:10px;border:none;border-radius:8px;background:#fff;color:#374151;font-size:13px;border:1px solid #e5e7eb;cursor:pointer;">📄 Copy Full</button>\n </div>`,document.body.appendChild(d),d.querySelector("#ais-close").addEventListener("click",(function(){d.remove(),window._aiSumPanel=null})),d.querySelector("#ais-copy").addEventListener("click",(function(){navigator.clipboard.writeText(i).then((()=>{this.textContent="✓ Copied!",setTimeout((()=>{this.textContent="📋 Copy Summary"}),1500)}))})),d.querySelector("#ais-copy-full").addEventListener("click",(function(){const e="## Summary\n\n"+i+"\n\n## Key Highlights\n\n"+r.map((e=>"> "+e)).join("\n\n");navigator.clipboard.writeText(e).then((()=>{this.textContent="✓ Copied!",setTimeout((()=>{this.textContent="📄 Copy Full"}),1500)}))}))}catch(c){alert("Error: "+c.message)}}();Drag me to bookmark bar: 👉🏻 AI Summarizer
Features #
- 🧠 Intelligent extractive summarization — picks the most important sentences
- 📊 Shows word count, estimated read time, and key points at a glance
- 🔑 Highlights the 3 most impactful sentences from the content
- 📋 One-click copy for both summary and full structured output
- 🔒 100% client-side — no data sent to any server
- ⚡ Instant results — no waiting for API responses
Why Use AI Summarizer? #
This bookmarklet is ideal for:
- Quickly assessing whether an article is worth a full read
- Summarizing research papers and long-form articles
- Creating notes and study materials from web content
- Getting key points from news articles and blog posts
- Productivity workflows — process more content in less time
- No subscription or API key needed — works entirely offline
How to Use #
- Drag the button above to your bookmarks bar
- Navigate to any article or content-heavy page
- Click the bookmarklet — the summary panel appears instantly
- Read the Summary section for the condensed version
- Check Key Highlights for the 3 most important sentences
- Click 📋 Copy Summary to copy just the summary text
- Click 📄 Copy Full to copy the summary with highlights in markdown format
- Click ✕ to close the panel
How It Works #
The summarizer uses extractive summarization — it analyzes word frequency and sentence position to identify the most informative sentences. Sentences at the beginning of the article get a slight priority boost, since content creators typically lead with key information.
- Previous: Add to Feedly
- Next: Check AMP Version