<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SHOTA</title>
    <description>The latest articles on DEV Community by SHOTA (@ktg0215).</description>
    <link>https://dev.to/ktg0215</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3680827%2F32772ff4-0790-4e58-a5f8-a919a1e5b19c.png</url>
      <title>DEV Community: SHOTA</title>
      <link>https://dev.to/ktg0215</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ktg0215"/>
    <language>en</language>
    <item>
      <title>How to Write a Bug Report That Won't Get Sent Back</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Wed, 05 Aug 2026 16:04:51 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-write-a-bug-report-that-wont-get-sent-back-17fe</link>
      <guid>https://dev.to/ktg0215/how-to-write-a-bug-report-that-wont-get-sent-back-17fe</guid>
      <description>&lt;p&gt;Every developer has received the bug report that just says "the save button is broken." No steps, no screenshot, no browser — so the first reply is always the same: "Can you reproduce it? What did you click?" A round-trip later, you finally have enough to start.&lt;/p&gt;

&lt;p&gt;A good bug report answers those questions before they're asked. Here's what to include, and a faster way to capture it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a reproducible bug report needs
&lt;/h2&gt;

&lt;p&gt;Whoever picks up the bug should be able to trigger it without messaging you. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steps to reproduce&lt;/strong&gt; — the exact clicks, in order, from a known starting point&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected vs. actual&lt;/strong&gt; — what should happen, what actually happened&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots&lt;/strong&gt; — the state at each meaningful step, and the failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt; — browser, OS, and the URL or build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The steps and screenshots are the part people skip, because capturing them by hand is tedious.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way (and where it breaks down)
&lt;/h2&gt;

&lt;p&gt;The usual flow: reproduce the bug, take a screenshot at each step with your OS shortcut, crop each one, paste them into the issue, and write out the steps from memory. It works, but it's slow, and "from memory" is where steps get dropped — you forget the filter you'd set three clicks ago that actually triggers the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  A faster way: Procshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=write-a-reproducible-bug-report"&gt;Procshot&lt;/a&gt; is a free Chrome extension that records what you do in the browser and turns it into a step-by-step guide — one screenshot and one written step per action.&lt;/p&gt;

&lt;p&gt;For a bug report:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click record, then reproduce the bug exactly as it happens&lt;/li&gt;
&lt;li&gt;Stop recording — you now have every click captured as a numbered step with a screenshot&lt;/li&gt;
&lt;li&gt;Annotate the failure screenshot with an arrow or box (and blur anything sensitive)&lt;/li&gt;
&lt;li&gt;Export to &lt;strong&gt;Markdown&lt;/strong&gt; and paste straight into a GitHub / GitLab issue, or &lt;strong&gt;PDF&lt;/strong&gt; for a ticket&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because Procshot captures each click as you go, you can't forget a step — the repro is the recording.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Markdown export is the useful part
&lt;/h3&gt;

&lt;p&gt;A Markdown export drops into an issue tracker with the steps and images already formatted. The person triaging reads a numbered repro instead of a paragraph, and they can follow it without asking you anything.&lt;/p&gt;

&lt;p&gt;One honest note: Procshot makes screenshot-based guides, not video. For a bug report that lives in an issue and needs to be &lt;em&gt;read&lt;/em&gt;, numbered screenshots beat a screen recording someone has to scrub through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 5 guides per month, all export formats, all annotation tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($4.99/month):&lt;/strong&gt; unlimited guides, custom branding, PDF templates, priority support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no Procshot account — your guides are built and stored in your browser (IndexedDB).&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=write-a-reproducible-bug-report"&gt;https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=write-a-reproducible-bug-report&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/procshot/ieblehdloggcpmkncplccjofeoakhkll" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/procshot/ieblehdloggcpmkncplccjofeoakhkll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's the one thing you wish every bug report included? For me it's the exact starting URL — half of "can't reproduce" is starting from the wrong place.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>testing</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Pocket Shut Down — Here's How to Actually Resume Reading Long Articles</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Tue, 04 Aug 2026 16:15:12 +0000</pubDate>
      <link>https://dev.to/ktg0215/pocket-shut-down-heres-how-to-actually-resume-reading-long-articles-16e1</link>
      <guid>https://dev.to/ktg0215/pocket-shut-down-heres-how-to-actually-resume-reading-long-articles-16e1</guid>
      <description>&lt;p&gt;Mozilla shut Pocket down. The apps and the website stopped working on &lt;strong&gt;July 8, 2025&lt;/strong&gt;, the extensions were pulled from stores back in May 2025, and the export window for your saved list closed in October 2025. (&lt;a href="https://support.mozilla.org/en-US/kb/future-of-pocket" rel="noopener noreferrer"&gt;Mozilla's own support page has the timeline.&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;If you were a Pocket user, you're probably looking for a "Pocket alternative" right now. Before you migrate your whole workflow, it's worth separating what Pocket actually did for you — because most people used it for &lt;strong&gt;one&lt;/strong&gt; job, and that job has a much lighter solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did you really use Pocket for?
&lt;/h2&gt;

&lt;p&gt;Pocket bundled several things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A save-for-later queue&lt;/strong&gt; — a place to stash articles you'll read someday&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-device sync&lt;/strong&gt; of that queue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline reading&lt;/strong&gt; and a clean reader view&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not losing your place&lt;/strong&gt; in a long piece you started&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Be honest about which of these you actually used. For a lot of people, the queue filled up with hundreds of links they never returned to, and the real day-to-day value was &lt;strong&gt;#4&lt;/strong&gt;: opening a long article, getting interrupted, and being able to pick up where they left off.&lt;/p&gt;

&lt;p&gt;If you need the full archive-and-offline experience, there are heavier read-later apps that replace all of Pocket. But if what you miss is &lt;em&gt;not losing your spot&lt;/em&gt;, you don't need to rebuild your whole reading stack — you need a bookmark that remembers your scroll position.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual ways (and where they fall short)
&lt;/h2&gt;

&lt;p&gt;Chrome gives you a few half-measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl/Cmd+F&lt;/strong&gt; the last sentence you remember — if you remember it, and if it's unique on the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A normal bookmark&lt;/strong&gt; saves the &lt;em&gt;page&lt;/em&gt;, not your position. You still land at the top and scroll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highlighter extensions&lt;/strong&gt; work, but only if you remember to highlight &lt;em&gt;before&lt;/em&gt; you get pulled away. Interruptions don't announce themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all share the same flaw: they need you to act ahead of the interruption.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lightweight option: ReadMark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=read-later-after-pocket-resume-reading"&gt;ReadMark&lt;/a&gt; is a free Chrome extension that saves your scroll position automatically, so reopening a page drops you back exactly where you stopped.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic saving&lt;/strong&gt; — it records your reading position as you scroll; there's no button to remember to press&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click return&lt;/strong&gt; — jump back to the saved spot, with a visual marker showing where you left off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-page tracking&lt;/strong&gt; — positions are saved per URL, so a dozen half-read tabs each remember their own place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kept in your browser&lt;/strong&gt; — your positions live in local browser storage; with Pro they sync across your own devices through Chrome sync, and no ReadMark account is required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest scope:&lt;/strong&gt; ReadMark is &lt;em&gt;not&lt;/em&gt; a Pocket clone. It doesn't keep a save-for-later queue, download articles for offline reading, or give you a reader view. It does one thing — pick up long reads where you left off — and stays out of your way. If that was your real Pocket use case, it's a much lighter replacement than a full read-later app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free vs Pro
&lt;/h3&gt;

&lt;p&gt;The free plan covers the core loop: save your position on up to 10 pages and jump back with one click.&lt;/p&gt;

&lt;p&gt;ReadMark Pro unlocks unlimited saved positions plus folders, full-text search across everything you've marked, and export/import — $4.99/month, with a 7-day free trial if you want to try it first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no ReadMark account — your reading positions stay in your browser, and Pro syncs them across your devices via Chrome.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=read-later-after-pocket-resume-reading"&gt;https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=read-later-after-pocket-resume-reading&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/readmark/inejhohffndeacbihghjcobndpoejdfn" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/readmark/inejhohffndeacbihghjcobndpoejdfn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that Pocket's gone — are you rebuilding a full read-later queue, or did you mostly just want to stop losing your place?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>chrome</category>
      <category>reading</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Stop Leaking Sensitive Data into ChatGPT</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Mon, 03 Aug 2026 16:28:23 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-stop-leaking-sensitive-data-into-chatgpt-19h3</link>
      <guid>https://dev.to/ktg0215/how-to-stop-leaking-sensitive-data-into-chatgpt-19h3</guid>
      <description>&lt;p&gt;You paste a customer's email into ChatGPT to draft a reply. You drop a real stack trace with an internal hostname into Claude to debug it. You ask Gemini to summarize a document that happens to have someone's name and phone number in it. None of it felt like a leak in the moment — but that data left your machine and went to a third-party model.&lt;/p&gt;

&lt;p&gt;For a lot of teams, "don't paste sensitive data into AI tools" is the policy. In practice, people paste anyway because redacting by hand is annoying. Here's how to make redaction automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why manual redaction fails
&lt;/h2&gt;

&lt;p&gt;The manual approach is: read your prompt, find the names, emails, and IDs, replace them with &lt;code&gt;[NAME]&lt;/code&gt; / &lt;code&gt;[EMAIL]&lt;/code&gt;, then send. It works right up until you're in a hurry — and that's exactly when the customer's real email address slips through. Relying on "remember to redact every time" is relying on the weakest possible control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: a redaction checklist (better than nothing)
&lt;/h2&gt;

&lt;p&gt;Keep a checklist of what to strip — names, emails, phone numbers, API keys, internal URLs — and run through it before every prompt. It raises your hit rate, but it's still manual, and it slows you down enough that people quietly stop doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: PromptStash (PII masking on insert)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=stop-leaking-sensitive-data-into-chatgpt"&gt;PromptStash&lt;/a&gt; is a Chrome extension for saving and inserting prompts across ChatGPT, Claude, Gemini, and Perplexity. Its Pro tier includes &lt;strong&gt;PII masking&lt;/strong&gt;: it detects and strips personal data — names, emails, and similar — from your prompt before it goes to the model.&lt;/p&gt;

&lt;p&gt;I turned this on after catching myself about to paste a real support email into a chat window to "just draft a quick reply." The masking is the seatbelt for the moment you're moving too fast to think about it.&lt;/p&gt;

&lt;p&gt;The workflow stays the same as always — write your prompt, insert it — except the sensitive tokens are masked on the way out, without you having to remember. It removes the "I forgot" failure mode, which is the one that actually bites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; up to 10 saved prompts, folders, and variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($5.99/mo):&lt;/strong&gt; unlimited prompts and folders, prompt chaining, a prompt quality score, &lt;strong&gt;PII masking&lt;/strong&gt;, and import/export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PII masking is the reason to go Pro if your prompts ever touch customer or employee data — one masked email that would otherwise have shipped to a third party pays for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no PromptStash account, and it works across ChatGPT / Claude / Gemini / Perplexity.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=stop-leaking-sensitive-data-into-chatgpt"&gt;https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=stop-leaking-sensitive-data-into-chatgpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How does your team handle sensitive data in AI tools right now — a policy, a tool, or mostly trust?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal Chrome extensions for productivity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Block YouTube Shorts on Desktop (Feed, Search &amp; Homepage)</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Sat, 01 Aug 2026 15:04:05 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-block-youtube-shorts-on-desktop-feed-search-homepage-4ajj</link>
      <guid>https://dev.to/ktg0215/how-to-block-youtube-shorts-on-desktop-feed-search-homepage-4ajj</guid>
      <description>&lt;p&gt;You open YouTube to watch one thing, and the Shorts shelf is right there on the homepage, then again in your subscriptions feed, then again when you search. It's engineered to pull you sideways, and "I'll just watch one" turns into fifteen minutes gone.&lt;/p&gt;

&lt;p&gt;YouTube doesn't give you a real off switch for this on desktop. Here's what you can do manually, and a cleaner way to just remove them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What YouTube lets you do (not much)
&lt;/h2&gt;

&lt;p&gt;Your built-in options are weak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Not interested"&lt;/strong&gt; on a Short — it hides that one, and three more take its place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch history off / pausing recommendations&lt;/strong&gt; — thins things out but doesn't remove the Shorts shelves.&lt;/li&gt;
&lt;li&gt;There's no setting that says "hide Shorts on desktop." That's the gap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So manually, it's whack-a-mole. The shelves keep coming back because removing them isn't in YouTube's interest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cleaner way: ShortsKiller
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/shortskiller/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=block-youtube-shorts-on-desktop"&gt;ShortsKiller&lt;/a&gt; is a Chrome extension that removes YouTube Shorts from the places they show up on desktop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Homepage&lt;/strong&gt; — no Shorts shelf when you open YouTube&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscriptions / feed&lt;/strong&gt; — Shorts rows stripped out of your feed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search results&lt;/strong&gt; — Shorts filtered out of what you searched for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also tracks your &lt;strong&gt;screen time&lt;/strong&gt; on YouTube, so you can see the before/after — the point isn't just hiding a UI element, it's getting the minutes back.&lt;/p&gt;

&lt;p&gt;I built this because the "just watch one" loop was the exact trap I kept falling into. Removing the shelf entirely worked where "not interested" never did — you can't tap into what isn't on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/shortskiller/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=block-youtube-shorts-on-desktop"&gt;https://dev-tools-hub.xyz/extensions/shortskiller/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=block-youtube-shorts-on-desktop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/shortskiller/bajebpkjihldiceceompbcjgepnbhnni" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/shortskiller/bajebpkjihldiceceompbcjgepnbhnni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do Shorts actually pull you off track, or do you scroll past them fine? Curious where people land on this.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>chrome</category>
      <category>youtube</category>
      <category>focus</category>
    </item>
    <item>
      <title>How to Create Step-by-Step Guides with Screenshots for Free (Scribe Alternative)</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Fri, 31 Jul 2026 16:04:28 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-create-step-by-step-guides-with-screenshots-for-free-scribe-alternative-34l5</link>
      <guid>https://dev.to/ktg0215/how-to-create-step-by-step-guides-with-screenshots-for-free-scribe-alternative-34l5</guid>
      <description>&lt;p&gt;If you've ever written a "how to do X" doc — a bug repro, an onboarding SOP, a code walkthrough — you know the tedious part isn't the words. It's the screenshots. Take a shot, crop it, draw an arrow, paste it, repeat for step 7, realize you missed a click, redo half of it.&lt;/p&gt;

&lt;p&gt;Tools like Scribe automate this, but the popular ones send your captures to their servers and gate the basics behind an account. Here's how to make illustrated step-by-step guides that stay in your browser — the manual way, and a faster free option.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual way (screenshots + a doc)
&lt;/h2&gt;

&lt;p&gt;You can do this with zero tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press your OS screenshot shortcut on each step&lt;/li&gt;
&lt;li&gt;Crop each image&lt;/li&gt;
&lt;li&gt;Drop them into a doc, in order&lt;/li&gt;
&lt;li&gt;Annotate the important spot (arrow or box) in an image editor&lt;/li&gt;
&lt;li&gt;Write the caption for each step&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It works for a 3-step guide. Past that it falls apart: renumbering when you insert a step, re-shooting when the UI changes, and keeping 15 loose PNGs in sync with 15 captions. I gave up on this for anything longer than a quick Slack message.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way: Procshot
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=create-step-by-step-guides-screenshots"&gt;Procshot&lt;/a&gt; is a free Chrome extension that records what you do in the browser and builds the guide for you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the toolbar icon and hit record&lt;/li&gt;
&lt;li&gt;Do the task normally — click, type, navigate&lt;/li&gt;
&lt;li&gt;Stop recording&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Procshot auto-captures each click, form input, and navigation, and turns it into an illustrated step-by-step guide — screenshot plus a written step for every action, no manual capturing.&lt;/p&gt;

&lt;p&gt;Then you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Annotate&lt;/strong&gt; screenshots with arrows, boxes, blur (for hiding secrets), and text labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; to PDF (4 templates), Markdown (drops straight into Notion / Confluence / GitHub Wiki), or a self-contained HTML file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it local&lt;/strong&gt; — your guides are stored in your browser (IndexedDB); no Procshot account required&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where it earns its place
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug reports&lt;/strong&gt; — record the repro once, export a numbered guide with exact steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding SOPs&lt;/strong&gt; — "how to set up the dev environment" without re-shooting every quarter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code walkthroughs and handoffs&lt;/strong&gt; — a Markdown export that lives next to the code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support docs&lt;/strong&gt; — a clean PDF you can hand a customer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest scope note: Procshot makes &lt;strong&gt;screenshot-based&lt;/strong&gt; guides, not video. If you specifically need a screen recording, it's the wrong tool. For written docs that people actually skim, screenshots-with-steps beat a 4-minute video most of the time — and this is the part I use it for the most.&lt;/p&gt;

&lt;p&gt;The blur tool is the underrated one. I annotate a guide with real data on screen, blur the account name, and export — no separate editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 5 guides per month, all export formats, all annotation tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($4.99/month):&lt;/strong&gt; unlimited guides, custom branding, PDF templates, priority support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no Procshot account — your guides are built and stored in your browser.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=create-step-by-step-guides-screenshots"&gt;https://dev-tools-hub.xyz/extensions/procshot/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=create-step-by-step-guides-screenshots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/procshot/ieblehdloggcpmkncplccjofeoakhkll" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/procshot/ieblehdloggcpmkncplccjofeoakhkll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you use to document a repro or an SOP today — screenshots by hand, a screen recorder, or something else?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>documentation</category>
      <category>chrome</category>
    </item>
    <item>
      <title>The Best EditThisCookie Replacement in 2026: What to Actually Look For</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Thu, 30 Jul 2026 15:52:01 +0000</pubDate>
      <link>https://dev.to/ktg0215/the-best-editthiscookie-replacement-in-2026-what-to-actually-look-for-47ne</link>
      <guid>https://dev.to/ktg0215/the-best-editthiscookie-replacement-in-2026-what-to-actually-look-for-47ne</guid>
      <description>&lt;p&gt;EditThisCookie was the default cookie editor for a decade. Then Manifest V3 landed, Chrome retired the old Manifest V2 platform, and editors that weren't rebuilt for MV3 quietly stopped working. If you're searching for a replacement in 2026, the field is smaller than it looks — a lot of "cookie editor" results are still MV2 extensions that will break (or already have).&lt;/p&gt;

&lt;p&gt;Instead of just handing you a link, here's the checklist I'd use to pick one, and where I landed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a 2026 cookie editor actually needs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. MV3-native.&lt;/strong&gt; This is non-negotiable. If an extension still relies on persistent background pages, it's living on borrowed time. Check that it's been updated recently and describes itself as Manifest V3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fast inline editing.&lt;/strong&gt; The whole point of a dedicated editor over DevTools is speed: see every cookie for the current tab, click one, change the value/expiry/flags, done — no digging through nested panels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Import / export.&lt;/strong&gt; JSON for tooling, Netscape &lt;code&gt;cookies.txt&lt;/code&gt; for curl/yt-dlp and other scripts. If you move sessions between environments, this is the feature you'll use most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Sane defaults, minimal permissions.&lt;/strong&gt; A cookie editor needs the &lt;code&gt;chrome.cookies&lt;/code&gt; API and host access to do its job — but it shouldn't ask for more than that. Fewer permissions, smaller attack surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Honest about browser limits.&lt;/strong&gt; No tool can &lt;em&gt;edit&lt;/em&gt; &lt;code&gt;HttpOnly&lt;/code&gt; cookies — that's a browser security rule, not a feature gap. Be suspicious of anything that claims otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The baseline: Chrome DevTools (no install)
&lt;/h2&gt;

&lt;p&gt;Before installing anything, know that DevTools has a built-in editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the page → &lt;strong&gt;Inspect&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt; tab → &lt;strong&gt;Storage → Cookies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select the domain, double-click a row to edit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's always there and it's trustworthy. But it's slow for repeated use: no quick filtering by cookie type, no one-click export, and every edit is several clicks deep in a small panel. Fine for a one-off; painful for a testing loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I landed: CookieJar
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/cookiejar/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=editthiscookie-replacement-2026"&gt;CookieJar&lt;/a&gt; is a free, Manifest V3 cookie editor built as a direct alternative to EditThisCookie. Against the checklist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;CookieJar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MV3-native&lt;/td&gt;
&lt;td&gt;✅ Built for current Chrome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline editing&lt;/td&gt;
&lt;td&gt;Click the toolbar icon → click a cookie → edit value/expiry/flags, applies immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-labeling&lt;/td&gt;
&lt;td&gt;Cookies grouped by domain and tagged (Login / Tracking / Analytics / Functional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import / export&lt;/td&gt;
&lt;td&gt;JSON and Netscape (&lt;code&gt;cookies.txt&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete single cookie&lt;/td&gt;
&lt;td&gt;One click&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HttpOnly&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewable and deletable, not editable — same browser rule as every tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything above is free. CookieJar Pro ($4.99/month, or $29.99 one-time) adds automatic cookie-cleanup rules, saved cookie profiles, and a storage manager — useful if you're constantly resetting state across projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest scope:&lt;/strong&gt; CookieJar focuses on editing, organizing, and moving cookies. It's not a network-request tool — if you need to rewrite response headers, that's a different category of extension. For the core "I need EditThisCookie back" job, though, it covers the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the checklist matters for testing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth flows&lt;/strong&gt; — flip session state without creating throwaway accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New vs. returning user&lt;/strong&gt; — clear specific cookies while keeping the rest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Login loops&lt;/strong&gt; — nuke a stale session cookie in two clicks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flag verification&lt;/strong&gt; — confirm &lt;code&gt;Secure&lt;/code&gt; / &lt;code&gt;HttpOnly&lt;/code&gt; / &lt;code&gt;SameSite&lt;/code&gt; at a glance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;CookieJar is free and needs no CookieJar account. Your cookies and saved profiles stay in local browser storage — CookieJar never uploads them.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/cookiejar/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=editthiscookie-replacement-2026"&gt;https://dev-tools-hub.xyz/extensions/cookiejar/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=editthiscookie-replacement-2026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/cookiejar/lhngfkchfepfjjdfhimconagoejemofg" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/cookiejar/lhngfkchfepfjjdfhimconagoejemofg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What was the one EditThisCookie feature you can't work without — inline editing, export, or the auto-grouping?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>webdev</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Resume Reading a Long Article Where You Left Off</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:52:43 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-resume-reading-a-long-article-where-you-left-off-3e0l</link>
      <guid>https://dev.to/ktg0215/how-to-resume-reading-a-long-article-where-you-left-off-3e0l</guid>
      <description>&lt;p&gt;You're halfway through a long article or a docs page, you close the tab (or the browser eats it), and later you're back at the top — scrolling, skimming, hunting for the paragraph you'd reached. For a 4,000-word piece that's a real interruption, and it happens every day across dozens of tabs.&lt;/p&gt;

&lt;p&gt;Here's how to pick up exactly where you left off — the manual way, and an automatic one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual ways (and where they fall short)
&lt;/h2&gt;

&lt;p&gt;A few built-in tricks get you partway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl/Cmd+F&lt;/strong&gt; the last sentence you remember — if you remember it, and if it's unique on the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser bookmark&lt;/strong&gt; — but a bookmark saves the &lt;em&gt;page&lt;/em&gt;, not your position. You still land at the top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highlighter extensions&lt;/strong&gt; — good for marking, but you have to remember to highlight before you leave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all share the same flaw: they need you to do something &lt;em&gt;before&lt;/em&gt; you get interrupted. Interruptions don't announce themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The automatic way: ReadMark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=resume-reading-where-you-left-off"&gt;ReadMark&lt;/a&gt; is a free Chrome extension that saves your scroll position automatically, so returning to a page drops you back where you stopped.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic saving&lt;/strong&gt; — it records your reading position as you go; no button to remember to press&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click return&lt;/strong&gt; — jump back to the saved spot instantly, with a visual marker showing where you left off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-page tracking&lt;/strong&gt; — positions are saved per URL, so 12 half-read tabs each remember their own place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stored in your browser&lt;/strong&gt; — your reading positions are kept in local browser storage; with Pro, they sync across your own devices through Chrome sync. No ReadMark account required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The per-URL part is what makes it usable in practice. I keep a pile of long docs open across a week; each one just remembers, independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free vs Pro
&lt;/h3&gt;

&lt;p&gt;The free plan covers the core loop: save your position on up to 10 pages and jump back with one click.&lt;/p&gt;

&lt;p&gt;ReadMark Pro unlocks unlimited saved positions plus folders, full-text search across everything you've marked, and export/import — $4.99/month, with a 7-day free trial if you want to try it first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no ReadMark account — your reading positions are kept in your browser, and Pro syncs them across your devices via Chrome.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=resume-reading-where-you-left-off"&gt;https://dev-tools-hub.xyz/extensions/readmark/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=resume-reading-where-you-left-off&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/readmark/inejhohffndeacbihghjcobndpoejdfn" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/readmark/inejhohffndeacbihghjcobndpoejdfn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do you get back to your spot in a long read right now — Ctrl+F, a highlight, or just re-skimming?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal, MV3-native Chrome extensions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>chrome</category>
      <category>reading</category>
    </item>
    <item>
      <title>Prompt Templates with Variables: Reusable AI Prompts for ChatGPT, Claude &amp; Gemini</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Tue, 28 Jul 2026 16:08:16 +0000</pubDate>
      <link>https://dev.to/ktg0215/prompt-templates-with-variables-reusable-ai-prompts-for-chatgpt-claude-gemini-o0p</link>
      <guid>https://dev.to/ktg0215/prompt-templates-with-variables-reusable-ai-prompts-for-chatgpt-claude-gemini-o0p</guid>
      <description>&lt;p&gt;Most of the prompts I reuse aren't fixed text — they're &lt;em&gt;almost&lt;/em&gt; the same every time, with one or two things swapped. "Rewrite this for a technical audience." "…for a beginner audience." "Summarize in 3 bullets." "…in 5 bullets." Retyping the whole thing to change one word is how good prompts quietly rot in your chat history.&lt;/p&gt;

&lt;p&gt;The fix is templates with variables. Here's the idea, and a free Chrome extension that makes it one click.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a prompt template is
&lt;/h2&gt;

&lt;p&gt;A template is a prompt with placeholders you fill at send time instead of editing the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rewrite the text below in a {{tone}} tone for a {{audience}} audience.
Keep it under {{word_count}} words.

---
{{text}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it once. Each time you use it, you fill in &lt;code&gt;tone&lt;/code&gt;, &lt;code&gt;audience&lt;/code&gt;, &lt;code&gt;word_count&lt;/code&gt;, and paste &lt;code&gt;text&lt;/code&gt; — one template, dozens of variations, zero retyping. The wording of the instruction (the part you tuned carefully) never changes, so the quality stays consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The manual version (and why it drags)
&lt;/h2&gt;

&lt;p&gt;You can fake this with a notes doc: keep the template as plain text, copy it into the chat box, then manually find-and-replace &lt;code&gt;{{tone}}&lt;/code&gt; before sending. It works, but you're tab-switching and hand-editing placeholders every single time — and it's easy to send a prompt with a &lt;code&gt;{{variable}}&lt;/code&gt; you forgot to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  PromptStash: variables, one-click insert
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=prompt-templates-with-variables"&gt;PromptStash&lt;/a&gt; is a free Chrome extension that stores prompt templates and inserts them straight into the chat box — ChatGPT, Claude, Gemini, Perplexity, and more.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save a prompt with &lt;code&gt;{{variables}}&lt;/code&gt; in it&lt;/li&gt;
&lt;li&gt;Organize it into a folder&lt;/li&gt;
&lt;li&gt;On insert, PromptStash prompts you to fill each variable&lt;/li&gt;
&lt;li&gt;The finished prompt drops directly into the chat box — no tab-switching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because it fills the variables for you, you can't accidentally send a raw &lt;code&gt;{{placeholder}}&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A few templates worth saving
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code review:&lt;/strong&gt; &lt;code&gt;Review the {{language}} code below for {{focus}} (bugs / style / performance). Be specific.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explain an error:&lt;/strong&gt; &lt;code&gt;Explain this {{language}} error in plain terms and give the most likely fix: {{error}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit message:&lt;/strong&gt; &lt;code&gt;Write a conventional commit message for this diff. Scope: {{scope}}.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save each once; fill the blanks per use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; up to 10 prompts, folders, and variables — enough to templatize your daily few&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro ($5.99/mo):&lt;/strong&gt; unlimited prompts and folders, prompt chaining, a prompt quality score, PII masking (strip names/emails before they hit the model), and import/export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PII masking is the one I'd point a team at — it catches the "oops, I pasted a customer's email into ChatGPT" problem before it happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no PromptStash account, and it works across ChatGPT / Claude / Gemini / Perplexity.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=prompt-templates-with-variables"&gt;https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=dev.to&amp;amp;utm_medium=referral&amp;amp;utm_campaign=prompt-templates-with-variables&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's the one prompt you retype the most? That's the first one to templatize.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal Chrome extensions for productivity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What are Partitioned cookies (CHIPS), and why can+t your cookie editor see them?</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:50:47 +0000</pubDate>
      <link>https://dev.to/ktg0215/what-are-partitioned-cookies-chips-and-why-cant-your-cookie-editor-see-them-12aj</link>
      <guid>https://dev.to/ktg0215/what-are-partitioned-cookies-chips-and-why-cant-your-cookie-editor-see-them-12aj</guid>
      <description>&lt;p&gt;I cleared "all cookies" for a site, reloaded, and a tracking cookie was still there. Not a caching issue — the cookie genuinely came back. That's what sent me down the CHIPS rabbit hole, and it turns out most cookie tools quietly hide a whole class of cookies from you.&lt;/p&gt;

&lt;p&gt;Here's the short version of what's happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third-party cookies got partitioned
&lt;/h2&gt;

&lt;p&gt;For years, a cookie set by &lt;code&gt;embed.example.com&lt;/code&gt; was one cookie, shared everywhere that embed appeared. That's exactly the cross-site tracking browsers have been clamping down on.&lt;/p&gt;

&lt;p&gt;Chrome's answer is &lt;strong&gt;CHIPS&lt;/strong&gt; — Cookies Having Independent Partitioned State — exposed as the &lt;code&gt;Partitioned&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Set-Cookie: session=abc; Secure; SameSite=None; Partitioned
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;Partitioned&lt;/code&gt;, that cookie is &lt;strong&gt;keyed by the top-level site&lt;/strong&gt; you're visiting. So the cookie &lt;code&gt;embed.example.com&lt;/code&gt; sets while you're on &lt;code&gt;site-a.com&lt;/code&gt; is a &lt;em&gt;different stored cookie&lt;/em&gt; from the one it sets on &lt;code&gt;site-b.com&lt;/code&gt;. Same domain, same name, two isolated jars. That isolation is the entire point — an embed can keep state without becoming a cross-site super-cookie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why your cookie editor doesn't show them
&lt;/h2&gt;

&lt;p&gt;This is the part that bites developers. In the extension API, &lt;code&gt;chrome.cookies.getAll()&lt;/code&gt; treats the partition key as a filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// unpartitioned cookies ONLY (what most old tools effectively ask for)&lt;/span&gt;
&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// a specific partition&lt;/span&gt;
&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;partitionKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;topLevelSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://site-a.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// EVERYTHING — partitioned and unpartitioned&lt;/span&gt;
&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;partitionKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a tool was written before CHIPS, it calls the first form. It isn't lying on purpose — it's asking a question whose answer no longer includes the partitioned cookies. So the UI shows a confident, complete-looking list that's &lt;strong&gt;missing rows&lt;/strong&gt;. You clear "all," the partitioned ones survive because they were never in the list, and you're left debugging against a wrong picture.&lt;/p&gt;

&lt;p&gt;The partition key itself has two parts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;partitionKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;topLevelSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://site-a.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;hasCrossSiteAncestor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;   &lt;span class="c1"&gt;// Chrome 130+&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;hasCrossSiteAncestor&lt;/code&gt; (the "Ancestor Chain Bit") is the subtle one: it records whether the cookie's frame sits under a cross-site ancestor. Two cookies can share a &lt;code&gt;topLevelSite&lt;/code&gt; and still be different entries because this bit differs. If a tool ignores it — or passes it without &lt;code&gt;topLevelSite&lt;/code&gt;, which throws — deletes silently miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually see and clean them
&lt;/h2&gt;

&lt;p&gt;Once you know partitioned cookies exist, you want two things: to &lt;strong&gt;see&lt;/strong&gt; them grouped by partition, and to &lt;strong&gt;delete&lt;/strong&gt; the right one (matching its exact partition key).&lt;/p&gt;

&lt;p&gt;That's the gap &lt;a href="https://dev-tools-hub.xyz/extensions/cookiejar" rel="noopener noreferrer"&gt;CookieJar&lt;/a&gt; fills. It's a free MV3 cookie manager that lists cookies &lt;strong&gt;across partitions&lt;/strong&gt;, &lt;strong&gt;groups&lt;/strong&gt; them by their partition (top-level site), and lets you &lt;strong&gt;see and delete&lt;/strong&gt; partitioned cookies correctly — not just the unpartitioned ones legacy tools show. Editing and dedicated export for partitioned cookies are coming in a later update; the immediate win is finally &lt;em&gt;seeing and clearing&lt;/em&gt; the ones that were invisible.&lt;/p&gt;

&lt;p&gt;A couple of gotchas worth knowing if you're testing this yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partitioned cookies require &lt;code&gt;Secure&lt;/code&gt; and &lt;code&gt;SameSite=None&lt;/code&gt;. You can't create one from a &lt;code&gt;chrome-extension://&lt;/code&gt; page, so to generate test data you need a real HTTPS server setting the header, with a cross-site iframe.&lt;/li&gt;
&lt;li&gt;Minimum useful Chrome for the full API is &lt;strong&gt;130&lt;/strong&gt; — earlier versions had a &lt;code&gt;getAll&lt;/code&gt; regression around partitioned cookies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/mv3-cookie-editor-manager/lhngfkchfepfjjdfhimconagoejemofg" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/mv3-cookie-editor-manager/lhngfkchfepfjjdfhimconagoejemofg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been fighting a cookie that "won't delete," check whether it's partitioned — I'd bet a good number of those bugs are CHIPS, not caching. Have you hit this one yet?&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I built a free, local step-by-step guide maker — the screenshots were the easy part</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:48:45 +0000</pubDate>
      <link>https://dev.to/ktg0215/i-built-a-free-local-step-by-step-guide-maker-the-screenshots-were-the-easy-part-1pa0</link>
      <guid>https://dev.to/ktg0215/i-built-a-free-local-step-by-step-guide-maker-the-screenshots-were-the-easy-part-1pa0</guid>
      <description>&lt;p&gt;Writing "how to do X in our app" docs by hand is miserable. You do the steps, screenshot each one, crop them, paste them into a doc, annotate, repeat. Tools like Scribe and Tango solved this years ago — you click through a process and they generate the guide. Tango alone has 400k+ installs, so clearly people want this.&lt;/p&gt;

&lt;p&gt;I wanted the same thing but with two constraints those tools don't give me: the guide should be generated &lt;strong&gt;locally&lt;/strong&gt; (screenshots of internal tools shouldn't get uploaded to someone's cloud), and it should export to a plain &lt;strong&gt;PDF&lt;/strong&gt; I own. So I built Procshot.&lt;/p&gt;

&lt;p&gt;The screenshot-and-caption part was straightforward. The part that ate a week was keeping a multi-step recording alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  MV3 service workers die in the middle of your recording
&lt;/h2&gt;

&lt;p&gt;A guide recording is inherently stateful: step 1, step 2, step 3… each click appends to a list you're building over time. My first version kept that list in a variable in the background service worker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// don't do this&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onClicked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; &lt;span class="cm"&gt;/* start recording */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works right up until the user pauses to actually &lt;em&gt;think&lt;/em&gt; about the next step. In Manifest V3 the service worker is terminated after ~30 seconds of inactivity, and when it does, &lt;code&gt;steps&lt;/code&gt; is gone. So a 12-step guide would randomly come out as a 4-step guide, and I couldn't reproduce it on demand — it depended on how long the user hovered between clicks.&lt;/p&gt;

&lt;p&gt;The fix is the MV3 rule everyone learns the hard way: &lt;strong&gt;never hold recording state in memory.&lt;/strong&gt; Every captured step gets written to &lt;code&gt;chrome.storage.local&lt;/code&gt; immediately, and listeners are registered at the top level so a woken-up worker re-attaches them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;STEP_CAPTURED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// append synchronously, don't trust the SW to still be alive next click&lt;/span&gt;
  &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;steps&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;steps&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same idea for the "am I currently recording?" flag — that lives in storage too, not a boolean in the worker. Once state moved out of memory, the dropped-step bug disappeared completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The screenshot timing gotcha
&lt;/h2&gt;

&lt;p&gt;The other thing that bit me: capturing the screenshot &lt;em&gt;on click&lt;/em&gt; often grabbed the page mid-transition — a half-rendered modal, a spinner. I ended up debouncing capture slightly after the interaction and waiting for the DOM to settle, which made the guides look like a human took them instead of a robot with a fast trigger finger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it landed
&lt;/h2&gt;

&lt;p&gt;Procshot records clicks, auto-captures and captions each step, and exports the whole thing to PDF — locally, no account, nothing uploaded. It's free. It's not trying to be a full video-SOP platform like the bigger tools; it's the "I need a clean numbered guide in two minutes" tool.&lt;/p&gt;

&lt;p&gt;If you want to try it: &lt;a href="https://chromewebstore.google.com/detail/ieblehdloggcpmkncplccjofeoakhkll" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/ieblehdloggcpmkncplccjofeoakhkll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've built anything that records a session across multiple steps in MV3 — how did you handle the service worker dying mid-flow? Curious if there's a cleaner pattern than "write everything to storage on every event."&lt;/p&gt;

</description>
      <category>chromeextension</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>A Chrome extension I never marketed grew 2.7x in two weeks — then I lost half of it</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Thu, 23 Jul 2026 15:48:36 +0000</pubDate>
      <link>https://dev.to/ktg0215/a-chrome-extension-i-never-marketed-grew-27x-in-two-weeks-then-i-lost-half-of-it-40ao</link>
      <guid>https://dev.to/ktg0215/a-chrome-extension-i-never-marketed-grew-27x-in-two-weeks-then-i-lost-half-of-it-40ao</guid>
      <description>&lt;p&gt;I have a bad habit of judging an extension by how loud its launch was. PageMemo broke that habit. It's a small sticky-notes tool — you drop a note on any web page and it comes back when you return. I never ran ads for it, never posted about it, never did a launch. And over two weeks in April it grew 2.7x on installs anyway.&lt;/p&gt;

&lt;p&gt;Then it gave most of that back. That second part turned out to be the more useful lesson, so I'll get to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The spike was real, not a bot
&lt;/h2&gt;

&lt;p&gt;First thing I checked, because I'd been burned before: was this a bot wave? On another extension I'd seen installs balloon ~6,000 that were almost entirely fake — they never fired a single usage event.&lt;/p&gt;

&lt;p&gt;PageMemo was the opposite. In the same window (April 13–27, peaking April 20–25), monthly active users went up ~4.5x and popup opens ~10x. Installs and actual usage moved together. When people install for real, they open the thing. When a bot "installs," it never does. So this was real demand, not noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually moved it (the honest version)
&lt;/h2&gt;

&lt;p&gt;Here's where I have to be careful, because it's easy to invent a clean story after the fact.&lt;/p&gt;

&lt;p&gt;I don't yet have the Chrome Web Store search-term data that would prove &lt;em&gt;which query&lt;/em&gt; drove the installs — that export is still pending. What I do have is the timeline, and it lines up with exactly one thing.&lt;/p&gt;

&lt;p&gt;On April 18, right before the spike started, I shipped a boring maintenance batch to PageMemo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Chrome Web Store screenshots&lt;/li&gt;
&lt;li&gt;An ASO pass on the title and description&lt;/li&gt;
&lt;li&gt;Two new locales (Korean and Spanish) added to the listing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No launch. No thread. Just the listing itself getting less bad.&lt;/p&gt;

&lt;p&gt;My working hypothesis — and I'm calling it a hypothesis, not a fact — is that the localization did most of the work. When you add locales, the Store re-indexes your listing under those languages, and you become discoverable to people who were never searching in English. That's the kind of growth that shows up as "organic" because there's no campaign attached to it. The screenshots and copy probably helped conversion once people landed, but discovery is what changes install &lt;em&gt;volume&lt;/em&gt;, and localization is the lever that touches discovery.&lt;/p&gt;

&lt;p&gt;If you take one thing from this: &lt;strong&gt;your Store listing is a growth surface, not a formality.&lt;/strong&gt; An afternoon of screenshots and two locales outperformed every "launch" I've done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody frames as a win: I lost them
&lt;/h2&gt;

&lt;p&gt;Now the uncomfortable number. By May, PageMemo's monthly actives fell from 161 back to 62.&lt;/p&gt;

&lt;p&gt;I got the traffic and I didn't keep it.&lt;/p&gt;

&lt;p&gt;That's a different problem from discovery, and it's the one I'd been ignoring. Sticky notes are a habit product — they only matter if you come back to the page and your note is still there, doing something for you. If the first session doesn't create a reason to return, a great listing just fills the top of a leaky bucket faster.&lt;/p&gt;

&lt;p&gt;So the ASO win exposed the real gap. Acquisition was never the bottleneck once the listing was fixed. &lt;strong&gt;Retention was.&lt;/strong&gt; And I'd spent months assuming it was the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm changing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat the listing as a recurring lever, not a one-time setup. Localization especially — it's the cheapest discovery I've found.&lt;/li&gt;
&lt;li&gt;Wait for the Store search-term export before I write the "we grew because of keyword X" story. Timeline correlation is a hypothesis; the export is the proof. I'd rather say "I don't know yet" than make it up.&lt;/li&gt;
&lt;li&gt;Actually work on the first session. A note that reappears is only valuable if the first note felt worth taking. That's the retention fix, and it's next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the record, PageMemo is here if you want to poke at it: &lt;a href="https://chromewebstore.google.com/detail/jmpmfbheoclfmceceihjpcjlabakkdde" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/jmpmfbheoclfmceceihjpcjlabakkdde&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've shipped something that grew from a listing change alone — did the users stick, or did you watch the same decay I did? I'm curious whether this is a sticky-notes problem or a me problem.&lt;/p&gt;

</description>
      <category>chromeextension</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>seo</category>
    </item>
    <item>
      <title>How to Save and Reuse Your ChatGPT Prompts (Chrome Extension)</title>
      <dc:creator>SHOTA</dc:creator>
      <pubDate>Sat, 11 Jul 2026 14:55:52 +0000</pubDate>
      <link>https://dev.to/ktg0215/how-to-save-and-reuse-your-chatgpt-prompts-chrome-extension-20d7</link>
      <guid>https://dev.to/ktg0215/how-to-save-and-reuse-your-chatgpt-prompts-chrome-extension-20d7</guid>
      <description>&lt;p&gt;If you use ChatGPT, Claude, or Gemini for real work, you've rewritten the same prompt more times than you'd like to admit — the code-review prompt, the "explain this stack trace" prompt, the commit-message prompt. Retyping them is slow, and the good versions get buried in chat history.&lt;/p&gt;

&lt;p&gt;Here's how to stop retyping and start reusing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why saved prompts beat chat history
&lt;/h2&gt;

&lt;p&gt;A dialed-in prompt is a reusable asset. Rebuilding it from memory each time risks a worse result. Saving prompts gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; — same prompt, same quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt; — no retyping multi-line prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing&lt;/strong&gt; — the team reuses what actually works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteration&lt;/strong&gt; — improve a saved version instead of starting over&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Option 1: a notes doc (zero tools)
&lt;/h2&gt;

&lt;p&gt;Keep a "Prompts" doc, paste each keeper with a label, and copy/paste when you need one. It works, but you're tab-switching constantly and there's no way to drop a prompt straight into the chat box. Fine for a few prompts; tedious past that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: PromptStash (one-click insert)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=devto&amp;amp;utm_campaign=save-reuse-chatgpt-prompts" rel="noopener noreferrer"&gt;PromptStash&lt;/a&gt; is a free Chrome extension that saves prompts and inserts them directly into ChatGPT, Claude, Gemini, Perplexity, and more — no tab-switching.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install it (free, no PromptStash account)&lt;/li&gt;
&lt;li&gt;Save any prompt and drop it in a folder&lt;/li&gt;
&lt;li&gt;Insert it straight into the chat box in one click&lt;/li&gt;
&lt;li&gt;Reuse as-is or tweak before sending&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Free:&lt;/strong&gt; up to 10 prompts, folders, and variables.&lt;br&gt;
&lt;strong&gt;Pro ($5.99/mo):&lt;/strong&gt; unlimited prompts and folders, prompt chaining, a prompt quality score, PII masking, and import/export.&lt;/p&gt;
&lt;h3&gt;
  
  
  Templates with variables
&lt;/h3&gt;

&lt;p&gt;If you send the same prompt with one thing changed, use a variable instead of editing text every time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rewrite the text below in a {{tone}} tone for a {{audience}} audience.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save once, fill in &lt;code&gt;tone&lt;/code&gt; and &lt;code&gt;audience&lt;/code&gt; on insert. One template, dozens of variations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it pays off for devs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Code-review and refactor prompts, reused across every PR&lt;/li&gt;
&lt;li&gt;"Explain this stack trace" with a consistent format&lt;/li&gt;
&lt;li&gt;Commit-message and changelog prompts as one-click templates&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Free, no PromptStash account, and it works across ChatGPT / Claude / Gemini / Perplexity.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Install free:&lt;/strong&gt; &lt;a href="https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=devto&amp;amp;utm_campaign=save-reuse-chatgpt-prompts" rel="noopener noreferrer"&gt;https://dev-tools-hub.xyz/extensions/promptstash/?utm_source=devto&amp;amp;utm_campaign=save-reuse-chatgpt-prompts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/promptstash/ocgkponbnolpgobllplcamfobolbjbcj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://dev-tools-hub.xyz" rel="noopener noreferrer"&gt;S-Hub&lt;/a&gt; — minimal Chrome extensions for productivity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
