<?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: Sonny kk</title>
    <description>The latest articles on DEV Community by Sonny kk (@sonny_9cfaf8b35514f).</description>
    <link>https://dev.to/sonny_9cfaf8b35514f</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%2F4007765%2F9d1afeae-75b5-4b93-9d9b-abc77259c469.jpg</url>
      <title>DEV Community: Sonny kk</title>
      <link>https://dev.to/sonny_9cfaf8b35514f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sonny_9cfaf8b35514f"/>
    <language>en</language>
    <item>
      <title>how to repeat texts up to 10,000 times quickly</title>
      <dc:creator>Sonny kk</dc:creator>
      <pubDate>Wed, 08 Jul 2026 05:54:48 +0000</pubDate>
      <link>https://dev.to/sonny_9cfaf8b35514f/how-to-repeat-texts-up-to-10000-times-quickly-h37</link>
      <guid>https://dev.to/sonny_9cfaf8b35514f/how-to-repeat-texts-up-to-10000-times-quickly-h37</guid>
      <description>&lt;h1&gt;
  
  
  I Found a Product Idea Hiding Inside a Google Autocomplete Suggestion. Here's the Full Case Study.
&lt;/h1&gt;

&lt;p&gt;Most indie hacker case studies start with "I had a problem, so I built a solution." Mine didn't start that way. Mine started with a autocomplete dropdown that made zero sense to me at first glance — and turned into one of the more satisfying small builds I've shipped.&lt;/p&gt;

&lt;p&gt;I'm sharing the full process here: the research, the validation, the build, and what happened after launch. No inflated numbers, no "I made $10k in a weekend" nonsense. Just an honest walkthrough for other devs who like turning small, weird ideas into working products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Noticing the Signal
&lt;/h2&gt;

&lt;p&gt;I was doing routine keyword research for a text utility site when I typed "sorry" into a search tool out of curiosity. The autocomplete and related-searches data showed something odd: &lt;a href="https://sorry100times.in/" rel="noopener noreferrer"&gt;write sorry 100 times&lt;/a&gt; as a real, recurring, high-frequency query. Not a fluke — consistent month over month.&lt;br&gt;
Before you go further here is output example of tool - &lt;br&gt;
I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺&lt;/p&gt;

&lt;p&gt;That's usually the point where most people scroll past and move on. I didn't, because a repeating pattern like that is a signal, not noise. Real people were typing that exact phrase into Google with real intent behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Figuring Out the Actual Intent
&lt;/h2&gt;

&lt;p&gt;Search volume alone doesn't tell you what to build. I had to figure out what someone typing "sorry 100 times" actually wanted as an end result. A few possibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They wanted to read about the phrase (informational intent)&lt;/li&gt;
&lt;li&gt;They wanted a pre-written block of "sorry" repeated, ready to copy (transactional intent)&lt;/li&gt;
&lt;li&gt;They wanted a meme or joke image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I checked what was already ranking. Almost everything was either a bare-bones repeater tool with poor UX, or low-effort content pages with no actual usable output. That told me the intent was clearly transactional — people wanted the text itself, generated instantly, not an article about apologies. And nobody had built a genuinely good tool for it.&lt;/p&gt;

&lt;p&gt;That's validation. Not survey data, not a landing page test — just a clear, unmet, repeating demand with weak existing competition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Scoping the MVP Ruthlessly
&lt;/h2&gt;

&lt;p&gt;It would've been easy to over-scope this. Add accounts, add a "save your history" feature, add social sharing, add a dozen preset categories. I didn't. The entire point of someone searching "sorry 1000 times" is urgency — they want output fast, not a feature tour.&lt;/p&gt;

&lt;p&gt;So the MVP became intentionally minimal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A text input, plus a few ready-made presets for common cases&lt;/li&gt;
&lt;li&gt;A count selector — 100, 1,000, 10,000&lt;/li&gt;
&lt;li&gt;A generate button&lt;/li&gt;
&lt;li&gt;Copy button&lt;/li&gt;
&lt;li&gt;Download as .txt button&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No sign-up wall, no unnecessary steps between the search query and the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Building and Shipping Fast
&lt;/h2&gt;

&lt;p&gt;Because the scope was so tight, the build itself only took a few focused sessions. Plain HTML, CSS, and JavaScript — no framework overhead needed for something this contained. I kept performance in mind from the start, since generating up to 10,000 repetitions needed to feel instant, not sluggish, or the entire value proposition falls apart.&lt;/p&gt;

&lt;p&gt;I didn't wait for a "perfect" version. I shipped the minimal version, watched how real users interacted with it, and iterated afterward based on actual usage rather than my own assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: What I Learned Post-Launch
&lt;/h2&gt;

&lt;p&gt;A few things surprised me once real traffic started coming in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;People use presets more than I expected.&lt;/strong&gt; I assumed most users would type their own text, but a large chunk of users click straight into a preset and generate immediately. Reducing typing effort mattered more than I predicted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The download button gets used more on mobile.&lt;/strong&gt; Copy-paste on mobile keyboards is clunky when the block of text is huge, so a lot of mobile users prefer downloading the .txt file over trying to copy 10,000 lines by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Sorry 100 times copy and paste" style intent dominates.&lt;/strong&gt; Almost everyone wants the output ready to paste somewhere immediately — a group chat, a text message, a caption — not a file to keep. Copy usage outpaces downloads by a wide margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Lesson for Other Indie Dev's
&lt;/h2&gt;

&lt;p&gt;You don't need a groundbreaking idea to build something worth shipping. You need a real, repeating signal of demand, a clear-eyed read on what people actually want when they search that phrase, and the discipline to build only what solves that specific need — nothing more.&lt;/p&gt;

&lt;p&gt;This entire project started because I refused to scroll past a weird, oddly specific search query. If you're doing keyword or market research for your own side project, don't dismiss the strange, hyper-specific queries. Sometimes those are exactly the ones nobody has bothered to build a good solution for yet.&lt;/p&gt;

&lt;p&gt;If you want to see the finished result of this whole process, it's a live tool now — simple enough that you can generate something like &lt;a href="https://sorry100times.in/" rel="noopener noreferrer"&gt;sorry 10,000 times&lt;/a&gt; output in under ten seconds without writing a single line of code yourself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>reviews</category>
    </item>
    <item>
      <title>Sorry 100 times generator</title>
      <dc:creator>Sonny kk</dc:creator>
      <pubDate>Wed, 08 Jul 2026 05:48:03 +0000</pubDate>
      <link>https://dev.to/sonny_9cfaf8b35514f/sorry-100-times-generator-id0</link>
      <guid>https://dev.to/sonny_9cfaf8b35514f/sorry-100-times-generator-id0</guid>
      <description>&lt;p&gt;How I Built a Text Repeater That Doesn't Freeze the Browser at 10,000 Repetitions&lt;/p&gt;

&lt;p&gt;A few months back I shipped a small utility that does one thing: repeat a block of text however many times you want. Sounds trivial, right? String repetition is a one-liner in most languages. But the moment I put a "10,000" option in the UI, I ran into a handful of problems that taught me more about browser performance than I expected from something this small.&lt;/p&gt;

&lt;p&gt;This is a build log, not a highlight reel. I want to walk through the actual technical decisions, including the ones that didn't work the first time.&lt;br&gt;
Before going further see some example output of the tool- &lt;br&gt;
I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺 I am really sorry 🥺&lt;/p&gt;

&lt;p&gt;The Trigger: A Weird Keyword&lt;/p&gt;

&lt;p&gt;Before any code, there was a keyword. I was doing search research for a side project and noticed a strange pattern: thousands of people searching &lt;a href="https://sorry100times.in/" rel="noopener noreferrer"&gt;sorry 1000 times&lt;/a&gt; every month. Not a typo, not a one-off — a consistent, recurring search. People wanted a fast way to generate a huge block of repeated text, usually the word "sorry," and copy or download it immediately.&lt;/p&gt;

&lt;p&gt;That's a product decision hiding inside a search query. So I decided to build it properly, as a developer, not just slap together a script.&lt;/p&gt;

&lt;p&gt;Problem 1: Naive String Repetition Doesn't Scale the Way You Think&lt;/p&gt;

&lt;p&gt;My first pass looked roughly like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function repeatText(text, count) {&lt;br&gt;
  let result = "";&lt;br&gt;
  for (let i = 0; i &amp;lt; count; i++) {&lt;br&gt;
    result += text + "\n";&lt;br&gt;
  }&lt;br&gt;
  return result;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
At 100 repetitions, fine. At 1,000, still fine. At 10,000, this starts to hurt — repeated string concatenation in a loop creates a lot of intermediate string allocations, and depending on the engine, that can get expensive fast. The fix was obvious once I looked at it properly: build an array and join it once.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function repeatText(text, count) {&lt;br&gt;
  return Array(count).fill(text).join("\n");&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Massive improvement. Lesson: don't concatenate strings in a hot loop, ever, even for something as "simple" as a repeater tool.&lt;/p&gt;

&lt;p&gt;Problem 2: Rendering 10,000 Lines to the DOM Is the Real Bottleneck&lt;/p&gt;

&lt;p&gt;Generating the string was fast. Displaying it wasn't. Dumping 10,000 lines into a &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; or a rendered &lt;/p&gt; caused visible jank on lower-end devices, especially mobile. The DOM doesn't care how efficient your string logic is if you're forcing a massive reflow.

&lt;p&gt;The fix here was to keep the raw text in a &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;, which browsers handle far better than rendering thousands of individual DOM nodes (which is what would happen if I'd foolishly rendered each repetition as its own element, something I actually tried first and immediately regretted). A &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; treats it as plain text content, not a DOM tree, so it stays lightweight even at 10,000 lines.&lt;/p&gt;

&lt;p&gt;Problem 3: Copy and Download Needed to Feel Instant&lt;/p&gt;

&lt;p&gt;Since the whole point of this tool is speed — someone searching "sorry 100 times" wants their text now, not after five seconds of spinner — I had to be careful with the copy and download flows too.&lt;/p&gt;

&lt;p&gt;For copying, I used the Clipboard API directly instead of the older &lt;code&gt;document.execCommand("copy")&lt;/code&gt; fallback, since it's cleaner and doesn't require selecting text manually:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
async function copyToClipboard(text) {&lt;br&gt;
  try {&lt;br&gt;
    await navigator.clipboard.writeText(text);&lt;br&gt;
  } catch (err) {&lt;br&gt;
    console.error("Copy failed", err);&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For downloading, I generate a Blob client-side and trigger a download without ever touching a server:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function downloadAsTxt(text, filename = "repeated-text.txt") {&lt;br&gt;
  const blob = new Blob([text], { type: "text/plain" });&lt;br&gt;
  const url = URL.createObjectURL(blob);&lt;br&gt;
  const a = document.createElement("a");&lt;br&gt;
  a.href = url;&lt;br&gt;
  a.download = filename;&lt;br&gt;
  a.click();&lt;br&gt;
  URL.revokeObjectURL(url);&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
No backend call, no waiting, no server round-trip. Everything happens in-browser, which matters a lot when your entire value proposition is speed.&lt;/p&gt;

&lt;p&gt;Problem 4: Debouncing the Generate Action&lt;/p&gt;

&lt;p&gt;Early testers (mostly friends I roped into clicking buttons for me) kept mashing the generate button impatiently, especially at the 10,000 setting, thinking it hadn't registered. I added a short debounce and a lightweight "generating..." state so the UI gives immediate feedback even though the actual generation takes milliseconds. Perceived performance matters as much as real performance.&lt;/p&gt;

&lt;p&gt;What I'd Tell Another Developer Building Something Similar&lt;/p&gt;

&lt;p&gt;If you're building anything that takes a "how many times" input from a user, don't assume they'll stick to reasonable numbers. Someone will always test the upper limit immediately — in my case, that's literally the point, since people specifically search for the highest counts like "sorry 1000 times" or more. Build for the ceiling, not the average case.&lt;/p&gt;

&lt;p&gt;Also, resist the urge to over-engineer a tool this small. I didn't need a framework, a state management library, or a backend. Vanilla JS, a textarea, the Clipboard API, and the Blob API covered everything. Sometimes the right architecture is just... less architecture.&lt;/p&gt;

&lt;p&gt;If you want to see how the copy and download flow feels in practice, the tool supports presets too, so you can test type &lt;a href="https://sorry100times.in/" rel="noopener noreferrer"&gt;sorry 100 times copy and paste&lt;/a&gt; style output in a couple of clicks without typing anything yourself. I'd genuinely appreciate feedback from other devs on what would break this at scale — I'm always looking for the next edge case I haven't hit yet.&lt;/p&gt;

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