<?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: erico964-blip</title>
    <description>The latest articles on DEV Community by erico964-blip (@erico964blip).</description>
    <link>https://dev.to/erico964blip</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%2F4010104%2F20d4e2db-157d-4975-9d31-3b93063d9214.png</url>
      <title>DEV Community: erico964-blip</title>
      <link>https://dev.to/erico964blip</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erico964blip"/>
    <language>en</language>
    <item>
      <title>Can AI Agents Actually Use Your Website? I Built a Tool to Find Out</title>
      <dc:creator>erico964-blip</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:21:34 +0000</pubDate>
      <link>https://dev.to/erico964blip/can-ai-agents-actually-use-your-website-i-built-a-tool-to-find-out-n9h</link>
      <guid>https://dev.to/erico964blip/can-ai-agents-actually-use-your-website-i-built-a-tool-to-find-out-n9h</guid>
      <description>&lt;p&gt;AI agents are getting better at using websites, but there is still a basic question that is surprisingly difficult to answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an AI agent actually use your website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built Agentic Web Check to test that question in a real browser.&lt;/p&gt;

&lt;p&gt;The idea is deliberately simple: instead of only checking whether a website has the right HTML, metadata, accessibility signals, or AI-facing interfaces, the tool actually opens the site in Chromium and tries to use it.&lt;/p&gt;

&lt;p&gt;It has three main parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic checks of what an agent can perceive and interact with&lt;/li&gt;
&lt;li&gt;real browser tasks such as finding contact information, privacy policies, or help pages&lt;/li&gt;
&lt;li&gt;programmatic verification of whether each task actually succeeded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last part is the one I care about most.&lt;/p&gt;

&lt;p&gt;The agent does not get to say “done” and receive a PASS.&lt;/p&gt;

&lt;p&gt;A task ends as &lt;code&gt;PASS&lt;/code&gt;, &lt;code&gt;FAIL&lt;/code&gt;, &lt;code&gt;BLOCKED&lt;/code&gt;, or &lt;code&gt;INCONCLUSIVE&lt;/code&gt; based on assertions against the resulting browser state.&lt;/p&gt;

&lt;p&gt;There is also a separate safety layer that looks for things such as hidden instructions aimed at AI systems, unsafe forms, authentication boundaries, downloads, and consequential actions without appropriate safeguards.&lt;/p&gt;

&lt;p&gt;One of the controlled fixtures gave an interesting result: it scored 81 on the perception checks, but all three browser tasks ended &lt;code&gt;BLOCKED&lt;/code&gt; because its consent banner did not expose a properly named close control.&lt;/p&gt;

&lt;p&gt;That is a deliberately broken fixture, not a claim about the wider web. But it illustrates the distinction I wanted to measure: a page can look reasonably good to a static audit while still being difficult for an agent to operate.&lt;/p&gt;

&lt;p&gt;The project is still very early.&lt;/p&gt;

&lt;p&gt;It is currently v0.1.0, Chromium-focused, does not perform a full site crawl, and I have not published a public benchmark. Some thresholds are documented defaults rather than empirically validated constants.&lt;/p&gt;

&lt;p&gt;The goal is to make those limitations visible and improve the methodology through real use rather than hiding them behind a single “AI readiness” score.&lt;/p&gt;

&lt;p&gt;The project is open source:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ericovirgy/agentic-web-check" rel="noopener noreferrer"&gt;https://github.com/ericovirgy/agentic-web-check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would be particularly interested in feedback from people working on browser agents, Playwright, accessibility, WebMCP, or agentic web tooling.&lt;/p&gt;

&lt;p&gt;What would you measure differently?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>🚀 Never Write a README.md from Scratch Again — Meet readmeai</title>
      <dc:creator>erico964-blip</dc:creator>
      <pubDate>Wed, 01 Jul 2026 07:12:13 +0000</pubDate>
      <link>https://dev.to/erico964blip/never-write-a-readmemd-from-scratch-again-meet-readmeai-3589</link>
      <guid>https://dev.to/erico964blip/never-write-a-readmemd-from-scratch-again-meet-readmeai-3589</guid>
      <description>&lt;p&gt;Every developer has been there. You finally finish that side project, push it to GitHub, open the repo and the README.md is just  # project-name . You tell yourself you'll fix it tomorrow. Tomorrow becomes next week. The repo quietly gathers dust.&lt;br&gt;
The excuse is always the same: writing a good README is harder than it looks. You need a hero description, install instructions, usage examples, badges, a contributing guide, a license section and you have to make it not look like a templated ghost wrote it. It's not technical work; it's polishing work. And polishing work is the first thing that gets pushed aside when the next idea hits.&lt;br&gt;
That's exactly why I built readmeai. It's a small Python CLI that scans your project structure, reads your key config files ( pyproject.toml ,  package.json ,  Cargo.toml ,  go.mod ,  Dockerfile , …) and asks an LLM to generate a complete, badge-laden  README.md  ready to commit. One command, about ten seconds, and your repo stops looking orphaned. Local-first if you want it (Ollama works out of the box), zero heavy dependencies ( requests  is the only one), MIT-licensed, on PyPI today.&lt;/p&gt;

&lt;p&gt;Suggested section headers for the rest of the article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quickstart in 90 Seconds&lt;/li&gt;
&lt;li&gt;How It Works (Under the Hood)&lt;/li&gt;
&lt;li&gt;Picking a Provider: OpenCode vs OpenAI vs Ollama&lt;/li&gt;
&lt;li&gt;Interactive Mode: Preview Before You Commit&lt;/li&gt;
&lt;li&gt;Supported Project Types &amp;amp; Config Files&lt;/li&gt;
&lt;li&gt;Customising the Output&lt;/li&gt;
&lt;li&gt;Roadmap &amp;amp; Contributing&lt;/li&gt;
&lt;li&gt;Closing Thoughts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built an AI-Powered Conventional Commit Generator in Python</title>
      <dc:creator>erico964-blip</dc:creator>
      <pubDate>Tue, 30 Jun 2026 20:59:59 +0000</pubDate>
      <link>https://dev.to/erico964blip/how-i-built-an-ai-powered-conventional-commit-generator-in-python-2fgb</link>
      <guid>https://dev.to/erico964blip/how-i-built-an-ai-powered-conventional-commit-generator-in-python-2fgb</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;I shipped my first Python CLI to PyPI this week. Here's what I learned building &lt;span class="gs"&gt;**gitpulse**&lt;/span&gt; — a tool that reads your staged git diff and generates Conventional Commit messages using AI.

&lt;span class="gu"&gt;## The Problem&lt;/span&gt;

Every developer has lazy commits in their history:
&lt;span class="sb"&gt;`git commit -m "fix"`&lt;/span&gt;
&lt;span class="sb"&gt;`git commit -m "update"`&lt;/span&gt;
&lt;span class="sb"&gt;`git commit -m "stuff"`&lt;/span&gt;

Clean commit histories matter — for changelogs, code reviews, and your future self trying to understand why you changed that line 6 months ago. But writing &lt;span class="sb"&gt;`feat(auth): add JWT token validation with refresh support`&lt;/span&gt; for every single commit is mental overhead nobody needs.

&lt;span class="gu"&gt;## The Solution&lt;/span&gt;

gitpulse reads your staged diff and generates the message for you:

&lt;span class="sb"&gt;`pip install gitpulse-commit`&lt;/span&gt;
&lt;span class="sb"&gt;`git add src/auth.py`&lt;/span&gt;
&lt;span class="sb"&gt;`git-pulse`&lt;/span&gt;
&lt;span class="sb"&gt;`# → feat(auth): add JWT token validation`&lt;/span&gt;

You confirm, edit, or abort. One key. Done.

&lt;span class="gu"&gt;## What I Learned&lt;/span&gt;

&lt;span class="gu"&gt;### 1. PyPI packaging is simpler than it looks&lt;/span&gt;

&lt;span class="sb"&gt;`pyproject.toml`&lt;/span&gt; + &lt;span class="sb"&gt;`python -m build`&lt;/span&gt; + &lt;span class="sb"&gt;`twine upload`&lt;/span&gt; is all you need. No &lt;span class="sb"&gt;`setup.py`&lt;/span&gt;, no &lt;span class="sb"&gt;`setup.cfg`&lt;/span&gt;. The hardest part was finding an available package name (hint: check PyPI before you start coding).

&lt;span class="gu"&gt;### 2. ABC + factory pattern for pluggable providers&lt;/span&gt;

The core &lt;span class="sb"&gt;`AIClient`&lt;/span&gt; is abstract. Each provider (OpenCode, OpenAI, Ollama) implements &lt;span class="sb"&gt;`generate(diff) -&amp;gt; str`&lt;/span&gt;. The factory function just does &lt;span class="sb"&gt;`return OpenAIClient(...)`&lt;/span&gt; based on a string. Adding a new provider is ~20 lines of code.

&lt;span class="gu"&gt;### 3. Prompt engineering is API design&lt;/span&gt;

The system prompt is the most important file in the project. It enforces:
&lt;span class="p"&gt;-&lt;/span&gt; Conventional Commits format (&lt;span class="sb"&gt;`type(scope): description`&lt;/span&gt;)
&lt;span class="p"&gt;-&lt;/span&gt; 72-character max
&lt;span class="p"&gt;-&lt;/span&gt; No markdown, no explanations, no fluff
&lt;span class="p"&gt;-&lt;/span&gt; Imperative mood, no period at end

If the AI ignores any of these, the CLI still strips markdown and truncates — defense in depth.

&lt;span class="gu"&gt;### 4. Git hooks are easy but fragile&lt;/span&gt;

&lt;span class="sb"&gt;`git-pulse init`&lt;/span&gt; writes a prepare-commit-msg hook. It works great, but detecting an existing hook without breaking it required a sentinel marker (&lt;span class="sb"&gt;`## GITPULSE_HOOK_V0.1`&lt;/span&gt;) rather than just searching for a comment string.

&lt;span class="gu"&gt;### 5. GitHub Actions CI/CD is a superpower&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
yaml&lt;br&gt;
on:&lt;br&gt;
  push:&lt;br&gt;
    tags:&lt;br&gt;
      - 'v*'&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Now `git tag v0.2.0 &amp;amp;&amp;amp; git push --tags` automatically publishes to PyPI. Zero manual steps.

## The Code

7 modules, ~300 lines of Python:
- `cli.py` — argparse with subcommands
- `ai_client.py` — ABC + 3 providers
- `git_ops.py` — subprocess wrappers
- `hook.py` — git hook installer
- `config.py` — env var getters
- `prompts.py` — the system prompt
- `__init__.py` — version

Only dependency: `requests`. Python 3.8+. MIT license.

## Try It

`pip install gitpulse-commit`

GitHub: [erico964-blip/gitpulse](https://github.com/erico964-blip/gitpulse)
PyPI: [gitpulse-commit](https://pypi.org/project/gitpulse-commit/)

Built this over a weekend. Feedback welcome — especially on the prompt design and hook workflow!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>python</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
