<?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: partick</title>
    <description>The latest articles on DEV Community by partick (@partick).</description>
    <link>https://dev.to/partick</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%2F4138522%2F238a1b61-50f5-4fb3-84a9-f11ff20afd92.jpg</url>
      <title>DEV Community: partick</title>
      <link>https://dev.to/partick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/partick"/>
    <language>en</language>
    <item>
      <title>My AI-Built Site's Internal Links Were Unmanageable — So I Mapped the Whole Graph Before Touching Anything</title>
      <dc:creator>partick</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:02:02 +0000</pubDate>
      <link>https://dev.to/partick/my-ai-built-sites-internal-links-were-unmanageable-so-i-mapped-the-whole-graph-before-touching-3ocm</link>
      <guid>https://dev.to/partick/my-ai-built-sites-internal-links-were-unmanageable-so-i-mapped-the-whole-graph-before-touching-3ocm</guid>
      <description>&lt;p&gt;My site is built largely by AI now — code and content. It's fast, and I'm not going back. But a few months in I noticed something nobody warns you about: &lt;strong&gt;internal linking is the one lever AI never managed&lt;/strong&gt;, because it's site-wide state, not page state.&lt;/p&gt;

&lt;p&gt;Every page was generated in isolation, with local context only. Each one &lt;em&gt;looks&lt;/em&gt; well-linked — sensible related links, breadcrumbs, a nav menu. Nobody, me or the model, was keeping a ledger of the whole graph. Multiply that by hundreds of pages and you get what I got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pages competing for the same queries, each hoarding a slice of the in-links that should have gone to one canonical page;&lt;/li&gt;
&lt;li&gt;orphans with zero content in-links, invisible to ranking and to me;&lt;/li&gt;
&lt;li&gt;dead ends that link nowhere, wasting their equity;&lt;/li&gt;
&lt;li&gt;and no way to answer the basic question: &lt;em&gt;which page should I strengthen, and where would those links even come from?&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm planning a round of link consolidation — merging near-duplicate pages and re-pointing links toward the pages that already rank. Before editing anything, I wanted to see the actual graph: every &lt;code&gt;from → to&lt;/code&gt;, from rendered HTML, not from what the templates claim they do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the obvious tools didn't fit
&lt;/h2&gt;

&lt;p&gt;I looked for an internal link visualization tool I could just point at a site. Commercial crawlers give you a report about your links; I wanted the &lt;em&gt;raw graph&lt;/em&gt; — the kind you can diff after a change, join against Search Console data, or hand to an LLM. Homegrown scripts got one thing consistently wrong: navigation. Header/footer links appear on every page, so raw counts say "everything links to everything" and hide the ~5% of links that actually carry meaning.&lt;/p&gt;

&lt;p&gt;So I built the instrument I needed, and open-sourced it: &lt;a href="https://github.com/partick33/internal-links-export" rel="noopener noreferrer"&gt;internal-links-export&lt;/a&gt;. It crawls a site (sitemap or BFS fallback), separates site-wide navigation from content links using a data-driven rule (any target linked from ≥ 90% of crawled pages is treated as chrome — no hardcoded nav lists), and compiles everything into a single offline HTML report plus exports. Zero dependencies, MIT. That's the whole pitch; the rest of this post is what the graph actually told me, because that's the part that transfers to your site.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the graph showed
&lt;/h2&gt;

&lt;p&gt;My own site — &lt;a href="https://petguidecalc.com/" rel="noopener noreferrer"&gt;petguidecalc.com&lt;/a&gt;, an English pet-care guide and calculator site, 231 pages, AI-built like the rest — produced a sobering but manageable picture: the orphans, the topic twins splitting in-links, the uniform hubs. But I didn't want an instrument that only works at that scale, so I stress-tested it against a deliberately hostile target I don't own: a large third-party e-commerce site whose link graph resolves to &lt;strong&gt;4,868 pages, 3,931 of them flat product URLs&lt;/strong&gt; at &lt;code&gt;/products/{slug}&lt;/code&gt; — no category in the path, nothing to group by. As one graph: hairball. As a table: meaningless.&lt;/p&gt;

&lt;p&gt;The tool recovered the de-facto taxonomy from the link structure itself: every non-hub page grouped under its &lt;strong&gt;strongest content in-link source&lt;/strong&gt; — whichever category page links to it most. That reconstructed &lt;strong&gt;268 category groups covering 92% of products&lt;/strong&gt;, each small enough to actually read. This was the moment the tool became useful: the site's real information architecture exists in its links, even when it exists nowhere else.&lt;/p&gt;

&lt;p&gt;Three views carry most of the diagnostic weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In-degree distribution&lt;/strong&gt; — which pages hoard equity (hubs linking in from everywhere) and which are starved. My orphans and near-orphans fell out of this list immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The category group graph&lt;/strong&gt; — double-click into any group and see the category page, its member pages, and exactly which members link back. The missing back-links are the cheapest wins in the whole audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-cluster flows&lt;/strong&gt; — where topic silos accidentally link to each other, and where they never do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The consolidation plan this produces
&lt;/h2&gt;

&lt;p&gt;With the graph exported (pages CSV + edge list CSV), the workflow I'm running is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Join pages against Search Console&lt;/strong&gt; — impressions and average position per URL. This splits every page into "earns traffic" / "exists but starved" / "competes with a sibling".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find merge candidates&lt;/strong&gt; — same-topic pages whose in-links are split between them. Merge the weaker one in, redirect it, and re-point every inbound link to the survivor. The edge list makes this mechanical: filter &lt;code&gt;to == weak-page&lt;/code&gt;, and you have the exact edit list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-point links toward the pages that rank&lt;/strong&gt; — for each strong page, look at its topic neighborhood in the graph and find pages that link generically (nav-only) or to the wrong sibling. Specific links from relevant pages, not more links from everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the floor first&lt;/strong&gt; — every orphan gets at least one content in-link from its topic hub; every dead end links out to its siblings. These are one-line edits each, and they're the ones nothing else was going to catch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-crawl and diff&lt;/strong&gt; — run the crawler again after changes and diff the edge list CSV. The graph becomes a regression test for information architecture: consolidation should show in-links concentrating on fewer, stronger pages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is why I cared so much about exports rather than a pretty report. A graph you can't diff is a screenshot; a graph you can diff is an instrument.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI comes back into it
&lt;/h2&gt;

&lt;p&gt;The irony isn't lost on me: the mess came from page-level generation with no global view, and the cleanup is now AI-assisted too — but this time the model gets to &lt;em&gt;see the whole graph&lt;/em&gt;. Export internal links as an edge list (one row per &lt;code&gt;from, to, count, type&lt;/code&gt;), hand it to an LLM with the Search Console table, and ask for merge candidates and re-pointing proposals. It's the same trick as the generation failure, reversed: global state supplied as context. GEXF and GraphML exports are there for the days I want to look at it in Gephi instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes from the trenches
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sites behind Cloudflare-style challenges can't be fetched from Node (TLS fingerprint mismatch — a valid &lt;code&gt;cf_clearance&lt;/code&gt; cookie doesn't help). The working path: pass the challenge in a real browser, then inject that page's &lt;code&gt;fetch&lt;/code&gt; into the collector. That recovered 930/931 sitemap pages on the test site; the one failure was a login-only page, recorded honestly in the crawl output.&lt;/li&gt;
&lt;li&gt;Dense category trees (one 104-node cluster had 1,930 breadcrumb links) need a deterministic layout, not force-directed — force layouts collapse them into a ball. The tool switches automatically and renders that cluster in ~265 ms.&lt;/li&gt;
&lt;li&gt;The report UI's chrome text is currently Simplified Chinese; paths and graphs are language-neutral. An English UI is on the roadmap — PRs welcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo is &lt;a href="https://github.com/partick33/internal-links-export" rel="noopener noreferrer"&gt;partick33/internal-links-export&lt;/a&gt; — crawler, single-file report, CSV/GEXF/GraphML/JSON exports, 12 tests, MIT. It's a means, not a product: the point was never the tool, it was getting the graph on the table before restructuring a site that grew faster than its linking could keep up.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Jev Was Full, So My Agent Moved Into My Browser Instead</title>
      <dc:creator>partick</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:42:13 +0000</pubDate>
      <link>https://dev.to/partick/jev-was-full-so-my-agent-moved-into-my-browser-instead-4h3i</link>
      <guid>https://dev.to/partick/jev-was-full-so-my-agent-moved-into-my-browser-instead-4h3i</guid>
      <description>&lt;p&gt;"Whoops, we're full - check &lt;a href="https://x.com/typesafeai" rel="noopener noreferrer"&gt;https://x.com/typesafeai&lt;/a&gt; for more information!"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuw3cn2gq7h2rlt4b8lfc.jpeg" 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%2Fuw3cn2gq7h2rlt4b8lfc.jpeg" alt="TypeSafe's sign-up page showing the message " width="525" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;too much demand, one week in&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's what TypeSafe's sign-up page told me on September 23. Jev Ultrafast itself is just an MIT-licensed repo — free to clone, and its first week was loud: zero to 18,392 stars, roughly 2,600 a day. But the agent runs on Jev, a TypeSafe model, and the API key for it only comes through TypeSafe's early access. That's what was full. I wanted to try it. I couldn't — and a week in, I still can't.&lt;/p&gt;

&lt;p&gt;I had a real need for browser automation, though. So I let my coding agent move into my own browser instead, and that same week, it shipped real work — the first visual usage guide for one of my site's calculator pages, screenshots, annotations, and all.&lt;/p&gt;

&lt;p&gt;The tool that moved in is &lt;a href="https://github.com/citrolabs/ego-lite" rel="noopener noreferrer"&gt;ego lite&lt;/a&gt;, citrolabs' open-source, agent-native Chromium — the agent works in its own isolated workspace (ego calls them Spaces), so my browser stayed mine while it worked. The site is petguidecalc, a stack of pet-care guides and calculators; every tool page deserves a visual usage guide — annotated screenshots — and I was never going to hand-make those at that scale. Page one was &lt;a href="https://petguidecalc.com/reptile/uvb-calculator/" rel="noopener noreferrer"&gt;this reptile UVB calculator&lt;/a&gt;: the agent drove the dev deployment, captured and annotated the three steps, and handed me a diff. One command, start to finish — the rest of this post is how that command works and why it's fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Jev Ultrafast actually is
&lt;/h2&gt;

&lt;p&gt;The model doing the deciding is Jev, TypeSafe's &lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;"System One Model"&lt;/a&gt;; the &lt;a href="https://github.com/browser-use/jev-ultrafast" rel="noopener noreferrer"&gt;browser-use org&lt;/a&gt; wraps it in an open-source agent billed as the "fastest and cheapest web agent." The design, in their own words: "Think of Jev as a frontier-intelligence function call: unstructured state in, typed probabilistic decisions out." Each cycle, the model emits exactly one typed decision — which operation, on which element — and only &lt;code&gt;TYPE_TEXT&lt;/code&gt; leans on a small LLM. The full operation set: &lt;code&gt;CLICK&lt;/code&gt;, &lt;code&gt;TYPE_TEXT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;SCROLL_UP&lt;/code&gt;/&lt;code&gt;SCROLL_DOWN&lt;/code&gt;, &lt;code&gt;WAIT&lt;/code&gt;, &lt;code&gt;DONE&lt;/code&gt;, &lt;code&gt;BLOCKED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The part I find genuinely interesting is the safety story: "Model output never becomes selectors, coordinates, shell commands, or executable JavaScript." Nothing the model says is directly executable. Their reported numbers: a Google Flights search completed in 7,073 ms, protocol calls down from 1,092 to 101.&lt;/p&gt;

&lt;p&gt;The repo is also unusually honest about the edges — "Shadow roots, frames, canvas, uploads, pop-up tabs, nested scrolling, and arbitrary keyboard widgets remain outside this MVP" — and about pricing: input at $0.042 per million tokens, output free ("too cheap to meter"), with the admission that they can't prove that price isn't subsidized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast brain, fast hands
&lt;/h2&gt;

&lt;p&gt;Here's where the "Jev alternative" framing breaks down: strictly speaking, they're not competitors — they don't even live in the same layer. Jev is a decision model: every cycle, it picks the operation and the element. ego lite is an execution environment: a real Chromium that any coding agent — Claude Code, Codex, Cursor, your own — can move into and work from. Fast brain, fast hands. Jev decides where to click; ego lite is where the clicking happens.&lt;/p&gt;

&lt;p&gt;Once I saw it that way, my problem sorted itself out. My task was "drive the dev build of a site I own through three steps I already know, and screenshot each one." The deciding is trivial — I wrote the page. What was actually scarce was the execution side: a browser the agent could treat as its own, isolated from mine, that I didn't have to babysit. I didn't need a faster brain. I needed fast hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it feels fast: code base, not CLI base
&lt;/h2&gt;

&lt;p&gt;The first thing I noticed was the speed. My previous setup used a Chrome extension to drive the browser, and ego lite is clearly faster in day-to-day use. That's a felt sense, not a benchmark — what the project itself claims, I'll get to in a moment.&lt;/p&gt;

&lt;p&gt;Their explanation is "Code base, not CLI base." In a CLI-driven loop, every round trip costs a model inference: generate an action, execute it, observe the result, generate the next. ego lite instead exposes the browser as in-page JavaScript tools — &lt;code&gt;snapshot&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;wait&lt;/code&gt;, &lt;code&gt;navigate&lt;/code&gt;, &lt;code&gt;capture&lt;/code&gt; — so the agent writes one whole program and the page runs it in a single pass. The multi-step loop collapses into one piece of code. As the README puts it, "the agent gets to do what it does best: write code" — and code is the cheapest, fastest thing an LLM produces.&lt;/p&gt;

&lt;p&gt;What the project does benchmark against is Vercel's agent-browser: up to 2.5× faster on four complex tasks, with a large drop in token use. That's their self-reported number, not mine. The only claim I'll stand behind is the felt one above: my guide pipeline ran noticeably faster than the Chrome-extension setup it replaced.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Live Calculator States to Publish-Ready Guides
&lt;/h2&gt;

&lt;p&gt;The UVB calculator works like this: pick the species and the lamp type, enter the lamp's wattage and how far it sits from the basking spot, and the page judges the combination — a result badge that reads OK when the values land in the recommended range. That's why the screenshots were the hard part. No verdict exists on a freshly loaded page; the states worth capturing only exist mid-use, form filled in, result on screen. And the values can't be random ones — they have to be a combination the calculator actually judges OK, so the screenshot teaches the ideal setup. By hand that means clicking through, screenshotting, opening an image editor to draw highlight boxes over the right controls, exporting, and redoing all of it whenever the page's layout shifts. Multiply that by every tool page on the site and it simply never gets done.&lt;/p&gt;

&lt;p&gt;So the capture went to the agent as code. The script it wrote drives the dev deployment through ego lite: load the page, walk the three steps, iterate the demo input values until the result badge reads "OK," then screenshot each state. Alongside each screenshot it records the controls' bounding boxes via &lt;code&gt;getBoundingClientRect()&lt;/code&gt;, printed as JSON.&lt;/p&gt;

&lt;p&gt;The capture had one genuinely tricky bit. ego lite's built-in &lt;code&gt;screenshot()&lt;/code&gt; ignores the device-scale-factor override, so the first pass came out 1× and soft. The fix is to set the metrics yourself over CDP, and take the shot over CDP too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cdp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Emulation.setDeviceMetricsOverride&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;deviceScaleFactor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;mobile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;screenWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;screenHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;screenOrientation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;angle&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;landscapePrimary&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cdp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Page.captureScreenshot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&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;After that: crisp 2× captures, and enough resolution for the 1024-wide srcset variant.&lt;/p&gt;

&lt;p&gt;A second script then runs each capture through sharp, drawing the highlight boxes from those recorded bounding boxes — where to circle is data, not eyeballing — in the site's brand colors, and exports three WebPs: 44 KB, 130 KB, and 127 KB.&lt;/p&gt;

&lt;p&gt;The last piece is the one I care about most as a site owner: the guide's content lives in a single data object, and both renderings are generated from it — the HTML page (zero client-side JavaScript, images kept out of the LCP path) and a plain-Markdown twin for machines. One source, two renderings; they can't drift apart because neither is hand-written.&lt;/p&gt;

&lt;h2&gt;
  
  
  From one-off to standing SOP
&lt;/h2&gt;

&lt;p&gt;The part I'd underline for anyone running agent workflows: the real deliverable wasn't the UVB guide — it was the process. Once the page shipped, the flow got distilled into a 99-line skill file — a template my agents load on demand — so "add a visual usage guide to page X" is a standing capability now, not a bespoke session. The next page is one sentence away.&lt;/p&gt;

&lt;p&gt;The repo is private, so I can't link the file — but the skeleton is the transferable part. Here it is as a template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Triggers live in the frontmatter.**&lt;/span&gt; The skill lists its own trigger phrases — "usage guide", "how to use", 图文操作指南 — so when I next say the words, it takes over. No re-explaining the pipeline.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**"When to use it" states the SEO reason in one line.**&lt;/span&gt; Visible step text is the keyword carrier — Google doesn't index text inside screenshots — so the words carry the keywords and the screenshots are the differentiator. The same section rules out video and GIFs: payload weight, LCP, and no rich-result eligibility.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Copy rules that survive without me.**&lt;/span&gt; H2s start with a verb (the "How to use" phrasing is explicitly banned), the intro carries the "free in your browser" value prop, exactly three imperative steps, and control names are copied verbatim from the page's data file — never from memory.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Three landing spots, one source.**&lt;/span&gt; The guide fields in the data object, the Astro rendering, and the Markdown twin all come off the same data — the same-source rule from the pipeline above, encoded as a skill move.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**A capture runbook.**&lt;/span&gt; For a new page: copy the template script, change three parameters, aim it at the dev deployment, and wait for the interactive island to mount before touching anything.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first run paid for the skill; every page after that rides on it. And the skeleton isn't pet-site-specific — if you build tool pages, borrow it, fit it to your stack, and "add a usage guide to page X" becomes a one-sentence job on your side too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this goes next
&lt;/h2&gt;

&lt;p&gt;My takeaway isn't "ego lite replaces Jev." It's that the barrier to this kind of automation has collapsed: one command did what I'd never have sustained by hand. The two tools live in different layers, but they point at the same future — agents that operate real software instead of describing it. I'd rather be learning that machinery now, on my own site, than reading about it while I sit on TypeSafe's waitlist.&lt;/p&gt;

&lt;p&gt;I'm exploring AI-automated site operations next — more pages through the guide pipeline, and whatever else the agent can own end to end. If you're running similar experiments on your own site or product, I'd genuinely like to compare notes in the comments.&lt;/p&gt;

&lt;p&gt;The site all of this runs on: &lt;a href="https://petguidecalc.com/" rel="noopener noreferrer"&gt;petguidecalc.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>browser</category>
      <category>jev</category>
    </item>
  </channel>
</rss>
