<?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: Matt Joshi</title>
    <description>The latest articles on DEV Community by Matt Joshi (@mattjoshi).</description>
    <link>https://dev.to/mattjoshi</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%2F3941349%2F4b1bfd9c-7e21-4ee2-aae7-3fb2c7d2829d.webp</url>
      <title>DEV Community: Matt Joshi</title>
      <link>https://dev.to/mattjoshi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mattjoshi"/>
    <language>en</language>
    <item>
      <title>Modern Home Lighting Guide: Pendants, Wall Lights, and More</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Wed, 08 Jul 2026 02:33:17 +0000</pubDate>
      <link>https://dev.to/mattjoshi/modern-home-lighting-guide-pendants-wall-lights-and-more-1fa3</link>
      <guid>https://dev.to/mattjoshi/modern-home-lighting-guide-pendants-wall-lights-and-more-1fa3</guid>
      <description>&lt;p&gt;When people think about interior design, furniture and wall colors usually get the most attention. However, lighting is often the element that brings everything together. The right lighting can transform the mood of a room, improve functionality, and highlight architectural features.&lt;/p&gt;

&lt;p&gt;Why Lighting Matters&lt;/p&gt;

&lt;p&gt;Lighting affects how we experience a space. A well-lit room feels more inviting, while poor lighting can make even beautifully designed interiors appear dull or uncomfortable.&lt;/p&gt;

&lt;p&gt;Different areas of the home have different lighting needs:&lt;/p&gt;

&lt;p&gt;Dining Room: Pendant lights create a focal point while providing comfortable illumination for meals and gatherings.&lt;br&gt;
Living Room: Layered lighting with floor lamps and table lamps adds warmth and flexibility.&lt;br&gt;
Hallways: Wall lights improve visibility while adding character to transitional spaces.&lt;br&gt;
Outdoor Areas: Lantern-style fixtures enhance both safety and curb appeal.&lt;br&gt;
Types of Home Lighting&lt;/p&gt;

&lt;p&gt;A balanced lighting plan usually combines three types of lighting:&lt;/p&gt;

&lt;p&gt;Ambient Lighting – General illumination for everyday activities.&lt;br&gt;
Task Lighting – Focused lighting for reading, cooking, or working.&lt;br&gt;
Accent Lighting – Used to highlight artwork, plants, or architectural details.&lt;/p&gt;

&lt;p&gt;Using these together creates a comfortable and visually appealing environment.&lt;/p&gt;

&lt;p&gt;Tips for Choosing the Right Fixtures&lt;/p&gt;

&lt;p&gt;Before selecting lighting fixtures, consider:&lt;/p&gt;

&lt;p&gt;The size of the room&lt;br&gt;
Ceiling height&lt;br&gt;
Natural light availability&lt;br&gt;
Energy efficiency&lt;br&gt;
Color temperature (warm vs. cool light)&lt;br&gt;
Overall interior design style&lt;/p&gt;

&lt;p&gt;Choosing fixtures that complement your home's décor creates a more cohesive appearance while maintaining functionality.&lt;/p&gt;

&lt;p&gt;Common Lighting Mistakes&lt;/p&gt;

&lt;p&gt;Many homeowners rely on a single ceiling light for an entire room. Instead, layering multiple light sources helps reduce harsh shadows and creates a more balanced atmosphere.&lt;/p&gt;

&lt;p&gt;Other common mistakes include:&lt;/p&gt;

&lt;p&gt;Using bulbs with inconsistent color temperatures&lt;br&gt;
Installing fixtures that are too large or too small&lt;br&gt;
Ignoring dimmers for adjustable brightness&lt;br&gt;
Overlooking outdoor lighting&lt;br&gt;
Final Thoughts&lt;/p&gt;

&lt;p&gt;Good lighting is more than decoration—it's an essential part of comfortable, functional living spaces. Whether you're renovating a home or simply updating a single room, thoughtful lighting choices can improve both aesthetics and everyday usability.&lt;/p&gt;

&lt;p&gt;Investing time in planning your lighting layout helps create spaces that feel welcoming, practical, and timeless.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>reviews</category>
      <category>react</category>
    </item>
    <item>
      <title>How to Create an LLM.txt File to Manage AI Crawler Access</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Wed, 24 Jun 2026 00:46:10 +0000</pubDate>
      <link>https://dev.to/mattjoshi/how-to-create-an-llmtxt-file-to-manage-ai-crawler-access-5f3f</link>
      <guid>https://dev.to/mattjoshi/how-to-create-an-llmtxt-file-to-manage-ai-crawler-access-5f3f</guid>
      <description>&lt;p&gt;So you've heard about LLM.txt files and want to control how AI crawlers interact with your website. Let me walk you through actually generating one that works.&lt;/p&gt;

&lt;p&gt;First, what exactly is an LLM.txt file? Think of it as robots.txt but specifically for large language models. It tells AI crawlers which parts of your site they can access and how they should process your content. It's becoming essential as more AI systems scrape the web.&lt;/p&gt;

&lt;p&gt;Here's a basic structure for your LLM.txt:&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: *
Allow: /blog/
Allow: /docs/
Disallow: /private/
Disallow: /api/internal/

Rate-limit: 10 requests per minute
Max-tokens: 4096
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But you can go deeper. Let me show you how to generate one dynamically with Node.js:&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;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateLLMTxt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Add user agents&lt;/span&gt;
  &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`User-agent: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allowedPaths&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`Allow: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disallowedPaths&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`Disallow: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&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="c1"&gt;// Add rules&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`Rate-limit: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`Max-tokens: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;;&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;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="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;GPTBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allowedPaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/public/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/blog/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;disallowedPaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/admin/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/drafts/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="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;Claude-Web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allowedPaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/docs/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;disallowedPaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20 requests per minute&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8192&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;llmTxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateLLMTxt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myConfig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LLM.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;llmTxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight? You want to be specific. Don't just block everything - that hurts your visibility. Instead, grant access to your valuable content while protecting sensitive areas.&lt;/p&gt;

&lt;p&gt;For example, if you run a dev blog, allow crawlers to index your tutorials but block draft posts and internal tools. This way AI models can still reference your work without exposing unfinished content.&lt;/p&gt;

&lt;p&gt;I've been using the SERPSpur LLM.txt Generator to streamline this process. It handles the syntax validation and lets me preview exactly how different AI agents will interpret my rules. The configuration interface makes it easy to toggle permissions without manually editing files.&lt;/p&gt;

&lt;p&gt;One thing I learned the hard way: always test your LLM.txt against actual crawlers. Some AI companies have specific requirements. For instance, Anthropic's Claude-Web expects certain header formats that aren't standard.&lt;/p&gt;

&lt;p&gt;Here's a quick testing snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"User-Agent: GPTBot"&lt;/span&gt; https://yoursite.com/LLM.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshqp08egrptdiou80r9h.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%2Fshqp08egrptdiou80r9h.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you get a 200 with your rules, you're good. If it's 404, check your file placement - it must be in the root directory.&lt;/p&gt;

&lt;p&gt;The bottom line: LLM.txt files aren't complicated once you understand the pattern. Start simple, test thoroughly, and iterate based on what crawlers actually hit. Your content strategy will thank you when AI systems start properly respecting your boundaries.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>Simple Lighting Upgrades That Make Any Room Feel More Inviting</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Tue, 23 Jun 2026 08:35:56 +0000</pubDate>
      <link>https://dev.to/mattjoshi/simple-lighting-upgrades-that-make-any-room-feel-more-inviting-383e</link>
      <guid>https://dev.to/mattjoshi/simple-lighting-upgrades-that-make-any-room-feel-more-inviting-383e</guid>
      <description>&lt;p&gt;Lighting is one of those design elements that often goes unnoticed—until something feels off. A room can have beautiful furniture and décor, but harsh overhead lights can instantly make the space feel cold and uncomfortable.&lt;/p&gt;

&lt;p&gt;Recently, I started replacing some of the fixtures in my apartment, and I was surprised by how much difference the right lighting made. Swapping bright ceiling lights for softer wall lights and adding a warm lamp in the corner completely changed the atmosphere.&lt;/p&gt;

&lt;p&gt;Lighting Affects More Than Visibility&lt;/p&gt;

&lt;p&gt;Good lighting isn't just about helping you see better. It influences how a room feels. Warm, layered lighting can make a living room feel cozy, a bedroom feel relaxing, and even a workspace feel more productive.&lt;/p&gt;

&lt;p&gt;Interior designers often recommend combining different light sources rather than relying on a single overhead fixture. This creates depth and gives you more control over the mood of the room.&lt;/p&gt;

&lt;p&gt;Popular Types of Home Lighting&lt;br&gt;
Pendant Lights&lt;/p&gt;

&lt;p&gt;Pendant lights are great for dining areas, kitchens, and entryways. They provide focused illumination while adding a stylish design element.&lt;/p&gt;

&lt;p&gt;Wall Lights&lt;/p&gt;

&lt;p&gt;Wall-mounted fixtures help create softer ambient lighting and are perfect for bedrooms, hallways, and reading corners.&lt;/p&gt;

&lt;p&gt;Floor and Table Lamps&lt;/p&gt;

&lt;p&gt;A warm lamp placed in the right spot can completely change the mood of a room. These lights are ideal for creating a comfortable and inviting atmosphere.&lt;/p&gt;

&lt;p&gt;Small Changes Can Make a Big Difference&lt;/p&gt;

&lt;p&gt;You don't need a full renovation to improve your home's appearance. Sometimes, simply replacing outdated fixtures or adding layered lighting can make your space feel more welcoming and enjoyable.&lt;/p&gt;

&lt;p&gt;Whether you're decorating a new home or refreshing an existing one, paying attention to lighting can have a bigger impact than you might expect. After all, a home shouldn't just look good—it should feel good too.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Lighting plays a crucial role in interior design, comfort, and everyday living. By choosing the right combination of ambient, task, and accent lighting, you can create spaces that are both functional and inviting. Sometimes the smallest upgrades make the biggest difference.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How Updating Cabinet Hardware Instantly Modernized My Kitchen</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Fri, 12 Jun 2026 08:18:24 +0000</pubDate>
      <link>https://dev.to/mattjoshi/how-updating-cabinet-hardware-instantly-modernized-my-kitchen-187n</link>
      <guid>https://dev.to/mattjoshi/how-updating-cabinet-hardware-instantly-modernized-my-kitchen-187n</guid>
      <description>&lt;p&gt;When planning a kitchen renovation, most homeowners focus on countertops, cabinetry, appliances, or flooring. However, one design element that often gets overlooked is cabinet hardware. Think of cabinet handles and knobs as the jewelry of your kitchen—they may seem small, but they can dramatically impact the overall appearance of the space.&lt;/p&gt;

&lt;p&gt;Recently, I replaced my outdated cabinet knobs with brushed brass pulls, and the transformation was immediate. The kitchen looked more refined, modern, and professionally designed without the expense of a full remodel.&lt;/p&gt;

&lt;p&gt;Why Cabinet Hardware Matters&lt;/p&gt;

&lt;p&gt;Cabinet hardware serves both functional and aesthetic purposes. The right handles and knobs can:&lt;/p&gt;

&lt;p&gt;Refresh outdated cabinetry&lt;br&gt;
Add personality and style&lt;br&gt;
Improve functionality and comfort&lt;br&gt;
Create a cohesive design throughout the room&lt;br&gt;
Increase the perceived value of your space&lt;/p&gt;

&lt;p&gt;Whether you're renovating a kitchen, bathroom, or utility room, upgrading your hardware is one of the most cost-effective improvements you can make.&lt;/p&gt;

&lt;p&gt;Choosing the Right Finish&lt;/p&gt;

&lt;p&gt;One of the easiest ways to create a polished look is by coordinating your hardware finish with other fixtures in the room.&lt;/p&gt;

&lt;p&gt;Popular finishes include:&lt;/p&gt;

&lt;p&gt;Brushed Brass&lt;br&gt;
Matte Black&lt;br&gt;
Satin Nickel&lt;br&gt;
Chrome&lt;br&gt;
Antique Bronze&lt;/p&gt;

&lt;p&gt;For a seamless design, consider matching cabinet hardware with:&lt;/p&gt;

&lt;p&gt;Faucets&lt;br&gt;
Light fixtures&lt;br&gt;
Door handles&lt;br&gt;
Appliance accents&lt;/p&gt;

&lt;p&gt;This simple strategy helps create visual consistency and gives the room a professionally curated appearance.&lt;/p&gt;

&lt;p&gt;Knobs vs. Pulls: Which Should You Choose?&lt;/p&gt;

&lt;p&gt;A design tip that interior designers frequently recommend is mixing knobs and pulls strategically.&lt;/p&gt;

&lt;p&gt;Use Pulls For:&lt;br&gt;
Drawers&lt;br&gt;
Large cabinets&lt;br&gt;
Frequently used storage areas&lt;br&gt;
Use Knobs For:&lt;br&gt;
Upper cabinets&lt;br&gt;
Smaller doors&lt;br&gt;
Decorative accent areas&lt;/p&gt;

&lt;p&gt;This combination adds visual interest while maintaining functionality throughout the space.&lt;/p&gt;

&lt;p&gt;Why I Chose Infinity Decor&lt;/p&gt;

&lt;p&gt;While researching cabinet hardware options, I came across Infinity Decor and was impressed by the variety of styles available.&lt;/p&gt;

&lt;p&gt;Their collection includes:&lt;/p&gt;

&lt;p&gt;Modern cabinet handles&lt;br&gt;
Brushed brass pulls&lt;br&gt;
Contemporary knobs&lt;br&gt;
Vintage-inspired hardware&lt;br&gt;
Premium furniture fittings&lt;/p&gt;

&lt;p&gt;The hardware feels durable, installation was straightforward, and the quality exceeded my expectations for the price point.&lt;/p&gt;

&lt;p&gt;Small Upgrade, Big Impact&lt;/p&gt;

&lt;p&gt;One of the biggest lessons I learned during my kitchen refresh is that small details often have the greatest visual impact. Replacing cabinet hardware required minimal time and investment, yet completely changed the character of the room.&lt;/p&gt;

&lt;p&gt;If you're looking for an affordable way to elevate your kitchen or bathroom, updating your cabinet handles and knobs should be at the top of your list.&lt;/p&gt;

&lt;p&gt;Explore the full collection of cabinet and furniture hardware here:&lt;/p&gt;

&lt;p&gt;Cabinet &amp;amp; Furniture Hardware Collection&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;A complete renovation isn't always necessary to achieve a fresh, modern look. Sometimes, the smallest design details make the biggest difference. By choosing high-quality cabinet hardware and coordinating finishes throughout your space, you can create a stylish and cohesive interior that feels both functional and timeless.&lt;/p&gt;

&lt;p&gt;Have you upgraded your &lt;a href="https://infinitydecor.co.uk/collections/cabinet-furniture" rel="noopener noreferrer"&gt;cabinet hardware&lt;/a&gt; recently? Share your favorite finishes and design tips in the comments below!&lt;/p&gt;

</description>
      <category>security</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>react</category>
    </item>
    <item>
      <title>Automate International Keyword Research with Python: A Practical SEO Guide</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Thu, 11 Jun 2026 04:30:00 +0000</pubDate>
      <link>https://dev.to/mattjoshi/automate-international-keyword-research-with-python-a-practical-seo-guide-3p4b</link>
      <guid>https://dev.to/mattjoshi/automate-international-keyword-research-with-python-a-practical-seo-guide-3p4b</guid>
      <description>&lt;p&gt;Keyword research becomes much more challenging when you're targeting multiple countries. Search volume, CPC, keyword difficulty, and competition levels can vary significantly between regions, making it difficult to identify the best opportunities manually.&lt;/p&gt;

&lt;p&gt;For a recent SEO project, I needed a faster way to compare keyword opportunities across different markets. Instead of checking each keyword individually, I used the SERPSpur API with Python to automate the process.&lt;/p&gt;

&lt;p&gt;Why Compare Keywords Across Countries?&lt;/p&gt;

&lt;p&gt;When expanding into international markets, relying on data from a single country can lead to missed opportunities. A keyword that's highly competitive in the United States might have lower competition and similar search volume in Canada, Australia, or the United Kingdom.&lt;/p&gt;

&lt;p&gt;Analyzing keyword metrics across regions helps you:&lt;/p&gt;

&lt;p&gt;Discover untapped keyword opportunities&lt;br&gt;
Identify low-competition markets&lt;br&gt;
Compare CPC values for PPC campaigns&lt;br&gt;
Prioritize content creation efforts&lt;br&gt;
Improve international SEO strategies&lt;br&gt;
Python Script for Keyword Analysis&lt;br&gt;
import requests&lt;/p&gt;

&lt;p&gt;API_KEY = "your_api_key_here"&lt;/p&gt;

&lt;p&gt;def analyze_keywords(keywords, country):&lt;br&gt;
    response = requests.get(&lt;br&gt;
        "&lt;a href="https://api.serpspur.com/v1/keyword-research" rel="noopener noreferrer"&gt;https://api.serpspur.com/v1/keyword-research&lt;/a&gt;",&lt;br&gt;
        headers={"Authorization": f"Bearer {API_KEY}"},&lt;br&gt;
        params={&lt;br&gt;
            "keywords": keywords,&lt;br&gt;
            "country": country,&lt;br&gt;
            "metrics": [&lt;br&gt;
                "volume",&lt;br&gt;
                "cpc",&lt;br&gt;
                "difficulty",&lt;br&gt;
                "competition"&lt;br&gt;
            ]&lt;br&gt;
        }&lt;br&gt;
    )&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = response.json()

&lt;p&gt;return [&lt;br&gt;
    {&lt;br&gt;
        "keyword": kw["keyword"],&lt;br&gt;
        "volume": kw["search_volume"],&lt;br&gt;
        "cpc": kw["cpc"],&lt;br&gt;
        "difficulty": kw["difficulty"],&lt;br&gt;
        "competition": kw["ads_competition"]&lt;br&gt;
    }&lt;br&gt;
    for kw in data["results"]&lt;br&gt;
]&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Example usage&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;keywords = [&lt;br&gt;
    "SEO tools",&lt;br&gt;
    "keyword research",&lt;br&gt;
    "backlink analysis"&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;results = analyze_keywords(keywords, "US")&lt;/p&gt;

&lt;p&gt;for r in results:&lt;br&gt;
    print(&lt;br&gt;
        f"{r['keyword']}: "&lt;br&gt;
        f"Volume={r['volume']}, "&lt;br&gt;
        f"CPC=${r['cpc']}, "&lt;br&gt;
        f"Difficulty={r['difficulty']}%"&lt;br&gt;
    )&lt;br&gt;
What This Script Does&lt;/p&gt;

&lt;p&gt;The script pulls key SEO metrics for a list of keywords, including:&lt;/p&gt;

&lt;p&gt;Search Volume&lt;br&gt;
Cost Per Click (CPC)&lt;br&gt;
Keyword Difficulty&lt;br&gt;
Advertising Competition&lt;/p&gt;

&lt;p&gt;By changing the country parameter, you can instantly compare keyword opportunities across multiple regions.&lt;/p&gt;

&lt;p&gt;Key Insights from International Keyword Research&lt;/p&gt;

&lt;p&gt;One interesting discovery was that several keywords with high competition in the US had significantly lower difficulty scores in other English-speaking countries while maintaining decent search volume.&lt;/p&gt;

&lt;p&gt;This allowed us to:&lt;/p&gt;

&lt;p&gt;Target easier ranking opportunities&lt;br&gt;
Reduce content production risk&lt;br&gt;
Generate quicker organic traffic gains&lt;br&gt;
Expand SEO efforts into underserved markets&lt;br&gt;
Practical Use Cases&lt;/p&gt;

&lt;p&gt;This workflow can be useful for:&lt;/p&gt;

&lt;p&gt;International SEO campaigns&lt;br&gt;
SaaS marketing teams&lt;br&gt;
Affiliate marketers&lt;br&gt;
Content agencies&lt;br&gt;
E-commerce businesses targeting multiple countries&lt;br&gt;
Final Thoughts&lt;/p&gt;

&lt;p&gt;Automating keyword research saves time and helps uncover opportunities that manual analysis often misses. Combining Python with the SERPSpur API makes it easy to collect and compare SEO data across multiple countries, helping you make more informed content and marketing decisions.&lt;/p&gt;

&lt;p&gt;Have you compared keyword metrics between countries in your niche? I'd love to hear what differences you've discovered and how they influenced your SEO strategy.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How I Used Python Fuzzy Matching to Detect Duplicate Content for SEO</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:32:54 +0000</pubDate>
      <link>https://dev.to/mattjoshi/how-i-used-python-fuzzy-matching-to-detect-duplicate-content-for-seo-20ah</link>
      <guid>https://dev.to/mattjoshi/how-i-used-python-fuzzy-matching-to-detect-duplicate-content-for-seo-20ah</guid>
      <description>&lt;p&gt;Struggling with duplicate content across your site? I wrote a Python script that uses fuzzy matching to find near-duplicate pages. It's been a lifesaver for my SEO audits:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
from difflib import SequenceMatcher&lt;br&gt;
import requests&lt;br&gt;
from bs4 import BeautifulSoup&lt;/p&gt;

&lt;p&gt;def get_page_text(url):&lt;br&gt;
    response = requests.get(url)&lt;br&gt;
    soup = BeautifulSoup(response.text, 'html.parser')&lt;br&gt;
    return soup.get_text()&lt;/p&gt;

&lt;p&gt;def similarity_ratio(text1, text2):&lt;br&gt;
    return SequenceMatcher(None, text1, text2).ratio()&lt;/p&gt;

&lt;p&gt;urls = ['&lt;a href="https://example.com/page1" rel="noopener noreferrer"&gt;https://example.com/page1&lt;/a&gt;', '&lt;a href="https://example.com/page2'" rel="noopener noreferrer"&gt;https://example.com/page2'&lt;/a&gt;]&lt;br&gt;
texts = [get_page_text(url) for url in urls]&lt;br&gt;
ratio = similarity_ratio(texts[0], texts[1])&lt;br&gt;
print(f'Similarity: {ratio:.2%}')&lt;/p&gt;

&lt;p&gt;if ratio &amp;gt; 0.8:&lt;br&gt;
    print('Warning: Possible duplicate content!')&lt;/p&gt;

&lt;p&gt;For more advanced analysis, tools like &lt;strong&gt;&lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;SERPSpur's&lt;/a&gt;&lt;/strong&gt; content audit feature can identify duplicates across large sites. But this script is great for quick checks. How do you handle duplicate content issues?&lt;/p&gt;

</description>
      <category>micropython</category>
      <category>programming</category>
      <category>aws</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Check Google Penalties Automatically Using SERPSpur API and Python Scripts</title>
      <dc:creator>Matt Joshi</dc:creator>
      <pubDate>Tue, 02 Jun 2026 11:29:59 +0000</pubDate>
      <link>https://dev.to/mattjoshi/how-to-check-google-penalties-automatically-using-serpspur-api-and-python-scripts-k7l</link>
      <guid>https://dev.to/mattjoshi/how-to-check-google-penalties-automatically-using-serpspur-api-and-python-scripts-k7l</guid>
      <description>&lt;p&gt;I recently noticed a sudden drop in organic traffic for one of my sites, and I suspected a search engine penalty. Instead of guessing, I used &lt;strong&gt;&lt;a href="https://serpspur.com/tool/search-engine-penalty-radar" rel="noopener noreferrer"&gt;SERPSpur’s Search Engine Penalty Radar&lt;/a&gt;&lt;/strong&gt; to check for indexing issues and blacklist signals. Here’s how I integrated it into my monitoring workflow:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
import requests&lt;/p&gt;

&lt;p&gt;url = '&lt;a href="https://serpspur.com/tool/search-engine-penalty-radar/" rel="noopener noreferrer"&gt;https://serpspur.com/tool/search-engine-penalty-radar/&lt;/a&gt;'&lt;br&gt;
params = {&lt;br&gt;
    'domain': 'example.com'&lt;br&gt;
}&lt;br&gt;
response = requests.get(url, params=params)&lt;br&gt;
data = response.json()&lt;br&gt;
if data['penalty_detected']:&lt;br&gt;
    print(f'Penalty found: {data["details"]}')&lt;br&gt;
else:&lt;br&gt;
    print('No penalty detected')&lt;/p&gt;

&lt;p&gt;It flagged a manual action from Google that I hadn’t noticed in Search Console. The tool also checks for blacklist signals from sources like Safe Browsing and Spamhaus. Since adding this to my weekly checks, I’ve caught two potential issues before they impacted rankings. Highly recommend for anyone managing multiple sites. #python #seo #monitoring&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nee2nnqpru2mygp9fuv.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%2F8nee2nnqpru2mygp9fuv.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>python</category>
      <category>elasticsearch</category>
    </item>
  </channel>
</rss>
