<?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: Daniel Akudbilla</title>
    <description>The latest articles on DEV Community by Daniel Akudbilla (@daniel_akudbilla_999ccff6).</description>
    <link>https://dev.to/daniel_akudbilla_999ccff6</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%2F2909057%2F3d781239-62a1-4645-8613-7b48547ed190.jpg</url>
      <title>DEV Community: Daniel Akudbilla</title>
      <link>https://dev.to/daniel_akudbilla_999ccff6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daniel_akudbilla_999ccff6"/>
    <language>en</language>
    <item>
      <title>I Built an AI Agent to Check the Weather. It Was Gloriously Unnecessary.</title>
      <dc:creator>Daniel Akudbilla</dc:creator>
      <pubDate>Sat, 04 Jul 2026 18:41:37 +0000</pubDate>
      <link>https://dev.to/daniel_akudbilla_999ccff6/i-built-an-ai-agent-to-check-the-weather-it-was-gloriously-unnecessary-53i9</link>
      <guid>https://dev.to/daniel_akudbilla_999ccff6/i-built-an-ai-agent-to-check-the-weather-it-was-gloriously-unnecessary-53i9</guid>
      <description>&lt;p&gt;Let me get the confession out of the way early: I built an AI agent that, given a city name, tells you about the place and then checks the weather.&lt;/p&gt;

&lt;p&gt;You know what already checks the weather? A weather API. One &lt;code&gt;fetch&lt;/code&gt;. No model, no tokens, no monthly bill with the word "usage" in it. I knew this the whole time I was building. Built the agent anyway.&lt;/p&gt;

&lt;p&gt;Here's the story of that, and a small argument for why doing the unnecessary thing was actually the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the thing does
&lt;/h2&gt;

&lt;p&gt;It's called the Travel &amp;amp; Weather Guide. You type in a city Lisbon, Kyoto, wherever and it gives you back four things: a couple of sentences on what the place is known for, the live weather right now, what people tend to do there this time of year, and a straight verdict on whether now is a good time to visit.&lt;/p&gt;

&lt;p&gt;It runs two ways. A web page with a search box:&lt;/p&gt;

&lt;p&gt;The Travel &amp;amp; Weather Guide web UI:&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%2Fd2ztpfy1gs7log7pkxn6.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%2Fd2ztpfy1gs7log7pkxn6.png" alt="Web UI of the travel and weather guide" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And a terminal version, for when you want to feel like a hacker while asking about the weather in Bali:&lt;/p&gt;

&lt;p&gt;The CLI starting up, printing "Travel &amp;amp; Weather Guide (type exit to quit)" and prompting for a city name]&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%2Fxjtznhw8amcuptqntytq.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%2Fxjtznhw8amcuptqntytq.png" alt="CLI for the travel and weather guide" width="799" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both talk to the same agent underneath. The weather itself comes from &lt;a href="https://open-meteo.com/" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;, which is free and needs no key. The "thinking" comes from a model via the &lt;a href="https://github.com/openai/openai-agents-js" rel="noopener noreferrer"&gt;OpenAI Agents SDK&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works (spoiler: not MCP)
&lt;/h2&gt;

&lt;p&gt;The interesting part is how the model gets the weather, because it doesn't. The model can't make an HTTP request or run code, it can only generate text. So instead of fetching anything itself, it asks an internal &lt;em&gt;tool&lt;/em&gt; to do it, and waits for the answer.&lt;br&gt;
In the SDK that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;getWeather&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fetch current weather for a given city using Open-Meteo.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The city or town name to check weather for&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="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// geocode the city, then hit the forecast endpoint&lt;/span&gt;
    &lt;span class="c1"&gt;// ...return "Lisbon, Portugal: 24°C, wind 12 km/h"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;tool()&lt;/code&gt; wrapper turns my Zod schema into a description the model can read. So now the model &lt;em&gt;knows&lt;/em&gt; a &lt;code&gt;get_weather(city)&lt;/code&gt; function exists — but it can't run it. It can only ask.&lt;/p&gt;

&lt;p&gt;The loop goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You ask about Lisbon.&lt;/li&gt;
&lt;li&gt;The model thinks, "I need weather data," and emits a structured tool call: &lt;code&gt;get_weather({ city: "Lisbon" })&lt;/code&gt;. No code has run yet. That's just the model raising its hand.&lt;/li&gt;
&lt;li&gt;The SDK's runner sees the request, runs my actual JavaScript function locally, and that function makes the plain &lt;code&gt;fetch&lt;/code&gt; to Open-Meteo.&lt;/li&gt;
&lt;li&gt;The result gets handed back to the model.&lt;/li&gt;
&lt;li&gt;The model writes the final answer using that data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;People sometimes assume this is MCP. It isn't. MCP is for tools that live in a &lt;em&gt;separate&lt;/em&gt; server you connect to over a protocol. This tool is just a function in my own process. The model requests, my code runs, the result goes back. All in-memory, one repo, no protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable part
&lt;/h2&gt;

&lt;p&gt;Look at that loop again. To tell you it's 24°C in Lisbon, the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sends the full conversation and tool definitions to a model,&lt;/li&gt;
&lt;li&gt;waits for the model to decide it wants the weather,&lt;/li&gt;
&lt;li&gt;runs the &lt;code&gt;fetch&lt;/code&gt; I could have run in the first place,&lt;/li&gt;
&lt;li&gt;sends everything &lt;em&gt;back&lt;/em&gt; to the model,&lt;/li&gt;
&lt;li&gt;waits again while it writes a paragraph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two model round-trips and a pile of tokens, wrapped around a single HTTP call that a first-week bootcamp student could write. The &lt;code&gt;fetch&lt;/code&gt; was always the easy part. I built a very expensive middle manager to decide when to make it.&lt;/p&gt;

&lt;p&gt;And here's the thing: this isn't just my weird little project. It's the whole moment we're in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything is becoming an agent now
&lt;/h2&gt;

&lt;p&gt;There's a quiet shift happening. A lot of things that used to be a function call, a cron job, or an &lt;code&gt;if&lt;/code&gt; statement are being rebuilt as agents. Not because the old way stopped working. The old way is fast and basically free. It's just that "agent" is the shape everything wants to be right now.&lt;/p&gt;

&lt;p&gt;Some of that is genuinely good. When a task is fuzzy, open-ended, needs judgment, or strings together tools in ways you can't predict up front, an agent earns its tokens. That's the real use case, and it's legitimately new.&lt;/p&gt;

&lt;p&gt;But a lot of it is us wrapping perfectly deterministic problems in a probabilistic, token-metered layer because it &lt;em&gt;feels&lt;/em&gt; like the future. We took things that were already solved and made them "smart," which mostly means slower, pricier, and occasionally confidently wrong about the weather. The wins are real. So is the tax. Both things are true at the same time, and nobody wants to say the second one out loud.&lt;/p&gt;

&lt;p&gt;My weather agent is a tiny, honest monument to that tax. It is a &lt;code&gt;fetch&lt;/code&gt; cosplaying as artificial intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  So why did I build it?
&lt;/h2&gt;

&lt;p&gt;Not to solve a world problem. Let's be very clear. Nobody was out there suffering from a lack of AI-narrated weather. Climate change did not get one degree cooler because my agent can tell you it's warm in Lisbon.&lt;/p&gt;

&lt;p&gt;I built it because I did not want to be the guy who &lt;em&gt;talks&lt;/em&gt; about agents at parties without having actually built one. You know that guy. I refuse to become that guy.&lt;/p&gt;

&lt;p&gt;The agentic era is happening whether I have opinions about tokens or not.&lt;/p&gt;

&lt;p&gt;Turns out the best way to understand the expensive absurdity of the agentic era is to commit a small, cheerful act of it yourself.&lt;/p&gt;

&lt;p&gt;So no, you should not build an agent to check the weather. You should just call the API.&lt;/p&gt;

&lt;p&gt;I, however, have now called the API. Through an agent. On purpose. And I regret nothing, except slightly the tokens. Cheers&lt;/p&gt;




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

&lt;p&gt;The code is on GitHub: &lt;strong&gt;&lt;a href="https://github.com/Dakudbilla/openai-travel-weather-agent" rel="noopener noreferrer"&gt;Dakudbilla/openai-travel-weather-agent&lt;/a&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# clone and install&lt;/span&gt;
git clone https://github.com/Dakudbilla/openai-travel-weather-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;openai-travel-weather-agent
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# add your OpenAI key&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env      &lt;span class="c"&gt;# then paste your key into .env: OPENAI_API_KEY=sk-...&lt;/span&gt;

npm start                 &lt;span class="c"&gt;# web app → http://localhost:3000&lt;/span&gt;
npm run cli               &lt;span class="c"&gt;# or the terminal version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weather data is free (Open-Meteo, no key), so the only thing you'll pay for is the tokens.You can get a free openai account generate the API key for it. &lt;/p&gt;

&lt;p&gt;Happy Coding &lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>javascript</category>
      <category>openai</category>
    </item>
    <item>
      <title>How to Push to a Private GitHub Repository Using a Fine-Grained Personal Access Token</title>
      <dc:creator>Daniel Akudbilla</dc:creator>
      <pubDate>Sat, 29 Mar 2025 12:39:25 +0000</pubDate>
      <link>https://dev.to/daniel_akudbilla_999ccff6/how-to-push-to-a-private-github-repository-using-a-fine-grained-personal-access-token-39ll</link>
      <guid>https://dev.to/daniel_akudbilla_999ccff6/how-to-push-to-a-private-github-repository-using-a-fine-grained-personal-access-token-39ll</guid>
      <description>&lt;p&gt;If you have an existing local Git repository and need to push it to a &lt;strong&gt;private GitHub repository&lt;/strong&gt;, but GitHub is rejecting your credentials, you may need to use a &lt;strong&gt;fine-grained personal access token (PAT)&lt;/strong&gt;. This guide will walk you through the process step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Generate a Fine-Grained Personal Access Token (PAT)
&lt;/h2&gt;

&lt;p&gt;GitHub has moved away from password authentication for Git operations, so you must use a personal access token (PAT) instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.1 Navigate to GitHub Settings&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/settings/tokens" rel="noopener noreferrer"&gt;GitHub Personal Access Tokens&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"Generate new token (fine-grained)"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.2 Configure Token Permissions&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository Access:&lt;/strong&gt; Select the specific repository you want to push to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Under "Repository permissions," set &lt;strong&gt;"Read and Write"&lt;/strong&gt; access for "Contents."&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Expiration:&lt;/strong&gt; Choose an expiration date or select "No expiration" (not recommended for security reasons).&lt;/li&gt;

&lt;li&gt;Click &lt;strong&gt;"Generate token"&lt;/strong&gt; and &lt;strong&gt;copy&lt;/strong&gt; the token immediately (you won’t see it again).&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Set the Remote URL with the PAT
&lt;/h2&gt;

&lt;p&gt;Now, update your Git remote URL to authenticate using the token.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.1 Navigate to Your Local Repository&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Open a terminal and move to your project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/local/repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2.2 Update the Remote URL&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run the following command, replacing &lt;code&gt;{your-personal-token}&lt;/code&gt;, &lt;code&gt;{github_username}&lt;/code&gt;, and &lt;code&gt;{private-repo-name}&lt;/code&gt; accordingly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin https://&lt;span class="o"&gt;{&lt;/span&gt;your-personal-token&lt;span class="o"&gt;}&lt;/span&gt;@github.com/&lt;span class="o"&gt;{&lt;/span&gt;github_username&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;private-repo-name&lt;span class="o"&gt;}&lt;/span&gt;.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The token will be stored in your Git configuration. For security reasons, it’s best to use a Git credential manager instead of embedding it in the URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 3: Push Your Code to GitHub
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.1 Add and Commit Changes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you haven’t already committed your changes, do so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3.2 Push to the Private Repository&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now, push your code to GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is set up correctly, your repository should now be updated on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Verify Your Push
&lt;/h2&gt;

&lt;p&gt;Go to your GitHub repository and refresh the page. You should see your files successfully pushed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: Use a Credential Manager for Better Security
&lt;/h2&gt;

&lt;p&gt;Instead of storing your token in the remote URL, you can configure a credential manager to securely store and automatically use your token when needed.&lt;/p&gt;

&lt;p&gt;For macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git credential-osxkeychain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git credential-manager-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git credential-store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, configure Git to use the credential manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; credential.helper store
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, you won’t need to include your token in the remote URL manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By following these steps, you should be able to push to a private GitHub repository using a fine-grained personal access token. This method ensures secure authentication without exposing your GitHub password. Always remember to keep your access tokens safe and use GitHub's credential storage features for added security.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cloning a Private GitHub Repository Using HTTPS</title>
      <dc:creator>Daniel Akudbilla</dc:creator>
      <pubDate>Mon, 03 Mar 2025 20:52:56 +0000</pubDate>
      <link>https://dev.to/daniel_akudbilla_999ccff6/cloning-a-private-github-repository-using-https-3p4k</link>
      <guid>https://dev.to/daniel_akudbilla_999ccff6/cloning-a-private-github-repository-using-https-3p4k</guid>
      <description>&lt;p&gt;If you're here, you're either struggling to clone a private GitHub repository or simply trying to learn how. Let's dive straight into the solution.&lt;br&gt;
You have encountered this error&lt;br&gt;
&lt;code&gt;Cloning into 'repo_name'...&lt;br&gt;
remote: Write access to repository not granted.&lt;br&gt;
fatal: unable to access 'https://github.com/username/repo_name.git/': The requested URL returned error: 403&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Generate a Personal Access Token (PAT)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To clone a private repository using HTTPS, you need a &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt; instead of a password. Follow these steps to generate one:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Log in to GitHub&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and sign in to your account.&lt;/li&gt;
&lt;li&gt;Click on your profile picture in the top-right corner.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. Navigate to Developer Settings&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scroll down and click on &lt;strong&gt;Developer settings&lt;/strong&gt; (found in the left sidebar).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Personal access tokens&lt;/strong&gt;, select &lt;strong&gt;Fine-grained tokens&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate new token&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&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%2Fmrf7yqlcktj3jffgml3u.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%2Fmrf7yqlcktj3jffgml3u.png" alt="access token image" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3. Configure the Token&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name the token&lt;/strong&gt; (e.g., &lt;em&gt;GitHub Repo Access&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select the resource owner:&lt;/strong&gt; Choose your GitHub username (or your organization if cloning an organization repo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set an expiration date:&lt;/strong&gt; Choose an appropriate duration for security purposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository access:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;All repositories&lt;/strong&gt; (if you want access to all your repos).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommended:&lt;/strong&gt; Select only the specific repositories you need access to.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Repository permissions&lt;/strong&gt;, find &lt;strong&gt;Contents&lt;/strong&gt; and set it to &lt;strong&gt;Read and Write&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;Administration&lt;/strong&gt; and set it to &lt;strong&gt;Read and Write&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Grant additional permissions as needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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%2Fmdd5rnoqiixwdqxj2wsg.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%2Fmdd5rnoqiixwdqxj2wsg.png" alt="Permissions options to be selected" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. Generate and Copy the Token&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Generate Token&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important:&lt;/strong&gt; Copy the generated token and store it securely, as it will not be shown again.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Clone the Private Repository&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With your &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt; ready, follow these steps to clone your private repository:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Open Your Terminal&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, use &lt;strong&gt;Git Bash&lt;/strong&gt; or Command Prompt.&lt;br&gt;
On &lt;strong&gt;Mac/Linux&lt;/strong&gt;, use the Terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. Run the Clone Command&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use the following command to clone your repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://USERNAME:TOKEN@github.com/USERNAME/REPOSITORY_NAME.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Replace:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;USERNAME&lt;/code&gt; → Your GitHub username&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TOKEN&lt;/code&gt; → Your generated Personal Access Token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REPOSITORY_NAME&lt;/code&gt; → The name of your repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://johnDoe:ghp_ABC123xyz@github.com/johnDoe/my-private-repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is correct, your repository should start cloning successfully.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I personally struggled with this issue for a while and decided to share my findings after thorough research. I hope this guide helps you avoid the same frustration. If you found this useful, share it with others who might need it!&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Happy coding!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>git</category>
    </item>
  </channel>
</rss>
