<?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: Leo Zhang</title>
    <description>The latest articles on DEV Community by Leo Zhang (@leozhang8285).</description>
    <link>https://dev.to/leozhang8285</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%2F4008393%2Ffd4220ec-5111-4477-bacb-24feb455565b.png</url>
      <title>DEV Community: Leo Zhang</title>
      <link>https://dev.to/leozhang8285</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leozhang8285"/>
    <language>en</language>
    <item>
      <title>I cleaned 2,300 photos off my iPhone with a 4.7 MB app</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Sat, 18 Jul 2026 05:36:39 +0000</pubDate>
      <link>https://dev.to/leozhang8285/i-cleaned-2300-photos-off-my-iphone-with-a-47-mb-app-8i5</link>
      <guid>https://dev.to/leozhang8285/i-cleaned-2300-photos-off-my-iphone-with-a-47-mb-app-8i5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: OnePhoto (a.k.a. Swipe Cleaner) is a partner product in the Nomos network I contribute to. The messy camera roll and opinions are my own.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My camera roll hit 38 GB last week. Mostly screenshots of Slack threads, boarding passes from 2024, and six near-identical photos of the same whiteboard.&lt;/p&gt;

&lt;p&gt;I tried the built-in Duplicates album first (Photos → Albums → Utilities → Duplicates). It merged about 400 exact dupes, which was nice, but it ignores "similar" shots — the five slightly different angles of the same thing. That's where most of my junk lives.&lt;/p&gt;

&lt;p&gt;A teammate pointed me to OnePhoto. It's a swipe-based cleaner: left to delete, right to keep, up to favorite. Two things made me actually finish the cleanup instead of abandoning it halfway like every other time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nothing gets deleted while you swipe.&lt;/strong&gt; Everything lands in a review queue and you confirm the batch at the end. I caught two photos I'd swiped wrong, so the queue paid for itself in the first ten minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It's 4.7 MB.&lt;/strong&gt; No account, no upload, all on-device. Freeing up storage with an app that itself eats 300 MB always felt ironic to me.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I did it in short bursts — waiting for coffee, in elevators, during CI runs. Two evenings later: 2,300 photos gone, 38 GB down to 11 GB, and I can actually find things in my library again.&lt;/p&gt;

&lt;p&gt;What it doesn't do: no auto-categorization, no ML picking the "best shot" for you. You still look at every photo yourself. For something this small I think that's the right tradeoff, but if you want full automation, this isn't it.&lt;/p&gt;

&lt;p&gt;Free on iOS 16+ / iPadOS / macOS (M1+): &lt;a href="https://apps.apple.com/app/id6779493280" rel="noopener noreferrer"&gt;https://apps.apple.com/app/id6779493280&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have a better cleanup workflow (or a swipe-fatigue horror story), I'm listening.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ios</category>
      <category>mobile</category>
      <category>tools</category>
    </item>
    <item>
      <title>How I Cut Literature Review Time from 4 Hours to 20 Minutes</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Fri, 17 Jul 2026 04:38:29 +0000</pubDate>
      <link>https://dev.to/leozhang8285/how-i-cut-literature-review-time-from-4-hours-to-20-minutes-50l2</link>
      <guid>https://dev.to/leozhang8285/how-i-cut-literature-review-time-from-4-hours-to-20-minutes-50l2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm an indie developer building AI tools. Here's something that surprised me: the tool I open most these days isn't my IDE or a CI dashboard. It's paperlist.ai, a paper discovery tool for AI research.&lt;/p&gt;

&lt;p&gt;Why would an indie dev care about academic papers? Simple. When you're building in AI, the gap between a conference paper and a product idea is maybe six months. If you're waiting for blog posts and Twitter threads to digest the latest research for you, you're already behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Before paperlist.ai, my literature review workflow was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to arxiv&lt;/li&gt;
&lt;li&gt;Search by keyword&lt;/li&gt;
&lt;li&gt;Open 20 tabs&lt;/li&gt;
&lt;li&gt;Read abstracts one by one&lt;/li&gt;
&lt;li&gt;Realize half of them aren't relevant&lt;/li&gt;
&lt;li&gt;Repeat for different keywords&lt;/li&gt;
&lt;li&gt;Four hours later, maybe found 5 useful papers&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;PaperList lets you browse top AI conference papers by topic and year. ICLR, NeurIPS, ICML, CVPR — all organized by subject area. Instead of keyword-guessing on arxiv, I pick a topic (say, "RLHF" or "multi-agent systems"), select a year, and get a curated list.&lt;/p&gt;

&lt;p&gt;The first time I used it, I found more relevant papers in 20 minutes than I usually did in an entire afternoon. Not because the papers were hidden — they were always there — but because arxiv's interface is optimized for search, not discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Indie Devs
&lt;/h2&gt;

&lt;p&gt;The biggest cost in solo development isn't compute or SaaS subscriptions. It's context switching. Every time you go from building to researching, you lose momentum. Shrinking the research phase from hours to minutes means you get back into flow faster.&lt;/p&gt;

&lt;p&gt;PaperList doesn't do anything magical. It just removes the friction between you and the papers that matter. And for an indie dev shipping AI products, that's exactly what you need.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're curious: paperlist.ai is free to browse. json.opennomos.com has the timestamp converter and JSON parser I use daily. Both are community-built tools on the OpenNomos platform.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A JSON tool that doesn't send your payload to a stranger's server</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Thu, 16 Jul 2026 13:09:32 +0000</pubDate>
      <link>https://dev.to/leozhang8285/a-json-tool-that-doesnt-send-your-payload-to-a-strangers-server-211d</link>
      <guid>https://dev.to/leozhang8285/a-json-tool-that-doesnt-send-your-payload-to-a-strangers-server-211d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I lost count of how many sketchy "JSON beautifier" sites I pasted production API responses into before it hit me: I was sending user data to servers I knew nothing about, multiple times a day, for years.&lt;/p&gt;

&lt;p&gt;This is a short post about why I stopped, what I use now, and the one design principle that made the switch stick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The habit was invisible
&lt;/h2&gt;

&lt;p&gt;When you're debugging an API integration, the flow goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the response body&lt;/li&gt;
&lt;li&gt;Open a new tab, type "json format" in the address bar&lt;/li&gt;
&lt;li&gt;Click the first result&lt;/li&gt;
&lt;li&gt;Paste, format, find the field you need&lt;/li&gt;
&lt;li&gt;Close the tab, forget it ever happened&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I did this maybe 8 times a day. Across 5 years. That's roughly 10,000 times I pasted structured data — sometimes with PII, sometimes with tokens, sometimes with production database records — into a text box on a random domain.&lt;/p&gt;

&lt;p&gt;I never thought about it until a colleague asked: "Where exactly does that JSON go when you hit format?"&lt;/p&gt;

&lt;p&gt;I didn't have an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The obvious risk, quantified
&lt;/h2&gt;

&lt;p&gt;Most JSON tools work client-side. The formatting happens in your browser, and the data never leaves your machine.&lt;/p&gt;

&lt;p&gt;The problem is you can't tell. A site that says "client-side only" today can ship an update tomorrow that sends your payload to a logging endpoint. You wouldn't notice unless you had DevTools open on every request — which nobody does while debugging an unrelated bug at 11pm.&lt;/p&gt;

&lt;p&gt;The risk compounds if you work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Healthcare or financial data&lt;/li&gt;
&lt;li&gt;Authentication tokens or session cookies&lt;/li&gt;
&lt;li&gt;User PII that your GDPR compliance posture assumes stays in your controlled environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One copy-paste into the wrong tool, and you've created an incident you don't even know about.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I use now: three constraints
&lt;/h2&gt;

&lt;p&gt;I switched to &lt;a href="https://json.opennomos.com" rel="noopener noreferrer"&gt;json.opennomos.com&lt;/a&gt;, an open-source developer toolset. The thing that made me switch wasn't the feature list — it was three constraints I could verify myself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One page, three functions.&lt;/strong&gt; Format, validate, and convert timestamps. No account needed, no registration funnel, no upsell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open source, inspectable.&lt;/strong&gt; I can read the source. If I'm paranoid, I can fork it and run it locally. That's a much stronger guarantee than a privacy policy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No data exfiltration path I can see.&lt;/strong&gt; No analytics SDKs, no third-party scripts, no form submissions on paste events. I checked. (An hour of paranoia that paid for itself.)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The conversion from "trust me" to "go check" is the entire value proposition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deeper insight: convenience tools are a supply chain
&lt;/h2&gt;

&lt;p&gt;Every online tool you paste data into is a dependency in your security posture, whether you acknowledge it or not. A JSON formatter feels harmless — it's not running in production, it's not in your CI pipeline, it's not even installed — but if you've pasted a production JWT into one, it was effectively in your threat model the entire time.&lt;/p&gt;

&lt;p&gt;I don't think most developers need to run everything locally. But I do think we should be able to answer the question "where does this data go?" for every tool in our daily workflow.&lt;/p&gt;

&lt;p&gt;For me, that list now includes a JSON formatter. Took years to notice, took an hour to fix.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Finding Your First 10 Users Before Writing a Single Line of Code</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:06:44 +0000</pubDate>
      <link>https://dev.to/leozhang8285/finding-your-first-10-users-before-writing-a-single-line-of-code-d78</link>
      <guid>https://dev.to/leozhang8285/finding-your-first-10-users-before-writing-a-single-line-of-code-d78</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I do growth work for 01MVP, which is mentioned below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A friend of mine spent three months building a meal-planning app. Auth, offline sync, a settings screen with 14 options. He launched it in a Sunday-night Reddit post, got 9 upvotes and zero signups, and quietly archived the repo two weeks later.&lt;/p&gt;

&lt;p&gt;The code was fine. Honestly, the code was good. What killed the project was that the first time a stranger saw the product was &lt;em&gt;after&lt;/em&gt; it was finished.&lt;/p&gt;

&lt;p&gt;I've watched this exact pattern repeat across side projects I've helped with growth. It's rarely a technical failure. It's almost always skipped validation — and the fix is embarrassingly unsexy: find your first 10 users before you write code, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 10, and why before?
&lt;/h2&gt;

&lt;p&gt;Ten is small enough that you can find them by hand, and large enough that patterns show up. One enthusiastic friend tells you nothing. Ten strangers who share the same complaint tell you a lot.&lt;/p&gt;

&lt;p&gt;"Before" matters because of what those conversations do to your build plan. Every hour you spend talking to potential users before coding deletes entire weeks from your roadmap. My friend's meal-planning app had offline sync because &lt;em&gt;he&lt;/em&gt; thought it was table stakes. None of the people he later talked to had ever planned a meal without an internet connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "finding users before code" actually looks like
&lt;/h2&gt;

&lt;p&gt;None of this requires a landing page, a waitlist tool, or a logo. It requires being mildly uncomfortable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Write the complaint, not the pitch.&lt;/strong&gt; Go to the places your users already hang out (a subreddit, a Discord, a niche forum) and search for people describing the problem in their own words. Screenshot the exact phrasing. If you can't find 10 people complaining about the problem, that's not a distribution issue — the pain might not be real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. DM with a question, not a link.&lt;/strong&gt; "How do you currently handle X?" out-converts "Check out my app" by a mile, mostly because there's no app to check out yet. You're collecting verbs: what they do today, what they tried, what they gave up on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Do the job manually for two of them.&lt;/strong&gt; If your product idea is "automated changelog generator," write two changelogs by hand for two real projects. You'll learn more about edge cases in an afternoon than in a month of speculative coding. And the two maintainers you helped? Users one and two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Ask the second-order question.&lt;/strong&gt; "Would you use this?" is worthless — everyone says yes to hypothetical software. "What are you using today, and what did it cost you?" is where the truth lives. People who have already spent money or hours on a problem are your actual market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Pre-commit them to something small.&lt;/strong&gt; Not money, necessarily. A reply that says "ping me when the beta is up" is a weak signal. Someone who agrees to a 15-minute call next Tuesday is a strong one. The strength of your first 10 users is measured in how much friction they've already accepted.&lt;/p&gt;

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

&lt;p&gt;The reason most of us skip all this isn't laziness — it's that building feels like progress and talking to strangers feels like procrastination. The dopamine is exactly backwards.&lt;/p&gt;

&lt;p&gt;That's the thing I appreciate about how &lt;a href="https://01mvp.com" rel="noopener noreferrer"&gt;01MVP&lt;/a&gt; structures the 0→1 path: it forces the questions into the right order. Who is the user, what is the pain, which channel do the first ten come from — and only then, what's the smallest thing you can ship. It reads less like a growth hack and more like a checklist that keeps you from building auth for an app nobody asked for. I've sent it to two developer friends this year; one of them killed a half-built project after working through the first section. He considers that a win. So do I.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody tells you
&lt;/h2&gt;

&lt;p&gt;Your first 10 users will mostly be found one at a time, through embarrassingly manual work: replying to forum threads, sending DMs that feel awkward, doing jobs by hand that your future product is supposed to automate.&lt;/p&gt;

&lt;p&gt;That doesn't scale. It's not supposed to. Scaling is a problem you've earned the right to have &lt;em&gt;after&lt;/em&gt; ten real people care.&lt;/p&gt;

&lt;p&gt;Ship the conversation first. The code can wait three weeks — it's waited this long.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A photo cleanup app that never uploads your photos — the on-device design tradeoffs</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Tue, 14 Jul 2026 04:52:29 +0000</pubDate>
      <link>https://dev.to/leozhang8285/a-photo-cleanup-app-that-never-uploads-your-photos-the-on-device-design-tradeoffs-5b0f</link>
      <guid>https://dev.to/leozhang8285/a-photo-cleanup-app-that-never-uploads-your-photos-the-on-device-design-tradeoffs-5b0f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Swipe Cleaner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most "clean up your camera roll" apps start the same way: create an account, grant full library access, and then — often without saying so loudly — upload thumbnails or full images to a server to "detect duplicates" or "find blurry shots."&lt;/p&gt;

&lt;p&gt;For a photo library that quietly contains passports, whiteboard snapshots, and the occasional screenshot of a 2FA code, that always felt backwards to me. So when we started building &lt;strong&gt;Swipe Cleaner&lt;/strong&gt; (an iOS photo cleanup app), we picked one hard constraint up front:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No account. No uploads. Every decision happens on the device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That single rule shaped almost every design choice that followed. Here's what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The review model: swipe, don't auto-delete
&lt;/h2&gt;

&lt;p&gt;The tempting shortcut is to run a model that scores every photo and auto-suggests deletions. But "smart" auto-deletion is exactly where these apps lose people's trust — one wrong call and you've lost a photo you cared about.&lt;/p&gt;

&lt;p&gt;Instead the core loop is manual and boring on purpose: you see one photo at a time and swipe. Left to trash, right to keep. You can start from All Photos, Videos, Screenshots, Favorites, or a timeline. It turns a vague, overwhelming task ("I have 12,000 photos") into a series of one-second decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Nothing is actually deleted until you confirm the batch
&lt;/h2&gt;

&lt;p&gt;This is the part I'd defend the hardest.&lt;/p&gt;

&lt;p&gt;Swiping left doesn't delete anything. It moves the photo into a &lt;strong&gt;pending-delete queue&lt;/strong&gt;. You keep swiping, build up a batch, and only at the end do you review the whole batch and confirm once. The actual deletion then goes through the system PhotoKit flow — so iOS shows its own confirmation, and the files land in "Recently Deleted" where they're recoverable for 30 days.&lt;/p&gt;

&lt;p&gt;Two safety nets (our batch review + the OS's own trash) instead of an irreversible tap. For a destructive action, that redundancy is worth the extra step.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. On-device means "smart" features have to be cheap
&lt;/h2&gt;

&lt;p&gt;Without a server, you can't lean on heavy ML pipelines. So the useful features are the ones that are genuinely local and fast: sorting by file size (surprisingly effective — big videos are usually the real storage hogs), grouping, and running smoothly on large libraries without a long first-time "scan everything" delay.&lt;/p&gt;

&lt;p&gt;Constraint as a feature: because there's no upload step, there's no waiting for a network round trip, and there's nothing to leak. The app works the same on a plane as it does on wifi.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell another builder
&lt;/h2&gt;

&lt;p&gt;If you're building anything that touches personal data, try writing your privacy constraint as a &lt;em&gt;technical&lt;/em&gt; constraint before you write the marketing copy. "We don't upload your photos" is a nice sentence. "The app has no backend that can receive a photo" is an architecture — and it forces better decisions.&lt;/p&gt;

&lt;p&gt;The core cleanup is free; there's a supporter tier for longer-term stats and an advanced queue, but the privacy model is the same either way.&lt;/p&gt;

&lt;p&gt;If you're on iOS and your storage is permanently "Almost Full," you can try it here: &lt;a href="https://apps.apple.com/cn/app/id6779493280" rel="noopener noreferrer"&gt;https://apps.apple.com/cn/app/id6779493280&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curious how other people handle the delete-confirmation UX in destructive-action apps — do you prefer a batch review, or immediate undo?&lt;/p&gt;

</description>
      <category>ios</category>
      <category>privacy</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a Paper Ranking Engine That Saved Me 4 Hours a Week</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Mon, 13 Jul 2026 04:05:52 +0000</pubDate>
      <link>https://dev.to/leozhang8285/how-i-built-a-paper-ranking-engine-that-saved-me-4-hours-a-week-4p1a</link>
      <guid>https://dev.to/leozhang8285/how-i-built-a-paper-ranking-engine-that-saved-me-4-hours-a-week-4p1a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Paper List, a project on the OpenNomos ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every Sunday, I'd sit down with coffee, open arXiv, and spend hours scrolling through paper titles. 47 papers last week. 3 worth reading.&lt;/p&gt;

&lt;p&gt;The problem isn't finding papers — it's filtering them. Keyword search returns too much noise. Citation count is a lagging indicator. And conference prestige doesn't tell you if a paper is relevant to &lt;em&gt;your&lt;/em&gt; specific project.&lt;/p&gt;

&lt;p&gt;So I built Paper List.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Instead of just matching keywords, Paper List ranks papers by relevance score. You tell it what you're working on, and it learns what matters to you.&lt;/p&gt;

&lt;p&gt;The first version was dead simple: a Python script that scraped arXiv, ran embeddings against my project description, and sorted by cosine similarity. 200 lines of code. Ugly as sin. But it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Relevance scoring beats keyword matching.&lt;/strong&gt; A paper about "transformer attention mechanisms" might be exactly what you need even if you searched for "NLP efficiency."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ranking gets better over time.&lt;/strong&gt; Every paper you save or dismiss teaches the model. After two weeks, the recommendations were noticeably more targeted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed matters more than you think.&lt;/strong&gt; Going from 5 hours to 45 minutes per week isn't just about time saved — it changes your relationship with research. You stop dreading the weekly paper review and start looking forward to what you'll find.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;47 papers scanned per week → 8 relevant surfaced&lt;/li&gt;
&lt;li&gt;5 hours → 45 minutes weekly review time&lt;/li&gt;
&lt;li&gt;3 papers saved per session (up from 1-2 with manual filtering)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not magic. It's just a better filter. And sometimes that's all you need.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Focus Timer That Doesn't Try to Be Your Life Coach</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Sat, 11 Jul 2026 01:46:18 +0000</pubDate>
      <link>https://dev.to/leozhang8285/i-built-a-focus-timer-that-doesnt-try-to-be-your-life-coach-4jc6</link>
      <guid>https://dev.to/leozhang8285/i-built-a-focus-timer-that-doesnt-try-to-be-your-life-coach-4jc6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on OpenNomos, the platform that powers OneZen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every productivity tool today wants to be your entire operating system. Tasks, habits, journaling, pomodoro, analytics dashboards, team features, integrations with seventeen other tools — and I just wanted a timer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with focus apps
&lt;/h2&gt;

&lt;p&gt;I've tried them all. Forest, Toggl Track, Focusmate, Flow Club, Endel, Brain.fm. Each one comes with at least three of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A signup flow that takes five minutes&lt;/li&gt;
&lt;li&gt;A ~$12/month subscription for features I'll never use&lt;/li&gt;
&lt;li&gt;Gamification that makes me feel guilty about yesterday's unproductive streak&lt;/li&gt;
&lt;li&gt;A notification asking me to "reflect on my focus session"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the thing: when I need to focus, I don't need a life coach. I need a frictionless way to say "give me 25 minutes of silence."&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter OneZen
&lt;/h2&gt;

&lt;p&gt;OneZen does exactly three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a duration&lt;/strong&gt; — from 5 minutes to 2 hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a sound&lt;/strong&gt; — rain, fireplace, white noise, or silence&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No accounts. No streaks. No guilt trips about the Tuesday you spent doom-scrolling. Just a timer and a sound that fades out when your session ends.&lt;/p&gt;

&lt;p&gt;The design philosophy is intentionally boring: every feature that didn't directly help someone enter flow state got cut. The settings panel has 8 options total. The codebase is ~200 lines of vanilla JS, a single HTML file, and a CSS file you can read in under 2 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "boring" is a feature
&lt;/h2&gt;

&lt;p&gt;As developers, we're naturally drawn to adding things. A new framework, a better state management pattern, a dark mode toggle, user preferences, a leaderboard. Every line of code feels like progress.&lt;/p&gt;

&lt;p&gt;But focus tools are the one category where more is almost always worse. Every extra click between you and flow state is a tax on your attention span. Every additional feature is a potential distraction.&lt;/p&gt;

&lt;p&gt;The hardest thing I did while building OneZen wasn't the audio integration or the timer logic — it was resisting the urge to add "just one more thing." I probably killed 10 features before writing a single line of production code.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audio is underrated.&lt;/strong&gt; Most "focus" apps treat sound as an afterthought. But the right ambient noise (rain, specifically, in my testing) has a measurable effect on sustained attention. The science on this is solid — steady-state noise masks intermittent distractions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Friction is the enemy.&lt;/strong&gt; People don't stick with productivity tools that require setup. The median time between "I need to focus" and "I am now in flow" should be under 5 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ship before it's ready.&lt;/strong&gt; I could have spent another month adding features, but the current version already does its one job well. The feedback loop from actual usage is worth 10x more than internal polish.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;OneZen is available on OpenNomos as an open-source contribution project. If you're someone who just wants a timer without the baggage, give it a shot. If you want to add a feature or improve the audio, the repo is open.&lt;/p&gt;

&lt;p&gt;The entire philosophy can be summed up in one sentence: &lt;strong&gt;the best focus tool is the one you actually use.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What Building 2 Products in 3 Months Taught Me About Shipping Fast</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Fri, 10 Jul 2026 03:10:17 +0000</pubDate>
      <link>https://dev.to/leozhang8285/what-building-2-products-in-3-months-taught-me-about-shipping-fast-3967</link>
      <guid>https://dev.to/leozhang8285/what-building-2-products-in-3-months-taught-me-about-shipping-fast-3967</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three months ago, I set out to build two products simultaneously: a photo cleaner app and an MVP development framework. I'd read all the indie dev success stories and figured shipping fast was just about writing code faster. I was wrong.&lt;/p&gt;

&lt;p&gt;Here's what actually mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Real Bottleneck Isn't Coding — It's Decision Fatigue
&lt;/h2&gt;

&lt;p&gt;On any given day building a product, you make hundreds of micro-decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should this button be blue or green?&lt;/li&gt;
&lt;li&gt;Do I need pagination or infinite scroll?&lt;/li&gt;
&lt;li&gt;Should I fix this edge case now or ship first?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each decision burns mental energy. By 2 PM, I couldn't make good choices anymore. The solution wasn't "be more decisive" — it was &lt;strong&gt;eliminating decisions entirely&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I started using a simple rule: if a decision doesn't affect whether the core feature works, flip a coin and move on. Ship the ugly version. You can fix it when users complain (and they will).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Your First 10 Users Don't Care About Polish
&lt;/h2&gt;

&lt;p&gt;I spent two weeks perfecting the onboarding flow for my photo cleaner. Beautiful animations, contextual tooltips, the works. When I finally launched and watched real users interact with it, they skipped past every single tutorial and just started tapping buttons randomly.&lt;/p&gt;

&lt;p&gt;The takeaway: your first users are explorers, not readers. They learn by doing. A polished onboarding flow matters when you have 10,000 users, not 10. Ship the bare minimum and watch where they get stuck — that's your real roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Audience &amp;gt; Product (Every Single Time)
&lt;/h2&gt;

&lt;p&gt;This was the hardest lesson. I built a solid photo cleaner and showed it to other developers on Twitter. Feedback was lukewarm — "nice UI," "clean code," generic praise. Then I showed the exact same product to people who regularly take 500+ photos at events. The reaction was completely different: "Wait, this solves my actual problem."&lt;/p&gt;

&lt;p&gt;Same product, different audience, 10x the enthusiasm. Before you build anything, ask: &lt;em&gt;Who specifically has this problem right now, and how do I reach them?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;Looking back at 3 months and 2 products, here's my revised playbook:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; Talk to 5 potential users before writing a single line of code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2-3:&lt;/strong&gt; Build the absolute minimum that solves exactly one problem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 4:&lt;/strong&gt; Ship it to the 5 users from week 1, get brutal feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Month 2-3:&lt;/strong&gt; Iterate based on what actual users say, not what you imagine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The indie dev path isn't about building faster — it's about &lt;strong&gt;learning faster&lt;/strong&gt;. Every day you spend building features nobody asked for is a day you're not learning what they actually need.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the hardest lesson you've learned shipping a product? I'd love to hear it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What I Learned Running 3 Open Source Projects Simultaneously</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Tue, 07 Jul 2026 02:15:46 +0000</pubDate>
      <link>https://dev.to/leozhang8285/web-50ic</link>
      <guid>https://dev.to/leozhang8285/web-50ic</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on OpenNomos, a platform for contributor-driven open source growth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two weeks ago I was running one project. Now I am running three. Here is what changed and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;I am building in public on Twitter, covering three different open source tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenNomos Json — a developer toolset&lt;/li&gt;
&lt;li&gt;PaperList — an AI/ML paper search engine&lt;/li&gt;
&lt;li&gt;Swipe Cleaner — an iOS utility for photo cleanup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three different audiences, three different value props, one person.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-Project Constraint
&lt;/h2&gt;

&lt;p&gt;The immediate concern was Twitter burnout. Posting about one project daily is doable. Three? That risks looking spammy. So the rule became: max 3 tweets per day, each about a different project.&lt;/p&gt;

&lt;p&gt;This constraint forced quality over quantity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Different angles for different projects. Each project has a natural angle — Json for developer efficiency, PaperList for research workflow, Swipe Cleaner for interaction design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build in Public communities amplify reach. Posting each tweet into topic-specific communities adds context that generic hashtags do not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-project learning accelerates everything. Fixing a UX issue on Json taught me something that improved how I talk about PaperList.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Hard Parts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Context switching is real&lt;/li&gt;
&lt;li&gt;Metrics are noisier across projects&lt;/li&gt;
&lt;li&gt;Tooling matters — automation is essential&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;If you are building multiple projects in public, one tweet per project per day forces focus. The key is treating each project as a separate conversation.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>"I Posted Image Tweets for 3 Days — Here's What the Data Says"</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Mon, 06 Jul 2026 01:37:52 +0000</pubDate>
      <link>https://dev.to/leozhang8285/i-posted-image-tweets-for-3-days-heres-what-the-data-says-3kc7</link>
      <guid>https://dev.to/leozhang8285/i-posted-image-tweets-for-3-days-heres-what-the-data-says-3kc7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm 17 days into building &lt;a href="https://json.opennomos.com" rel="noopener noreferrer"&gt;OpenNomos Json&lt;/a&gt; — a tiny developer toolset with a Timestamp Converter and a JSON Parser. Last week we started an experiment: what happens when you add product screenshots to your build-in-public tweets?&lt;/p&gt;

&lt;p&gt;Here's the 3-day data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The experiment is simple: post one BIP tweet per day with a product screenshot, track views/likes/replies/reposts. Compare against our baseline text-only tweets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The product:&lt;/strong&gt; OpenNomos Json — two tools, ~10 daily active uses, early-stage SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The screenshots:&lt;/strong&gt; dashboard view showing both tools, logged-in state, real user context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1 (July 4)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tweet:&lt;/strong&gt; First image tweet. Screenshot of the dashboard, "Day 15 building in public" narrative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; 2 views, 0 likes, 0 replies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take:&lt;/strong&gt; Terrible. Image didn't help at all. Could be content, timing, or algorithm.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 2 (July 5)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tweet:&lt;/strong&gt; Second image tweet. Different angle — focused on the JSON Parser tool specifically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Collected, pending 24h maturation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 3 (July 6)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tweet:&lt;/strong&gt; "Day 17 of OpenNomos Json" — screenshot of the full tool dashboard, sharing 3 specific learnings from 17 days of building.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Pending.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Early patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Image tweets aren't magic.&lt;/strong&gt; They don't automatically get more engagement just because they have a picture. Day 1 was our worst-performing tweet in a week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quote tweets outperform everything.&lt;/strong&gt; Our Quote Tweet experiment (quoting smaller accounts with relevant takes) consistently gets 3-6x more views than our main tweets. One Quote Tweet got 6 views vs 0 on the main tweet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thread decay is real.&lt;/strong&gt; A 4-tweet thread sees views drop 10→4→3→2 across tweets. We're now testing "independent sub-tweets" — each tweet readable on its own, no "1/4" numbering.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually learned about image tweets
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context matters more than the image.&lt;/strong&gt; A screenshot of a dashboard people don't know means nothing. The image needs to communicate value &lt;em&gt;without&lt;/em&gt; reading the text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dev tool screenshots are hard.&lt;/strong&gt; Unlike SaaS dashboards (colorful, full of data), a two-tool developer utility looks... simple. The visual story isn't strong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Small accounts benefit from interaction, not media.&lt;/strong&gt; At 0-50 followers, adding images doesn't change reach. Engaging with other accounts does.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's working better
&lt;/h2&gt;

&lt;p&gt;The real growth levers we've found so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quote Tweeting smaller accounts:&lt;/strong&gt; 3-6x views vs main tweets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BIP (Build in Public) community:&lt;/strong&gt; Consistent but small reach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform (dev.to):&lt;/strong&gt; Longer shelf life, SEO value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; Daily posting builds slow trust&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The plan going forward
&lt;/h2&gt;

&lt;p&gt;We're not giving up on images — we're giving them more time. Three days isn't enough data. We're also launching a cross-community repost experiment this week to test if the same tweet in two Twitter communities gets incremental or duplicate reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;If you're building a developer tool and posting about it: start with text. Master the narrative first. Add images later, and only when the image &lt;em&gt;itself&lt;/em&gt; communicates something the text can't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building OpenNomos Json in public. Follow along at &lt;a href="https://json.opennomos.com" rel="noopener noreferrer"&gt;json.opennomos.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>web3</category>
      <category>showdev</category>
    </item>
    <item>
      <title>16 Days of Building in Public — What Actually Moves the Needle</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Sun, 05 Jul 2026 02:38:38 +0000</pubDate>
      <link>https://dev.to/leozhang8285/16-days-of-building-in-public-what-actually-moves-the-needle-hj1</link>
      <guid>https://dev.to/leozhang8285/16-days-of-building-in-public-what-actually-moves-the-needle-hj1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After 16 days of consistently posting on X/Twitter about my developer tools project, I have real data on what works and what doesn't for indie dev growth. Here's the unfiltered breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://json.opennomos.com" rel="noopener noreferrer"&gt;01MVP&lt;/a&gt; — a free set of developer tools (Timestamp Converter and JSON Parser) that handle 90% of my daily workflow. The goal was simple: get developers to use and talk about it.&lt;/p&gt;

&lt;p&gt;My daily posting cadence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 BIP community post&lt;/li&gt;
&lt;li&gt;1 quote tweet to indie devs&lt;/li&gt;
&lt;li&gt;1 dev.to article&lt;/li&gt;
&lt;li&gt;Bonus: Zhihu (Chinese Q&amp;amp;A)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Numbers (Day 16)
&lt;/h2&gt;

&lt;p&gt;The clearest signal came from comparing identical content posted in the &lt;strong&gt;Build in Public&lt;/strong&gt; community vs raw timeline posting:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;BIP Community&lt;/th&gt;
&lt;th&gt;Raw Posting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Views&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Likes&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replies&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reposts&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;12x difference.&lt;/strong&gt; Not "BIP helps a bit" — BIP is the channel, raw posting is basically invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Worked
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Image Tweets &amp;gt; Text-Only
&lt;/h3&gt;

&lt;p&gt;Same topic, same time, same community. The image tweet got engagement immediately. Text-only tweets felt like noise. The images don't need to be polished — a real screenshot of your product beats a designed graphic.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Quote-Tweeting Small Indie Accounts
&lt;/h3&gt;

&lt;p&gt;Big accounts (10k+ followers) rarely engage. But indie devs with 100-1000 followers? They reply, they retweet, they check out your profile. The signal-to-noise ratio is way better.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Community Posts Are Not Optional
&lt;/h3&gt;

&lt;p&gt;Posting to BIP isn't a "growth hack." It's table stakes. Without a community placement, your tweet competes with the entire algorithm. Inside a community, you're one of maybe 20-50 posts that hour.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. dev.to Brings Long-Tail Traffic
&lt;/h3&gt;

&lt;p&gt;Twitter gives you the spike. dev.to gives you the tail. Articles published weeks ago still bring views through search and the dev.to feed. Write once, distribute forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Didn't Work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commenting on big influencer posts:&lt;/strong&gt; 0 interaction so far. Their threads are too noisy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posting in Chinese on Zhihu with a new account:&lt;/strong&gt; Zero traction in 4 days. Cold start on Chinese platforms requires 2-3 weeks of consistent output before the algorithm picks you up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiting for the "perfect" tweet:&lt;/strong&gt; The 36-view tweet was written in 5 minutes. The overthought ones got 2-8 views.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Current Growth Stack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Daily BIP community post (image &amp;gt; text)&lt;/li&gt;
&lt;li&gt;Daily quote tweet to 1 indie dev (100-1k followers)&lt;/li&gt;
&lt;li&gt;Daily dev.to article (en → long-tail)&lt;/li&gt;
&lt;li&gt;Weekly experiment: new format, new angle&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Counterintuitive Truth
&lt;/h2&gt;

&lt;p&gt;You don't need "better content" to get engagement. You need &lt;strong&gt;better distribution&lt;/strong&gt;. The exact same text got 12x the results just by changing where it was posted.&lt;/p&gt;

&lt;p&gt;If you're an indie dev building in public, stop optimizing your tweet copy. Join a community. Add a screenshot. Find your people with &amp;lt;1000 followers. That's where the real growth starts.&lt;/p&gt;

&lt;p&gt;What's your current growth experiment?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>web3</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Ship an MVP in 2 Weeks - Part 3 From Code to First User</title>
      <dc:creator>Leo Zhang</dc:creator>
      <pubDate>Sat, 04 Jul 2026 02:10:39 +0000</pubDate>
      <link>https://dev.to/leozhang8285/how-i-ship-an-mvp-in-2-weeks-part-3-from-code-to-first-user-15cf</link>
      <guid>https://dev.to/leozhang8285/how-i-ship-an-mvp-in-2-weeks-part-3-from-code-to-first-user-15cf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on OpenNomos, building developer tools and tracking my indie journey.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is Part 3 of my 01MVP series. In Part 1 and 2, I covered why MVPs matter and how to pick the right first feature. This time, let's talk about actually shipping — the part where most projects die.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2-Week Rule
&lt;/h2&gt;

&lt;p&gt;After spending 3 months on a project nobody used, I made a rule: &lt;strong&gt;if I can't ship something usable in 2 weeks, I'm building too much.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the reality check: your first users don't need a polished product. They need one thing that works. One feature. One workflow. One problem solved.&lt;/p&gt;

&lt;p&gt;My current project, &lt;a href="https://json.opennomos.com" rel="noopener noreferrer"&gt;OpenNomos Json&lt;/a&gt;, started as exactly two tools: a Timestamp Converter and a JSON Parser. That's it. Two tools, zero bloat, one weekend of work. And people started using it immediately because it solved actual pain points.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Ship" Actually Means
&lt;/h2&gt;

&lt;p&gt;Shipping isn't just pushing code. It means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The thing is live.&lt;/strong&gt; Someone can type a URL and use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It does exactly one thing.&lt;/strong&gt; Not "it could do X, Y, Z eventually." One thing, right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can measure if it works.&lt;/strong&gt; Did someone actually complete the core workflow?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything else — analytics dashboards, user onboarding, dark mode — is noise for week 3+.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Feedback Loop
&lt;/h2&gt;

&lt;p&gt;The real value of shipping fast isn't speed itself. It's the feedback loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; Ship → 0 users → "nobody knows it exists"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; Share on Twitter/Build in Public → 5 users → "the JSON error messages are confusing"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; Fix error messages → 15 users → "can you add a minify toggle?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is infinitely better than:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Month 1-6:&lt;/strong&gt; Build everything in silence → launch → crickets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Scariest Part
&lt;/h2&gt;

&lt;p&gt;The scariest part of shipping in 2 weeks is that &lt;strong&gt;people will see the ugly version.&lt;/strong&gt; But here's what I learned: nobody cares about your messy V1 as much as you do. The people who do notice are usually other builders who appreciate the honesty.&lt;/p&gt;

&lt;p&gt;In fact, I recently quoted &lt;a class="mentioned-user" href="https://dev.to/arvidkahl"&gt;@arvidkahl&lt;/a&gt;'s observation that "bad writing becomes more valuable in a world of AI-assisted writing." The same applies to software: &lt;strong&gt;rough, real, working software stands out in a sea of polished AI-generated landing pages.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Building Next
&lt;/h2&gt;

&lt;p&gt;With 01MVP, I'm following this same 2-week rule. Next tool, next weekend. Each tool ships when it's useful, not when it's perfect.&lt;/p&gt;

&lt;p&gt;The hardest part isn't the code. It's resisting the urge to add "just one more feature" before showing it to anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ship it ugly. Ship it Monday. Ship it now.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is Part 3 of my 01MVP series. Catch Part 1 and 2 on the &lt;a href="https://opennomos.com" rel="noopener noreferrer"&gt;OpenNomos blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>sideprojects</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
