<?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: 王冲</title>
    <description>The latest articles on DEV Community by 王冲 (@chongwang).</description>
    <link>https://dev.to/chongwang</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%2F4057853%2Fa5aabe62-6407-4fe6-9b2e-2e450d9bb92e.png</url>
      <title>DEV Community: 王冲</title>
      <link>https://dev.to/chongwang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chongwang"/>
    <language>en</language>
    <item>
      <title>I built a body-doubling focus app: no camera, no booking, no signup to look around</title>
      <dc:creator>王冲</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:18:06 +0000</pubDate>
      <link>https://dev.to/chongwang/i-built-a-body-doubling-focus-app-no-camera-no-booking-no-signup-to-look-around-4na4</link>
      <guid>https://dev.to/chongwang/i-built-a-body-doubling-focus-app-no-camera-no-booking-no-signup-to-look-around-4na4</guid>
      <description>&lt;p&gt;I kept noticing that the thing stopping me wasn't &lt;em&gt;what&lt;/em&gt; to do — I knew that. It was the act of starting. So I built &lt;a href="https://dopastep.com/" rel="noopener noreferrer"&gt;Dopastep&lt;/a&gt;, and the whole design is about removing reasons not to start.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Disclosure up front: this is my own project. Feedback, including the harsh kind, is why I'm posting.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two things it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Breaks the task down.&lt;/strong&gt; You name the thing you've been circling for three days, and it gets split into steps small enough that the first one isn't a decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puts other people in the room.&lt;/strong&gt; You drop into a live focus room and work in synced focus/break cycles alongside whoever is there. That's body doubling — the effect where someone else working nearby makes it easier to begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I deliberately left out
&lt;/h2&gt;

&lt;p&gt;I used Focusmate for a while and it genuinely helped, but two things eventually killed it for me: the camera, and the booking. By the time a session was scheduled, the window where I could actually have started had closed.&lt;/p&gt;

&lt;p&gt;So Dopastep has no camera, no chat, no booking and no partner matching. You open a room, see how many people are in it and which phase the shared timer is in, and start. No account needed to look around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two implementation notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The timer is derived, not synced.&lt;/strong&gt; Everyone in a room has to agree on which phase they're in, including people who joined late or just refreshed. Rather than broadcasting ticks, the phase is computed from a single server-held start time. Late joiners and refreshes land in the right phase for free, and a whole category of "my timer says 3 minutes, yours says 5" bugs never exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Occupancy has to be honest, including when it's zero.&lt;/strong&gt; The entire value proposition is "someone else is actually here", so an inflated number would poison the one thing the product is for. Presence runs over Supabase Realtime, and an empty room says it's empty. This is commercially the wrong choice and I'm keeping it.&lt;/p&gt;

&lt;p&gt;Stack, if useful: Next.js 16, React 19, Supabase, Tailwind v4, deployed on Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it actually is
&lt;/h2&gt;

&lt;p&gt;Launched in July 2026. Outside one scheduled session a day the rooms are usually empty — which, for a product whose point is other people, is &lt;em&gt;the&lt;/em&gt; problem rather than &lt;em&gt;a&lt;/em&gt; problem. That's the part I'd most like to hear ideas on: how do you bootstrap something that only works when someone else shows up?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dopastep.com/" rel="noopener noreferrer"&gt;https://dopastep.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer anything about the presence setup or the timer derivation.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
