<?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: kamlesh Choudhary</title>
    <description>The latest articles on DEV Community by kamlesh Choudhary (@devxkamlesh).</description>
    <link>https://dev.to/devxkamlesh</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%2F3674217%2F47e78025-0e41-4ce1-b080-ea63aa9b21e6.jpg</url>
      <title>DEV Community: kamlesh Choudhary</title>
      <link>https://dev.to/devxkamlesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devxkamlesh"/>
    <language>en</language>
    <item>
      <title>Why Your Coding Streak Died on Day 12 (and the Fix Isn't Willpower)</title>
      <dc:creator>kamlesh Choudhary</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:30:00 +0000</pubDate>
      <link>https://dev.to/devxkamlesh/why-your-coding-streak-died-on-day-12-and-the-fix-isnt-willpower-1n6</link>
      <guid>https://dev.to/devxkamlesh/why-your-coding-streak-died-on-day-12-and-the-fix-isnt-willpower-1n6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmylqrywk502par6136tz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmylqrywk502par6136tz.png" alt=" " width="799" height="418"&gt;&lt;/a&gt;&lt;br&gt;
Day 1: energized, committed, pushing a commit before breakfast. Day 12: you miss one evening because of a family thing, and the whole habit quietly dies. Not dramatically — you just don't open the editor the next day either, or the day after. If this sounds familiar, you're not undisciplined. You built a system that was designed to break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The streak is the wrong metric&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Streak-based tracking has one rule: don't miss a day. That sounds motivating right up until you miss a day, at which point the entire system's response is "start over from zero." There's no partial credit, no accounting for the fact that you coded consistently for eleven days before life intervened on the twelfth. The system doesn't distinguish between someone who's given up and someone who missed one Tuesday.&lt;/p&gt;

&lt;p&gt;This is a design flaw, not a personal failing. A tracking method that treats one missed day identically to total abandonment is going to produce a lot of people who, after missing a day, reasonably think "well, streak's broken, may as well stop." That's not weak willpower — that's a rational response to a binary system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually predicts whether a habit sticks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Research on habit formation (the often-cited Lally et al. study out of UCL) found something people rarely quote correctly: the average time to form a habit was 66 days, but the range across participants was 18 to 254 days — and, more importantly, missing a single occasion didn't meaningfully derail the process. What mattered was the overall pattern of repetition, not an unbroken chain.&lt;/p&gt;

&lt;p&gt;In other words: your coding streak dying on day 12 because you missed one day says almost nothing about whether you'll code consistently long-term. It only says something if you let that one miss become the reason you stop tracking altogether.&lt;/p&gt;

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

&lt;p&gt;I stopped using pure streak counters and started tracking a rolling consistency percentage instead — something closer to "showed up 5 of the last 7 days" than "current streak: 0." The difference sounds small. In practice, it means a missed Tuesday is a data point, not a failure state. Wednesday is still worth showing up for.&lt;/p&gt;

&lt;p&gt;This is the exact gap Habitos is built around — instead of a streak that resets to zero, it uses a Consistency Score that reflects your actual pattern of showing up, including rest days, without treating one gap as game over. For something like a daily coding practice — LeetCode reps, a side project commit, thirty minutes of a new framework — that distinction is the difference between quitting in week two and still going in month three.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The actual fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your coding habit keeps dying around the two-week mark, the problem probably isn't your discipline. It's that you're using a tracking system with no room for being a human who occasionally has a bad Tuesday. Track the pattern, not the unbroken chain, and missing a day stops being a reason to quit.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>habits</category>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>I Was a Great Developer and a Terrible Invoicer. Here's What Fixed It</title>
      <dc:creator>kamlesh Choudhary</dc:creator>
      <pubDate>Sat, 08 Aug 2026 12:30:00 +0000</pubDate>
      <link>https://dev.to/devxkamlesh/i-was-a-great-developer-and-a-terrible-invoicer-heres-what-fixed-it-22gm</link>
      <guid>https://dev.to/devxkamlesh/i-was-a-great-developer-and-a-terrible-invoicer-heres-what-fixed-it-22gm</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0tnezdifhwn1gf8edmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0tnezdifhwn1gf8edmq.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;br&gt;
Three years into freelancing, I did an audit of my own habits and found something embarrassing: I was shipping code within hours of a client request, but sitting on unsent invoices for two, sometimes three weeks. Not because I forgot. Because raising an invoice felt like a chore I could always do "tomorrow," and tomorrow kept losing to actual paid work.&lt;/p&gt;

&lt;p&gt;That gap has a name in freelance circles — payment friction — and it's rarely about the client refusing to pay. It's about the invoice never reaching them in a state they can act on immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the friction actually lives&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I went back through six months of my own invoicing and found three repeat offenders:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The invoice sat in a Word template with manually typed GST fields.&lt;/strong&gt; Every mistake meant re-sending, which meant restarting the client's mental clock on "when do I need to pay this."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment instructions were a separate email.&lt;/strong&gt; Bank account number, IFSC, UPI ID — clients had to hunt across two messages to actually pay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I had no idea what was outstanding at a glance.&lt;/strong&gt; I'd remember a client owed me money the same way I remember a dentist appointment: too late.
None of these are client problems. They're workflow problems, and they compound. A study on small business payment delays that circulates in freelancer communities puts the average invoice-to-payment gap at 30–45 days when there's no clear payment path attached — versus under a week when a payment link is included directly on the invoice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What changed the math for me&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I stopped treating the invoice as a document and started treating it as the last screen of the product I'd just delivered. Same care, same clarity. Concretely, that meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Line items with GST (CGST/SGST or IGST, depending on the client's state) calculated automatically instead of me doing mental tax math at 11 PM.&lt;/li&gt;
&lt;li&gt;A private payment link the client could open without creating an account — with UPI QR and card checkout both sitting right there.&lt;/li&gt;
&lt;li&gt;A single dashboard showing collected vs. outstanding revenue, so "who owes me money" stopped living only in my head.
I switched to &lt;a href="http://cloudinvoice.co.in/" rel="noopener noreferrer"&gt;CloudInvoice&lt;/a&gt; for exactly this — it's built around the idea that the invoice is the payment experience, not paperwork before the payment experience. GST is calculated per line item, clients get a private portal instead of a PDF attachment, and Stripe payments only mark an invoice paid after a verified webhook, which matters more than it sounds like once you've had a client claim they "already paid."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The part that actually mattered&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tooling helped, but the bigger shift was psychological. When sending an invoice took two minutes instead of fifteen, I stopped delaying it. And every day an invoice sits unsent is a day added to when you get paid — no client behavior required, just friction removed.&lt;/p&gt;

&lt;p&gt;If you're a freelance developer still emailing GST-calculated PDFs from a template you built in 2022, the fix isn't willpower. It's making the invoice easy enough to send that you actually send it.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>productivity</category>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I built a bilingual site that ranks in Google and AI answers</title>
      <dc:creator>kamlesh Choudhary</dc:creator>
      <pubDate>Fri, 17 Jul 2026 17:20:14 +0000</pubDate>
      <link>https://dev.to/devxkamlesh/how-i-built-a-bilingual-site-that-ranks-in-google-and-ai-answers-5gd9</link>
      <guid>https://dev.to/devxkamlesh/how-i-built-a-bilingual-site-that-ranks-in-google-and-ai-answers-5gd9</guid>
      <description>&lt;p&gt;Rajasthan's SSO portal is one login for dozens of state services, used by millions of people. The official help is hard to follow, so people search for the basics: how to register, how to log in, how to recover a locked account. I built &lt;a href="https://rajssoidguide.in" rel="noopener noreferrer"&gt;rajssoidguide.in&lt;/a&gt; to answer those questions clearly, in both English and Hindi.&lt;/p&gt;

&lt;p&gt;The content was the easy part. The real work was getting a small site to show up against portals with far more authority. Here is what actually moved the needle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bilingual is a ranking problem, not just a translation one
&lt;/h2&gt;

&lt;p&gt;If you publish the same guide in two languages without telling search engines how the versions relate, they compete with each other and both suffer. hreflang fixes that. In the Next.js App Router it lives in the metadata:&lt;/p&gt;

&lt;p&gt;​&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;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rajssoidguide.in/sso-login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;languages&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="s2"&gt;en-IN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rajssoidguide.in/en/sso-login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hi-IN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rajssoidguide.in/hi/sso-login&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="s2"&gt;```



Now Google serves the Hindi page to Hindi searchers and the English page to everyone else, instead of guessing.

## Schema is what gets you into AI answers

FAQ and HowTo structured data turns a page into something Google and AI assistants can quote directly. Every guide carries a FAQPage block:

​

```&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FAQPage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mainEntity&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Question&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;How do I create a Rajasthan SSO ID?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;acceptedAnswer&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Answer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Go to sso.rajasthan.gov.in, choose Registration, pick Citizen, and verify with your Jan Aadhaar or Google account.&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="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;​&lt;/span&gt;&lt;span class="s2"&gt;```



## Write the answer for the quote

AI answers and featured snippets pull the first clear sentence that answers the question. So each page leads with a direct 40 to 60 word answer, then the detail below. Bury the answer three paragraphs down and you lose the citation to a site that put it up top.

## Find gaps instead of guessing

Instead of writing what I assumed people wanted, I looked at which specific questions the big portals answered poorly, then wrote those. Underserved, high-intent queries are far easier to rank for than broad ones.

## Takeaways

You do not need a big domain to win these queries. A small site with clear answers and correct markup can beat authority on the right questions. For anyone building info or docs sites: get hreflang right, add FAQ/HowTo schema, and put the answer in the first two lines.

Built with Next.js and Tailwind. I write about shipping real products at [devxkamlesh.com](https://devxkamlesh.com).

*Have you tried optimizing content for AI answers yet? What worked or didn't for you? I'd like to hear in the comments.*
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>nextjs</category>
      <category>seo</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
