<?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: Atharv Mohite</title>
    <description>The latest articles on DEV Community by Atharv Mohite (@atharv96k).</description>
    <link>https://dev.to/atharv96k</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%2F4152548%2F82f84d7e-b370-40c3-aa79-5734e286a5bf.jpg</url>
      <title>DEV Community: Atharv Mohite</title>
      <link>https://dev.to/atharv96k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atharv96k"/>
    <language>en</language>
    <item>
      <title>Cold emails in her voice: I made an open-weight AI show its work, phrase by phrase</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Sat, 03 Oct 2026 09:53:50 +0000</pubDate>
      <link>https://dev.to/atharv96k/coldopen-an-open-weight-model-that-learns-how-you-write-then-drafts-the-email-youd-actually-send-1ogg</link>
      <guid>https://dev.to/atharv96k/coldopen-an-open-weight-model-that-learns-how-you-write-then-drafts-the-email-youd-actually-send-1ogg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;ColdOpen&lt;/strong&gt; for my sister, Aishwarya. She's a software engineer with 5+ years of experience, and she's good at her job. She still puts off one task for weeks: writing the first message to someone she doesn't know. That could be a referral request, a note to a recruiter, or a question to someone who changed roles the way she wants to.&lt;/p&gt;

&lt;p&gt;She told me "I rewrite the first line ten times and then close the tab". The AI tools she'd tried made it worse. The drafts were polished, but they started with "I hope this email finds you well" and sounded like nobody she knows. If it doesn't sound like her, she won't send it.&lt;/p&gt;

&lt;p&gt;ColdOpen starts from her own writing instead of a template:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;She pastes 2-3 messages she has actually written.&lt;/li&gt;
&lt;li&gt;She says who she's writing to and what she wants (15 goals: referral, recruiter intro, alumni intro, resume feedback, mock interview, mentoring, follow-up, thank-you, reconnect, reference, switching roles, and more).&lt;/li&gt;
&lt;li&gt;ColdOpen writes a short &lt;strong&gt;"voice learned" note&lt;/strong&gt; (greeting, sign-off, sentence length, habits) that she can check. Then it writes &lt;strong&gt;three emails and three subject lines&lt;/strong&gt;: Direct &amp;amp; Concise, Warm &amp;amp; Respectful, and Curiosity-First.&lt;/li&gt;
&lt;li&gt;One checkbox shows the same request written with &lt;strong&gt;no voice&lt;/strong&gt;, side by side, so she can see what the voice step changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The highlights are the part I'm proudest of. In the side-by-side view, &lt;span&gt;green&lt;/span&gt; marks wording that carries her voice, &lt;span&gt;pink&lt;/span&gt; marks stock template phrases in the generic draft, and &lt;span&gt;amber&lt;/span&gt; marks &lt;code&gt;[placeholders]&lt;/code&gt; she has to fill in before sending.&lt;/p&gt;

&lt;p&gt;It also won't invent facts. If she doesn't tell it about a shared project or a talk, it writes &lt;code&gt;[bracketed placeholder]&lt;/code&gt; and doesn't make something up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://coldopen-fe.onrender.com/" rel="noopener noreferrer"&gt;https://coldopen-fe.onrender.com/&lt;/a&gt; (hosted on Render's free tier, and an UptimeRobot monitor pings the &lt;code&gt;/api/health&lt;/code&gt; endpoint every 5-10 minutes so the service stays awake)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Direct &amp;amp; Concise: the same reference request, in her voice and without it&lt;/strong&gt;&lt;br&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%2Fkjmwrtik32bji1c5x49u.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%2Fkjmwrtik32bji1c5x49u.png" alt="ColdOpen Direct &amp;amp; Concise tone: a reference request to a former manager, written in the user's voice (top) and as a generic draft (bottom), with highlights" width="799" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top: "In your voice". Bottom: "Generic (no voice)". Green marks her phrasing, pink marks stock template phrases, and amber marks &lt;code&gt;[Your name]&lt;/code&gt;, which she has to fill in.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Warm &amp;amp; Respectful: the same request, a softer tone&lt;/strong&gt;&lt;br&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%2F4x26kybunc9yk0hfnfbm.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%2F4x26kybunc9yk0hfnfbm.png" alt="ColdOpen Warm &amp;amp; Respectful tone: voice draft and generic draft side by side" width="800" height="466"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen recording:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/154JrBEXIZEkQHYuivElIQ-7X-v0bPnop/view?usp=drive_link" rel="noopener noreferrer"&gt;Watch the 1-minute walkthrough on Google Drive&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/atharv96k" rel="noopener noreferrer"&gt;
        atharv96k
      &lt;/a&gt; / &lt;a href="https://github.com/atharv96k/ColdOpen" rel="noopener noreferrer"&gt;
        ColdOpen
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Cold emails in your own voice. Paste your past messages, get 3 drafts that sound like you.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/atharv96k/ColdOpen/docs/Logo2.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fatharv96k%2FColdOpen%2FHEAD%2Fdocs%2FLogo2.png" alt="ColdOpen" width="420"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Cold emails that sound like you wrote them&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Paste a few of your own messages. ColdOpen learns how you write and drafts three cold emails and three subject lines in your voice, then shows you what changed next to a generic AI draft.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/64a44b8deb11fddfbd6bcc09beb9823a7d197d9c2759b85cf68f10923673274c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4445562532305765656b656e642532304368616c6c656e67652d4275696c64253230666f7225323061253230467269656e642d3666343263313f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/64a44b8deb11fddfbd6bcc09beb9823a7d197d9c2759b85cf68f10923673274c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4445562532305765656b656e642532304368616c6c656e67652d4275696c64253230666f7225323061253230467269656e642d3666343263313f7374796c653d666c61742d737175617265" alt="Weekend Challenge"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7b5a3696d47b7d135bb2e78cf600b603f740ec55eec9641c71d151367e0486b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d6f70656e2d2d7765696768742532306d6f64656c732d3265613434663f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/7b5a3696d47b7d135bb2e78cf600b603f740ec55eec9641c71d151367e0486b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d6f70656e2d2d7765696768742532306d6f64656c732d3265613434663f7374796c653d666c61742d737175617265" alt="Open-weight models"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aa2656c56d263e83dc1eaf5f4b34da640de82afda99cceae130cae0397e2a6ad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652d3631646166623f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/aa2656c56d263e83dc1eaf5f4b34da640de82afda99cceae130cae0397e2a6ad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652d3631646166623f7374796c653d666c61742d737175617265" alt="React"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5405c65912f08b8c4813094ae10af3ffe5a505ea1bd93fd4b8e3332958590b19/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732d3333393933333f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/5405c65912f08b8c4813094ae10af3ffe5a505ea1bd93fd4b8e3332958590b19/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732d3333393933333f7374796c653d666c61742d737175617265" alt="Node"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://coldopen-fe.onrender.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Live demo&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://dev.to/your-post" rel="nofollow"&gt;&lt;strong&gt;Write-up on DEV&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://github.com/atharv96k/ColdOpen/../../issues" rel="noopener noreferrer"&gt;&lt;strong&gt;Report an issue&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/atharv96k/ColdOpen/docs/sc.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fatharv96k%2FColdOpen%2FHEAD%2Fdocs%2Fsc.png" alt="ColdOpen side-by-side comparison"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/div&gt;
&lt;br&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Motivation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;ColdOpen was built for a software engineer with more than five years of experience. Reaching out to someone you do not know is difficult; the first message is often the one that never gets sent. Generic AI email tools produce polished drafts that do not sound like the sender, so those drafts go unsent as well.&lt;/p&gt;

&lt;p&gt;ColdOpen begins with the user’s own writing rather than a template.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Feature&lt;/th&gt;

&lt;th&gt;Description&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;strong&gt;Voice learning&lt;/strong&gt;&lt;/td&gt;

&lt;td&gt;Analyzes 2–3 of your own messages and produces a short “voice learned” note (greeting, sign-off, sentence length, habits) that you can review.&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;&lt;strong&gt;Three drafts,&lt;/strong&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/atharv96k/ColdOpen" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;React + Vite frontend, Node/Express backend, MIT licensed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The model.&lt;/strong&gt; ColdOpen calls open-weight models (default &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;, with &lt;code&gt;qwen/qwen3.8-27b&lt;/code&gt; and &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt; as fallbacks) through Groq's hosted API. The list is one environment variable (&lt;code&gt;GROQ_MODELS&lt;/code&gt;). If a model is rate limited or unavailable, the server moves to the next one. I started out thinking of running the model locally, but I wanted Aishwarya to be able to open a link and use it without installing anything, so I switched to a hosted open-weight model and deployed the app. Because the model is open-weight and the list is a single environment variable, that switch was a config change, not a rewrite, and the same prompts can point back at a local runtime later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt design.&lt;/strong&gt; The model describes how she writes &lt;em&gt;before&lt;/em&gt; it drafts anything. That voice-notes step is shown in the UI so she can tell whether it understood her. Her text goes into the prompt fenced as data, not as instructions. The fact rules are strict: the model may only use what she typed into &lt;em&gt;About you&lt;/em&gt;, &lt;em&gt;Your question&lt;/em&gt; and &lt;em&gt;Anything specific&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most of the work was guardrails around a small model.&lt;/strong&gt; The prompt alone wasn't enough, so the server checks the output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It validates the JSON.&lt;/li&gt;
&lt;li&gt;It rejects stock clichés like "I hope you're doing well" in the voice column and retries once.&lt;/li&gt;
&lt;li&gt;It repairs one-line emails into a proper email layout (greeting, short paragraphs, sign-off).&lt;/li&gt;
&lt;li&gt;It checks that every highlighted phrase really appears in the email. If the model's picks fail the check, it falls back to simple methods: overlap with her samples for the voice column and a hand-written stock-phrase list for the generic column.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking back, getting highlights to work was harder than getting emails to work. Early on the model returned empty highlight arrays, and exact-match checks failed on curly quotes and dashes. I fixed that by normalizing punctuation before matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other things.&lt;/strong&gt; The API is rate limited to 10 requests a minute per IP, and inputs have length caps. In development there's a test bar with 15 sample cases, one per goal. I wrote them from an experienced engineer's point of view, because that's who the app is for. The whole app deploys as a single Render web service, since Express serves the built React client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Moving from local to hosted was a config change.&lt;/strong&gt; I needed a deployed link she could open, so I moved from a local setup to a hosted open-weight model by changing one environment variable. A closed API would have tied the prompts and guardrails to one provider's models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could see where the model stopped and my code started.&lt;/strong&gt; With open weights and a swappable model list, I could tell which problems were the model's (clichés, invented details, one-line emails) and which were mine to guard against. Most of this project is that second part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It cost nothing to build.&lt;/strong&gt; A free-tier key was enough for a weekend of testing, and I tested a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An honest limit:&lt;/strong&gt; ColdOpen calls a &lt;em&gt;hosted&lt;/em&gt; open-weight model, so the writing samples are sent to that provider to generate drafts. This app doesn't store them, but they do leave the machine. Writing samples can be personal, and the open-weight advantage I'd most like to use is running locally so they never leave. My machine isn't configured well enough to run an LLM locally, so this version uses a hosted open-weight model instead, and I'd rather say that than imply privacy it doesn't have. Because the model is just a setting, the same app can point at a local runtime on a machine that can handle one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where a closed model might have done better:&lt;/strong&gt; The models kept falling back on "I hope you're doing well" even when told not to, and sometimes returned the whole email as one line. I added a banned-phrase check with a retry and a layout repair step. A frontier model might have followed those instructions the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hand-over
&lt;/h2&gt;

&lt;p&gt;She didn't care much about the three tones. What she reacted to was the generic version next to her own. She pointed at the pink-highlighted "I hope this email finds you well" and laughed: "That's exactly what I hate." Then she pointed at the green phrases in her version and said, "That's actually how I'd say it."&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the app is deployed as a single Render web service, with Express serving the built React client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Language models sometimes add small details that weren't in the input. The fact rules and filters reduce this but don't remove it. Read every draft before you send it.&lt;/li&gt;
&lt;li&gt;Voice match depends on how much natural writing you paste in.&lt;/li&gt;
&lt;li&gt;Highlights are a guide, not an AI-text detector.&lt;/li&gt;
&lt;li&gt;With the generic comparison on, each request makes two model calls, so free-tier rate limits apply.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Gemma as an additional model, with a side-by-side voice comparison between models&lt;/li&gt;
&lt;li&gt;Remember writing samples in the browser&lt;/li&gt;
&lt;li&gt;"Make it shorter / more casual" per email&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Tutorial Hell Is Comfortable. Here's How I Got Out.</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:49:02 +0000</pubDate>
      <link>https://dev.to/atharv96k/tutorial-hell-is-comfortable-heres-how-i-got-out-1e49</link>
      <guid>https://dev.to/atharv96k/tutorial-hell-is-comfortable-heres-how-i-got-out-1e49</guid>
      <description>&lt;p&gt;Tutorial hell doesn't feel like hell. That's the problem.&lt;/p&gt;

&lt;p&gt;It feels like progress. You watch a video, you type along, the code runs, and you think "I get it." Then you open a blank file and nothing comes.&lt;/p&gt;

&lt;p&gt;I lived in that loop for a long time. This is how I got out.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to know you're in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You finish a course and immediately start another one&lt;/li&gt;
&lt;li&gt;You can follow along, but a blank editor freezes you&lt;/li&gt;
&lt;li&gt;You say "I'll start my own project once I learn a bit more"&lt;/li&gt;
&lt;li&gt;Your projects are clones of what the instructor built&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's you, you're not slow. You're practicing &lt;strong&gt;watching&lt;/strong&gt;, not &lt;strong&gt;building&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;In a tutorial, someone else makes every decision: what to build, what to name things, what comes next. You only do the typing.&lt;/p&gt;

&lt;p&gt;Real work is the opposite. Nobody tells you the next step. You have to decide, get stuck, search, and fix it. That struggle is where learning actually happens, and tutorials remove it.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. One tutorial, then a rule
&lt;/h3&gt;

&lt;p&gt;Finish the tutorial, then immediately build something &lt;em&gt;different&lt;/em&gt; with the same skills. No starting a new course until that's done.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Build small and ugly
&lt;/h3&gt;

&lt;p&gt;My first attempts were tiny: a CRUD API, a simple REST endpoint, a basic login. They were messy, and that was fine. A finished ugly project teaches more than a perfect abandoned one.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Get stuck on purpose, for 20 minutes
&lt;/h3&gt;

&lt;p&gt;When I hit an error, I gave myself 20 minutes before searching or asking. Reading the stack trace, guessing, and trying things is the skill you're actually training.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ship it and write about it
&lt;/h3&gt;

&lt;p&gt;Push it to GitHub with a README. Explaining what you built in plain words shows you what you really understood and what you copied.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 80/20 rule I use now
&lt;/h2&gt;

&lt;p&gt;Spend about &lt;strong&gt;20% of your time learning&lt;/strong&gt; and &lt;strong&gt;80% building&lt;/strong&gt;. Most people do the opposite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What real projects taught me that tutorials never did
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Error messages are not the enemy, they are the map&lt;/li&gt;
&lt;li&gt;Reading other people's code (open source is great for this) is a skill on its own&lt;/li&gt;
&lt;li&gt;"It works" and "it's structured well" are two different goals&lt;/li&gt;
&lt;li&gt;Nobody remembers syntax perfectly. Everyone searches. The real skill is knowing what to search for&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you're stuck right now
&lt;/h2&gt;

&lt;p&gt;Do this today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close the tutorial.&lt;/li&gt;
&lt;li&gt;Pick one small idea (a to-do API, an expense tracker, a URL shortener).&lt;/li&gt;
&lt;li&gt;Write down 3 features it needs.&lt;/li&gt;
&lt;li&gt;Build the first one, badly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Momentum beats planning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;How long were you stuck in tutorial hell, and what finally got you out? Tell me in the comments, I'd love to hear it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>java</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
