<?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: Hem Bahadur Pun</title>
    <description>The latest articles on DEV Community by Hem Bahadur Pun (@hempun10).</description>
    <link>https://dev.to/hempun10</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%2F1007310%2Fe6410cc8-8a43-4f3e-abea-3b5cfb0697b4.png</url>
      <title>DEV Community: Hem Bahadur Pun</title>
      <link>https://dev.to/hempun10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hempun10"/>
    <language>en</language>
    <item>
      <title>I didn't understand F1, so I built a quiz app to teach myself</title>
      <dc:creator>Hem Bahadur Pun</dc:creator>
      <pubDate>Fri, 02 Oct 2026 07:48:29 +0000</pubDate>
      <link>https://dev.to/hempun10/i-dont-watch-f1-so-i-built-a-quiz-where-the-ai-isnt-allowed-to-grade-me-b0b</link>
      <guid>https://dev.to/hempun10/i-dont-watch-f1-so-i-built-a-quiz-where-the-ai-isnt-allowed-to-grade-me-b0b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I want to get into Formula 1, but I didn't know what pole, DNF or undercut meant. Pit Wall is the quiz I built to learn.&lt;/p&gt;

&lt;p&gt;Pick a 2026 Grand Prix and a tyre. The start lights go out and you answer five questions, one per lap. After each answer, a card explains the F1 term the question used.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tyre&lt;/th&gt;
&lt;th&gt;Asks about&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Soft&lt;/td&gt;
&lt;td&gt;one fact from the race&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;comparing drivers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard&lt;/td&gt;
&lt;td&gt;the season so far&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An agent writes every question, but it never grades you. With each question it also writes a GROQ query that answers it. The server runs that query against real race results in Sanity, and the result becomes the answer.&lt;/p&gt;

&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%2Fdda6vfgncon3b6318mmk.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%2Fdda6vfgncon3b6318mmk.png" alt="After an answer: the verdict, the F1 term explained, and the timing tower sliding into the finishing order" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To check this matters, I gave 30 questions from the app to the same model with no access to the data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pit Wall (answer from a GROQ query)&lt;/td&gt;
&lt;td&gt;30 / 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same model, no data&lt;/td&gt;
&lt;td&gt;16 / 30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same model, Hard questions only&lt;/td&gt;
&lt;td&gt;3 / 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Random guessing gets 7 or 8. Asked who had the most podiums after Monaco, the model said Max Verstappen. The data says Kimi Antonelli.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://pit-wall-olive.vercel.app" rel="noopener noreferrer"&gt;Play Pit Wall&lt;/a&gt;. There's no sign-up. Pick a three-letter driver code and race.&lt;/p&gt;

&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%2F1tz1s5h2wuwt6opwuoss.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%2F1tz1s5h2wuwt6opwuoss.png" alt="The intro" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fwo3rcwj15jo7ctxe96fd.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%2Fwo3rcwj15jo7ctxe96fd.png" alt="Pick a Grand Prix and a tyre" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fnav3rivbio5zf9emyo1e.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%2Fnav3rivbio5zf9emyo1e.png" alt="The start lights before lap 1" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Flhy05smocnvbz8jzgqrq.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%2Flhy05smocnvbz8jzgqrq.png" alt="A question, with keyboard hints and team-colour helmets" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&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%2Fbzw8fznvn8qrqosvetgb.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%2Fbzw8fznvn8qrqosvetgb.png" alt="Results: F1 points and a review of every lap" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hempun10/pit-wall" rel="noopener noreferrer"&gt;github.com/hempun10/pit-wall&lt;/a&gt;. The README covers setup from an empty Sanity project.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&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%2Fegnj4sjqwagakt673vno.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%2Fegnj4sjqwagakt673vno.png" alt="How Pit Wall fits together" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The race data
&lt;/h3&gt;

&lt;p&gt;A Python script converts the &lt;a href="https://github.com/f1db/f1db" rel="noopener noreferrer"&gt;F1DB&lt;/a&gt; SQLite release (CC BY 4.0) into 6,254 Sanity documents. They cover 2014 to round 15 of 2026.&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;raceResult&lt;/code&gt; is one driver in one race. It references its &lt;code&gt;race&lt;/code&gt;, &lt;code&gt;driver&lt;/code&gt; and &lt;code&gt;team&lt;/code&gt;, so a single query answers "who finished on the podium in Azerbaijan?"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "raceResult" &amp;amp;&amp;amp; year == 2026 &amp;amp;&amp;amp; round == 15 &amp;amp;&amp;amp; position &amp;lt;= 3]
  | order(position asc) {position, "driver": driver-&amp;gt;name, "team": team-&amp;gt;name}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent's instructions warn about three traps in the data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;points&lt;/code&gt; counts Grand Prix points only. Sprint points live in the standings documents.&lt;/li&gt;
&lt;li&gt;Pole is &lt;code&gt;polePosition == true&lt;/code&gt;. &lt;code&gt;gridPosition == 1&lt;/code&gt; is wrong after a grid penalty.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pitStops: 0&lt;/code&gt; in a dry race means missing data. Every driver has to use two tyre compounds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Two Context endpoints
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pit-wall-data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the dataset, GROQ mode&lt;/td&gt;
&lt;td&gt;facts and numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pit-wall-rules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a Knowledge Base&lt;/td&gt;
&lt;td&gt;what F1 words mean&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An endpoint with both sources ignores the Knowledge Base without an error, so Pit Wall uses two. Both expose a tool named &lt;code&gt;initial_context&lt;/code&gt;, so the agent gets each set with a prefix.&lt;/p&gt;

&lt;p&gt;The data endpoint needs a deployed Studio. Run &lt;code&gt;sanity deploy&lt;/code&gt; first, or every call fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Knowledge Base
&lt;/h3&gt;

&lt;p&gt;Nine Wikipedia articles became 15 entries. I added one stale article on purpose, a June 2023 revision that still gives a bonus point for the fastest lap. F1 dropped that rule in 2025.&lt;/p&gt;

&lt;p&gt;The build flagged it. One entry said the point was gone, and the glossary said it still existed. The race data settled it. Here is what a winner who also set the fastest lap scored:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Season&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&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%2Fmqdyggk4f26kadq9tver.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%2Fmqdyggk4f26kadq9tver.png" alt="Two Knowledge Base entries disagreed about the fastest-lap point; the race data settled it" width="799" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I resolved it to "abolished from 2025". The build flagged three more conflicts. I resolved two from the sources and dismissed one that misread a date range.&lt;/p&gt;

&lt;h3&gt;
  
  
  How a question gets made
&lt;/h3&gt;

&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%2F59qu3aikaevgbz239dlq.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%2F59qu3aikaevgbz239dlq.png" alt="How a question gets made, in six steps" width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent (gpt-5.4-mini on the Vercel AI SDK) gets the round, the tyre and the questions already asked.&lt;/li&gt;
&lt;li&gt;It explores the data with &lt;code&gt;groq_query&lt;/code&gt; and writes the query that answers its question.&lt;/li&gt;
&lt;li&gt;It reads one Knowledge Base entry to explain the F1 term.&lt;/li&gt;
&lt;li&gt;It calls &lt;code&gt;submit_question&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The server runs the query. If the result isn't a single string or number, the agent gets one retry with the error.&lt;/li&gt;
&lt;li&gt;The server encrypts the answer (AES-GCM) into the question. The browser can't read it, and the server stores nothing per player.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every answer screen has a "How we checked this" drawer with the exact query that graded you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The question bank
&lt;/h3&gt;

&lt;p&gt;Writing a question live took 20 to 50 seconds and up to 55,000 input tokens. Now the server saves every verified question as a &lt;code&gt;quizQuestion&lt;/code&gt; document and serves it from Sanity in about a second.&lt;/p&gt;

&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%2Flwxl0vrw3aqy9k0n4thf.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%2Flwxl0vrw3aqy9k0n4thf.png" alt="Serving a question: bank first, the agent only when the bank runs dry" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent writes a new question only when you've seen every stored one for that round and tyre. It stops at six per round and tyre, which also caps the cost. The bank holds 222 questions.&lt;/p&gt;

&lt;p&gt;Live questions also got cheaper. The server cancels the OpenAI request when you leave, the agent gets only the three tools it uses, and large query results get cut off so the agent narrows its query.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team radio
&lt;/h3&gt;

&lt;p&gt;After an answer, you can ask your race engineer a question. A live agent answers from both endpoints and lists the queries and rules entries it used.&lt;/p&gt;

&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%2Fhe8owv8dkr7twj70z8sv.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%2Fhe8owv8dkr7twj70z8sv.png" alt="Team radio: the engineer's reply, with the exact query it ran" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the data can't answer, it says so. Asked why a driver made one pit stop, it confirmed the count and said the data doesn't record the reason. You get two messages per lap.&lt;/p&gt;

&lt;h3&gt;
  
  
  The championship
&lt;/h3&gt;

&lt;p&gt;A race scores like F1's top five. Five correct answers earn 25 points, then 18, 15, 12 and 10. Your best result per race and tyre counts, and ties go to whoever got there first. Each finished race is a &lt;code&gt;quizRun&lt;/code&gt; document.&lt;/p&gt;

&lt;p&gt;There are no accounts, only a three-letter code. Your score travels in an encrypted token, so the browser can't change it. Replaying a question, forging a token and finishing a race twice all fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vary the questions. Hard often asks "most podiums after round X", and Antonelli has won 8 of 15 races, so the answer rarely changes.&lt;/li&gt;
&lt;li&gt;Add optional sign-in. I appear twice as HEM because I played in two browsers.&lt;/li&gt;
&lt;li&gt;Grow the Knowledge Base. Nine articles cover newcomer questions, not race strategy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built with
&lt;/h2&gt;

&lt;p&gt;I built Pit Wall with Pi. The car at lights out is a recording by Geoff-Bremner-Audio (CC BY 4.0). The fonts are Departure Mono and Instrument Serif, and the flags come from country-flag-icons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;hptt7wjq&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt; (public)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example query:&lt;/strong&gt; &lt;a href="https://hptt7wjq.api.sanity.io/v2025-02-19/data/query/production?query=*%5B_type%3D%3D%22raceResult%22%20%26%26%20year%3D%3D2026%20%26%26%20round%3D%3D15%20%26%26%20position%20%3C%3D%203%5D%20%7C%20order(position%20asc)%7Bposition%2C%20%22driver%22%3A%20driver-%3Ename%2C%20%22team%22%3A%20team-%3Ename%7D" rel="noopener noreferrer"&gt;Azerbaijan 2026 podium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document types:&lt;/strong&gt; &lt;code&gt;race&lt;/code&gt;, &lt;code&gt;raceResult&lt;/code&gt;, &lt;code&gt;driver&lt;/code&gt;, &lt;code&gt;team&lt;/code&gt;, &lt;code&gt;circuit&lt;/code&gt;, &lt;code&gt;driverStanding&lt;/code&gt;, &lt;code&gt;teamStanding&lt;/code&gt;, &lt;code&gt;quizQuestion&lt;/code&gt;, &lt;code&gt;quizRun&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context endpoints:&lt;/strong&gt; &lt;code&gt;pit-wall-data&lt;/code&gt; (GROQ mode), &lt;code&gt;pit-wall-rules&lt;/code&gt; (Knowledge Base "F1 rules for newcomers")&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Over to you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you follow F1, play a race you watched and tell me which question felt wrong.&lt;/li&gt;
&lt;li&gt;If you're new, which F1 term confused you first? I'll add it to the Knowledge Base so the race engineer can explain it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a CLI That Remembers What I Was Working On (So I Don't Have To)</title>
      <dc:creator>Hem Bahadur Pun</dc:creator>
      <pubDate>Sat, 14 Feb 2026 19:39:27 +0000</pubDate>
      <link>https://dev.to/hempun10/i-built-a-cli-that-remembers-what-i-was-working-on-so-i-dont-have-to-4p1j</link>
      <guid>https://dev.to/hempun10/i-built-a-cli-that-remembers-what-i-was-working-on-so-i-dont-have-to-4p1j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every Sunday morning, same story. Standup starts, someone asks "what did you work on last week?" and I'm sitting there scrolling through my git log trying to reconstruct what I did three days ago. Then my manager asks for a weekly summary. Then I need a PR description. Then I switch branches and completely forget what I was doing before lunch.&lt;/p&gt;

&lt;p&gt;I was sick of it. So I built &lt;strong&gt;DevDaily AI&lt;/strong&gt; — a CLI tool that acts as your developer memory.&lt;/p&gt;

&lt;p&gt;One command, and it reads your git history, analyzes your commits, branches, diffs, PRs, ticket references — and generates a standup, a PR description, or a weekly summary. But the part I'm most proud of? It builds a &lt;strong&gt;persistent local journal&lt;/strong&gt; of your work. Every command you run, every branch you switch, every commit you make — DevDaily silently captures a snapshot. So when you come back on Monday morning and can't remember what you were doing Friday afternoon:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it tells you. Exactly where you left off. Which files you were editing. What branch you were on. What tickets you were working on.&lt;/p&gt;

&lt;p&gt;No cloud. No telemetry. Everything stays on your machine at &lt;code&gt;~/.config/devdaily/journal/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The interesting part — it's powered by GitHub Copilot CLI
&lt;/h3&gt;

&lt;p&gt;DevDaily doesn't call OpenAI or Anthropic APIs directly. All the AI generation is delegated to &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt;. And here's why that matters — Copilot CLI isn't just one model. It's a &lt;strong&gt;multi-model agentic platform&lt;/strong&gt;. It defaults to Claude Sonnet 4.5, but you can switch to Claude Sonnet 4, GPT-5, or whatever model GitHub adds next — all through your existing GitHub account. No separate API keys, no vendor SDKs, no billing headaches. One integration, multiple AI vendors.&lt;/p&gt;

&lt;p&gt;DevDaily calls it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Given these 14 commits across 3 branches, generate a standup report..."&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--no-ask-user&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; claude-sonnet-4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The &lt;code&gt;--silent&lt;/code&gt; and &lt;code&gt;--no-ask-user&lt;/code&gt; flags let DevDaily use Copilot CLI as a headless AI backend. Users can swap models with a single flag change. And when GitHub adds new models to Copilot CLI, DevDaily gets them for free — zero code changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I focused on for this challenge
&lt;/h3&gt;

&lt;p&gt;The core features (standup, PR, weekly) already existed, but during this challenge I built out the pieces that make DevDaily actually useful day-to-day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot hooks&lt;/strong&gt; — Opt-in &lt;code&gt;post-commit&lt;/code&gt; and &lt;code&gt;post-checkout&lt;/code&gt; git hooks that silently capture work snapshots. Install with &lt;code&gt;devdaily init --git-hooks&lt;/code&gt;, forget about it, and your journal fills up automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipboard integration fix&lt;/strong&gt; — The &lt;code&gt;--format&lt;/code&gt; flag was broken. It was accepted but never applied — clipboard always copied raw markdown. Fixed the formatter pipeline so &lt;code&gt;--format slack&lt;/code&gt; actually converts to Slack mrkdwn before copying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output formatter&lt;/strong&gt; — Proper conversion between markdown, plain text, Slack mrkdwn, and structured JSON. The Slack converter was tricky — you need to convert &lt;code&gt;**bold**&lt;/code&gt; to &lt;code&gt;*bold*&lt;/code&gt; without eating &lt;code&gt;*italic*&lt;/code&gt;, so I built a Unicode placeholder system that protects code blocks during transformation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook notifications&lt;/strong&gt; — &lt;code&gt;devdaily standup --send&lt;/code&gt; pushes your standup to Slack or Discord. Plus &lt;code&gt;--test-webhook&lt;/code&gt; to validate your setup without spamming the channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;724 tests&lt;/strong&gt; — Comprehensive test suite covering everything from hook installation idempotency to formatter edge cases.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/hempun10/devdaily" rel="noopener noreferrer"&gt;github.com/hempun10/devdaily&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npm install -g devdaily-ai&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Setup — &lt;code&gt;devdaily init&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;First time? The interactive wizard gets you going in under a minute. It sets up your shell alias (&lt;code&gt;dd&lt;/code&gt;), tab completions, notification webhooks, and git hooks — all in one flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It asks what you want to configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dd&lt;/code&gt; shell alias (so &lt;code&gt;dd standup&lt;/code&gt; works)&lt;/li&gt;
&lt;li&gt;Shell completions (tab-complete all commands)&lt;/li&gt;
&lt;li&gt;Slack/Discord webhook setup&lt;/li&gt;
&lt;li&gt;Git hooks for auto-snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick what you need, skip what you don't. You can always come back with &lt;code&gt;devdaily init --notifications&lt;/code&gt; or &lt;code&gt;devdaily init --git-hooks&lt;/code&gt; to set up individual pieces later.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Check
&lt;/h3&gt;

&lt;p&gt;First thing after install — &lt;code&gt;devdaily doctor&lt;/code&gt; makes sure everything is set up, including &lt;strong&gt;Copilot CLI&lt;/strong&gt;:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F6ehgrpsco8ce3jsy8o3f.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.amazonaws.com%2Fuploads%2Farticles%2F6ehgrpsco8ce3jsy8o3f.png" alt="devdaily standup output" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Standup Generation — &lt;code&gt;devdaily standup&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The bread and butter. One command, your entire standup, copied to clipboard:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F10ttun44rbo72tc2uitl.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.amazonaws.com%2Fuploads%2Farticles%2F10ttun44rbo72tc2uitl.png" alt=" " width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Need the last 3 days? &lt;code&gt;devdaily standup --days 3&lt;/code&gt;. Working on a specific ticket? &lt;code&gt;devdaily standup --ticket PROJ-123&lt;/code&gt; pulls in the ticket context from your PM tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Format Options — The Fix That Matters
&lt;/h3&gt;

&lt;p&gt;Before this challenge, &lt;code&gt;--format slack&lt;/code&gt; was silently ignored. Now it actually works — and the formatted version is what gets copied to your clipboard.&lt;br&gt;
&lt;code&gt;devdaily standup --format slack&lt;/code&gt; gives you Slack-ready mrkdwn — headers become bold, lists become bullets, and markdown syntax is properly converted:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F1k8hi1zk1ozga1aa5w73.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.amazonaws.com%2Fuploads%2Farticles%2F1k8hi1zk1ozga1aa5w73.png" alt="Standup generated with slack format" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's what it looks like when it actually lands in Slack:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F5w60mu8vw7auw9weunw3.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.amazonaws.com%2Fuploads%2Farticles%2F5w60mu8vw7auw9weunw3.png" alt="Formatted standup in slack" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;devdaily standup --format json&lt;/code&gt; gives you structured data — perfect for piping into dashboards or automation scripts:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fm24ckuf8o3qlc3yrzlb6.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.amazonaws.com%2Fuploads%2Farticles%2Fm24ckuf8o3qlc3yrzlb6.png" alt="devdaily standup JSON format output" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;--format plain&lt;/code&gt; strips all markdown for clean paste into emails or chat.&lt;/p&gt;
&lt;h3&gt;
  
  
  Webhook Notifications — &lt;code&gt;devdaily standup --send&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Don't want to paste your standup manually? Just send it directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily standup &lt;span class="nt"&gt;--send&lt;/span&gt;       &lt;span class="c"&gt;# Sends to all configured channels&lt;/span&gt;
devdaily standup &lt;span class="nt"&gt;--slack&lt;/span&gt;      &lt;span class="c"&gt;# Slack only&lt;/span&gt;
devdaily standup &lt;span class="nt"&gt;--discord&lt;/span&gt;    &lt;span class="c"&gt;# Discord only&lt;/span&gt;
devdaily standup &lt;span class="nt"&gt;--test-webhook&lt;/span&gt;  &lt;span class="c"&gt;# Test your setup without spamming&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DevDaily formats the payload specifically for each platform — Slack gets proper &lt;code&gt;mrkdwn&lt;/code&gt; blocks with headers, dividers, and ticket links. Discord gets rich embeds with color-coded types (green for standups, blue for PRs, purple for weekly summaries). Set up your webhooks once with &lt;code&gt;devdaily init --notifications&lt;/code&gt; and forget about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Recovery — &lt;code&gt;devdaily context&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is the feature that started the whole project. You come back from lunch, a meeting, or a weekend, and you have no idea what you were doing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily context              &lt;span class="c"&gt;# Where did I leave off?&lt;/span&gt;
devdaily context &lt;span class="nt"&gt;--ai&lt;/span&gt;         &lt;span class="c"&gt;# AI-powered summary of your recent work&lt;/span&gt;
devdaily context &lt;span class="nt"&gt;--branches&lt;/span&gt;   &lt;span class="c"&gt;# Show all active branches and their status&lt;/span&gt;
devdaily context &lt;span class="nt"&gt;--all-projects&lt;/span&gt;  &lt;span class="c"&gt;# Context across all your repos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It pulls from your local journal — every snapshot captured by your git hooks, every standup you ran, every PR you generated — and reconstructs what you were doing. Add &lt;code&gt;--ai&lt;/code&gt; and Copilot CLI generates a natural language summary: "You were in the middle of refactoring the auth middleware. Your last commit touched &lt;code&gt;src/services/auth.ts&lt;/code&gt; and you had an open PR against &lt;code&gt;develop&lt;/code&gt;."&lt;/p&gt;

&lt;h3&gt;
  
  
  Work Search — &lt;code&gt;devdaily recall&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;"When did I last touch the auth code?" — a question I used to answer by grepping through git logs. Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily recall &lt;span class="s2"&gt;"auth"&lt;/span&gt;                &lt;span class="c"&gt;# Search by keyword&lt;/span&gt;
devdaily recall &lt;span class="nt"&gt;--file&lt;/span&gt; src/auth.ts    &lt;span class="c"&gt;# When was this file changed?&lt;/span&gt;
devdaily recall &lt;span class="nt"&gt;--tag&lt;/span&gt; feature         &lt;span class="c"&gt;# Find snapshots tagged "feature"&lt;/span&gt;
devdaily recall PROJ-123              &lt;span class="c"&gt;# Find all work related to a ticket&lt;/span&gt;
devdaily recall login &lt;span class="nt"&gt;--ai&lt;/span&gt;            &lt;span class="c"&gt;# AI summary of search results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It fuzzy-searches across commit messages, branch names, notes, and tags in your journal. Add &lt;code&gt;--ai&lt;/code&gt; and Copilot CLI summarizes the results: "You worked on auth-related code across 3 sessions over the last 2 weeks, primarily in &lt;code&gt;src/services/auth.ts&lt;/code&gt; and &lt;code&gt;src/middleware/rate-limit.ts&lt;/code&gt;."&lt;/p&gt;

&lt;h3&gt;
  
  
  Snapshot Journal — The Memory
&lt;/h3&gt;

&lt;p&gt;This is the feature I'm most proud of. &lt;code&gt;devdaily snapshot --list&lt;/code&gt; shows your work timeline — every commit, branch switch, and PR captured automatically:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Femfqhuqbqlex3qngc6yz.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.amazonaws.com%2Fuploads%2Farticles%2Femfqhuqbqlex3qngc6yz.png" alt="devdaily snapshot list output" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;devdaily snapshot --stats&lt;/code&gt; to see your journal health:&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F2h6cbmrtey3djondn5l8.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.amazonaws.com%2Fuploads%2Farticles%2F2h6cbmrtey3djondn5l8.png" alt="devdaily snapshot stats output" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also manually capture snapshots with notes and tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily snapshot &lt;span class="nt"&gt;--note&lt;/span&gt; &lt;span class="s2"&gt;"before big refactor"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt; release
devdaily snapshot &lt;span class="nt"&gt;--light&lt;/span&gt;    &lt;span class="c"&gt;# Quick capture, no PR/ticket fetch&lt;/span&gt;
devdaily snapshot &lt;span class="nt"&gt;--prune&lt;/span&gt; 90 &lt;span class="c"&gt;# Clean up entries older than 90 days&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PR Generation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;devdaily pr&lt;/code&gt; auto-detects your PR template (&lt;code&gt;.github/PULL_REQUEST_TEMPLATE.md&lt;/code&gt;), analyzes the diff, and generates the whole thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily &lt;span class="nb"&gt;pr&lt;/span&gt;                   &lt;span class="c"&gt;# Generate + interactive menu&lt;/span&gt;
devdaily &lt;span class="nb"&gt;pr&lt;/span&gt; &lt;span class="nt"&gt;--create&lt;/span&gt;          &lt;span class="c"&gt;# Create PR directly on GitHub&lt;/span&gt;
devdaily &lt;span class="nb"&gt;pr&lt;/span&gt; &lt;span class="nt"&gt;--draft&lt;/span&gt;           &lt;span class="c"&gt;# Create as draft&lt;/span&gt;
devdaily &lt;span class="nb"&gt;pr&lt;/span&gt; &lt;span class="nt"&gt;--interactive&lt;/span&gt;     &lt;span class="c"&gt;# Pick labels, reviewers, assignees&lt;/span&gt;
devdaily &lt;span class="nb"&gt;pr&lt;/span&gt; &lt;span class="nt"&gt;--ticket&lt;/span&gt; PROJ-456 &lt;span class="c"&gt;# Include ticket context in description&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It detects the PR type from your commits (feature, bugfix, breaking change), generates a conventional commit title, links related issues, and gives you an interactive menu: copy to clipboard, create on GitHub, create as draft, or configure labels and reviewers.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F28pekkgwmf4q4zhzi3gy.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.amazonaws.com%2Fuploads%2Farticles%2F28pekkgwmf4q4zhzi3gy.png" alt=" " width="800" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F3v1m3jbkpoz9abf8nam7.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.amazonaws.com%2Fuploads%2Farticles%2F3v1m3jbkpoz9abf8nam7.png" alt=" " width="800" height="858"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F1i95d2a8uwslsla6n7rv.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.amazonaws.com%2Fuploads%2Farticles%2F1i95d2a8uwslsla6n7rv.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Weekly Summary — &lt;code&gt;devdaily week&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Every Friday (or whenever your manager asks):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily week                 &lt;span class="c"&gt;# This week's summary&lt;/span&gt;
devdaily week &lt;span class="nt"&gt;--last&lt;/span&gt;          &lt;span class="c"&gt;# Last week&lt;/span&gt;
devdaily week &lt;span class="nt"&gt;--all-projects&lt;/span&gt;  &lt;span class="c"&gt;# Cross-project summary from your journal&lt;/span&gt;
devdaily week &lt;span class="nt"&gt;--save&lt;/span&gt;          &lt;span class="c"&gt;# Save to journal for future reference&lt;/span&gt;
devdaily week &lt;span class="nt"&gt;--json&lt;/span&gt;          &lt;span class="c"&gt;# Machine-readable stats&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--all-projects&lt;/code&gt; flag is where the journal really shines — it pulls snapshots from every repo you've worked in and generates one unified weekly summary. No more scrambling across repos trying to remember what you shipped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Management Integration — &lt;code&gt;devdaily connect&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;DevDaily integrates with &lt;strong&gt;GitHub Issues&lt;/strong&gt;, &lt;strong&gt;Jira&lt;/strong&gt;, and &lt;strong&gt;Linear&lt;/strong&gt;. Connect your PM tool once, and standups, PRs, and weekly summaries automatically pull in ticket context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily connect              &lt;span class="c"&gt;# Interactive setup&lt;/span&gt;
devdaily connect &lt;span class="nt"&gt;--test&lt;/span&gt;       &lt;span class="c"&gt;# Verify your connection works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It shows credential status, tests the connection, and verifies it can fetch tickets. Once connected, DevDaily extracts ticket IDs from your commit messages and branch names (&lt;code&gt;PROJ-123&lt;/code&gt;, &lt;code&gt;#42&lt;/code&gt;, &lt;code&gt;LINEAR-456&lt;/code&gt;), fetches the ticket details, and includes them in your AI-generated output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration — Global + Project Level
&lt;/h3&gt;

&lt;p&gt;DevDaily has a layered config system. Global config lives at &lt;code&gt;~/.config/devdaily/config.json&lt;/code&gt;, project config lives at &lt;code&gt;.devdaily.json&lt;/code&gt; in your repo root. Project config overrides global — so you can have different settings per repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;devdaily config &lt;span class="nt"&gt;--show&lt;/span&gt;        &lt;span class="c"&gt;# See current merged configuration&lt;/span&gt;
devdaily config &lt;span class="nt"&gt;--edit&lt;/span&gt;        &lt;span class="c"&gt;# Open in your editor&lt;/span&gt;
devdaily config &lt;span class="nt"&gt;--path&lt;/span&gt;        &lt;span class="c"&gt;# Show config file locations&lt;/span&gt;
devdaily config &lt;span class="nt"&gt;--reset&lt;/span&gt;       &lt;span class="c"&gt;# Reset to defaults&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The config file has JSON Schema support (&lt;code&gt;$schema&lt;/code&gt; field), so you get autocompletion and validation in VS Code or any editor that supports it. You can configure everything — output format, default branch, standup sections, PR defaults (reviewers, labels, assignees), notification webhooks, theming, keyboard shortcuts, and more.&lt;/p&gt;

&lt;p&gt;Here's a taste of what &lt;code&gt;.devdaily.json&lt;/code&gt; looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://raw.githubusercontent.com/hempun10/devdaily/main/schemas/devdaily.schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"copyToClipboard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"standup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"defaultDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in-progress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blockers"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"defaultBase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"autoLabels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"titleFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conventional"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"slack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"discord"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectManagement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;I used GitHub Copilot CLI to build this entire project, and I also built DevDaily to use Copilot CLI under the hood. So I got to experience it from both sides — as a developer using it to code, and as a tool author integrating with it programmatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Copilot CLI to build DevDaily
&lt;/h3&gt;

&lt;p&gt;The thing that surprised me most was how good Copilot CLI is at &lt;strong&gt;understanding existing codebases&lt;/strong&gt;. I could just launch &lt;code&gt;copilot&lt;/code&gt; in my project directory and say "the --format flag on the standup command isn't working, the output is always raw markdown even when I pass --format slack" — and it would read through my source files, trace the execution path through the command handler, and come back with: "The formatter is never called before the clipboard copy. You need to apply &lt;code&gt;formatOutput()&lt;/code&gt; before passing the text to &lt;code&gt;clipboardy&lt;/code&gt;."&lt;/p&gt;

&lt;p&gt;That's not autocomplete. That's actual debugging.&lt;/p&gt;

&lt;p&gt;Here are the specific moments where Copilot CLI made a real difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Slack formatter regex problem.&lt;/strong&gt; Converting markdown to Slack mrkdwn sounds simple until you realize that markdown uses &lt;code&gt;**text**&lt;/code&gt; for bold and &lt;code&gt;*text*&lt;/code&gt; for italic, while Slack uses &lt;code&gt;*text*&lt;/code&gt; for bold and &lt;code&gt;_text_&lt;/code&gt; for italic. If you naively convert &lt;code&gt;**bold**&lt;/code&gt; → &lt;code&gt;*bold*&lt;/code&gt;, you'll break any &lt;code&gt;*italic*&lt;/code&gt; text in the same document. I described this edge case to Copilot CLI and it suggested the Unicode placeholder approach — stash code blocks and inline code using private-use-area characters (&lt;code&gt;\uE000&lt;/code&gt;, &lt;code&gt;\uE001&lt;/code&gt;) before running the bold/italic conversions, then restore them after. It worked perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git hook portability.&lt;/strong&gt; The auto-snapshot hooks needed to be POSIX-compatible (&lt;code&gt;#!/bin/sh&lt;/code&gt;, not &lt;code&gt;#!/bin/bash&lt;/code&gt;), run the snapshot in the background so they don't slow down commits, and append to existing hooks instead of overwriting them. I was going back and forth on the right approach and Copilot CLI helped me think through the edge cases — what if the user already has a &lt;code&gt;post-commit&lt;/code&gt; hook? What if they install twice? What if they remove hooks but there's other content in the file? The resulting implementation handles all of these cleanly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test scaffolding.&lt;/strong&gt; 724 tests is a lot. Copilot CLI was incredibly helpful for scaffolding the repetitive parts — especially the hook installation tests where I needed to cover idempotency, concurrent installations, force overwrite, appending to existing hooks, and clean removal. I'd describe the scenario, it would generate the test structure, and I'd refine the assertions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source cleanup.&lt;/strong&gt; Before publishing, I asked Copilot CLI to audit the repo for anything that shouldn't be public — hardcoded paths, internal docs, personal information. It went through every file and flagged things I would have missed.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I love about Copilot CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Multi-model flexibility.&lt;/strong&gt; Copilot CLI isn't locked to one AI vendor. It defaults to Claude Sonnet 4.5, but you can switch to Claude Sonnet 4, GPT-5, or other models with &lt;code&gt;/model&lt;/code&gt; or &lt;code&gt;--model&lt;/code&gt;. Different models have different strengths — I found myself switching models depending on the task. That flexibility is something you don't get when you're locked into a single vendor's API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic capabilities.&lt;/strong&gt; This isn't just prompt-in, response-out. Copilot CLI can read files, edit code, run shell commands, create GitHub issues — it's a full coding agent in the terminal. When I asked it to "add error handling to the webhook notification flow," it read the existing code, identified the gaps, wrote the try/catch blocks, and even added the corresponding test cases. All from one prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staying in the terminal.&lt;/strong&gt; I'm a CLI person. Having an AI coding agent that lives where I already work — no browser tab, no VS Code sidebar, just my terminal — felt natural. I could go from writing code to asking Copilot CLI a question and back without any context switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP extensibility.&lt;/strong&gt; Copilot CLI ships with GitHub's MCP server built in, so it already knows how to work with my repos, issues, and PRs. When I told it to create issues for the remaining work items, it created them directly on my GitHub project board. No copy-pasting, no switching to the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  The meta moment
&lt;/h3&gt;

&lt;p&gt;There's something satisfying about using Copilot CLI to build a tool that wraps Copilot CLI. DevDaily calls &lt;code&gt;copilot -p &amp;lt;prompt&amp;gt; --silent --no-ask-user&lt;/code&gt; to generate standups and PR descriptions — it uses Copilot CLI as a headless, multi-model AI backend. And the tool itself was built with Copilot CLI as my development partner.&lt;/p&gt;

&lt;p&gt;Would I have been able to build DevDaily without Copilot CLI? Sure. Would I have shipped this much — snapshot hooks, formatter pipeline, clipboard fix, webhook integration, 724 tests, open-source prep — in the same timeframe? Not a chance. Copilot CLI didn't just speed things up; it caught bugs I would have missed and thought through edge cases I hadn't considered.&lt;/p&gt;




&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/hempun10/devdaily" rel="noopener noreferrer"&gt;github.com/hempun10/devdaily&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;npm install -g devdaily-ai&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;p&gt;TypeScript · Node.js · GitHub Copilot CLI · Commander.js · simple-git · clipboardy · Zod · Vitest · tsup · GitHub Actions&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>From Extra Syllabus to Career</title>
      <dc:creator>Hem Bahadur Pun</dc:creator>
      <pubDate>Mon, 13 May 2024 14:22:08 +0000</pubDate>
      <link>https://dev.to/hempun10/journey-from-novice-to-explorer-35m7</link>
      <guid>https://dev.to/hempun10/journey-from-novice-to-explorer-35m7</guid>
      <description>&lt;p&gt;I still remember the day it was 19th of July 2022 I learned about Web Development (HTML, CSS) in my college at high school. I was majoring in commerce then, and computer science was an extra syllabus added by our high school. But for me, this extra subject was my favorite. Then, Like everyone, I started researching the web development of this topic on YouTube. &lt;/p&gt;

&lt;p&gt;At that time there weren't as many tutors on youtube talking about web dev. But from somewhere I got to land on the channel named &lt;a href="https://www.codewithharry.com/" rel="noopener noreferrer"&gt;Code with Harry&lt;/a&gt; as I was from Nepal Hindi language was of little use to me. So, I started learning about web development from his &lt;a href="https://www.codewithharry.com/videos/web-development-in-hindi-1/" rel="noopener noreferrer"&gt;playlist&lt;/a&gt;. His teaching style was super fun and the way he used to clear the concept.&lt;/p&gt;

&lt;p&gt;As I was going at a good pace. Then my high school board examination was waiting for me 😌. Due to the pressure of the examination, I got distracted and all the topics were fussed from my mind.&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fkho10gqfr3n5xx3287xf.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.amazonaws.com%2Fuploads%2Farticles%2Fkho10gqfr3n5xx3287xf.png" alt="😂" width="640" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After around 4 months from nowhere. Again, I got the motivation to start the journey again. Then, I rejoined the playlist. Then, after around 2 months I got a bit of confidence in topics like HTML, CSS, and Internet stuff. Then built some projects &lt;a href="https://hempun10.github.io/htmlrevisioncv/" rel="noopener noreferrer"&gt;CV&lt;/a&gt;, &lt;a href="https://hempun10.github.io/foxdesignnp/index.html" rel="noopener noreferrer"&gt;Course Landing Page&lt;/a&gt;, &lt;a href="https://hempun10.github.io/hostinger_redesign/" rel="noopener noreferrer"&gt;Hostinger Landing Page Clone&lt;/a&gt;. I think I lost a lot of my time learning CSS which was my second mistake. After that, I started learning about JS again from Harry Bhai. As I don't have any prior knowledge of programming at that time. It usually, takes a bit more time to catch the concepts. At that time I learned about many CS kinds of stuff and programming concepts like types of Programming Paradigms, Classes, Functions, Objects, Arrays, Variables, Loops, etc. &lt;br&gt;
Then I started building some projects from YT &lt;a href="https://quote-generator-tweet.netlify.app/" rel="noopener noreferrer"&gt;Quote Generator&lt;/a&gt;, &lt;a href="https://hempun10.github.io/BookMark-Kepper/" rel="noopener noreferrer"&gt;Book Mark Keeper&lt;/a&gt;, &lt;a href="https://hempun10.github.io/Music-Player/" rel="noopener noreferrer"&gt;Music Player&lt;/a&gt;, &lt;a href="https://hempun10.github.io/Joke_Teller/" rel="noopener noreferrer"&gt;Joke Teller&lt;/a&gt; &lt;br&gt;
By building these projects I feel a bit comfortable with javascript.&lt;/p&gt;

&lt;p&gt;At that time I had also enrolled for my Bachelor's Degree in Computer science side-wise I was constantly learning and expiring the stuff. There comes my third mistake being stuck in tutorial hell. Then, I decided to build some projects on my own and I accomplished &lt;a href="https://hempun10.github.io/Video-player/" rel="noopener noreferrer"&gt;Video Player&lt;/a&gt;, &lt;a href="https://hempun10.github.io/form-Validator/" rel="noopener noreferrer"&gt;Form Validator&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Then, I was looking to be involved in some real-world project, and coincidently. At the end of the first semester, I got a chance to intern as a front-end developer through my college coding program. On day one, I felt like like I didn't know anything they asked me about do I know swagger, redux, react query, and many more? I felt literally what are they talking about. I just had a basic knowledge of React JS. Then, they asked me to research about the terms they just asked me and I opened YouTube a typed How to....? Then one of the senior devs of that organization told me I should try to read docs, and blogs more rather than Youtube. After around 2 weeks I started getting what they asked me about and I also started involving in their projects. Some projects I was involved in were in &lt;a href="https://www.thriftstorenepal.com/" rel="noopener noreferrer"&gt;Thrif Store Nepal&lt;/a&gt;, and &lt;a href="https://everestbilling.com/" rel="noopener noreferrer"&gt;Billing Software&lt;/a&gt;. It has been a quite tough and fun journey up to now. From an extra syllabus to a career and passion for it. &lt;/p&gt;

&lt;p&gt;Summary&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistency is the key&lt;/li&gt;
&lt;li&gt;Don't get stuck into tutorial hell.&lt;/li&gt;
&lt;li&gt;Try a project-based learning approach.&lt;/li&gt;
&lt;li&gt;Make basic strong.&lt;/li&gt;
&lt;li&gt;If you want to grow don't stop learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: The above was my journey and learnings all the above words are from my mistakes and learnings.&lt;/p&gt;

&lt;p&gt;Looking for your feedback, Happy Learning 🙏🏻 &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>journey</category>
      <category>beginners</category>
      <category>passion</category>
    </item>
  </channel>
</rss>
