<?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: Mohammed Ashraf</title>
    <description>The latest articles on DEV Community by Mohammed Ashraf (@mdashraf).</description>
    <link>https://dev.to/mdashraf</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899643%2F08f39c64-628e-4254-9da4-2d8309e4ca22.png</url>
      <title>DEV Community: Mohammed Ashraf</title>
      <link>https://dev.to/mdashraf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mdashraf"/>
    <language>en</language>
    <item>
      <title>10 Ways Teachers and Educators Use Anonymous Polls in the Classroom</title>
      <dc:creator>Mohammed Ashraf</dc:creator>
      <pubDate>Sun, 24 May 2026 16:08:57 +0000</pubDate>
      <link>https://dev.to/mdashraf/10-ways-teachers-and-educators-use-anonymous-polls-in-the-classroom-17fk</link>
      <guid>https://dev.to/mdashraf/10-ways-teachers-and-educators-use-anonymous-polls-in-the-classroom-17fk</guid>
      <description>&lt;p&gt;Last week someone used AnonPolls to ask students &lt;br&gt;
"do you like the use of tokens for class debates?" &lt;br&gt;
mid-lesson. The poll got created and voted on &lt;br&gt;
during the session itself.&lt;/p&gt;

&lt;p&gt;That's the real use case. Here are 10 more ways &lt;br&gt;
teachers are using anonymous polls.&lt;/p&gt;

&lt;h1&gt;
  
  
  10 Ways Teachers and Educators Use Anonymous Polls in the Classroom
&lt;/h1&gt;

&lt;p&gt;You ask a question. Half the class stares at the floor. Two students answer. The rest nod along, agreeing with whoever spoke first.&lt;/p&gt;

&lt;p&gt;That's not engagement. That's social pressure doing what it always does — silencing the people who aren't sure, who disagree, or who just don't want to be the one who gets it wrong in front of everyone.&lt;/p&gt;

&lt;p&gt;Anonymous polls fix this. When nobody knows who voted for what, students answer honestly. The quiet ones vote. The ones who disagree with the teacher vote. The ones who didn't understand the lesson actually say so.&lt;/p&gt;

&lt;p&gt;Here are 10 real ways educators are using anonymous polls — and how to run them in under 60 seconds with no app, no signup, and no tech headaches.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Check for understanding mid-lesson
&lt;/h2&gt;

&lt;p&gt;The most common use. You've explained a concept. You think they got it. But did they?&lt;/p&gt;

&lt;p&gt;Ask: &lt;em&gt;"How well did you understand what we just covered?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely clear&lt;/li&gt;
&lt;li&gt;Mostly clear, a few questions&lt;/li&gt;
&lt;li&gt;Somewhat confused&lt;/li&gt;
&lt;li&gt;Very confused, need to go over it again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When students answer anonymously, they tell you the truth. In a named poll, nobody wants to be the one who says they're confused. Anonymous changes everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to run it:&lt;/strong&gt; Create the poll on &lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;AnonPolls&lt;/a&gt;, share the link on the class WhatsApp group or projector screen. Students vote in their browser — no app needed. Results show live.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Pre-class knowledge check
&lt;/h2&gt;

&lt;p&gt;Before you start a new topic, find out what students already know.&lt;/p&gt;

&lt;p&gt;Ask: &lt;em&gt;"How familiar are you with [topic] before today's lesson?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never heard of it&lt;/li&gt;
&lt;li&gt;Heard of it but don't understand it&lt;/li&gt;
&lt;li&gt;Some knowledge&lt;/li&gt;
&lt;li&gt;I know this well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tells you where to start. If 70% say "never heard of it," you don't skip the basics. If 60% say "some knowledge," you can move faster.&lt;/p&gt;

&lt;p&gt;Takes 2 minutes at the start of class. Saves you from pitching at the wrong level for 45 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Classroom debate — anonymous position vote
&lt;/h2&gt;

&lt;p&gt;Before and after a debate. This is where anonymous polling really shines.&lt;/p&gt;

&lt;p&gt;Before the debate: &lt;em&gt;"What is your position on [topic]?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Students vote privately. Results shown — now everyone knows where the class stands without anyone being called out.&lt;/p&gt;

&lt;p&gt;After the debate: same poll, same question.&lt;/p&gt;

&lt;p&gt;See who changed their mind. See if the arguments moved anyone. The anonymity means they'll vote their actual opinion, not what they think they're supposed to believe after hearing the teacher's view.&lt;/p&gt;

&lt;p&gt;This works especially well for sensitive topics — climate, ethics, history, social issues — where students might self-censor if their name is attached.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Course evaluation and feedback
&lt;/h2&gt;

&lt;p&gt;End of term. You want honest feedback on how the course went.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"How would you rate this course overall?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"What was the most useful part of the course?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"What should be changed for next year?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Named feedback forms get polite, safe answers. Anonymous polls get real ones.&lt;/p&gt;

&lt;p&gt;Teachers who run anonymous end-of-course polls consistently report more actionable feedback than those who use named forms. Students will say "the pace was too fast" or "we needed more examples" when they know it can't be traced back to them.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Student wellbeing check-in
&lt;/h2&gt;

&lt;p&gt;This one matters more than any academic use case.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"How are you feeling this week?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Great&lt;/li&gt;
&lt;li&gt;Good&lt;/li&gt;
&lt;li&gt;Okay&lt;/li&gt;
&lt;li&gt;Struggling&lt;/li&gt;
&lt;li&gt;Really not okay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run this at the start of Monday morning. Look at the results privately. If 30% of your class says they're struggling, that's information you need — and they'd never tell you in person.&lt;/p&gt;

&lt;p&gt;This isn't a replacement for counseling or real support. But it's a signal. And the anonymity is what makes it honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Peer teaching assessment
&lt;/h2&gt;

&lt;p&gt;You've had students present or teach a concept to the class. Now assess how well they taught it — without the awkwardness of naming names.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"After [student name]'s presentation, how well do you understand [concept]?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Wait — this one is tricky if you're asking about a named presenter. Use it carefully. Better framing:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"How well do you understand [concept] after today's student presentations?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This gives you signal on whether peer teaching is working without putting any individual student on the spot.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Lesson format preference
&lt;/h2&gt;

&lt;p&gt;Not every class learns the same way. Ask them what works.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Which format helps you learn best?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teacher-led lecture&lt;/li&gt;
&lt;li&gt;Group discussion&lt;/li&gt;
&lt;li&gt;Individual work then share&lt;/li&gt;
&lt;li&gt;Case studies and examples&lt;/li&gt;
&lt;li&gt;Hands-on activities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might be running lectures for a class that learns better through discussion. You won't know unless you ask. And they won't tell you honestly unless it's anonymous.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Quick opinion polls on current events
&lt;/h2&gt;

&lt;p&gt;For social studies, civics, history, or any subject where current events matter.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Should [policy/decision] be implemented?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Who do you think was responsible for [historical event]?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"What do you think is the biggest environmental issue right now?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Students have opinions. They don't always share them because they're worried about judgment from classmates or from the teacher. Anonymous polling removes that barrier.&lt;/p&gt;

&lt;p&gt;Use the results as a discussion starter. "62% of you said X — let's talk about why."&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Group project team formation
&lt;/h2&gt;

&lt;p&gt;Nobody wants to say out loud that they don't want to work with certain people. But forced random groupings can sink projects.&lt;/p&gt;

&lt;p&gt;Try this: &lt;em&gt;"What kind of project team do you prefer?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I want to choose my own team&lt;/li&gt;
&lt;li&gt;I'm okay with random assignment&lt;/li&gt;
&lt;li&gt;I'd like the teacher to assign based on skills&lt;/li&gt;
&lt;li&gt;I prefer working alone and presenting separately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or more specifically: &lt;em&gt;"How do you prefer to contribute in group projects?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I like leading and coordinating&lt;/li&gt;
&lt;li&gt;I prefer doing the research&lt;/li&gt;
&lt;li&gt;I'm best at writing and presenting&lt;/li&gt;
&lt;li&gt;I'm good at the creative and design parts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use these anonymous responses to form balanced groups without the awkwardness of public declarations.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Anonymous Q&amp;amp;A — questions students won't ask out loud
&lt;/h2&gt;

&lt;p&gt;At the end of a lesson: &lt;em&gt;"What question do you still have about today's topic?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not a poll with options — but some anonymous poll tools allow open-ended or multiple-choice questions that surface what's really going on.&lt;/p&gt;

&lt;p&gt;Even just offering: &lt;em&gt;"Do you have questions you didn't ask today?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No, I understood everything&lt;/li&gt;
&lt;li&gt;Yes, I have 1-2 questions&lt;/li&gt;
&lt;li&gt;Yes, I have several questions&lt;/li&gt;
&lt;li&gt;I'm completely lost and need help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last option. Students will never click it with their name attached. Anonymously, they will. And now you know who to follow up with.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to run anonymous classroom polls with AnonPolls
&lt;/h2&gt;

&lt;p&gt;No app needed for you or your students. No signup, no accounts, no IT requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Go to &lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;anonpolls.com&lt;/a&gt; and create your poll. Takes 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Share the link. Paste it in your class WhatsApp group, project it on screen, or send it via email or LMS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Students click the link on their phone or laptop and vote instantly in their browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Watch results update in real time. No waiting, no collecting forms.&lt;/p&gt;

&lt;p&gt;Results show vote totals only — nobody's individual vote is ever visible. Not to you, not to other students. Truly anonymous.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why anonymity matters more in education than anywhere else
&lt;/h2&gt;

&lt;p&gt;The power dynamic in a classroom is real. Students are being assessed by the person asking the questions. Peers are watching. Social hierarchies are active.&lt;/p&gt;

&lt;p&gt;In that environment, honest responses require anonymity. The student who's confused won't admit it. The student who disagrees won't say so. The student who's struggling won't raise their hand.&lt;/p&gt;

&lt;p&gt;Anonymous polls don't fix all of this. But they remove one barrier — the fear of being seen. And that's often enough to get the honest signal that makes you a better teacher.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ready to try it?
&lt;/h2&gt;

&lt;p&gt;Create your first anonymous classroom poll in under a minute.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://anonpolls.com/classroom-poll-maker" rel="noopener noreferrer"&gt;Create a free anonymous poll — no signup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No app download for you or your students. Works on any device, in any browser. Free.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Related reading:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://dev.to/blog/anonymous-polls-microsoft-teams"&gt;How to run anonymous polls in Microsoft Teams&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://dev.to/blog/anonymous-poll-whatsapp-group"&gt;Anonymous poll for WhatsApp groups&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  education #teaching #productivity #webdev
&lt;/h1&gt;

&lt;p&gt;*Originally published at &lt;a href="https://anonpolls.com/blog/anonymous-polls-education-use-cases" rel="noopener noreferrer"&gt;https://anonpolls.com/blog/anonymous-polls-education-use-cases&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I fixed 0% CTR on pages that were already ranking on Google</title>
      <dc:creator>Mohammed Ashraf</dc:creator>
      <pubDate>Wed, 20 May 2026 09:39:00 +0000</pubDate>
      <link>https://dev.to/mdashraf/how-i-fixed-0-ctr-on-pages-that-were-already-ranking-on-google-17mi</link>
      <guid>https://dev.to/mdashraf/how-i-fixed-0-ctr-on-pages-that-were-already-ranking-on-google-17mi</guid>
      <description>&lt;p&gt;Running AnonPolls as a solo founder. This week I pulled GSC data &lt;br&gt;
and found something frustrating: multiple pages ranking positions &lt;br&gt;
8-16 with hundreds of impressions and literally zero clicks.&lt;/p&gt;

&lt;p&gt;The pages weren't broken. Google trusted them enough to show them.&lt;br&gt;
Users just weren't choosing them.&lt;/p&gt;

&lt;p&gt;Here's what I changed and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;My &lt;code&gt;/blog/anonymous-polls-microsoft-teams&lt;/code&gt; page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;370 impressions last week&lt;/li&gt;
&lt;li&gt;Position 10.46&lt;/li&gt;
&lt;li&gt;0 clicks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Title was: "How to Run Anonymous Polls in Microsoft Teams &lt;br&gt;
(No Add-ins Required)"&lt;br&gt;
Meta was: "Run anonymous polls directly in Microsoft Teams &lt;br&gt;
without installing add-ins..."&lt;/p&gt;

&lt;p&gt;Technically fine. Functionally invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was missing
&lt;/h2&gt;

&lt;p&gt;The searchers typing "are teams polls anonymous" don't want &lt;br&gt;
a how-to. They want confirmation that Teams polls aren't &lt;br&gt;
truly anonymous — and a solution to that.&lt;/p&gt;

&lt;p&gt;The meta that converts isn't the one that describes your product.&lt;br&gt;
It's the one that answers the searcher's specific question &lt;br&gt;
in the first 8 words.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;New title: "Teams Anonymous Poll — No Add-in Needed | AnonPolls"&lt;br&gt;
New meta: "Teams' built-in polls aren't truly anonymous. &lt;br&gt;
Use a free AnonPolls link — no add-in, no signup, real-time results."&lt;/p&gt;

&lt;p&gt;The first sentence of the meta answers the searcher's fear directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern across 6 pages
&lt;/h2&gt;

&lt;p&gt;I applied the same logic to 5 other zero-click pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/anonymous-employee-survey&lt;/code&gt;: Meta now opens with 
"Are employee surveys really anonymous? Yours will be."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/yes-no-poll&lt;/code&gt;: Meta now opens with "Need a quick yes or no?"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/team-decision-poll&lt;/code&gt;: Meta ends with "let results speak, not politics"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every winning meta opens with the &lt;em&gt;user's frustration&lt;/em&gt;, &lt;br&gt;
not the product's features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early results
&lt;/h2&gt;

&lt;p&gt;Too soon for data (just deployed). Will update this post &lt;br&gt;
next week with CTR changes.&lt;/p&gt;

&lt;p&gt;If you're building a SaaS with content pages — pull your &lt;br&gt;
GSC data filtered to "impressions &amp;gt; 50, clicks = 0." &lt;br&gt;
That's your leverage list.&lt;/p&gt;




&lt;p&gt;Built with: React, Neon Postgres, Hostinger&lt;br&gt;
Tool: Google Search Console (free)&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>google</category>
      <category>marketing</category>
      <category>startup</category>
    </item>
    <item>
      <title>From 38% to 58% Activation Rate in One Week — The Single UX Change That Did It</title>
      <dc:creator>Mohammed Ashraf</dc:creator>
      <pubDate>Sun, 17 May 2026 15:50:24 +0000</pubDate>
      <link>https://dev.to/mdashraf/from-38-to-58-activation-rate-in-one-week-the-single-ux-change-that-did-it-53d6</link>
      <guid>https://dev.to/mdashraf/from-38-to-58-activation-rate-in-one-week-the-single-ux-change-that-did-it-53d6</guid>
      <description>&lt;p&gt;Last month, 38% of polls created on AnonPolls got at &lt;br&gt;
least one vote.&lt;/p&gt;

&lt;p&gt;This week it's 58%.&lt;/p&gt;

&lt;p&gt;No new traffic. No new features. No marketing campaign.&lt;/p&gt;

&lt;p&gt;One UX change in a single afternoon.&lt;/p&gt;

&lt;p&gt;Here's what happened.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem I was ignoring
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;AnonPolls&lt;/a&gt; is a free anonymous &lt;br&gt;
polling tool — no signup for creators or voters. People &lt;br&gt;
create polls and share them via link or QR code.&lt;/p&gt;

&lt;p&gt;I was tracking a metric I called "activation rate" — &lt;br&gt;
the percentage of polls created that received at least &lt;br&gt;
one vote.&lt;/p&gt;

&lt;p&gt;For weeks it sat at 38%. That meant 62% of polls were &lt;br&gt;
created and never voted on.&lt;/p&gt;

&lt;p&gt;I assumed this was a distribution problem. People were &lt;br&gt;
creating polls but not sharing them effectively. My plan: &lt;br&gt;
drive more traffic, get more creators, some of them would &lt;br&gt;
share better.&lt;/p&gt;

&lt;p&gt;I was wrong about the cause.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the data actually showed
&lt;/h2&gt;

&lt;p&gt;When I looked more carefully at the user flow, I noticed &lt;br&gt;
something. A lot of visitors were landing on poll pages &lt;br&gt;
— they &lt;em&gt;had&lt;/em&gt; received the shared link. They arrived. &lt;br&gt;
They just weren't voting.&lt;/p&gt;

&lt;p&gt;The drop-off was happening on the poll page itself, &lt;br&gt;
not before it.&lt;/p&gt;

&lt;p&gt;I watched a few Hotjar recordings. The pattern was clear:&lt;/p&gt;

&lt;p&gt;Users landed on a poll page. They could immediately see &lt;br&gt;
the current results — which option was leading, by how &lt;br&gt;
much, how many people had voted. They read the results. &lt;br&gt;
Then they left without voting.&lt;/p&gt;

&lt;p&gt;They got the answer without participating.&lt;/p&gt;
&lt;h2&gt;
  
  
  The anchoring problem
&lt;/h2&gt;

&lt;p&gt;There's a well-documented cognitive bias called the &lt;br&gt;
anchoring effect. When people see existing data before &lt;br&gt;
making a decision, that data disproportionately &lt;br&gt;
influences their choice.&lt;/p&gt;

&lt;p&gt;In the context of polls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If someone sees "Option A is leading 70% to 30%" 
before voting, they're more likely to vote for Option A 
(bandwagon effect) or decide their vote won't change 
anything (futility effect)&lt;/li&gt;
&lt;li&gt;Either way, the visible results are reducing honest 
participation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same problem exists in workplace surveys and &lt;br&gt;
classroom polls. When people can see what others &lt;br&gt;
answered, they stop answering for themselves.&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;I implemented vote-first display.&lt;/p&gt;

&lt;p&gt;The logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before rendering poll results, check vote status&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;voteStatus&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;queryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;voteStatus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pollId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userIdentifier&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;queryFn&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="nf"&gt;checkVoteStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pollId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Only show results if user has already voted&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;showResults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;voteStatus&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;hasVoted&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isClosed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple in principle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you haven't voted → you see the question and options 
as clickable buttons, no results visible&lt;/li&gt;
&lt;li&gt;After you vote → results appear immediately&lt;/li&gt;
&lt;li&gt;If the poll is closed → results are always visible 
(voting is over, results are public)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One additional change: I stopped showing per-option vote &lt;br&gt;
counts on poll cards in the browse page. Previously cards &lt;br&gt;
showed "Option A: 67% — Option B: 33%". This spoiled the &lt;br&gt;
result before someone even clicked through to vote.&lt;/p&gt;

&lt;p&gt;Cards now show the question, total vote count, and a &lt;br&gt;
"Vote Now" button. Options are listed but without counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Activation rate: 38% → 58% in one week.&lt;/p&gt;

&lt;p&gt;Avg votes per poll: 1.4 → 2.3 in the same week.&lt;/p&gt;

&lt;p&gt;No new traffic. The same visitors, the same polls, the &lt;br&gt;
same sharing patterns. Just removing the thing that was &lt;br&gt;
killing their motivation to participate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this took me so long to fix
&lt;/h2&gt;

&lt;p&gt;I was measuring the wrong thing.&lt;/p&gt;

&lt;p&gt;I was watching total votes and total polls. Both were &lt;br&gt;
growing, slowly. Nothing looked obviously broken.&lt;/p&gt;

&lt;p&gt;It took tracking &lt;em&gt;activation rate&lt;/em&gt; specifically — polls &lt;br&gt;
getting at least one vote as a percentage of polls created &lt;br&gt;
— to surface the problem clearly.&lt;/p&gt;

&lt;p&gt;Once I saw 62% of polls were dying with zero votes, the &lt;br&gt;
question became: where in the flow is this happening? &lt;br&gt;
Only then did I look at the poll page experience and &lt;br&gt;
find the actual cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson: build the metric that measures your core &lt;br&gt;
value delivery, not just volume.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a polling tool, volume metrics (total polls, total &lt;br&gt;
votes) tell you how busy the system is. The activation &lt;br&gt;
rate tells you whether the product is actually working.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more thing
&lt;/h2&gt;

&lt;p&gt;The same principle applies beyond polling tools.&lt;/p&gt;

&lt;p&gt;If your product shows aggregate data, leaderboards, &lt;br&gt;
or other people's activity before the user has done &lt;br&gt;
the thing you want them to do — you might be creating &lt;br&gt;
the same problem.&lt;/p&gt;

&lt;p&gt;Social proof is powerful for conversion. But visible &lt;br&gt;
outcomes before participation can kill the participation &lt;br&gt;
itself.&lt;/p&gt;

&lt;p&gt;Test hiding it. The results might surprise you.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;AnonPolls&lt;/a&gt; is free, no signup &lt;br&gt;
for anyone. If you're building something that needs &lt;br&gt;
honest anonymous feedback — team retros, classroom &lt;br&gt;
check-ins, group decisions — give it a try.&lt;/p&gt;

&lt;p&gt;And if you've hit a similar activation problem in your &lt;br&gt;
own product, I'd love to hear how you diagnosed it in &lt;br&gt;
the comments.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I Built a Truly Anonymous Polling Tool — And Why "Anonymous" Usually Isn't</title>
      <dc:creator>Mohammed Ashraf</dc:creator>
      <pubDate>Thu, 14 May 2026 09:31:43 +0000</pubDate>
      <link>https://dev.to/mdashraf/how-i-built-a-truly-anonymous-polling-tool-and-why-anonymous-usually-isnt-5bih</link>
      <guid>https://dev.to/mdashraf/how-i-built-a-truly-anonymous-polling-tool-and-why-anonymous-usually-isnt-5bih</guid>
      <description>&lt;p&gt;I built &lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;AnonPolls&lt;/a&gt; — a free &lt;br&gt;
anonymous polling tool where neither the creator nor &lt;br&gt;
the voter needs an account.&lt;/p&gt;

&lt;p&gt;This post covers why I built it, the technical decisions &lt;br&gt;
behind "true" anonymity, and what I learned growing it &lt;br&gt;
to 1,500+ votes in 3 months as a solo founder.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem with "anonymous" surveys
&lt;/h2&gt;

&lt;p&gt;Most polling tools that claim anonymity have a catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Forms&lt;/strong&gt; — if your organisation has "Restrict to &lt;br&gt;
[domain] users" enabled, the form owner can see individual &lt;br&gt;
responses tied to Google accounts. "Anonymous" is a UI &lt;br&gt;
label, not a technical guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Teams polls&lt;/strong&gt; — via Microsoft Forms, tenant &lt;br&gt;
admins can view individual responses depending on your &lt;br&gt;
organisation's settings. This is documented in Microsoft's &lt;br&gt;
own support pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SurveyMonkey free tier&lt;/strong&gt; — shows individual responses &lt;br&gt;
to the survey creator.&lt;/p&gt;

&lt;p&gt;The pattern: tools call themselves anonymous because &lt;br&gt;
&lt;em&gt;voters&lt;/em&gt; don't see each other's responses. But the creator &lt;br&gt;
or an admin can still identify individuals.&lt;/p&gt;
&lt;h2&gt;
  
  
  What "truly anonymous" actually means technically
&lt;/h2&gt;

&lt;p&gt;For AnonPolls, I made two architectural decisions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. No accounts — for anyone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most tools require the creator to have an account. That &lt;br&gt;
account is linked to every poll they create. Even if &lt;br&gt;
voters are anonymous to each other, the creator's identity &lt;br&gt;
is attached to the data.&lt;/p&gt;

&lt;p&gt;AnonPolls requires no account for the creator either. &lt;br&gt;
No email, no OAuth, no session tied to an identity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. IP hashing, not IP storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For vote deduplication (preventing someone voting twice), &lt;br&gt;
I need to track something. But storing raw IPs creates a &lt;br&gt;
privacy risk — even "anonymized" IPs can sometimes be &lt;br&gt;
reverse-engineered.&lt;/p&gt;

&lt;p&gt;Instead I use HMAC-SHA256 hashing on the IP before storage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anonymizeIp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&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;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;IP_HASH_SECRET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;anon.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&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="nf"&gt;substring&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;12&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;The hash is one-way. Even if someone accessed the database, &lt;br&gt;
they couldn't reverse the hash back to an IP address.&lt;/p&gt;

&lt;p&gt;The result: even the poll creator — even me as the &lt;br&gt;
platform operator — cannot identify who voted for what.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 18 + TypeScript + Vite + Tailwind + 
Radix UI + shadcn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Node.js + Express + TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; Neon serverless Postgres + Drizzle ORM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Google Gemini API for poll generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Hostinger (Node.js + LiteSpeed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned about distribution
&lt;/h2&gt;

&lt;p&gt;The product was live for 2 months before I paid serious &lt;br&gt;
attention to distribution. Some things I learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix engagement metrics before promoting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My "activation rate" (polls getting at least 1 vote) &lt;br&gt;
was 38%. I was driving traffic into a leaky funnel.&lt;/p&gt;

&lt;p&gt;The single biggest fix: &lt;strong&gt;vote-first display&lt;/strong&gt; — hiding &lt;br&gt;
poll results until the user votes. Activation rate jumped &lt;br&gt;
to 58% in one week. Avg votes per poll went from 1.4 to 2.3.&lt;/p&gt;

&lt;p&gt;Only after fixing that did I start on SEO and community &lt;br&gt;
outreach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI search is already real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I added &lt;code&gt;llms.txt&lt;/code&gt;, WebApplication + FAQPage JSON-LD &lt;br&gt;
schemas, and BlogPosting schema to blog posts. ChatGPT &lt;br&gt;
and Microsoft Copilot started sending sessions within &lt;br&gt;
one week.&lt;/p&gt;

&lt;p&gt;Not a lot of traffic yet — but faster than I expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-tail keywords competitors ignore&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"anonymous poll microsoft teams" — no major competitor &lt;br&gt;
has a dedicated page for this. I wrote a blog post &lt;br&gt;
targeting it and built a landing page. Both indexed &lt;br&gt;
within a week.&lt;/p&gt;

&lt;p&gt;Same for "anonymous poll whatsapp", "slido alternative &lt;br&gt;
free", "strawpoll alternative".&lt;/p&gt;

&lt;h2&gt;
  
  
  Current numbers (month 3)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;676 polls created&lt;/li&gt;
&lt;li&gt;1,564 votes cast&lt;/li&gt;
&lt;li&gt;90+ countries&lt;/li&gt;
&lt;li&gt;Avg votes per poll: 2.3&lt;/li&gt;
&lt;li&gt;Activation rate: 58%&lt;/li&gt;
&lt;li&gt;AI agent traffic: ChatGPT + Copilot sending sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Building creator retention tracking (repeat creators &lt;br&gt;
by anonymized IP hash), preparing a Pro tier, and &lt;br&gt;
continuing the content + SEO engine.&lt;/p&gt;

&lt;p&gt;If you're building something similar or have questions &lt;br&gt;
about the anonymity implementation, happy to discuss &lt;br&gt;
in the comments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://anonpolls.com" rel="noopener noreferrer"&gt;Try AnonPolls →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>security</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
