<?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: Eleanor Brooks</title>
    <description>The latest articles on DEV Community by Eleanor Brooks (@eleanor-brooks).</description>
    <link>https://dev.to/eleanor-brooks</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%2F3950043%2F33014c33-e63c-4b71-aac2-e5ba6e52d632.png</url>
      <title>DEV Community: Eleanor Brooks</title>
      <link>https://dev.to/eleanor-brooks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eleanor-brooks"/>
    <language>en</language>
    <item>
      <title>Micro-Upgrades: How a Simple Hardware Swap Transformed My Workspace Vibe</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Mon, 15 Jun 2026 10:20:40 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/micro-upgrades-how-a-simple-hardware-swap-transformed-my-workspace-vibe-48g9</link>
      <guid>https://dev.to/eleanor-brooks/micro-upgrades-how-a-simple-hardware-swap-transformed-my-workspace-vibe-48g9</guid>
      <description>&lt;p&gt;The Friction Point: Outdated Tactile Feedback&lt;br&gt;
Every single time I enter or leave my workspace, I have to interact with the door. For years, that interaction was mediated by a pair of generic, cheap plastic builder-grade knobs. They squeaked, they felt hollow, and visually, they screamed "temporary rental." It was a minor point of friction, but cumulative over hundreds of daily transitions, it chipped away at the premium feel of the studio.&lt;/p&gt;

&lt;p&gt;Upgrading your door handles is honestly one of the easiest, most underrated ways to completely shift the vibe and tactile profile of a room. It requires minimal tools, zero structural changes, and takes less than twenty minutes per door.&lt;/p&gt;

&lt;p&gt;Physical UI Matters: The tactile interface of your physical space matters just as much as the UI of your operating system. If it feels cheap, it subtly degrades the experience of being there.&lt;/p&gt;

&lt;p&gt;The Solution: Infinity Decor Art Deco Levers&lt;br&gt;
I ended up swapping out the old plastic hardware for a set of Art Deco-style lever handles from Infinity Decor. I chose a matte black finish to contrast against the clean, light-colored wood of the door frame.&lt;/p&gt;

&lt;p&gt;[ Old Plastic Knob ]  --&amp;gt;  [ Matte Black Art Deco Lever ]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hollow feel               - Solid weight &amp;amp; structure&lt;/li&gt;
&lt;li&gt;Squeaky transition        - Smooth mechanical precision&lt;/li&gt;
&lt;li&gt;Dated aesthetic           - Sleek modern contrast
The difference in appearance and hand-feel is night and day. The black finish looks incredibly sleek, but more importantly, the levers feel substantial and solid in the hand. There is a weight and mechanical precision to the movement that completely changes the transition into the workspace. It moves the experience from a thoughtless, cheap action to an intentional, high-quality interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Levers Over Knobs?&lt;br&gt;
From an industrial design standpoint, levers offer superior ergonomics and accessibility compared to traditional round knobs. You can operate them easily even if your hands are full of gear, and they provide a clean, horizontal visual line that grounds the door's overall aesthetics.&lt;/p&gt;

&lt;p&gt;The Installation Blueprint&lt;br&gt;
For anyone looking to duplicate this quick win, the installation process is perfectly straightforward and requires only a standard screwdriver (though a magnetic bit holder speeds things up):&lt;/p&gt;

&lt;p&gt;Teardown: Back out the long mounting screws on the existing interior knob, slide both sides out of the central spindle, and remove the latch plate from the door edge.&lt;/p&gt;

&lt;p&gt;Alignment: Slide the new latch mechanism into the mortise, ensuring the bevel faces the correct direction of the door swing.&lt;/p&gt;

&lt;p&gt;Fitment: Guide the Infinity Decor lever spindle through the latch hub. The manufacturing tolerances on these specific units are tight, meaning there's zero wobble once aligned.&lt;/p&gt;

&lt;p&gt;Securing: Tighten down the structural screws evenly on both sides to prevent binding, then snap on the decorative faceplates to hide the fasteners.&lt;/p&gt;

&lt;p&gt;The Verdict&lt;br&gt;
If you are feeling uninspired by your current workspace environment, don't immediately assume you need to tear down walls or buy an entirely new standing desk. Look for the low-hanging fruit.&lt;/p&gt;

&lt;p&gt;Swapping out basic hardware for something with intentional design and solid material weight can completely transform how a room registers to your brain. It’s an elegant, satisfying weekend project that pays dividends every single time you step through the door to code.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Generate and Manage LLM.txt Files for AI Crawlers Using Python</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Sat, 13 Jun 2026 11:32:09 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/how-to-generate-and-manage-llmtxt-files-for-ai-crawlers-using-python-497e</link>
      <guid>https://dev.to/eleanor-brooks/how-to-generate-and-manage-llmtxt-files-for-ai-crawlers-using-python-497e</guid>
      <description>&lt;p&gt;AI crawlers are becoming more common, and controlling how they access your site is important. I've been experimenting with LLM.txt files to set access rules for AI bots. Here's a Python script that uses the SERPSpur LLM.txt Generator to create and manage these files:&lt;/p&gt;

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

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

&lt;p&gt;def generate_llm_txt(domain, rules):&lt;br&gt;
    url = "&lt;a href="https://serpspur.com/tool/llms-txt-generator-tool/" rel="noopener noreferrer"&gt;https://serpspur.com/tool/llms-txt-generator-tool/&lt;/a&gt;"&lt;br&gt;
    payload = {&lt;br&gt;
        "domain": domain,&lt;br&gt;
        "rules": rules,  # e.g., {"allow": ["/blog/"], "disallow": ["/admin/"]}&lt;br&gt;
        "api_key": API_KEY&lt;br&gt;
    }&lt;br&gt;
    response = requests.post(url, json=payload)&lt;br&gt;
    if response.status_code == 200:&lt;br&gt;
        with open("llm.txt", "w") as f:&lt;br&gt;
            f.write(response.text)&lt;br&gt;
        print("LLM.txt generated!")&lt;br&gt;
    else:&lt;br&gt;
        print(f"Error: {response.status_code}")&lt;/p&gt;

&lt;h1&gt;
  
  
  Example
&lt;/h1&gt;

&lt;p&gt;rules = {"allow": ["/public/"], "disallow": ["/private/", "/api/"]}&lt;br&gt;
generate_llm_txt("mysite.com", rules)&lt;/p&gt;

&lt;p&gt;This lets me define which sections AI crawlers can access. It's a neat way to protect sensitive content while keeping public pages open. Have you set up LLM.txt for your site yet?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I Used Python to Visualize Ergonomic Cabinet Handle Placement</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Wed, 10 Jun 2026 11:17:36 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/how-i-used-python-to-visualize-ergonomic-cabinet-handle-placement-2m24</link>
      <guid>https://dev.to/eleanor-brooks/how-i-used-python-to-visualize-ergonomic-cabinet-handle-placement-2m24</guid>
      <description>&lt;p&gt;I built a small Python script to analyze cabinet handle placement and ergonomics. It's helped me understand the science behind good hardware design.&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%2F4yhs42jpyagdtj9lu6xf.webp" 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%2F4yhs42jpyagdtj9lu6xf.webp" alt=" " width="360" height="360"&gt;&lt;/a&gt;&lt;br&gt;
python&lt;br&gt;
import numpy as np&lt;br&gt;
import matplotlib.pyplot as plt&lt;/p&gt;

&lt;h1&gt;
  
  
  Simulate handle positions on a cabinet door
&lt;/h1&gt;

&lt;p&gt;cabinet_width = 60  # cm&lt;br&gt;
door_height = 80  # cm&lt;/p&gt;

&lt;h1&gt;
  
  
  Handle positions (x, y in cm)
&lt;/h1&gt;

&lt;p&gt;handles = {&lt;br&gt;
    'Standard Knob': (30, 40),&lt;br&gt;
    'Bar Pull': (30, 35),&lt;br&gt;
    'Cup Pull': (30, 45),&lt;br&gt;
    'T Bar': (30, 38)&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;plt.figure(figsize=(8, 6))&lt;br&gt;
for name, (x, y) in handles.items():&lt;br&gt;
    plt.scatter(x, y, s=100, label=name)&lt;br&gt;
    plt.annotate(name, (x, y), textcoords="offset points", xytext=(5,5))&lt;/p&gt;

&lt;p&gt;plt.xlim(0, cabinet_width)&lt;br&gt;
plt.ylim(0, door_height)&lt;br&gt;
plt.xlabel('Width (cm)')&lt;br&gt;
plt.ylabel('Height (cm)')&lt;br&gt;
plt.title('Optimal Handle Placement for Cabinet Doors')&lt;br&gt;
plt.gca().invert_yaxis()&lt;br&gt;
plt.legend()&lt;br&gt;
plt.grid(True, alpha=0.3)&lt;br&gt;
plt.show()&lt;/p&gt;

&lt;p&gt;This visualization shows how different handle types cluster around the ergonomic sweet spot. For real hardware, I've been browsing Infinity Decor's &lt;strong&gt;&lt;a href="https://infinitydecor.co.uk/collections/cabinet-furniture" rel="noopener noreferrer"&gt;cabinet furniture&lt;/a&gt;&lt;/strong&gt; collection—their handles and pulls have that perfect balance of style and function.&lt;/p&gt;

&lt;p&gt;How do you decide on cabinet hardware placement? Do you have a preferred ergonomic rule?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Convert PDF, XLS, and HTML Invoices to CSV Using Python and SERPSpur API</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Tue, 09 Jun 2026 07:18:14 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/how-to-convert-pdf-xls-and-html-invoices-to-csv-using-python-and-serpspur-api-25pn</link>
      <guid>https://dev.to/eleanor-brooks/how-to-convert-pdf-xls-and-html-invoices-to-csv-using-python-and-serpspur-api-25pn</guid>
      <description>&lt;p&gt;Dealing with invoice data from different formats can be a pain. I've been using the SERPSpur Invoice to CSV Converter to handle PDF, XLS, and HTML invoices in bulk. Here's a Python wrapper I built around it:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
import requests&lt;br&gt;
import pandas as pd&lt;/p&gt;

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

&lt;p&gt;def convert_invoices(file_paths):&lt;br&gt;
    results = []&lt;br&gt;
    for path in file_paths:&lt;br&gt;
        with open(path, 'rb') as f:&lt;br&gt;
            response = requests.post(&lt;br&gt;
f"Bearer {API_KEY}"},&lt;br&gt;
                files={"file": f},&lt;br&gt;
                params={"output_format": "csv"}&lt;br&gt;
            )&lt;br&gt;
            if response.status_code == 200:&lt;br&gt;
                results.append(response.text)&lt;br&gt;
    return results&lt;/p&gt;

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

&lt;p&gt;csv_data = convert_invoices(["invoice1.pdf", "invoice2.xlsx"])&lt;br&gt;
for i, csv in enumerate(csv_data):&lt;br&gt;
    print(f"Invoice {i+1} converted successfully")&lt;br&gt;
    # Optional: parse with pandas&lt;br&gt;
    df = pd.read_csv(pd.StringIO(csv))&lt;br&gt;
    print(df.head())&lt;/p&gt;

&lt;p&gt;This has streamlined my accounting workflow significantly. What's your go-to method for processing invoice data? &lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;https://serpspur.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Detect Duplicate Content Using Python Fuzzy String Matching</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Fri, 05 Jun 2026 06:38:39 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/how-to-detect-duplicate-content-using-python-fuzzy-string-matching-3b7c</link>
      <guid>https://dev.to/eleanor-brooks/how-to-detect-duplicate-content-using-python-fuzzy-string-matching-3b7c</guid>
      <description>&lt;p&gt;Got tired of manually writing &lt;strong&gt;&lt;a href="https://serpspur.com/tool/schema-markup-generator-json-ld/" rel="noopener noreferrer"&gt;schema markup&lt;/a&gt;&lt;/strong&gt; for every page on my site. So I built a little workflow using an AI Schema Architect that generates JSON-LD automatically based on the content type. For a recipe blog, it spits out:&lt;/p&gt;

&lt;p&gt;"@type": "Recipe",&lt;br&gt;
  "name": "Chocolate Cake",&lt;br&gt;
  "author": "Chef John",&lt;br&gt;
  "cookTime": "PT30M",&lt;br&gt;
  "recipeIngredient": ["flour", "sugar", "cocoa"]}&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%2F7d5bbrgtog5jc2qkt8p9.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%2F7d5bbrgtog5jc2qkt8p9.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Since implementing this, my pages started getting indexed within hours instead of days. The tool I used is at serpspur and it's saved me hours of work.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Detect Duplicate Content with Python Using Fuzzy String Matching</title>
      <dc:creator>Eleanor Brooks</dc:creator>
      <pubDate>Tue, 02 Jun 2026 08:54:27 +0000</pubDate>
      <link>https://dev.to/eleanor-brooks/how-to-detect-duplicate-content-with-python-using-fuzzy-string-matching-mf3</link>
      <guid>https://dev.to/eleanor-brooks/how-to-detect-duplicate-content-with-python-using-fuzzy-string-matching-mf3</guid>
      <description>&lt;p&gt;Struggling with duplicate content issues on your site? I wrote a small Python script that checks for near-duplicates using fuzzy string matching. It's helped me catch pages that were too similar and needed merging.&lt;/p&gt;

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

&lt;p&gt;def fetch_text(url):&lt;br&gt;
    response = requests.get(url)&lt;br&gt;
    soup = BeautifulSoup(response.text, 'html.parser')&lt;br&gt;
    # Remove script and style elements&lt;br&gt;
    for script in soup(['script', 'style']):&lt;br&gt;
        script.decompose()&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;url1 = '&lt;a href="https://example.com/page1" rel="noopener noreferrer"&gt;https://example.com/page1&lt;/a&gt;'&lt;br&gt;
url2 = '&lt;a href="https://example.com/page2" rel="noopener noreferrer"&gt;https://example.com/page2&lt;/a&gt;'&lt;br&gt;
text1 = fetch_text(url1)&lt;br&gt;
text2 = fetch_text(url2)&lt;br&gt;
ratio = similarity_ratio(text1, text2)&lt;br&gt;
print(f'Similarity: {ratio:.2%}')&lt;br&gt;
if ratio &amp;gt; 0.8:&lt;br&gt;
    print('These pages might need attention!')&lt;/p&gt;

&lt;p&gt;This is a quick check, but for larger sites, I'd recommend using a dedicated tool like SERPSpur's content analysis feature to pinpoint exact duplicates. What's your strategy for handling duplicate content?&lt;br&gt;
&lt;a href="https://serpspur.com/" rel="noopener noreferrer"&gt;https://serpspur.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
