<?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: Caelora</title>
    <description>The latest articles on DEV Community by Caelora (@caelora).</description>
    <link>https://dev.to/caelora</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%2F4044992%2Fb784496e-0cf3-4f6b-9a0c-e9b88691f08d.jpg</url>
      <title>DEV Community: Caelora</title>
      <link>https://dev.to/caelora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caelora"/>
    <language>en</language>
    <item>
      <title>What I Check Before Deploying a Website to Production</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Tue, 29 Sep 2026 02:53:28 +0000</pubDate>
      <link>https://dev.to/caelora/what-i-check-before-deploying-a-website-to-production-3b0f</link>
      <guid>https://dev.to/caelora/what-i-check-before-deploying-a-website-to-production-3b0f</guid>
      <description>&lt;h1&gt;
  
  
  What I Check Before Deploying a Website to Production
&lt;/h1&gt;

&lt;p&gt;Deploying a website can feel like the finish line.&lt;/p&gt;

&lt;p&gt;The code works.&lt;br&gt;
The pages look right.&lt;br&gt;
The buttons respond.&lt;br&gt;
The tests are passing.&lt;/p&gt;

&lt;p&gt;Then you deploy it and discover that something important was missed.&lt;/p&gt;

&lt;p&gt;Maybe an environment variable wasn't configured. Maybe the production database is using the wrong connection. Maybe a redirect is broken. Or maybe the website works perfectly on your machine but behaves differently on the server.&lt;/p&gt;

&lt;p&gt;Over time, I've found that a simple pre-deployment checklist can prevent a lot of unnecessary problems.&lt;/p&gt;

&lt;p&gt;Here are some of the things worth checking before pushing a website into production.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Check Environment Variables
&lt;/h2&gt;

&lt;p&gt;Never assume the production environment is identical to your local machine.&lt;/p&gt;

&lt;p&gt;Things like these should be checked before deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL
API_KEY
APP_URL
NODE_ENV
SECRET_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure production values are actually configured and that sensitive credentials aren't accidentally committed to Git.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;.env&lt;/code&gt; file sitting inside a repository is an easy mistake to make.&lt;/p&gt;

&lt;p&gt;Before committing, check:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It's also worth reviewing &lt;code&gt;.gitignore&lt;/code&gt; and making sure environment files are excluded when appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Test the Production Build
&lt;/h2&gt;

&lt;p&gt;A development environment can hide problems.&lt;/p&gt;

&lt;p&gt;For example, a JavaScript application may work perfectly with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but fail during the production build.&lt;/p&gt;

&lt;p&gt;Run the actual build process locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test the generated application as close to the production environment as possible.&lt;/p&gt;

&lt;p&gt;This can reveal issues involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing dependencies&lt;/li&gt;
&lt;li&gt;Invalid imports&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Build configuration&lt;/li&gt;
&lt;li&gt;Case-sensitive file paths&lt;/li&gt;
&lt;li&gt;Unused or incompatible packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finding these problems before deployment is much easier than finding them from a user's report.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Check Database Changes
&lt;/h2&gt;

&lt;p&gt;Database migrations deserve extra attention.&lt;/p&gt;

&lt;p&gt;If the application requires a new column, table, index, or constraint, make sure the migration is included in the deployment process.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application v1
    ↓
Database v1

Application v2
    ↓
Database v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploying the new application without applying the corresponding database changes can cause unexpected errors.&lt;/p&gt;

&lt;p&gt;It's also important to think about backwards compatibility.&lt;/p&gt;

&lt;p&gt;During a deployment, there may be a short period where old application code and new database structures interact.&lt;/p&gt;

&lt;p&gt;A migration strategy should account for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Don't Forget Error Handling
&lt;/h2&gt;

&lt;p&gt;Users shouldn't see raw exceptions or database errors.&lt;/p&gt;

&lt;p&gt;Instead of exposing something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQLSTATE[HY000]: General error...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the application should provide a useful response while logging the technical details internally.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Something went wrong.

Please try again in a few moments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the same time, developers should still have enough information in the logs to diagnose the actual problem.&lt;/p&gt;

&lt;p&gt;Good error handling has two audiences:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Users need clarity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers need details.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those don't have to be the same message.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check Logs
&lt;/h2&gt;

&lt;p&gt;A deployment isn't finished just because the server says it succeeded.&lt;/p&gt;

&lt;p&gt;Check the logs afterward.&lt;/p&gt;

&lt;p&gt;Depending on your stack, that could mean looking at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;or application-specific logs.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeated errors&lt;/li&gt;
&lt;li&gt;Database connection failures&lt;/li&gt;
&lt;li&gt;Authentication problems&lt;/li&gt;
&lt;li&gt;Missing environment variables&lt;/li&gt;
&lt;li&gt;Timeout errors&lt;/li&gt;
&lt;li&gt;Unexpected HTTP status codes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A successful deployment pipeline only tells you that the deployment process completed.&lt;/p&gt;

&lt;p&gt;It doesn't necessarily tell you that users are having a good experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test Important User Flows
&lt;/h2&gt;

&lt;p&gt;Don't test every tiny detail manually.&lt;/p&gt;

&lt;p&gt;Instead, identify the flows that would cause the biggest problems if they stopped working.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Homepage
   ↓
Login
   ↓
Dashboard
   ↓
Create item
   ↓
Save
   ↓
Logout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an e-commerce website, that might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product
   ↓
Cart
   ↓
Checkout
   ↓
Payment
   ↓
Confirmation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These critical paths deserve extra attention after deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Check HTTPS
&lt;/h2&gt;

&lt;p&gt;Make sure the production website is actually using HTTPS.&lt;/p&gt;

&lt;p&gt;Open the website manually and check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test the HTTP version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If HTTP is supposed to redirect to HTTPS, verify that it actually does.&lt;/p&gt;

&lt;p&gt;Also check for mixed-content problems where an HTTPS page attempts to load insecure HTTP resources.&lt;/p&gt;

&lt;p&gt;Browsers may block those resources or display security warnings.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Check DNS
&lt;/h2&gt;

&lt;p&gt;DNS problems can make a perfectly deployed website appear completely broken.&lt;/p&gt;

&lt;p&gt;Before or immediately after deployment, verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A record
AAAA record
CNAME
MX records
TXT records
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;depending on what the project requires.&lt;/p&gt;

&lt;p&gt;For example, if you're moving a website to a new server, the web server might be configured correctly while the domain still points to the old IP address.&lt;/p&gt;

&lt;p&gt;That's not an application bug.&lt;/p&gt;

&lt;p&gt;It's simply a DNS issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Test From Outside Your Network
&lt;/h2&gt;

&lt;p&gt;Something working on your own computer doesn't necessarily mean it's working globally.&lt;/p&gt;

&lt;p&gt;If possible, test the website using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile data&lt;/li&gt;
&lt;li&gt;Another Wi-Fi connection&lt;/li&gt;
&lt;li&gt;A different device&lt;/li&gt;
&lt;li&gt;An external monitoring service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can expose DNS caching issues, firewall rules, CDN configuration problems, or IP restrictions that aren't visible from your development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Check Permissions
&lt;/h2&gt;

&lt;p&gt;File and directory permissions can cause strange production-only problems.&lt;/p&gt;

&lt;p&gt;The application may need access to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uploads/
cache/
storage/
logs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But giving everything &lt;code&gt;777&lt;/code&gt; isn't a proper solution.&lt;/p&gt;

&lt;p&gt;Instead, understand which user actually runs the application and grant only the permissions it needs.&lt;/p&gt;

&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give the application enough permission to work, but not more than necessary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This becomes especially important when the application handles uploaded files or user-generated content.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Test Backups
&lt;/h2&gt;

&lt;p&gt;Having a backup system is different from having a backup system that actually works.&lt;/p&gt;

&lt;p&gt;Before relying on backups, verify that you can restore them.&lt;/p&gt;

&lt;p&gt;For a database, a backup might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqldump database_name &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the important question isn't whether the file exists.&lt;/p&gt;

&lt;p&gt;The important question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you restore the application from it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A backup that has never been tested is still an assumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Check Monitoring
&lt;/h2&gt;

&lt;p&gt;Once the website is live, you need a way to know when something breaks.&lt;/p&gt;

&lt;p&gt;At minimum, monitor important things such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uptime
HTTP errors
Server resources
Database availability
Disk usage
Application errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't necessarily need an elaborate monitoring stack for a small project.&lt;/p&gt;

&lt;p&gt;Even a simple uptime monitor can be useful.&lt;/p&gt;

&lt;p&gt;The goal is to discover problems before users start reporting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Have a Rollback Plan
&lt;/h2&gt;

&lt;p&gt;This is one of the most overlooked parts of deployment.&lt;/p&gt;

&lt;p&gt;Before deploying a significant change, know how you would go back.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current version
      ↓
Backup
      ↓
Deploy new version
      ↓
Something breaks
      ↓
Rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a rollback plan, a small production bug can turn into a long debugging session.&lt;/p&gt;

&lt;p&gt;With a rollback plan, you can restore the previous working version first and investigate the problem afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Keep the Checklist Small
&lt;/h2&gt;

&lt;p&gt;A deployment checklist doesn't need to contain 100 items.&lt;/p&gt;

&lt;p&gt;If it's too complicated, people eventually stop using it.&lt;/p&gt;

&lt;p&gt;A small project might only need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Production build works
[ ] Environment variables checked
[ ] Database migration completed
[ ] HTTPS working
[ ] Critical user flow tested
[ ] Logs checked
[ ] Backup available
[ ] Rollback available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact checklist should depend on the project.&lt;/p&gt;

&lt;p&gt;A personal side project doesn't need the same process as a financial application serving millions of users.&lt;/p&gt;

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

&lt;p&gt;Deployment is not just the moment when code moves from your computer to a server.&lt;/p&gt;

&lt;p&gt;It's a transition from an environment you control completely to an environment where real users, real data, network problems, unexpected traffic, and unexpected behavior become part of the equation.&lt;/p&gt;

&lt;p&gt;A short checklist can catch many problems before they become incidents.&lt;/p&gt;

&lt;p&gt;The goal isn't to make deployment complicated.&lt;/p&gt;

&lt;p&gt;It's to make deployment predictable.&lt;/p&gt;

&lt;p&gt;When you know what needs to be checked, you can spend less time worrying about what might have gone wrong and more time building the next thing.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>automation</category>
      <category>kubernetes</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Technical SEO Still Matters for Developer-Built Websites</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Tue, 29 Sep 2026 02:50:03 +0000</pubDate>
      <link>https://dev.to/caelora/why-technical-seo-still-matters-for-developer-built-websites-5a4k</link>
      <guid>https://dev.to/caelora/why-technical-seo-still-matters-for-developer-built-websites-5a4k</guid>
      <description>&lt;p&gt;When developers build a website, the first priorities are usually performance, functionality, security, and user experience.&lt;/p&gt;

&lt;p&gt;Search engines often come later.&lt;/p&gt;

&lt;p&gt;That is understandable. A website can work perfectly from a developer's perspective while still having problems that make it difficult for search engines to discover, crawl, understand, or index its content.&lt;/p&gt;

&lt;p&gt;This is where technical SEO becomes useful.&lt;/p&gt;

&lt;p&gt;Technical SEO isn't about stuffing keywords into a page or writing content specifically for search engines. At its core, it's about making sure a website can be properly accessed and understood by both users and search engine crawlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Fast Website Isn't Automatically SEO-Friendly
&lt;/h2&gt;

&lt;p&gt;Performance matters, but speed is only one part of the equation.&lt;/p&gt;

&lt;p&gt;A website can load quickly and still have problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Important pages aren't internally linked.&lt;/li&gt;
&lt;li&gt;Pages are blocked by &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Canonical URLs are incorrect.&lt;/li&gt;
&lt;li&gt;The sitemap contains URLs that shouldn't be indexed.&lt;/li&gt;
&lt;li&gt;JavaScript prevents important content from being rendered properly.&lt;/li&gt;
&lt;li&gt;Multiple URL versions point to the same content.&lt;/li&gt;
&lt;li&gt;Pages return unexpected HTTP status codes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems aren't always obvious when you're browsing the website manually.&lt;/p&gt;

&lt;p&gt;For example, you might open a page in Chrome and everything looks completely normal. However, a crawler could encounter a different experience depending on how the site delivers its HTML, JavaScript, redirects, and metadata.&lt;/p&gt;

&lt;p&gt;That's why technical SEO should be considered part of website development rather than something added after launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start With Crawlability
&lt;/h2&gt;

&lt;p&gt;Before worrying about rankings, make sure search engines can actually discover your pages.&lt;/p&gt;

&lt;p&gt;One of the simplest things to check is the &lt;code&gt;robots.txt&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;A basic example might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: *
Disallow:

Sitemap: https://example.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact configuration depends on the website.&lt;/p&gt;

&lt;p&gt;The important thing is understanding what you're allowing and blocking.&lt;/p&gt;

&lt;p&gt;An accidental rule such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: *
Disallow: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can prevent crawlers from accessing the entire website.&lt;/p&gt;

&lt;p&gt;This kind of mistake is surprisingly easy to make during development or when migrating a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Ignore Internal Linking
&lt;/h2&gt;

&lt;p&gt;Internal links are useful for users, but they also help crawlers discover relationships between pages.&lt;/p&gt;

&lt;p&gt;Imagine a website with 500 articles.&lt;/p&gt;

&lt;p&gt;If most of those articles aren't connected through internal links, some pages may be difficult to discover even though they're technically published.&lt;/p&gt;

&lt;p&gt;A simple structure might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Homepage
   |
   +-- Category
         |
         +-- Article A
         +-- Article B
         +-- Article C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then connect related articles where it makes sense:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Article A → Article B
Article B → Article C
Article C → Article A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't mean every page needs dozens of links.&lt;/p&gt;

&lt;p&gt;The goal is to create a logical navigation structure where important content isn't isolated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Canonical URLs Carefully
&lt;/h2&gt;

&lt;p&gt;Duplicate or near-duplicate URLs can create unnecessary confusion.&lt;/p&gt;

&lt;p&gt;For example, a website might accidentally expose the same content through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com/article
https://example.com/article/
https://www.example.com/article
http://example.com/article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not every URL variation will necessarily be indexed, but having a clear preferred version makes the site's structure easier to manage.&lt;/p&gt;

&lt;p&gt;A canonical tag can communicate the preferred URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/article"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, canonical tags aren't magic.&lt;/p&gt;

&lt;p&gt;They should match the actual URL structure and should be implemented consistently.&lt;/p&gt;

&lt;p&gt;If your site has complicated URL rules, it's worth testing them instead of assuming everything is working correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  XML Sitemaps Are Simple but Useful
&lt;/h2&gt;

&lt;p&gt;An XML sitemap provides search engines with a list of URLs that you consider important.&lt;/p&gt;

&lt;p&gt;A basic sitemap might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://example.com/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://example.com/about/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://example.com/article/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A sitemap doesn't guarantee indexing.&lt;/p&gt;

&lt;p&gt;It simply makes URL discovery easier.&lt;/p&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;Submitting thousands of URLs to a sitemap doesn't mean all of them deserve to be indexed. A sitemap should generally contain URLs that are useful, accessible, canonical, and intended for search visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch Your HTTP Status Codes
&lt;/h2&gt;

&lt;p&gt;Developers already know that HTTP status codes matter.&lt;/p&gt;

&lt;p&gt;SEO adds another reason to pay attention to them.&lt;/p&gt;

&lt;p&gt;A page that has permanently moved should generally use a &lt;code&gt;301&lt;/code&gt; redirect.&lt;/p&gt;

&lt;p&gt;A page that doesn't exist should normally return a &lt;code&gt;404&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A temporary problem might result in a &lt;code&gt;5xx&lt;/code&gt; response.&lt;/p&gt;

&lt;p&gt;Problems appear when a website accidentally returns the wrong status.&lt;/p&gt;

&lt;p&gt;For example, a custom "Page Not Found" page that returns HTTP 200 can create what's commonly called a soft 404.&lt;/p&gt;

&lt;p&gt;The browser may display a friendly error message, but technically the server is telling crawlers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This page exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That mismatch can create unnecessary crawling and indexing issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript Can Change the Equation
&lt;/h2&gt;

&lt;p&gt;Modern websites increasingly rely on JavaScript frameworks.&lt;/p&gt;

&lt;p&gt;React, Vue, Angular, and other technologies can produce excellent user experiences.&lt;/p&gt;

&lt;p&gt;But developers should still consider how important content is delivered to crawlers.&lt;/p&gt;

&lt;p&gt;For critical content, it's useful to understand whether the content exists in the initial HTML, requires JavaScript execution, or is loaded later through API requests.&lt;/p&gt;

&lt;p&gt;This doesn't mean JavaScript websites can't perform well in search.&lt;/p&gt;

&lt;p&gt;It means developers should understand the rendering process.&lt;/p&gt;

&lt;p&gt;A useful test is to inspect the actual HTML delivered to the browser rather than looking only at the final visual result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Forget Mobile
&lt;/h2&gt;

&lt;p&gt;Most modern websites are designed with mobile users in mind, but responsive design alone isn't enough.&lt;/p&gt;

&lt;p&gt;Check things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text readability&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Button spacing&lt;/li&gt;
&lt;li&gt;Horizontal scrolling&lt;/li&gt;
&lt;li&gt;Page performance&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Layout shifts&lt;/li&gt;
&lt;li&gt;Forms and interactive elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A page can technically be responsive while still being frustrating to use on a small screen.&lt;/p&gt;

&lt;p&gt;Good technical SEO and good UX often overlap here.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Tools Are Useful for Developers
&lt;/h2&gt;

&lt;p&gt;You don't need to spend hours staring at search results to find technical problems.&lt;/p&gt;

&lt;p&gt;Tools such as Google Search Console can reveal useful information about indexing, crawling, search queries, and page issues.&lt;/p&gt;

&lt;p&gt;For larger websites, automated crawlers can also help identify broken links, redirect chains, duplicate metadata, missing tags, and other structural problems.&lt;/p&gt;

&lt;p&gt;Third-party SEO services can be useful when a project needs a broader audit or when the development team doesn't have time to investigate every technical detail. For example, a service such as seoservices1.com can be considered when you need external SEO support rather than handling every part of the process internally.&lt;/p&gt;

&lt;p&gt;The important part is knowing what problem you're trying to solve before choosing a tool or service.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Should Be Part of the Development Process
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes is treating SEO as a final checklist.&lt;/p&gt;

&lt;p&gt;Build the website.&lt;/p&gt;

&lt;p&gt;Launch it.&lt;/p&gt;

&lt;p&gt;Then think about SEO.&lt;/p&gt;

&lt;p&gt;A better approach is to include basic SEO considerations during development.&lt;/p&gt;

&lt;p&gt;Before launch, check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] HTTPS works correctly
[ ] Preferred domain is consistent
[ ] Robots.txt is configured
[ ] XML sitemap exists
[ ] Important pages are crawlable
[ ] Canonical URLs are correct
[ ] Internal links work
[ ] Broken links have been checked
[ ] Redirects work correctly
[ ] 404 pages return the correct status
[ ] Mobile layout works
[ ] Important content is accessible
[ ] Page performance has been tested
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;None of these steps guarantees high rankings.&lt;/p&gt;

&lt;p&gt;That's not what technical SEO is supposed to do.&lt;/p&gt;

&lt;p&gt;The purpose is to remove unnecessary technical obstacles so that useful content has a better chance of being discovered, processed, and presented to users.&lt;/p&gt;

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

&lt;p&gt;Developers don't need to become full-time SEO specialists.&lt;/p&gt;

&lt;p&gt;But understanding the technical side of search can prevent a lot of avoidable problems.&lt;/p&gt;

&lt;p&gt;A well-built website should not only work when someone opens it in a browser. Its structure should also make sense to crawlers, users, and future developers who have to maintain it.&lt;/p&gt;

&lt;p&gt;The best SEO implementation is often the one you barely notice because it has been built into the website from the beginning.&lt;/p&gt;

&lt;p&gt;Performance, accessibility, clean URLs, logical navigation, crawlability, and useful content are not separate worlds.&lt;/p&gt;

&lt;p&gt;They are all parts of building a website that works well.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
    <item>
      <title>When the Network Breaks: A Developer’s View of Mobile and Internet Support</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 18 Sep 2026 06:38:08 +0000</pubDate>
      <link>https://dev.to/caelora/when-the-network-breaks-a-developers-view-of-mobile-and-internet-support-ih2</link>
      <guid>https://dev.to/caelora/when-the-network-breaks-a-developers-view-of-mobile-and-internet-support-ih2</guid>
      <description>&lt;p&gt;When an application stops responding, developers rarely start by saying, "The internet is broken."&lt;/p&gt;

&lt;p&gt;They usually ask a series of more specific questions:&lt;/p&gt;

&lt;p&gt;Is DNS working? Is the device connected to the network? Can the server be reached? Is the request being rejected? Is there packet loss? Did the service itself fail?&lt;/p&gt;

&lt;p&gt;The same mindset can be applied to everyday mobile and internet problems.&lt;/p&gt;

&lt;p&gt;From a user's perspective, a failed connection may simply look like "no internet." Technically, however, there are several layers between a device and the service it is trying to reach. Understanding those layers can make troubleshooting much more systematic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think in Layers
&lt;/h2&gt;

&lt;p&gt;A useful way to troubleshoot connectivity is to work from the lowest layer upward.&lt;/p&gt;

&lt;p&gt;Consider a smartphone trying to access a website.&lt;/p&gt;

&lt;p&gt;First, the device needs a connection to a mobile network or Wi-Fi network. The network then needs to provide an IP configuration. DNS may be required to translate a domain name into an IP address. Finally, the device needs to establish a connection to the destination server.&lt;/p&gt;

&lt;p&gt;A failure at any one of these stages can produce a similar symptom: the website does not load.&lt;/p&gt;

&lt;p&gt;This is why randomly changing settings is usually less effective than testing each layer independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start With the Client
&lt;/h2&gt;

&lt;p&gt;The client device should normally be the first thing to investigate.&lt;/p&gt;

&lt;p&gt;Check whether Wi-Fi or mobile data is enabled. Verify that the device recognizes the SIM card or wireless network. Restarting the network interface, enabling Airplane Mode temporarily, or rebooting the device can eliminate temporary state-related problems.&lt;/p&gt;

&lt;p&gt;Developers use a similar principle when debugging applications: establish whether the problem can be reproduced consistently.&lt;/p&gt;

&lt;p&gt;If one device cannot connect while another device on the same network works normally, the problem is less likely to be a complete network outage.&lt;/p&gt;

&lt;p&gt;That distinction is valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate Connectivity From Service Availability
&lt;/h2&gt;

&lt;p&gt;A common troubleshooting mistake is assuming that an application failure automatically means the network is down.&lt;/p&gt;

&lt;p&gt;Imagine a phone connected to Wi-Fi but unable to open one particular website. Other websites work normally.&lt;/p&gt;

&lt;p&gt;The network connection itself may be fine.&lt;/p&gt;

&lt;p&gt;The problem could instead involve DNS resolution, the destination server, TLS negotiation, routing, or the application service.&lt;/p&gt;

&lt;p&gt;The same logic applies to mobile networks.&lt;/p&gt;

&lt;p&gt;If calls work but mobile data does not, the problem is different from a complete loss of cellular connectivity. If only one application fails while everything else works, investigating the application may make more sense than changing network settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Observable Symptoms
&lt;/h2&gt;

&lt;p&gt;In software engineering, observability is built around signals such as logs, metrics, and traces.&lt;/p&gt;

&lt;p&gt;Users do not normally have access to infrastructure-level telemetry, but they can still collect useful observations.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When did the failure start?&lt;/li&gt;
&lt;li&gt;Does it happen continuously or intermittently?&lt;/li&gt;
&lt;li&gt;Does it affect one device or multiple devices?&lt;/li&gt;
&lt;li&gt;Does switching between Wi-Fi and mobile data change the result?&lt;/li&gt;
&lt;li&gt;Are calls and SMS still working?&lt;/li&gt;
&lt;li&gt;Does restarting the device temporarily fix it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These observations effectively become a small incident report.&lt;/p&gt;

&lt;p&gt;Instead of reporting "my internet is broken," a user can provide information that helps narrow down the failure domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Self-Service Is Not Enough
&lt;/h2&gt;

&lt;p&gt;Technical troubleshooting eventually reaches a boundary where the user cannot inspect the underlying infrastructure.&lt;/p&gt;

&lt;p&gt;A mobile customer cannot directly inspect a carrier's radio network, subscriber database, or backend provisioning system. A home internet customer cannot access the provider's access network or authentication infrastructure.&lt;/p&gt;

&lt;p&gt;This is where customer support becomes an important part of the technical workflow.&lt;/p&gt;

&lt;p&gt;For example, someone searching for information about &lt;a href="https://callcenterno.vip/1612/cara-hubungi-indosat/" rel="noopener noreferrer"&gt;how to contact Indosat&lt;/a&gt; may simply need the correct support channel after local troubleshooting has failed.&lt;/p&gt;

&lt;p&gt;The same applies to home broadband services. A user experiencing a persistent connection failure can check information about how to contact IndiHome 147 before reporting the incident.&lt;/p&gt;

&lt;p&gt;For IM3 users, a reference covering how to contact an IM3 operator can serve a similar purpose.&lt;/p&gt;

&lt;p&gt;The links are not the troubleshooting process itself. They are the next step when the failure moves beyond what can be diagnosed from the client side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat Support Tickets Like Incident Reports
&lt;/h2&gt;

&lt;p&gt;There is an interesting similarity between customer support and incident management.&lt;/p&gt;

&lt;p&gt;A good support request contains enough information for another person to reproduce or investigate the problem.&lt;/p&gt;

&lt;p&gt;A useful report might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Issue: Mobile data unavailable

Started: 10:30 UTC
Device: Android smartphone
Network: Mobile data
Calls: Working
SMS: Working
Data: Not working
Location: Same location where service normally works
Restarted: Yes
Airplane Mode test: Yes
SIM tested in another device: Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more useful than a vague description.&lt;/p&gt;

&lt;p&gt;The support team can now investigate specific possibilities instead of starting from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a Troubleshooting Decision Tree
&lt;/h2&gt;

&lt;p&gt;The entire process can be simplified into a decision tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connection unavailable
        |
        v
Is the device connected?
   /             \
 No               Yes
 |                 |
Check Wi-Fi/     Test another
mobile settings  service
                   |
                   v
          Is everything affected?
             /            \
           Yes             No
            |               |
      Check network       Check the
      or provider         application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact decision tree will vary depending on the technology, but the principle remains the same: eliminate possibilities one at a time.&lt;/p&gt;

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

&lt;p&gt;Connectivity problems are often treated as simple consumer issues, but they can be surprisingly complex underneath the surface.&lt;/p&gt;

&lt;p&gt;A single failed webpage request can involve the device, wireless network, IP configuration, DNS, routing, security protocols, and the destination service.&lt;/p&gt;

&lt;p&gt;Thinking like a developer helps turn an unclear problem into a sequence of testable questions.&lt;/p&gt;

&lt;p&gt;And when the failure exists beyond the client side, good customer support provides the bridge between the user's observations and the provider's infrastructure.&lt;/p&gt;

&lt;p&gt;That combination—structured troubleshooting, useful observations, and reliable support channels—is what makes technical problems easier to diagnose and resolve.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>7 Git Commands I Use Every Single Day</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:50:33 +0000</pubDate>
      <link>https://dev.to/caelora/7-git-commands-i-use-every-single-day-436a</link>
      <guid>https://dev.to/caelora/7-git-commands-i-use-every-single-day-436a</guid>
      <description>&lt;p&gt;Git has hundreds of commands, but honestly, I only use a handful of them every day. These commands cover almost everything I need—from checking changes to syncing with remote repositories.&lt;/p&gt;

&lt;p&gt;Here are my daily essentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;code&gt;git status&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is probably the command I run the most.&lt;/p&gt;

&lt;p&gt;Before doing anything, I always check the current state of my 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 status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It tells me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which files have changed&lt;/li&gt;
&lt;li&gt;What's staged&lt;/li&gt;
&lt;li&gt;What's untracked&lt;/li&gt;
&lt;li&gt;Which branch I'm on&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. &lt;code&gt;git diff&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One habit that has saved me from countless mistakes is reviewing the actual changes before committing.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If I've already staged files, I'll use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--staged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seeing the exact lines that changed helps catch accidental edits before they become part of the commit history.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;code&gt;git add&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Once everything looks good, I stage the files.&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;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if I only want specific files:&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 src/app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. &lt;code&gt;git commit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Every commit should explain &lt;em&gt;why&lt;/em&gt; the change exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Fix login validation"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small, focused commits make debugging and code reviews much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;code&gt;git pull&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before starting new work, I make sure my local branch is up to date.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This reduces merge conflicts later.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. &lt;code&gt;git push&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Once everything is ready:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, but one of the most satisfying commands after finishing a feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;code&gt;git log --oneline&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Need to quickly review recent commits?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's much cleaner than the default log and gives a quick overview of project history.&lt;/p&gt;




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

&lt;p&gt;You don't need to memorize every Git command to be productive.&lt;/p&gt;

&lt;p&gt;For me, these seven commands handle about 95% of my day-to-day Git workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff --staged&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm always curious to learn new workflows, though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's one Git command you use every day that you think more developers should know?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pls find me at &lt;a href="https://callcenterno.vip/" rel="noopener noreferrer"&gt;callcenterno.vip&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My Side Projects Started Growing After I Stopped Waiting for "Perfect"</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:31:20 +0000</pubDate>
      <link>https://dev.to/caelora/my-side-projects-started-growing-after-i-stopped-waiting-for-perfect-1ke0</link>
      <guid>https://dev.to/caelora/my-side-projects-started-growing-after-i-stopped-waiting-for-perfect-1ke0</guid>
      <description>&lt;p&gt;I used to spend more time planning projects than actually building them.&lt;/p&gt;

&lt;p&gt;I'd think about the tech stack.&lt;/p&gt;

&lt;p&gt;The database.&lt;/p&gt;

&lt;p&gt;Authentication.&lt;/p&gt;

&lt;p&gt;Folder structure.&lt;/p&gt;

&lt;p&gt;CI/CD.&lt;/p&gt;

&lt;p&gt;Docker.&lt;/p&gt;

&lt;p&gt;Kubernetes.&lt;/p&gt;

&lt;p&gt;Monitoring.&lt;/p&gt;

&lt;p&gt;By the time I finished planning...&lt;/p&gt;

&lt;p&gt;I was already tired.&lt;/p&gt;

&lt;p&gt;The project never even started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I tried something different
&lt;/h2&gt;

&lt;p&gt;One weekend I gave myself a simple rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build something that works in one day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No fancy architecture.&lt;/p&gt;

&lt;p&gt;No microservices.&lt;/p&gt;

&lt;p&gt;No "future-proof" decisions.&lt;/p&gt;

&lt;p&gt;Just make it work.&lt;/p&gt;

&lt;p&gt;That project was ugly.&lt;/p&gt;

&lt;p&gt;The UI wasn't great.&lt;/p&gt;

&lt;p&gt;The code wasn't perfect.&lt;/p&gt;

&lt;p&gt;But people actually used it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping teaches things tutorials don't
&lt;/h2&gt;

&lt;p&gt;When real users start clicking your app, you notice problems that never appear in toy projects.&lt;/p&gt;

&lt;p&gt;Your loading state is confusing.&lt;/p&gt;

&lt;p&gt;Your error messages make no sense.&lt;/p&gt;

&lt;p&gt;Someone tries something you never expected.&lt;/p&gt;

&lt;p&gt;And suddenly you're solving real problems instead of imaginary ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfection is expensive
&lt;/h2&gt;

&lt;p&gt;I've realized perfection has a hidden cost.&lt;/p&gt;

&lt;p&gt;Every extra day polishing an unreleased project is another day without feedback.&lt;/p&gt;

&lt;p&gt;You don't know if people even want your idea.&lt;/p&gt;

&lt;p&gt;You're optimizing for users that don't exist yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  My new workflow
&lt;/h2&gt;

&lt;p&gt;Now I ask myself only three questions before starting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it solve one problem?&lt;/li&gt;
&lt;li&gt;Can I build it this weekend?&lt;/li&gt;
&lt;li&gt;Can someone use it on Monday?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is yes...&lt;/p&gt;

&lt;p&gt;I start coding.&lt;/p&gt;

&lt;p&gt;Everything else can wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Funny enough...
&lt;/h2&gt;

&lt;p&gt;The projects I spent months planning never launched.&lt;/p&gt;

&lt;p&gt;The projects I built in a weekend are the ones still online today.&lt;/p&gt;

&lt;p&gt;Not because they're better.&lt;/p&gt;

&lt;p&gt;Because they actually exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Your first version isn't supposed to impress people.&lt;/p&gt;

&lt;p&gt;It's supposed to teach you something.&lt;/p&gt;

&lt;p&gt;You can always improve software that exists.&lt;/p&gt;

&lt;p&gt;You can't improve software that's still inside your notebook.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>I Stopped Chasing AI Frameworks and Started Building with Plain APIs</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:26:45 +0000</pubDate>
      <link>https://dev.to/caelora/i-stopped-chasing-ai-frameworks-and-started-building-with-plain-apis-56o5</link>
      <guid>https://dev.to/caelora/i-stopped-chasing-ai-frameworks-and-started-building-with-plain-apis-56o5</guid>
      <description>&lt;p&gt;When I first got into AI development, I thought I needed to learn every new framework that appeared on GitHub.&lt;/p&gt;

&lt;p&gt;LangChain.&lt;br&gt;
CrewAI.&lt;br&gt;
AutoGen.&lt;br&gt;
LangGraph.&lt;br&gt;
LlamaIndex.&lt;/p&gt;

&lt;p&gt;Every week, there seemed to be another library promising to make AI agents easier.&lt;/p&gt;

&lt;p&gt;I kept bookmarking repositories instead of actually building anything.&lt;/p&gt;

&lt;p&gt;Eventually, I decided to ignore all of them for a weekend.&lt;/p&gt;

&lt;p&gt;Instead, I opened the OpenAI API documentation and started from scratch.&lt;/p&gt;

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

&lt;p&gt;The first chatbot I built was around 60 lines of code.&lt;/p&gt;

&lt;p&gt;Adding conversation history wasn't difficult.&lt;/p&gt;

&lt;p&gt;Calling a weather API wasn't difficult.&lt;/p&gt;

&lt;p&gt;Generating structured JSON wasn't difficult either.&lt;/p&gt;

&lt;p&gt;Suddenly I realized something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most AI frameworks aren't introducing new capabilities—they're packaging patterns that you can learn yourself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That realization completely changed how I approached AI projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks aren't the enemy
&lt;/h2&gt;

&lt;p&gt;Don't get me wrong.&lt;/p&gt;

&lt;p&gt;Frameworks are useful.&lt;/p&gt;

&lt;p&gt;They solve repetitive problems.&lt;/p&gt;

&lt;p&gt;They standardize workflows.&lt;/p&gt;

&lt;p&gt;They save time once your project grows.&lt;/p&gt;

&lt;p&gt;The problem is when beginners mistake the framework for the technology.&lt;/p&gt;

&lt;p&gt;It's like learning React before understanding JavaScript.&lt;/p&gt;

&lt;p&gt;Or learning Kubernetes before understanding Docker.&lt;/p&gt;

&lt;p&gt;You'll eventually hit a wall because you never learned the fundamentals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What every beginner should build first
&lt;/h2&gt;

&lt;p&gt;Before touching any AI framework, I'd recommend building these yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A basic chatbot&lt;/li&gt;
&lt;li&gt;Conversation memory&lt;/li&gt;
&lt;li&gt;Function/tool calling&lt;/li&gt;
&lt;li&gt;Streaming responses&lt;/li&gt;
&lt;li&gt;JSON structured outputs&lt;/li&gt;
&lt;li&gt;A simple RAG app&lt;/li&gt;
&lt;li&gt;A tiny agent loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these require thousands of lines of code.&lt;/p&gt;

&lt;p&gt;Most can be built in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;When something breaks inside a framework, you'll know &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When a model behaves strangely, you'll understand where the prompt lives.&lt;/p&gt;

&lt;p&gt;When tokens get expensive, you'll know exactly what's consuming them.&lt;/p&gt;

&lt;p&gt;And when a new framework becomes popular next month...&lt;/p&gt;

&lt;p&gt;...you'll learn it in hours instead of weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The AI ecosystem moves incredibly fast.&lt;/p&gt;

&lt;p&gt;Frameworks will come and go.&lt;/p&gt;

&lt;p&gt;APIs will change.&lt;/p&gt;

&lt;p&gt;Model names will change.&lt;/p&gt;

&lt;p&gt;But understanding the fundamentals will always be valuable.&lt;/p&gt;

&lt;p&gt;Sometimes the fastest way to learn isn't by installing another dependency.&lt;/p&gt;

&lt;p&gt;It's by writing one more file from scratch.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sharepointframework</category>
      <category>api</category>
    </item>
    <item>
      <title>Why Every Developer Should Learn Docker (Even for Small Projects)</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:17:26 +0000</pubDate>
      <link>https://dev.to/caelora/why-every-developer-should-learn-docker-even-for-small-projects-29jg</link>
      <guid>https://dev.to/caelora/why-every-developer-should-learn-docker-even-for-small-projects-29jg</guid>
      <description>&lt;h1&gt;
  
  
  Why Every Developer Should Learn Docker (Even for Small Projects)
&lt;/h1&gt;

&lt;p&gt;If you've ever heard someone say, &lt;em&gt;"It works on my machine,"&lt;/em&gt; you've already encountered one of the biggest problems in software development.&lt;/p&gt;

&lt;p&gt;Different operating systems, dependency versions, and local configurations can make the same project behave differently across computers.&lt;/p&gt;

&lt;p&gt;That's exactly the problem Docker was built to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Docker?
&lt;/h2&gt;

&lt;p&gt;Docker is a platform that packages your application together with everything it needs to run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming language runtime&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Libraries&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;System tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of telling someone how to set up your project, you simply share a Docker image or a Docker Compose file.&lt;/p&gt;

&lt;p&gt;If Docker runs, your application runs too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Started Using Docker
&lt;/h2&gt;

&lt;p&gt;When I first learned web development, setting up a new project was frustrating.&lt;/p&gt;

&lt;p&gt;Sometimes I needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18&lt;/li&gt;
&lt;li&gt;PostgreSQL 15&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installing everything manually often caused version conflicts.&lt;/p&gt;

&lt;p&gt;After switching to Docker, setting up a project became much easier.&lt;/p&gt;

&lt;p&gt;Instead of spending 30 minutes configuring my environment, I could start everything with one command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Imagine you're building a Node.js API.&lt;/p&gt;

&lt;p&gt;Without Docker, every team member has to install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Docker, everyone uses the same environment.&lt;/p&gt;

&lt;p&gt;A basic Dockerfile looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now anyone can run the application without worrying about different Node.js versions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Compose Makes It Better
&lt;/h2&gt;

&lt;p&gt;Real applications usually need more than one service.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend API&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Redis cache&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker Compose lets you start everything together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;

  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of opening multiple terminals and starting services manually, one command launches the entire stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits I've Noticed
&lt;/h2&gt;

&lt;p&gt;After using Docker regularly, I noticed several improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Faster onboarding
&lt;/h3&gt;

&lt;p&gt;New developers can run a project within minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fewer environment issues
&lt;/h3&gt;

&lt;p&gt;No more "works on my machine" conversations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleaner computer
&lt;/h3&gt;

&lt;p&gt;I don't have dozens of database installations and conflicting versions anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier deployment
&lt;/h3&gt;

&lt;p&gt;The same container used during development can often be deployed to production with minimal changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Is Docker Difficult?
&lt;/h2&gt;

&lt;p&gt;At first, yes.&lt;/p&gt;

&lt;p&gt;The documentation introduces many concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;li&gt;Volumes&lt;/li&gt;
&lt;li&gt;Networks&lt;/li&gt;
&lt;li&gt;Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can feel overwhelming.&lt;/p&gt;

&lt;p&gt;But once you understand the difference between an image and a container, everything starts to make sense.&lt;/p&gt;

&lt;p&gt;You don't need to master every Docker feature on day one.&lt;/p&gt;

&lt;p&gt;Learn the basics first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should Beginners Learn Docker?
&lt;/h2&gt;

&lt;p&gt;Absolutely—but not immediately.&lt;/p&gt;

&lt;p&gt;If you're just starting programming, focus on learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you've built a few projects, Docker becomes much easier to appreciate because you'll understand the problems it solves.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Docker isn't just for large companies or DevOps engineers.&lt;/p&gt;

&lt;p&gt;Even small personal projects benefit from having a consistent development environment.&lt;/p&gt;

&lt;p&gt;If you're tired of installation issues, dependency conflicts, or spending too much time configuring projects, Docker is worth learning.&lt;/p&gt;

&lt;p&gt;It may have a learning curve, but it's one of the best investments you can make as a developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you already using Docker in your projects, or are you planning to learn it? I'd love to hear your experience in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>docker</category>
    </item>
    <item>
      <title>5 Git Commands Every Developer Should Know</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:13:49 +0000</pubDate>
      <link>https://dev.to/caelora/5-git-commands-every-developer-should-know-2ifn</link>
      <guid>https://dev.to/caelora/5-git-commands-every-developer-should-know-2ifn</guid>
      <description>&lt;h1&gt;
  
  
  5 Git Commands Every Developer Should Know
&lt;/h1&gt;

&lt;p&gt;Git is one of the most important tools every developer uses, yet many people only know a few basic commands.&lt;/p&gt;

&lt;p&gt;Learning a handful of additional Git commands can save time, reduce mistakes, and make collaboration much easier.&lt;/p&gt;

&lt;p&gt;Here are five Git commands I use almost every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Check What Changed
&lt;/h2&gt;

&lt;p&gt;Before committing anything, always check your changes.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This command shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modified files&lt;/li&gt;
&lt;li&gt;New files&lt;/li&gt;
&lt;li&gt;Deleted files&lt;/li&gt;
&lt;li&gt;Files ready to commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running &lt;code&gt;git status&lt;/code&gt; before every commit is a good habit.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. View Your Commit History
&lt;/h2&gt;

&lt;p&gt;Need to know what happened recently?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of showing long commit details, this command displays a clean, compact history.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f82d4f1 Fix login bug
1ab8c72 Update README
8ce44f0 Add authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's much easier to read than the default output.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Create a New Branch
&lt;/h2&gt;

&lt;p&gt;Never work directly on the main branch.&lt;/p&gt;

&lt;p&gt;Create a feature branch instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, with newer Git versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps your work isolated until it's ready to merge.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Undo Staged Changes
&lt;/h2&gt;

&lt;p&gt;Accidentally added the wrong file?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git restore &lt;span class="nt"&gt;--staged&lt;/span&gt; filename.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes the file from the staging area without deleting your changes.&lt;/p&gt;

&lt;p&gt;It's much safer than trying to fix mistakes later.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Pull Before You Push
&lt;/h2&gt;

&lt;p&gt;Before pushing your code, make sure your local branch is up to date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps avoid unnecessary merge conflicts and ensures you're working with the latest code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Bonus Tip
&lt;/h1&gt;

&lt;p&gt;If you forget a command, Git has built-in help.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;help&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;help &lt;/span&gt;commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The documentation is surprisingly helpful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;You don't need to memorize every Git command.&lt;/p&gt;

&lt;p&gt;Mastering a small set of frequently used commands will make your daily workflow smoother and reduce common mistakes.&lt;/p&gt;

&lt;p&gt;The five commands I recommend every beginner learns are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git switch -c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git restore --staged&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you're comfortable with these, learning more advanced Git features becomes much easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Git command do you use the most? Let me know in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Using console.log Everywhere: Better Ways to Debug JavaScript</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:03:37 +0000</pubDate>
      <link>https://dev.to/caelora/stop-using-consolelog-everywhere-better-ways-to-debug-javascript-4kf4</link>
      <guid>https://dev.to/caelora/stop-using-consolelog-everywhere-better-ways-to-debug-javascript-4kf4</guid>
      <description>&lt;h1&gt;
  
  
  Stop Using &lt;code&gt;console.log()&lt;/code&gt; Everywhere: Better Ways to Debug JavaScript
&lt;/h1&gt;

&lt;p&gt;If you're learning JavaScript, you've probably written something like this hundreds of times:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's absolutely nothing wrong with using &lt;code&gt;console.log()&lt;/code&gt;. Every developer starts there, and even experienced developers still use it.&lt;/p&gt;

&lt;p&gt;However, as your application grows, relying only on &lt;code&gt;console.log()&lt;/code&gt; can make debugging slower and your code harder to maintain.&lt;/p&gt;

&lt;p&gt;Here are several debugging techniques that can save you time and make your development workflow much more efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Use the Browser Debugger
&lt;/h2&gt;

&lt;p&gt;Instead of printing every variable, use the built-in JavaScript debugger.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;debugger&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;When execution reaches the &lt;code&gt;debugger&lt;/code&gt; statement, the browser pauses your application. You can inspect variables, check the call stack, and execute code step by step.&lt;/p&gt;

&lt;p&gt;This is much more powerful than printing dozens of log statements.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Display Objects with &lt;code&gt;console.table()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Large arrays of objects quickly become difficult to read.&lt;/p&gt;

&lt;p&gt;Instead of:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output becomes a clean table that's much easier to understand.&lt;/p&gt;

&lt;p&gt;This works especially well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API responses&lt;/li&gt;
&lt;li&gt;Product lists&lt;/li&gt;
&lt;li&gt;User records&lt;/li&gt;
&lt;li&gt;Database results&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Organize Logs with &lt;code&gt;console.group()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If your application produces many log messages, grouping them makes the console much cleaner.&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Login Process&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Checking credentials...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Loading user...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authentication successful&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupEnd&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now related messages stay together, making debugging much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Measure Performance
&lt;/h2&gt;

&lt;p&gt;Need to know how long a function takes?&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fetchUsers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fetchUsers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This instantly tells you how long an operation required without installing additional tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Take Advantage of Breakpoints
&lt;/h2&gt;

&lt;p&gt;Modern browsers include excellent debugging tools.&lt;/p&gt;

&lt;p&gt;Simply click beside a line number in Chrome or Firefox DevTools to create a breakpoint.&lt;/p&gt;

&lt;p&gt;When execution stops, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inspect variables&lt;/li&gt;
&lt;li&gt;View the call stack&lt;/li&gt;
&lt;li&gt;Execute code manually&lt;/li&gt;
&lt;li&gt;Step through your application line by line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For complex bugs, breakpoints are often much faster than adding dozens of log statements.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Read Error Messages Carefully
&lt;/h2&gt;

&lt;p&gt;Many developers immediately search Google after seeing an error.&lt;/p&gt;

&lt;p&gt;Instead, spend a few seconds reading it.&lt;/p&gt;

&lt;p&gt;Most JavaScript errors already tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which file caused the problem&lt;/li&gt;
&lt;li&gt;The line number&lt;/li&gt;
&lt;li&gt;The type of error&lt;/li&gt;
&lt;li&gt;The function where it happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding error messages is a skill that will dramatically improve your debugging speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Clean Up Before Deploying
&lt;/h2&gt;

&lt;p&gt;We've all forgotten to remove debugging code.&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HERE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TEST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WHY IS THIS UNDEFINED?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before pushing your code to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove unnecessary &lt;code&gt;console.log()&lt;/code&gt; calls.&lt;/li&gt;
&lt;li&gt;Delete forgotten &lt;code&gt;debugger&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Keep only meaningful error logging where appropriate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clean codebase is much easier to maintain.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;console.log()&lt;/code&gt; isn't bad—it remains one of the simplest and fastest debugging tools available.&lt;/p&gt;

&lt;p&gt;But combining it with browser DevTools, breakpoints, &lt;code&gt;console.table()&lt;/code&gt;, and performance timers can significantly improve your workflow.&lt;/p&gt;

&lt;p&gt;As your projects become larger and more complex, learning these debugging techniques will save you hours of frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What debugging technique do you use most often? Share your favorite tips in the comments!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 VS Code Extensions I Install on Every New Computer</title>
      <dc:creator>Caelora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:57:51 +0000</pubDate>
      <link>https://dev.to/caelora/7-vs-code-extensions-i-install-on-every-new-computer-2oe0</link>
      <guid>https://dev.to/caelora/7-vs-code-extensions-i-install-on-every-new-computer-2oe0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnh9v38hk61g8begg4ou0.jpg" 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%2Fnh9v38hk61g8begg4ou0.jpg" alt=" " width="640" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  7 VS Code Extensions I Install on Every New Computer
&lt;/h1&gt;

&lt;p&gt;Every time I reinstall Windows or buy a new laptop, the first application I install is Visual Studio Code. But VS Code alone isn't enough. The real productivity boost comes from its extensions.&lt;/p&gt;

&lt;p&gt;After years of web development, I've narrowed my list down to seven extensions that I install immediately. These extensions save time, improve code quality, and make development much more enjoyable.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Prettier
&lt;/h2&gt;

&lt;p&gt;Nobody likes arguing about code formatting.&lt;/p&gt;

&lt;p&gt;Prettier automatically formats your code every time you save, keeping your project clean and consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I use it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent formatting&lt;/li&gt;
&lt;li&gt;Works with almost every language&lt;/li&gt;
&lt;li&gt;Saves time during code reviews
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. ESLint
&lt;/h2&gt;

&lt;p&gt;ESLint catches mistakes before they become bugs.&lt;/p&gt;

&lt;p&gt;Instead of discovering issues after deployment, you'll see warnings directly in your editor.&lt;/p&gt;

&lt;p&gt;It also helps enforce coding standards across your team.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. GitLens
&lt;/h2&gt;

&lt;p&gt;GitLens makes Git much easier to understand.&lt;/p&gt;

&lt;p&gt;With one hover, you can instantly see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who changed a line&lt;/li&gt;
&lt;li&gt;When it was changed&lt;/li&gt;
&lt;li&gt;Why it was changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is incredibly useful when working on large projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Error Lens
&lt;/h2&gt;

&lt;p&gt;Normally, VS Code shows errors at the bottom of the screen.&lt;/p&gt;

&lt;p&gt;Error Lens displays them directly beside your code, making debugging much faster.&lt;/p&gt;

&lt;p&gt;Small extension, huge productivity boost.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Auto Rename Tag
&lt;/h2&gt;

&lt;p&gt;If you're working with HTML, React, or Vue, this extension is a lifesaver.&lt;/p&gt;

&lt;p&gt;Rename an opening tag...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...and the closing tag updates automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more broken markup.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Path Intellisense
&lt;/h2&gt;

&lt;p&gt;Import paths can become annoying in large projects.&lt;/p&gt;

&lt;p&gt;Instead of typing long file paths manually, this extension autocompletes them for you.&lt;/p&gt;

&lt;p&gt;It's simple but saves countless keystrokes every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Thunder Client
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't want to open Postman just to test one API endpoint.&lt;/p&gt;

&lt;p&gt;Thunder Client lives inside VS Code and lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send HTTP requests&lt;/li&gt;
&lt;li&gt;Test REST APIs&lt;/li&gt;
&lt;li&gt;Organize collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for backend developers.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;VS Code is already a fantastic editor, but the right extensions can dramatically improve your workflow.&lt;/p&gt;

&lt;p&gt;If I had to choose only three, they would be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prettier&lt;/li&gt;
&lt;li&gt;ESLint&lt;/li&gt;
&lt;li&gt;GitLens&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those three alone eliminate many common development headaches.&lt;/p&gt;

&lt;p&gt;What VS Code extension can't you live without? Let me know in the comments!&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
