<?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: Shahriar Ahmed</title>
    <description>The latest articles on DEV Community by Shahriar Ahmed (@shahriar_ahmed_937be55f35).</description>
    <link>https://dev.to/shahriar_ahmed_937be55f35</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%2F4216456%2F4cc39190-bd0e-4ca4-916c-c0e3715aa306.png</url>
      <title>DEV Community: Shahriar Ahmed</title>
      <link>https://dev.to/shahriar_ahmed_937be55f35</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shahriar_ahmed_937be55f35"/>
    <language>en</language>
    <item>
      <title>What I learned building a Chrome extension for X growth as a student founder</title>
      <dc:creator>Shahriar Ahmed</dc:creator>
      <pubDate>Sun, 01 Nov 2026 05:18:15 +0000</pubDate>
      <link>https://dev.to/shahriar_ahmed_937be55f35/what-i-learned-building-a-chrome-extension-for-x-growth-as-a-student-founder-g23</link>
      <guid>https://dev.to/shahriar_ahmed_937be55f35/what-i-learned-building-a-chrome-extension-for-x-growth-as-a-student-founder-g23</guid>
      <description>&lt;p&gt;In July 2026 I started building GrowX, a Chrome extension that helps creators and founders grow a relevant audience on X (formerly Twitter). I'm a full-time student, so every decision had to fit around classes and exams. Four months later the extension is live on the Chrome Web Store, and I've learned more about product building, browser engineering and distribution than any course has taught me. Here are the lessons I'd share with any student thinking about shipping a side project.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start from a workflow you already do by hand
&lt;/h2&gt;

&lt;p&gt;GrowX didn't start as an idea. It started as a chore. I was trying to grow my own X account, and the only thing that reliably worked was finding people who had recently followed creators in my niche, checking whether they were active and real, and engaging with them. It worked, but it took an hour a day.&lt;/p&gt;

&lt;p&gt;When a manual process works but costs too much time, that's a strong signal for a product. You already know the steps, you know what "good" looks like, and you are your own first user. Every feature in GrowX maps to a step I used to do myself: source targeting, filtering by activity and profile quality, and tracking who followed back.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make the core logic explainable
&lt;/h2&gt;

&lt;p&gt;The heart of GrowX is a follow-back score from 1 to 99. I could have tried to build something clever and opaque. Instead I built a weighted score from a handful of signals anyone can understand: follow ratio, recent activity, whether an account has a real photo and bio, and how similar it is to accounts that followed you back before.&lt;/p&gt;

&lt;p&gt;Explainable logic paid off in three ways. Users trust a number they can reason about. Bugs are easy to find, because when a score looks wrong you can see which signal caused it. And I could ship it in days instead of weeks. For an early product, "simple and transparent" beats "smart and mysterious".&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Local-first is a feature, not just a cost saving
&lt;/h2&gt;

&lt;p&gt;As a student I couldn't afford servers, so GrowX stores everything in the browser's own storage. There's no account to create and no backend holding anyone's X data. Follower snapshots, scores and settings never leave the user's machine, and backup is a JSON file they control.&lt;/p&gt;

&lt;p&gt;What started as a budget constraint turned into one of the things users mention most. People are tired of handing their social accounts to third-party dashboards. Keeping data local made the product easier to trust and easier to explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Learn your platform's constraints early
&lt;/h2&gt;

&lt;p&gt;Chrome's Manifest V3 replaced always-on background pages with service workers that the browser can suspend at any moment. My first scheduler kept losing its place. The fix was to treat every step as resumable: wake up with chrome.alarms, read state from storage, do one small unit of work, save state, and go back to sleep.&lt;/p&gt;

&lt;p&gt;The broader lesson is that every platform has rules that shape your architecture, whether that's a browser, an app store or a social network's own policies. Reading them on day one saves a rewrite on day thirty. It's also why GrowX defaults to slow, human-paced activity with daily caps, active hours and an emergency stop: X's rules apply to every user, and the product should respect them by design.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Measure what actually drives results
&lt;/h2&gt;

&lt;p&gt;I added analytics to GrowX mostly for myself, and it changed how I grew my own account. When I tracked which source accounts brought real follow-backs, I found that two out of ten were responsible for most of my growth. I had been spreading effort evenly across all of them.&lt;/p&gt;

&lt;p&gt;The same applies to building a product. I now track which launch channels send visitors to growxapp.org, and the answer is rarely the one I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Distribution is half the work
&lt;/h2&gt;

&lt;p&gt;I underestimated this badly. Building the extension took weeks; getting anyone to see it is an ongoing job. Over the past few weeks I've listed GrowX on startup directories, written technical articles about how the follow-back score and unfollower tracker work, and shared it in communities that welcome makers.&lt;/p&gt;

&lt;p&gt;What I've learned: be honest that it's your own project, give people something useful even if they never install it, and don't expect any single launch to change everything. Search visibility compounds slowly.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Protect your time
&lt;/h2&gt;

&lt;p&gt;Exams don't move for product launches. I keep a short daily list (one piece of content, a few listings, one useful post) and automate what I can. Shipping small and steady has worked far better for me than weekend sprints followed by weeks of silence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What GrowX does today
&lt;/h2&gt;

&lt;p&gt;GrowX is free on the Chrome Web Store. It includes source-based audience targeting with filters, the 1-99 follow-back score, an unfollower tracker, a post scheduler with active hours, growth analytics, and an on-device writing helper. Premium options come with a 30-day free trial.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.growxapp.org" rel="noopener noreferrer"&gt;growxapp.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/growx-unlimited-auto-foll/ofiancichfcakbdgekhcahflpoglfgbh" rel="noopener noreferrer"&gt;GrowX on the Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're a student building something on the side, I'd love to hear what you're working on and what's been hardest for you. And if you try GrowX, honest feedback is the most useful thing you can give me.&lt;/p&gt;

</description>
      <category>chromeextension</category>
      <category>javascript</category>
      <category>startup</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How Follow-Back Scores Work: Building a 1-99 Ranking for X Accounts in a Chrome Extension</title>
      <dc:creator>Shahriar Ahmed</dc:creator>
      <pubDate>Fri, 30 Oct 2026 05:15:47 +0000</pubDate>
      <link>https://dev.to/shahriar_ahmed_937be55f35/how-follow-back-scores-work-building-a-1-99-ranking-for-x-accounts-in-a-chrome-extension-2f10</link>
      <guid>https://dev.to/shahriar_ahmed_937be55f35/how-follow-back-scores-work-building-a-1-99-ranking-for-x-accounts-in-a-chrome-extension-2f10</guid>
      <description>&lt;p&gt;When you're trying to grow a small account on X, the hardest question isn't "what should I post?" It's "whose attention is actually worth my time?" Following people at random fills your feed with noise and rarely builds a real audience. So while building &lt;strong&gt;GrowX&lt;/strong&gt;, my Chrome extension for X growth, I spent a lot of time on one feature: a &lt;strong&gt;follow-back score&lt;/strong&gt; that rates any account from 1 to 99.&lt;/p&gt;

&lt;p&gt;This post explains how a follow-back score works, which signals matter, how I weighted them, and what I learned building the scoring logic entirely in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcm0u8mrwtbpzgdy5m96b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcm0u8mrwtbpzgdy5m96b.png" alt="GrowX overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What a follow-back score is (and isn't)
&lt;/h2&gt;

&lt;p&gt;A follow-back score is a quick estimate of how likely an account is to follow you back if you follow them. It isn't a judgement of whether someone is a "good" account, and it isn't a guarantee. It's a ranking tool: when you're looking at 200 followers of a creator in your niche, the score helps you decide where to spend your limited attention first.&lt;/p&gt;

&lt;p&gt;I chose a 1-99 range on purpose. A 0 or 100 would suggest certainty, and there's no certainty in predicting human behaviour. Clamping the output to 1-99 keeps the number honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signals that matter
&lt;/h2&gt;

&lt;p&gt;After looking at a lot of accounts by hand, a handful of public signals turned out to be useful predictors:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Follow ratio
&lt;/h3&gt;

&lt;p&gt;The ratio of following to followers is the strongest single signal. An account that follows 1,800 people and has 1,200 followers is clearly someone who follows people. An account with 50,000 followers that follows 300 almost never will. I don't use the raw ratio; I put it through a log scale so that extreme values don't dominate the score.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Recent activity
&lt;/h3&gt;

&lt;p&gt;An account that hasn't posted in six months won't notice your follow. GrowX looks at how recently the account posted and gives a strong boost to accounts active in the last few days. Inactive accounts get pushed toward the bottom of the scale no matter how good their ratio is.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Account size
&lt;/h3&gt;

&lt;p&gt;Mid-sized accounts (roughly a few hundred to a few thousand followers) are the sweet spot. Tiny accounts are often new or abandoned, and very large accounts get too many notifications to see yours. The size signal is a gentle bell curve rather than a hard cut-off.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Profile completeness
&lt;/h3&gt;

&lt;p&gt;A profile photo, a bio and a banner suggest a real person who cares about their presence. Missing basics usually means a low-effort or throwaway account, so those signals reduce the score a little.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Niche relevance
&lt;/h3&gt;

&lt;p&gt;This is the part most tools skip. If you build developer tools, a developer who follows you back is worth far more than a random follow-back. GrowX lets you set keywords, and accounts whose bios match those keywords get a relevance boost. A high score on an irrelevant account isn't growth, it's just a bigger number.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Account age
&lt;/h3&gt;

&lt;p&gt;Very new accounts behave unpredictably. Older accounts with steady activity are more reliable. Age is a small modifier, not a main driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning signals into one number
&lt;/h2&gt;

&lt;p&gt;Each signal produces a value between 0 and 1. The score is a weighted sum, then mapped onto 1-99:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;followBackScore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;following&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;followers&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// about -2..2&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratioScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;daysSincePost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;daysSinceLastPost&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;daysSincePost&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;followers&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// peaks around 1k&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasPhoto&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bio&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasBanner&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;relevance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;keywordMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 0..1&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accountAgeDays&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="mf"&gt;0.30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;ratioScore&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="mf"&gt;0.25&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;activity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="mf"&gt;0.10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="mf"&gt;0.15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;relevance&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="mf"&gt;0.05&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1..99&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weights above are simplified from what ships, but the idea is the same. I tuned them by checking my own follows against who actually followed back over a few weeks, then adjusting until the high-score group clearly outperformed the low-score group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx0yzm88zmkhfun5es69j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx0yzm88zmkhfun5es69j.png" alt="GrowX analytics" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why everything runs on-device
&lt;/h2&gt;

&lt;p&gt;GrowX computes scores locally in the extension. Profile data that's already on the page you're viewing is read, scored and stored in &lt;code&gt;chrome.storage&lt;/code&gt;. There's no server receiving your follow lists. That decision had a few nice side effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; scoring is instant because there's no network round-trip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; your targeting choices and history stay in your browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; as a student with a pre-revenue product, not running a backend matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is that I can't train a big model across all users. Honestly, for this problem a transparent weighted formula is easier to reason about anyway, and users can see why an account scored the way it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the score well
&lt;/h2&gt;

&lt;p&gt;A score is only useful if it changes what you do. A few habits that worked for me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start from a relevant source.&lt;/strong&gt; Open the followers of a creator in your niche. Those people already showed interest in your topic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort by score, then read.&lt;/strong&gt; Look at the top of the list and actually read a few bios. Skip anyone who isn't a fit, even with a high score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pace yourself.&lt;/strong&gt; Spread activity across your real active hours and keep daily numbers modest. GrowX has caps, active hours and a warm-up period built in for this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure follow-backs by source.&lt;/strong&gt; After a week, check which source accounts brought the most follow-backs. In my case two sources out of ten produced most of my growth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean up later.&lt;/strong&gt; The unfollower tracker shows who left and when, which helps you spot posts that turned people off.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvc6tfl4b75af90esj6sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvc6tfl4b75af90esj6sg.png" alt="GrowX follower tracker" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;If I started over, I'd log the score at the time of each follow from day one. Having that history makes tuning weights much easier, because you can compare predicted scores against what really happened. I added it later and wish I'd had the earlier data.&lt;/p&gt;

&lt;p&gt;I'd also expose the breakdown sooner. Users trust a number more when they can see "high ratio, active yesterday, bio matches your keywords" next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;GrowX bundles the follow-back score with a post scheduler, analytics, an unfollower tracker, smart auto follow based on the audience you target, and an on-device writer. It's free to start.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.growxapp.org" rel="noopener noreferrer"&gt;growxapp.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/detail/growx-unlimited-auto-foll/ofiancichfcakbdgekhcahflpoglfgbh" rel="noopener noreferrer"&gt;GrowX on the Chrome Web Store&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm a student building this in public, so feedback on the scoring approach is very welcome. What signals would you add?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>chromeextension</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
