<?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: Howth Technology Factory</title>
    <description>The latest articles on DEV Community by Howth Technology Factory (@howthtechnologyfactory).</description>
    <link>https://dev.to/howthtechnologyfactory</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%2F4038014%2Fd7fe59b0-5e1b-453e-bf5f-075692c0b322.png</url>
      <title>DEV Community: Howth Technology Factory</title>
      <link>https://dev.to/howthtechnologyfactory</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/howthtechnologyfactory"/>
    <language>en</language>
    <item>
      <title>BuiltWith vs Wappalyzer vs pay-per-use: the 2026 economics of tech stack detection published</title>
      <dc:creator>Howth Technology Factory</dc:creator>
      <pubDate>Fri, 24 Jul 2026 14:46:00 +0000</pubDate>
      <link>https://dev.to/howthtechnologyfactory/builtwith-vs-wappalyzer-vs-pay-per-use-the-2026-economics-of-tech-stack-detection-published-5b89</link>
      <guid>https://dev.to/howthtechnologyfactory/builtwith-vs-wappalyzer-vs-pay-per-use-the-2026-economics-of-tech-stack-detection-published-5b89</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%2Fotx7qj76l4qr3f5gc169.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%2Fotx7qj76l4qr3f5gc169.png" alt=" " width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you sell to companies based on what software they run ("find me every site on Shopify", "which agencies' clients still use Universal Analytics"), you have three ways to get that data in 2026. They differ in price by a factor of about 100, and most people only know the expensive two.&lt;/p&gt;

&lt;p&gt;Option 1: BuiltWith&lt;/p&gt;

&lt;p&gt;The heavyweight. Its real product is historical data: what a site ran three years ago, when it switched, technology trends across the whole web. If you need that, nothing else comes close. Plans commonly run hundreds of dollars per month, and for trend analysis it earns it.&lt;/p&gt;

&lt;p&gt;But most sales and SEO use cases don't need history. They need "what does this list of 2,000 domains run today", and paying a monthly subscription for that is renting a combine harvester to mow a lawn.&lt;/p&gt;

&lt;p&gt;Option 2: Wappalyzer&lt;/p&gt;

&lt;p&gt;The origin of most detection tech. The browser extension is great for spot checks on a single site. The API and bulk products moved to paid plans years ago, and the open-source fingerprint dataset the community built lives on in maintained forks.&lt;/p&gt;

&lt;p&gt;Option 3: pay-per-result detection&lt;/p&gt;

&lt;p&gt;The newer model: no subscription, you pay per site checked, typically around half a cent. The engines run the same class of open-source fingerprints (7,500+ technologies: CMS, ecommerce, analytics, frameworks, CDNs, with versions and confidence scores), so detection quality on current-state checks is comparable. What you give up is history; what you get is a bill that matches your actual usage.&lt;/p&gt;

&lt;p&gt;Worked example with real numbers: a 1,000-domain prospect list costs about $5 to enrich with full tech stacks at pay-per-result pricing. The same job through incumbent per-result pricing on marketplace tools ranges from $70 to $100, and through a subscription product it costs whatever your monthly plan costs whether you run the list or not.&lt;/p&gt;

&lt;p&gt;When each makes sense&lt;/p&gt;

&lt;p&gt;Historical trends and web-wide statistics: BuiltWith, no contest. One-off manual checks while browsing: the Wappalyzer extension, free. Bulk current-state enrichment for lead-gen, SEO audits, or competitive research: pay-per-result is the price-performance winner, and it fits AI agents too, since MCP-compatible tools let an agent enrich a list mid-workflow and the bill lands in cents.&lt;/p&gt;

&lt;p&gt;Full disclosure: I built one of the pay-per-result options, &lt;a href="https://apify.com/apifmcpfactory/tech-stack-detector" rel="noopener noreferrer"&gt;Website Technology Detector&lt;/a&gt; (about $5 per 1,000 sites, MCP-ready, live example output on the listing). If your use case is the third one, it will save you real money; if it's the first, buy BuiltWith and don't look back.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>api</category>
    </item>
    <item>
      <title>The PDF Function Is the Easy Part: Designing a Reliable Document Step</title>
      <dc:creator>Howth Technology Factory</dc:creator>
      <pubDate>Fri, 24 Jul 2026 14:06:41 +0000</pubDate>
      <link>https://dev.to/howthtechnologyfactory/the-pdf-function-is-the-easy-part-designing-a-reliable-document-step-8dl</link>
      <guid>https://dev.to/howthtechnologyfactory/the-pdf-function-is-the-easy-part-designing-a-reliable-document-step-8dl</guid>
      <description>&lt;p&gt;Most PDF automation starts with a verb: merge, split, compress, rotate.&lt;/p&gt;

&lt;p&gt;The code for that verb may be a library call. The production work begins around it.&lt;/p&gt;

&lt;p&gt;A dependable document step has to answer questions the PDF function cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where may the input come from?&lt;/li&gt;
&lt;li&gt;How do we prove that a URL returned a PDF rather than an HTML error page?&lt;/li&gt;
&lt;li&gt;What does a page range mean, and what happens when it is invalid?&lt;/li&gt;
&lt;li&gt;Where is the result stored?&lt;/li&gt;
&lt;li&gt;How long does it remain there?&lt;/li&gt;
&lt;li&gt;Which failures are safe to retry?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article builds a small operational contract for that step. The examples use hosted PDF tools, but the design applies equally to a local library, a containerized CLI or an internal service.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treat retrieval as part of the operation
&lt;/h2&gt;

&lt;p&gt;If an API accepts a URL, it is also a network client. That makes fetching part of the product surface.&lt;/p&gt;

&lt;p&gt;At minimum, decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether only HTTPS is accepted;&lt;/li&gt;
&lt;li&gt;whether redirects are followed;&lt;/li&gt;
&lt;li&gt;which hosts or address ranges are allowed;&lt;/li&gt;
&lt;li&gt;the maximum download time and byte count;&lt;/li&gt;
&lt;li&gt;whether authenticated or private documents are supported;&lt;/li&gt;
&lt;li&gt;what happens when the response is not actually a PDF.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An unrestricted URL field can become a server-side request forgery risk. A private-document URL can leak through logs. A link that works in a browser may return an HTML viewer rather than the PDF bytes.&lt;/p&gt;

&lt;p&gt;For sensitive workflows, a pre-signed object-store URL with a short lifetime is usually easier to reason about than a public permanent link. If the tool only supports public URLs, treat that as an architectural constraint—not a footnote.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Make one action explicit
&lt;/h2&gt;

&lt;p&gt;Avoid an input that asks the processor to infer what should happen. The caller should choose a narrow action and provide action-specific options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/report.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/appendix.pdf"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That contract is useful because a workflow can validate it before it moves any bytes. It also gives an AI agent a bounded tool call instead of arbitrary code execution.&lt;/p&gt;

&lt;p&gt;The same principle applies to page ranges. Pick one documented syntax, define whether pages are one-based or zero-based, reject overlapping or out-of-range input consistently, and return the normalized selection in the result if possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Define what “compress” means
&lt;/h2&gt;

&lt;p&gt;Compression is not one operation.&lt;/p&gt;

&lt;p&gt;Structural compression removes redundant objects and rewrites streams without deliberately reducing visual quality. Image recompression may lower JPEG quality or resolution. Font subsetting, object cleanup and linearization affect different aspects of the file.&lt;/p&gt;

&lt;p&gt;A “high compression” setting is meaningless unless the documentation explains the trade-off. For image-heavy scans, lossless structural compression may barely change the size. For an already optimized PDF, any further reduction may require visible degradation.&lt;/p&gt;

&lt;p&gt;Record both input and output sizes. If the tool changes image quality, say so. If it falls back to a different strategy when a dependency is unavailable, expose that fact or at least document it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Return an inspectable result
&lt;/h2&gt;

&lt;p&gt;A binary file is necessary, but it is not a useful workflow response on its own.&lt;/p&gt;

&lt;p&gt;A structured result should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://storage.example/result.pdf"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sizeBefore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;842190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sizeAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;837421&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;913&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those fields let the next step check that an output exists, compare its size, record processing time and decide whether a retry or human review is appropriate.&lt;/p&gt;

&lt;p&gt;Use stable error categories as well: invalid input, unreachable source, corrupt PDF, resource limit, processing failure and result too large are materially different states.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Decide where bytes live
&lt;/h2&gt;

&lt;p&gt;“We do not keep your data” is not a storage model.&lt;/p&gt;

&lt;p&gt;Document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether processing is in memory or on disk;&lt;/li&gt;
&lt;li&gt;whether inputs or outputs are written to platform storage;&lt;/li&gt;
&lt;li&gt;the retention policy governing that storage;&lt;/li&gt;
&lt;li&gt;whether logs include URLs or filenames;&lt;/li&gt;
&lt;li&gt;who can retrieve the result;&lt;/li&gt;
&lt;li&gt;how a caller can delete it early.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For regulated or confidential documents, a managed API may be the wrong boundary regardless of convenience. A local library or service inside the protected network may be the better design.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Give agents decisions, not bytes
&lt;/h2&gt;

&lt;p&gt;An agent can be useful at the orchestration layer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;identify the approved source documents;&lt;/li&gt;
&lt;li&gt;choose merge, split or compression;&lt;/li&gt;
&lt;li&gt;construct a typed request;&lt;/li&gt;
&lt;li&gt;inspect the structured result;&lt;/li&gt;
&lt;li&gt;ask for review when the outcome is ambiguous.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The deterministic processor should manipulate the file. The agent should not improvise a binary transformation or receive broader filesystem access than the workflow needs.&lt;/p&gt;

&lt;p&gt;Tool descriptions matter here. “Process a PDF” is a poor agent tool. “Split a PDF into these one-based page ranges; reject any range outside the document” is much easier to call safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. A concrete comparison
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://howthtechnologyfactory.pro/products/pdf-toolkit.html?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=pdf_toolkit_launch" rel="noopener noreferrer"&gt;Howth Technology Factory's PDF Toolkit&lt;/a&gt; provides a useful example because it has two related delivery forms.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/apifmcpfactory/pdf-toolkit?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=pdf_toolkit_launch" rel="noopener noreferrer"&gt;Apify Actor&lt;/a&gt; documents nine actions: merge, split, compress, rotate, delete pages, add a text watermark, render PDF pages as images, assemble images into a PDF, and render a URL as PDF. It accepts URL-based inputs and returns a dataset record plus files in the run's key-value store.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://mcpize.com/mcp/pdf-toolkit-mcp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=pdf_toolkit_launch" rel="noopener noreferrer"&gt;MCPize package&lt;/a&gt; is not the same interface. It exposes five typed tools: merge, split, structural compression, PDF-to-text and images-to-PDF. Its listing states explicit per-input, per-request, result and text-extraction caps.&lt;/p&gt;

&lt;p&gt;That difference is the lesson: select a document tool by its contract, limits and data path—not by the label “PDF toolkit”.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a specialist service is the right choice
&lt;/h2&gt;

&lt;p&gt;Basic page manipulation is only one part of the PDF world. OCR, certified redaction, digital signatures, form filling, PDF/A validation, accessibility remediation and complex layout extraction need specialist capabilities.&lt;/p&gt;

&lt;p&gt;Enterprise document APIs and commercial SDKs can be justified when those requirements matter. Local open-source libraries make sense when data cannot leave your environment or when you need deep control. A hosted narrow tool is attractive when the work is routine, the data policy fits and maintaining the processing stack would be needless overhead.&lt;/p&gt;

&lt;p&gt;The decision is not “API or library?” in the abstract. It is: which boundary makes this particular workflow reliable, observable and appropriately constrained?&lt;/p&gt;

</description>
      <category>automation</category>
      <category>programming</category>
      <category>architecture</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Bulk-validating EU VAT numbers</title>
      <dc:creator>Howth Technology Factory</dc:creator>
      <pubDate>Wed, 22 Jul 2026 13:41:00 +0000</pubDate>
      <link>https://dev.to/howthtechnologyfactory/bulk-validating-eu-vat-numbers-56lk</link>
      <guid>https://dev.to/howthtechnologyfactory/bulk-validating-eu-vat-numbers-56lk</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%2F03uurdbxcrhxf8nn24f6.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%2F03uurdbxcrhxf8nn24f6.png" alt=" " width="512" height="512"&gt;&lt;/a&gt;&lt;br&gt;
If you invoice EU businesses with reverse-charge VAT, you already know you're supposed to validate your customers' VAT numbers. What surprises most finance teams is the gap between "we checked it" and "we can prove we checked it", and that gap only becomes visible during a tax inspection.&lt;/p&gt;

&lt;p&gt;What VIES gives you for free&lt;/p&gt;

&lt;p&gt;VIES is the European Commission's official validation service. Paste in a VAT number, it tells you valid or invalid, and for most member states returns the registered business name and address. It's free, it's official, and for one-off checks it's all you need.&lt;/p&gt;

&lt;p&gt;The three problems at any real volume&lt;/p&gt;

&lt;p&gt;First, there's no bulk mode. Validating a 500-customer ledger means 500 manual checks or writing code against the API.&lt;/p&gt;

&lt;p&gt;Second, it falls over constantly. Individual member states go offline for hours ("MS_UNAVAILABLE" is a rite of passage), and the service rate-limits aggressively. Naive scripts that hammer it with 20 parallel requests get error codes and, eventually, IP blocks. A batch that dies at number 347 of 500 with no record of which succeeded is worse than no batch at all.&lt;/p&gt;

&lt;p&gt;Third, and least known: the audit evidence. When you supply YOUR VAT number along with the one you're checking, VIES returns a consultation number, an official identifier proving that check happened on that date. Under the rules of several member states, that consultation number is the evidence a tax authority expects when you justify zero-rating a cross-border sale to a customer whose VAT number later turns out dead. A screenshot of a green tick carries a lot less weight.&lt;/p&gt;

&lt;p&gt;What a sane bulk setup looks like&lt;/p&gt;

&lt;p&gt;Whatever tool you use (including your own script), it should: accept messy input formats and normalise them, keep concurrency low (around 3) with backoff retries so member-state downtime and rate limits don't kill the batch, output one row per input including failures so reconciliation is possible, and request consultation numbers on every check so the audit trail builds itself.&lt;/p&gt;

&lt;p&gt;Disclosure: I built a tool that does exactly this pattern, &lt;a href="https://apify.com/apifmcpfactory/eu-vat-validator" rel="noopener noreferrer"&gt;EU VAT Validator (VIES)&lt;/a&gt;, about $5 per 1,000 validations, no subscription, MCP-ready so finance automations and AI agents can call it directly. But the pattern matters more than the product: if your current process can't show a consultation number per customer per period, that's the gap to close before an inspector finds it for you.&lt;/p&gt;

&lt;p&gt;(Not tax advice; check your member state's specific evidence requirements with your advisor.)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>We scored major websites on AI readiness. A national newspaper got 33/100.</title>
      <dc:creator>Howth Technology Factory</dc:creator>
      <pubDate>Mon, 20 Jul 2026 11:10:25 +0000</pubDate>
      <link>https://dev.to/howthtechnologyfactory/we-scored-major-websites-on-ai-readiness-a-national-newspaper-got-33100-ebp</link>
      <guid>https://dev.to/howthtechnologyfactory/we-scored-major-websites-on-ai-readiness-a-national-newspaper-got-33100-ebp</guid>
      <description>&lt;p&gt;AI assistants are becoming a referral channel whether sites prepare for it or not. People ask ChatGPT, Claude and Perplexity for recommendations, and those assistants read the web to answer. Which raises a question almost nobody is checking: can they actually read YOUR site?&lt;/p&gt;

&lt;p&gt;There are three mundane, checkable things that decide it.&lt;/p&gt;

&lt;p&gt;The three checks&lt;/p&gt;

&lt;p&gt;llms.txt. A plain-text file at yoursite.com/llms.txt that tells AI systems what your site is and where the important content lives, like robots.txt but for guidance instead of prohibition. It went from proposal to quiet standard fast: in our scans this month, Shopify, Stripe's docs, Anthropic's docs and WordPress.org all serve one.&lt;/p&gt;

&lt;p&gt;AI crawler access in robots.txt. GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, Google-Extended, CCBot: each can be allowed or blocked in robots.txt, and many sites block them without remembering they did (often a blanket rule added in 2023). Blocking is a legitimate choice for some businesses. Blocking accidentally while your marketing team invests in "AI visibility" is just self-harm.&lt;/p&gt;

&lt;p&gt;A sitemap. Boring, decades old, still how any crawler, AI or classic, discovers your content systematically.&lt;/p&gt;

&lt;p&gt;What we found&lt;/p&gt;

&lt;p&gt;We ran a scored audit (0 to 100 across those checks) on a mix of docs sites and publishers. WordPress.org scored 88: llms.txt present and well-formed, every major AI crawler explicitly allowed, sitemap in place. Stripe's and Anthropic's docs scored 75 and 85.&lt;/p&gt;

&lt;p&gt;The Irish Times scored 33: no llms.txt, no llms-full.txt, and GPTBot explicitly blocked in robots.txt. A national newspaper, invisible by choice or accident to the fastest-growing answer engine there is. (For a publisher wanting licensing leverage, that may be strategy. If so, the llms.txt file stating terms is still missing.)&lt;/p&gt;

&lt;p&gt;Check your own site in 30 seconds&lt;/p&gt;

&lt;p&gt;Manually: visit yoursite.com/llms.txt, yoursite.com/robots.txt (search it for "GPTBot" and "ClaudeBot"), and yoursite.com/sitemap.xml. That's the whole audit for one site.&lt;/p&gt;

&lt;p&gt;At scale (client portfolios, prospect lists, agencies selling AI-visibility work): I built &lt;a href="https://apify.com/apifmcpfactory/llms-txt-checker" rel="noopener noreferrer"&gt;llms.txt Checker&lt;/a&gt;, which runs all the checks on a list of URLs and returns the 0-100 score with a plain-English fix list, about $5 per 1,000 sites. The example run on the listing shows the exact newspaper result above.&lt;/p&gt;

&lt;p&gt;The fixes are usually a day's work: write an llms.txt, audit the robots.txt rules against actual intent, confirm the sitemap. Cheap insurance on a channel that's only growing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>marketing</category>
      <category>llmstxt</category>
    </item>
  </channel>
</rss>
