<?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: JesseJun</title>
    <description>The latest articles on DEV Community by JesseJun (@jessejun).</description>
    <link>https://dev.to/jessejun</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%2F3561815%2F4458f8c7-e946-4ae0-93de-c7f8aceb9162.jpg</url>
      <title>DEV Community: JesseJun</title>
      <link>https://dev.to/jessejun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jessejun"/>
    <language>en</language>
    <item>
      <title>A Middle-Aged Dev’s Web Tetris: Zero Marketing, 2,000+ MAU in Six Months</title>
      <dc:creator>JesseJun</dc:creator>
      <pubDate>Mon, 13 Oct 2025 07:59:07 +0000</pubDate>
      <link>https://dev.to/jessejun/a-middle-aged-devs-web-tetris-zero-marketing-2000-mau-in-six-months-2384</link>
      <guid>https://dev.to/jessejun/a-middle-aged-devs-web-tetris-zero-marketing-2000-mau-in-six-months-2384</guid>
      <description>&lt;p&gt;Hi everyone, I’m Jesse, the developer of OnlineTetris. I built a browser-based Tetris with vanilla JS + HTML5 Canvas. I launched the first version at the end of April and then basically left it alone. A month later I noticed around twenty new players were playing every day—some even reported bugs. So I started fixing things and iterating. Now it’s at 2,000+ monthly active users across hundreds of cities. Here I’ll share my motivation, technical details, key features, how “zero marketing” played out, some data, and a few takeaways.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Idea: Why Tetris?
&lt;/h2&gt;

&lt;p&gt;One day in April this year I suddenly remembered the feeling of playing Tetris on a handheld as a kid: simple rules, instant feedback, and when you lose, you can instantly try again. I wanted a web version you can open and play anytime—a small tribute to that era.&lt;br&gt;
I shipped the first version at the end of April. I didn’t plan any promotion or ongoing ops—just “ship it and park it.”&lt;/p&gt;

&lt;p&gt;A month later I happened to check the numbers: roughly 20 players a day. Even more surprising, people were leaving comments on-site with lots of suggestions—gameplay, UI styling, etc. That’s when I realized some folks genuinely liked it. I began fixing bugs and iterating based on their feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Technical Details: How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend stack:&lt;/strong&gt; HTML5 + vanilla JavaScript + Tailwind CSS. Keep it simple so I can maintain it solo.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rendering:&lt;/strong&gt; Canvas + &lt;code&gt;requestAnimationFrame&lt;/code&gt;. I made some classic mistakes at first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tying refresh rate too tightly to game logic, which caused &lt;strong&gt;high GPU usage and animation stutter&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Overeager partial redraws—redrawing areas that didn’t need it;&lt;/li&gt;
&lt;li&gt;Browser/device differences (especially iGPUs) made edge cases more visible.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;What I changed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split the “logic layer” from the “rendering layer” to reduce wasted frames;&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;minimal dirty-rectangle&lt;/strong&gt; redraws whenever possible;&lt;/li&gt;
&lt;li&gt;Run animations on a lightweight, separate path to reduce interference;&lt;/li&gt;
&lt;li&gt;Added &lt;strong&gt;effects degradation&lt;/strong&gt; for integrated graphics (e.g., lower animation frequency for some themes).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase for the database.&lt;/li&gt;
&lt;li&gt;Each finished game round is stored and pushed to the leaderboard in real time.&lt;/li&gt;
&lt;li&gt;Aggregations for the leaderboard live in SQL views to avoid piling too much logic into the frontend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Notable Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;① Global Leaderboard (Individual)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ranking by each player’s personal high score to drive engagement and a sense of achievement.&lt;/li&gt;
&lt;li&gt;Basic validation on submissions to reduce anomalous data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;② Global Leaderboard (Regional)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregate scores by region to get a region’s total points, and rank regions globally.&lt;/li&gt;
&lt;li&gt;I’m refining “bubble markers” on the map (zoom, hover for details).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;③ Skin System&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure “joy engineering”: wood, neon, retro, pixel, etc.&lt;/li&gt;
&lt;li&gt;A real-world lesson: &lt;strong&gt;pretty ≠ high-perf&lt;/strong&gt;. Some theme animations don’t love iGPUs, so I added toggles and graceful degradation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. “Marketing”: I Basically Didn’t Do Any
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I’m not a marketing person and had no budget.&lt;/li&gt;
&lt;li&gt;No ads or press at launch.&lt;/li&gt;
&lt;li&gt;I only shared the link with a few friends—after that it spread organically.&lt;/li&gt;
&lt;li&gt;Honestly, this forced me to &lt;strong&gt;spend time on the experience itself&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Six-Month Snapshot
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It’s been about half a year since launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MAU:&lt;/strong&gt; steady at &lt;strong&gt;2,000+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geography:&lt;/strong&gt; players from hundreds of cities worldwide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feeling:&lt;/strong&gt; small in scale but real. Some people keep coming back.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Lessons Learned: Taught by Players
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Treat players like friends.&lt;/strong&gt; Every piece of feedback is product review help. If someone says animations stutter, I go record a performance flamegraph; if someone says lock-in feels off, I rework the “grounding delay” logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experience first&lt;/strong&gt;, even for tiny details. For instance, “Should there be a short movable window after a piece touches down?” dramatically affects feel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize for real hardware.&lt;/strong&gt; Many users are on integrated graphics—don’t only build “soul-stirring” effects on high-end machines.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Updates &amp;amp; What’s Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;In progress:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Further reducing GPU pressure for certain themes;&lt;/li&gt;
&lt;li&gt;Polishing map interactions for the regional leaderboard;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Planned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fuller “City Championship” mode;&lt;/li&gt;
&lt;li&gt;Achievements/titles and light incentives.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project began with &lt;strong&gt;nostalgia&lt;/strong&gt;, survived on &lt;strong&gt;player feedback&lt;/strong&gt;, and keeps rolling by &lt;strong&gt;getting the small things right&lt;/strong&gt;.&lt;br&gt;
If you’re also building a web mini-game, I’d love to chat about performance and game feel; if you’re just passing by as a player, please feel free to take it for a spin—complaints welcome.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Site: &lt;a href="https://onlinetetris.org/devto1013" rel="noopener noreferrer"&gt;&lt;strong&gt;onlinetetris.org&lt;/strong&gt;&lt;/a&gt; (Play a couple of rounds anytime. I’ll keep listening and polishing.)&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tetris</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
