Verified AgentReady.md certificate
Issued sig: ea1e00ef37bc186f Verify →

Analyzed URL

https://rodrigocastilho.com

Measured 17 hours ago

Analyze another URL

AI-Ready Score

Excellent

out of 100

Token Savings

HTML tokens 7847
Markdown tokens 1379
Savings 82%

Score Breakdown

Accessibility 94/100
AI Discoverability 82/100
Structured Data 100/100
Semantic HTML 100/100
Content Efficiency 78/100

Emerging protocols

6 of 6 detected

Well-known endpoints AI agents look for. Detected here means an agent can discover and connect to your service automatically.

  • OAuth Protected Resource RFC 9728
    /.well-known/oauth-protected-resource
    • resource: https://rodrigocastilho.com/
    • 1 authorization server(s)
  • OAuth Discovery RFC 8414
    /.well-known/oauth-authorization-server
    • issuer: https://rodrigocastilho.com
    • token_endpoint: https://rodrigocastilho.com/oauth/token
    • 2 grant type(s)
  • MCP Server Card SEP-1649 draft
    /.well-known/mcp/server-card.json
  • A2A Agent Card A2A v1.0
    /.well-known/agent-card.json
    • name: Rodrigo Castilho Personal Website Agent
    • v1.0.0
    • 2 capabilities
    • 4 skill(s)
  • API Catalog RFC 9727
    /.well-known/api-catalog
    • 1 API(s)
    • media type: application/octet-stream (expected application/linkset+json)
  • Agent Skills index Discovery RFC v0.2.0 draft
    /.well-known/agent-skills/index.json
    • 5 skill(s)
    • api-discovery, markdown-negotiation, auth-discovery, webmcp-tools, web-bot-auth

Doesn't stay fixed by itself. Monitoring isn't built yet — join the list and we'll tell you when it is.

You're on the list! We'll notify you when it launches.

What we measured No Content-Signal found (robots.txt or HTTP headers)

No Content-Signal directives found. These tell AI agents how they may use your content (search indexing, AI input, training data). The recommended location is robots.txt.

How to implement

Add Content-Signal to your robots.txt: User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no. You can also add it as an HTTP header on markdown responses.

Paste into a coding agent to make the fix

What we measured Content ratio: 8.7% (2441 content chars / 28062 HTML bytes)

Your page has a low ratio of actual content to total HTML. Much of the page weight is markup, scripts, or styles rather than content.

How to implement

Move CSS to external stylesheets, remove inline styles, minimize JavaScript, and ensure the HTML focuses on content structure.

Paste into a coding agent to make the fix
Markdown tokens: 1379
## My repositories on GitHub

1.  [rodcast.github.io](https://github.com/rodcast/rodcast.github.io "rodcast.github.io")💀 Rodrigo Castilho | Personal website built with Next.js 16, TypeScript, GitHub API, Medium API, GitHub Pages, and Vercel #rodrigocastilho
2.  [chrome-extension-filter-by-videos-shorts-subscriptions-youtube](https://github.com/rodcast/chrome-extension-filter-by-videos-shorts-subscriptions-youtube "chrome-extension-filter-by-videos-shorts-subscriptions-youtube")⚙️ This extension helps you to filter your Subscriptions by either Videos or Shorts on Youtube.
3.  [slickmap](https://github.com/rodcast/slickmap "slickmap")🌲 SlickMap is inspired on SlickMap CSS: Create site map with base JSON tree.

[View all repositories →](https://github.com/rodcast "View all repositories on GitHub")

## My articles on Medium

1.  [Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/fetch-api-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-96ae79f9a0d4?source=rss-105526889e2f------2 "Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 15, 2023The Fetch API is a powerful and flexible tool for making HTTP requests in the browser.
2.  [Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/async-await-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-7e42af034f5?source=rss-105526889e2f------2 "Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 8, 2023Make your asynchronous code more readable and easier to understand.
3.  [Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/promises-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-178f1277cb88?source=rss-105526889e2f------2 "Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 1, 2023A powerful feature of JavaScript that makes it easier to write Asynchronous code.
4.  [Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…](https://medium.com/@rodcast/synchronous-and-asynchronous-understanding-javascript-api-requests-and-responses-in-the-data-64fa9e8cd319?source=rss-105526889e2f------2 "Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…")April 24, 2023Two different types of programming implementations can confuse.
5.  [AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/ajax-and-xmlhttprequest-understanding-javascript-api-requests-and-responses-in-the-data-fetching-507a7959330e?source=rss-105526889e2f------2 "AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…")April 17, 2023You can create web applications that are more responsive and user-friendly by using AJAX and XMLHttpRequest.
6.  [Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/callbacks-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-499cdeb026ee?source=rss-105526889e2f------2 "Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")April 10, 2023A callback is a programming technique in which a function is passed as an argument to another function and is executed.
7.  [V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/v8-javascript-engine-understanding-javascript-api-requests-and-responses-in-the-data-fetching-311481bdae6a?source=rss-105526889e2f------2 "V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…")April 3, 2023V8 is the most popular JavaScript engine and was developed by Google.
8.  [Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/introduction-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-9eae22fd3d16?source=rss-105526889e2f------2 "Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")March 27, 2023It’s important to note that using client-side data fetching can affect the performance of your application.
9.  [Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/understanding-javascript-api-requests-and-responses-in-thedata-fetching-lifecycle-539bf96b2293?source=rss-105526889e2f------2 "Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")March 20, 2023In this article series <strong>Introduction, V8 JavaScript engine, Callbacks, AJAX/XMLHttpRequest, Synchronous/Asynchronous, Promises, Async/Await, Fetch API, and Conclusion</strong>.
10.  [Just Let Me Say — Be Yourself](https://medium.com/@rodcast/just-let-me-say-be-yourself-b2f5cedeb5a1?source=rss-105526889e2f------2 "Just Let Me Say — Be Yourself")February 12, 2020I want to say something to you and would like you never forget.

[Read all articles →](https://medium.com/@rodcast "Read all articles on Medium")
Rodrigo Castilho - Staff Frontend Software Engineer

# Rodrigo CastilhoRODCAST

Toggle between light and dark theme. Currently in light mode.

![Professional headshot of Rodrigo Castilho, Staff Frontend Software Engineer](https://rodrigocastilho.com/rodrigo-castilho-rodcast_photo.jpg)## Rodrigo Castilho

Staff Frontend Software Engineer at [Wellhub](https://github.com/gympass) specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.

In a committed relationship with code and the gym.

-   [GitHub](https://github.com/rodcast "Follow me on GitHub")
-   [Twitter](https://twitter.com/rodcast "Follow me on Twitter")
-   [LinkedIn](https://www.linkedin.com/in/rodcast "Follow me on LinkedIn")
-   [Medium](https://medium.com/@rodcast "Follow me on Medium")

## My repositories on GitHub

1.  [rodcast.github.io](https://github.com/rodcast/rodcast.github.io "rodcast.github.io")💀 Rodrigo Castilho | Personal website built with Next.js 16, TypeScript, GitHub API, Medium API, GitHub Pages, and Vercel #rodrigocastilho
2.  [chrome-extension-filter-by-videos-shorts-subscriptions-youtube](https://github.com/rodcast/chrome-extension-filter-by-videos-shorts-subscriptions-youtube "chrome-extension-filter-by-videos-shorts-subscriptions-youtube")⚙️ This extension helps you to filter your Subscriptions by either Videos or Shorts on Youtube.
3.  [slickmap](https://github.com/rodcast/slickmap "slickmap")🌲 SlickMap is inspired on SlickMap CSS: Create site map with base JSON tree.

[View all repositories →](https://github.com/rodcast "View all repositories on GitHub")

## My articles on Medium

1.  [Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/fetch-api-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-96ae79f9a0d4?source=rss-105526889e2f------2 "Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 15, 2023The Fetch API is a powerful and flexible tool for making HTTP requests in the browser.
2.  [Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/async-await-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-7e42af034f5?source=rss-105526889e2f------2 "Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 8, 2023Make your asynchronous code more readable and easier to understand.
3.  [Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/promises-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-178f1277cb88?source=rss-105526889e2f------2 "Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")May 1, 2023A powerful feature of JavaScript that makes it easier to write Asynchronous code.
4.  [Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…](https://medium.com/@rodcast/synchronous-and-asynchronous-understanding-javascript-api-requests-and-responses-in-the-data-64fa9e8cd319?source=rss-105526889e2f------2 "Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…")April 24, 2023Two different types of programming implementations can confuse.
5.  [AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/ajax-and-xmlhttprequest-understanding-javascript-api-requests-and-responses-in-the-data-fetching-507a7959330e?source=rss-105526889e2f------2 "AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…")April 17, 2023You can create web applications that are more responsive and user-friendly by using AJAX and XMLHttpRequest.
6.  [Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/callbacks-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-499cdeb026ee?source=rss-105526889e2f------2 "Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")April 10, 2023A callback is a programming technique in which a function is passed as an argument to another function and is executed.
7.  [V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/v8-javascript-engine-understanding-javascript-api-requests-and-responses-in-the-data-fetching-311481bdae6a?source=rss-105526889e2f------2 "V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…")April 3, 2023V8 is the most popular JavaScript engine and was developed by Google.
8.  [Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/introduction-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-9eae22fd3d16?source=rss-105526889e2f------2 "Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")March 27, 2023It’s important to note that using client-side data fetching can affect the performance of your application.
9.  [Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/understanding-javascript-api-requests-and-responses-in-thedata-fetching-lifecycle-539bf96b2293?source=rss-105526889e2f------2 "Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle")March 20, 2023In this article series <strong>Introduction, V8 JavaScript engine, Callbacks, AJAX/XMLHttpRequest, Synchronous/Asynchronous, Promises, Async/Await, Fetch API, and Conclusion</strong>.
10.  [Just Let Me Say — Be Yourself](https://medium.com/@rodcast/just-let-me-say-be-yourself-b2f5cedeb5a1?source=rss-105526889e2f------2 "Just Let Me Say — Be Yourself")February 12, 2020I want to say something to you and would like you never forget.

[Read all articles →](https://medium.com/@rodcast "Read all articles on Medium")

Upload this file as /index.md on your server so AI agents can access a clean version of your page. You can also configure Accept: text/markdown content negotiation to serve it automatically.

Our recommendation

Download llms.txt
# rodrigocastilho.com

> Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.

## Main
- [Rodrigo Castilho - Staff Frontend Software Engineer](https://rodrigocastilho.com): Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems…
- [About](https://rodrigocastilho.com/)
- [RSS Feed](https://rodrigocastilho.com/feed.xml)
- [Sitemap](https://rodrigocastilho.com/sitemap.xml)

Full llms.txt requires domain-wide analysis (coming soon)

Upload this file to https://rodrigocastilho.com/llms.txt at the root of your domain. AI agents like ChatGPT, Claude, and Perplexity check this file to understand your site structure.

This site already has a llms.txt file.

Valid format
# Rodrigo Castilho

> Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO. Personal site exposing public profile, projects, and articles as agent-friendly content.

The site is a statically exported Next.js application. Project and article data are fetched at build time from the GitHub REST API and the Medium RSS feed. The Markdown homepage is available directly at `/index.md`. Accept-based content negotiation on `/` works only on hosts that honor the repository's rewrite and header configuration; GitHub Pages does not.

## Content

- [Homepage (Markdown)](https://rodrigocastilho.com/index.md): Profile summary, projects, and articles with embedded schema.org JSON-LD.
- [RSS Feed](https://rodrigocastilho.com/feed.xml): Site feed.
- [Sitemap](https://rodrigocastilho.com/sitemap.xml): List of indexable URLs.

## API

- [OpenAPI Specification](https://rodrigocastilho.com/docs/api/openapi.json): OpenAPI 3.1 description of the public endpoints.
- [API Documentation](https://rodrigocastilho.com/docs/api/): Human-readable API docs.
- [API Documentation (Markdown)](https://rodrigocastilho.com/docs/api.md): Agent-friendly API docs.
- [API Catalog](https://rodrigocastilho.com/.well-known/api-catalog): RFC 9727 linkset advertising API discovery endpoints.

## Agents

- [Agent Card](https://rodrigocastilho.com/.well-known/agent-card.json): Agent metadata for this site.
- [Agent Skills Index](https://rodrigocastilho.com/.well-known/agent-skills/index.json): Catalog of agent skills (markdown negotiation, API discovery, WebMCP tools, auth).
- [MCP Server Card](https://rodrigocastilho.com/.well-known/mcp/server-card.json): Model Context Protocol server descriptor.

## Social

- [GitHub](https://github.com/rodcast)
- [Twitter](https://twitter.com/rodcast)
- [LinkedIn](https://www.linkedin.com/in/rodcast)
- [Medium](https://medium.com/@rodcast)

Accessibility

Content available without JavaScript (100/100)

Content available without JavaScript

Content appears early in HTML (75/100)

Main content starts at 29% of HTML

Reasonable page size (100/100)

Page size: 27KB

AI Discoverability

Robots.txt allows AI bots (100/100)

All major AI search bots allowed

Markdown for Agents support (60/100) Application
✗ Accept: text/markdown ✓ .md URL ✓ <link> tag ✗ Link header YAML frontmatter (enriched)

Discoverable, but not negotiable: an agent that reads your HTML finds the .md version; one that requests the page directly still receives HTML. Answering Accept: text/markdown covers both.

Has sitemap.xml (100/100)

Sitemap found

Has robots.txt file (100/100)

robots.txt exists

Has llms.txt file (100/100)

llms.txt exists and is valid

Has Content-Signal (robots.txt or HTTP headers) (0/100)
✓ robots.txt ✓ HTTP header ✗ Policy

Structured Data

Has Schema.org / JSON-LD (100/100)

JSON-LD found: Person, WebSite, WebPage, ProfilePage

Has Open Graph tags (100/100)

All OG tags present

Has meta description (100/100)

Meta description: 146 chars

Has canonical URL (100/100)

Canonical URL present

Has lang attribute (100/100)

lang="en"

Semantic HTML

Proper heading hierarchy (100/100)

Clean heading hierarchy

Uses article or main element (100/100)

Has both <article> and <main>

Uses semantic HTML elements (100/100)

19 semantic elements, 4 divs (ratio: 83%)

Meaningful image alt texts (100/100)

1/1 images with meaningful alt text

Low div nesting depth (100/100)

Avg div depth: 1.3, max: 2

Content Efficiency

Good token reduction ratio (100/100)

82% token reduction (HTML→Markdown)

Good content-to-noise ratio (25/100)

Content ratio: 8.7% (2441 content chars / 28062 HTML bytes)

Reasonable page weight (100/100)

HTML size: 27KB

Minimal inline styles (100/100)

1/198 elements with inline styles (0.5%)

{
  "url": "https://rodrigocastilho.com",
  "timestamp": 1791417511665,
  "fetch": {
    "mode": "simple",
    "timeMs": 154,
    "htmlSizeBytes": 28062,
    "supportsMarkdown": false,
    "markdownAgents": {
      "contentNegotiation": false,
      "mdUrl": {
        "found": true,
        "url": "https://rodrigocastilho.com/index.md"
      },
      "linkTag": {
        "found": true,
        "url": "/index.md"
      },
      "linkHeader": {
        "found": false,
        "url": null
      },
      "responseHeaders": {
        "contentSignal": null,
        "xMarkdownTokens": null,
        "vary": "Accept-Encoding"
      },
      "frontmatter": {
        "present": true,
        "fields": [
          "title",
          "description",
          "image",
          "dateModified"
        ],
        "level": "enriched"
      },
      "level": "application",
      "mdUrlMediaType": "text/markdown",
      "mdUrlProperMediaType": true
    },
    "statusCode": 200
  },
  "extraction": {
    "title": "Rodrigo Castilho - Staff Frontend Software Engineer",
    "excerpt": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
    "byline": "Rodrigo Castilho",
    "siteName": null,
    "lang": "en",
    "contentLength": 2441,
    "metadata": {
      "description": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
      "ogTitle": "Rodrigo Castilho - Staff Frontend Software Engineer",
      "ogDescription": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
      "ogImage": "https://rodrigocastilho.com/rodrigo-castilho-rodcast_card.jpg",
      "ogType": "profile",
      "canonical": "https://rodrigocastilho.com/",
      "lang": "en",
      "schemas": [
        {
          "@type": "Person",
          "@id": "https://rodrigocastilho.com/#person",
          "name": "Rodrigo Castilho",
          "alternateName": "RODCAST",
          "description": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
          "url": "https://rodrigocastilho.com/",
          "image": {
            "@type": "ImageObject",
            "@id": "https://rodrigocastilho.com/#image",
            "url": "https://rodrigocastilho.com/rodrigo-castilho-rodcast_photo.jpg",
            "contentUrl": "https://rodrigocastilho.com/rodrigo-castilho-rodcast_photo.jpg",
            "width": 400,
            "height": 400,
            "caption": "Rodrigo Castilho - Staff Frontend Software Engineer"
          },
          "jobTitle": "Staff Frontend Software Engineer",
          "worksFor": {
            "@type": "Organization",
            "@id": "https://www.wellhub.com/#organization",
            "name": "Wellhub",
            "url": "https://www.wellhub.com/"
          },
          "alumniOf": {
            "@type": "CollegeOrUniversity",
            "name": "Unisanta: Universidade Santa Cecília"
          },
          "knowsLanguage": [
            "English",
            "Portuguese"
          ],
          "knowsAbout": [
            "JavaScript",
            "TypeScript",
            "React",
            "Next.js",
            "Frontend Development",
            "Web Development",
            "CSS",
            "HTML",
            "AWS",
            "Design Systems",
            "Web Performance",
            "SEO"
          ],
          "sameAs": [
            "https://twitter.com/rodcast",
            "https://github.com/rodcast",
            "https://medium.com/@rodcast",
            "https://www.linkedin.com/in/rodcast"
          ]
        },
        {
          "@type": "WebSite",
          "@id": "https://rodrigocastilho.com/#website",
          "url": "https://rodrigocastilho.com/",
          "name": "Rodrigo Castilho",
          "description": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
          "publisher": {
            "@id": "https://rodrigocastilho.com/#person"
          },
          "inLanguage": "en-US"
        },
        {
          "@type": "WebPage",
          "@id": "https://rodrigocastilho.com/#webpage",
          "url": "https://rodrigocastilho.com/",
          "name": "Rodrigo Castilho - Staff Frontend Software Engineer",
          "description": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
          "isPartOf": {
            "@id": "https://rodrigocastilho.com/#website"
          },
          "about": {
            "@id": "https://rodrigocastilho.com/#person"
          },
          "primaryImageOfPage": {
            "@id": "https://rodrigocastilho.com/#image"
          },
          "datePublished": "2023-01-01",
          "dateModified": "2026-09-29",
          "inLanguage": "en-US"
        },
        {
          "@type": "ProfilePage",
          "@id": "https://rodrigocastilho.com/#profilepage",
          "url": "https://rodrigocastilho.com/",
          "name": "Rodrigo Castilho - Staff Frontend Software Engineer",
          "description": "Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.",
          "isPartOf": {
            "@id": "https://rodrigocastilho.com/#website"
          },
          "mainEntity": {
            "@id": "https://rodrigocastilho.com/#person"
          },
          "inLanguage": "en-US"
        }
      ],
      "robotsMeta": "index, follow",
      "author": "Rodrigo Castilho",
      "generator": null,
      "markdownAlternateHref": "/index.md"
    }
  },
  "markdown": "## My repositories on GitHub\n\n1.  [rodcast.github.io](https://github.com/rodcast/rodcast.github.io \"rodcast.github.io\")💀 Rodrigo Castilho | Personal website built with Next.js 16, TypeScript, GitHub API, Medium API, GitHub Pages, and Vercel #rodrigocastilho\n2.  [chrome-extension-filter-by-videos-shorts-subscriptions-youtube](https://github.com/rodcast/chrome-extension-filter-by-videos-shorts-subscriptions-youtube \"chrome-extension-filter-by-videos-shorts-subscriptions-youtube\")⚙️ This extension helps you to filter your Subscriptions by either Videos or Shorts on Youtube.\n3.  [slickmap](https://github.com/rodcast/slickmap \"slickmap\")🌲 SlickMap is inspired on SlickMap CSS: Create site map with base JSON tree.\n\n[View all repositories →](https://github.com/rodcast \"View all repositories on GitHub\")\n\n## My articles on Medium\n\n1.  [Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/fetch-api-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-96ae79f9a0d4?source=rss-105526889e2f------2 \"Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 15, 2023The Fetch API is a powerful and flexible tool for making HTTP requests in the browser.\n2.  [Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/async-await-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-7e42af034f5?source=rss-105526889e2f------2 \"Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 8, 2023Make your asynchronous code more readable and easier to understand.\n3.  [Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/promises-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-178f1277cb88?source=rss-105526889e2f------2 \"Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 1, 2023A powerful feature of JavaScript that makes it easier to write Asynchronous code.\n4.  [Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…](https://medium.com/@rodcast/synchronous-and-asynchronous-understanding-javascript-api-requests-and-responses-in-the-data-64fa9e8cd319?source=rss-105526889e2f------2 \"Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…\")April 24, 2023Two different types of programming implementations can confuse.\n5.  [AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/ajax-and-xmlhttprequest-understanding-javascript-api-requests-and-responses-in-the-data-fetching-507a7959330e?source=rss-105526889e2f------2 \"AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…\")April 17, 2023You can create web applications that are more responsive and user-friendly by using AJAX and XMLHttpRequest.\n6.  [Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/callbacks-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-499cdeb026ee?source=rss-105526889e2f------2 \"Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")April 10, 2023A callback is a programming technique in which a function is passed as an argument to another function and is executed.\n7.  [V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/v8-javascript-engine-understanding-javascript-api-requests-and-responses-in-the-data-fetching-311481bdae6a?source=rss-105526889e2f------2 \"V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…\")April 3, 2023V8 is the most popular JavaScript engine and was developed by Google.\n8.  [Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/introduction-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-9eae22fd3d16?source=rss-105526889e2f------2 \"Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")March 27, 2023It’s important to note that using client-side data fetching can affect the performance of your application.\n9.  [Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/understanding-javascript-api-requests-and-responses-in-thedata-fetching-lifecycle-539bf96b2293?source=rss-105526889e2f------2 \"Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")March 20, 2023In this article series <strong>Introduction, V8 JavaScript engine, Callbacks, AJAX/XMLHttpRequest, Synchronous/Asynchronous, Promises, Async/Await, Fetch API, and Conclusion</strong>.\n10.  [Just Let Me Say — Be Yourself](https://medium.com/@rodcast/just-let-me-say-be-yourself-b2f5cedeb5a1?source=rss-105526889e2f------2 \"Just Let Me Say — Be Yourself\")February 12, 2020I want to say something to you and would like you never forget.\n\n[Read all articles →](https://medium.com/@rodcast \"Read all articles on Medium\")\n",
  "fullPageMarkdown": "Rodrigo Castilho - Staff Frontend Software Engineer\n\n# Rodrigo CastilhoRODCAST\n\nToggle between light and dark theme. Currently in light mode.\n\n![Professional headshot of Rodrigo Castilho, Staff Frontend Software Engineer](https://rodrigocastilho.com/rodrigo-castilho-rodcast_photo.jpg)## Rodrigo Castilho\n\nStaff Frontend Software Engineer at [Wellhub](https://github.com/gympass) specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.\n\nIn a committed relationship with code and the gym.\n\n-   [GitHub](https://github.com/rodcast \"Follow me on GitHub\")\n-   [Twitter](https://twitter.com/rodcast \"Follow me on Twitter\")\n-   [LinkedIn](https://www.linkedin.com/in/rodcast \"Follow me on LinkedIn\")\n-   [Medium](https://medium.com/@rodcast \"Follow me on Medium\")\n\n## My repositories on GitHub\n\n1.  [rodcast.github.io](https://github.com/rodcast/rodcast.github.io \"rodcast.github.io\")💀 Rodrigo Castilho | Personal website built with Next.js 16, TypeScript, GitHub API, Medium API, GitHub Pages, and Vercel #rodrigocastilho\n2.  [chrome-extension-filter-by-videos-shorts-subscriptions-youtube](https://github.com/rodcast/chrome-extension-filter-by-videos-shorts-subscriptions-youtube \"chrome-extension-filter-by-videos-shorts-subscriptions-youtube\")⚙️ This extension helps you to filter your Subscriptions by either Videos or Shorts on Youtube.\n3.  [slickmap](https://github.com/rodcast/slickmap \"slickmap\")🌲 SlickMap is inspired on SlickMap CSS: Create site map with base JSON tree.\n\n[View all repositories →](https://github.com/rodcast \"View all repositories on GitHub\")\n\n## My articles on Medium\n\n1.  [Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/fetch-api-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-96ae79f9a0d4?source=rss-105526889e2f------2 \"Fetch API — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 15, 2023The Fetch API is a powerful and flexible tool for making HTTP requests in the browser.\n2.  [Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/async-await-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-7e42af034f5?source=rss-105526889e2f------2 \"Async/Await — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 8, 2023Make your asynchronous code more readable and easier to understand.\n3.  [Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/promises-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-178f1277cb88?source=rss-105526889e2f------2 \"Promises — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")May 1, 2023A powerful feature of JavaScript that makes it easier to write Asynchronous code.\n4.  [Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…](https://medium.com/@rodcast/synchronous-and-asynchronous-understanding-javascript-api-requests-and-responses-in-the-data-64fa9e8cd319?source=rss-105526889e2f------2 \"Synchronous and Asynchronous — Understanding JavaScript API Requests and Responses in the Data…\")April 24, 2023Two different types of programming implementations can confuse.\n5.  [AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/ajax-and-xmlhttprequest-understanding-javascript-api-requests-and-responses-in-the-data-fetching-507a7959330e?source=rss-105526889e2f------2 \"AJAX and XMLHttpRequest — Understanding JavaScript API Requests and Responses in the Data Fetching…\")April 17, 2023You can create web applications that are more responsive and user-friendly by using AJAX and XMLHttpRequest.\n6.  [Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/callbacks-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-499cdeb026ee?source=rss-105526889e2f------2 \"Callbacks — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")April 10, 2023A callback is a programming technique in which a function is passed as an argument to another function and is executed.\n7.  [V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…](https://medium.com/@rodcast/v8-javascript-engine-understanding-javascript-api-requests-and-responses-in-the-data-fetching-311481bdae6a?source=rss-105526889e2f------2 \"V8 JavaScript engine — Understanding JavaScript API Requests and Responses in the Data Fetching…\")April 3, 2023V8 is the most popular JavaScript engine and was developed by Google.\n8.  [Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/introduction-understanding-javascript-api-requests-and-responses-in-the-data-fetching-lifecycle-9eae22fd3d16?source=rss-105526889e2f------2 \"Introduction — Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")March 27, 2023It’s important to note that using client-side data fetching can affect the performance of your application.\n9.  [Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle](https://medium.com/@rodcast/understanding-javascript-api-requests-and-responses-in-thedata-fetching-lifecycle-539bf96b2293?source=rss-105526889e2f------2 \"Understanding JavaScript API Requests and Responses in the Data Fetching lifecycle\")March 20, 2023In this article series <strong>Introduction, V8 JavaScript engine, Callbacks, AJAX/XMLHttpRequest, Synchronous/Asynchronous, Promises, Async/Await, Fetch API, and Conclusion</strong>.\n10.  [Just Let Me Say — Be Yourself](https://medium.com/@rodcast/just-let-me-say-be-yourself-b2f5cedeb5a1?source=rss-105526889e2f------2 \"Just Let Me Say — Be Yourself\")February 12, 2020I want to say something to you and would like you never forget.\n\n[Read all articles →](https://medium.com/@rodcast \"Read all articles on Medium\")\n",
  "markdownStats": {
    "images": 0,
    "links": 15,
    "tables": 0,
    "codeBlocks": 0,
    "headings": 2
  },
  "tokens": {
    "htmlTokens": 7847,
    "markdownTokens": 1379,
    "reduction": 6468,
    "reductionPercent": 82
  },
  "score": {
    "score": 92,
    "grade": "A",
    "rubricVersion": 3,
    "dimensions": {
      "accessibility": {
        "score": 94,
        "weight": 30,
        "grade": "A",
        "checks": {
          "content_without_js": {
            "score": 100,
            "weight": 55,
            "evidence": "proven",
            "details": "Content available without JavaScript"
          },
          "fast_content_position": {
            "score": 75,
            "weight": 25,
            "evidence": "plausible",
            "details": "Main content starts at 29% of HTML"
          },
          "reasonable_page_size": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "Page size: 27KB"
          }
        }
      },
      "aiDiscoverability": {
        "score": 82,
        "weight": 25,
        "grade": "B",
        "checks": {
          "robots_allows_ai_bots": {
            "score": 100,
            "weight": 35,
            "evidence": "proven",
            "details": "All major AI search bots allowed"
          },
          "supports_markdown_negotiation": {
            "score": 60,
            "weight": 20,
            "evidence": "plausible",
            "details": "Application level — .md URL (https://rodrigocastilho.com/index.md), <link> tag",
            "mechanisms": {
              "negotiation": false,
              "mdUrl": true,
              "linkTag": true,
              "linkHeader": false
            }
          },
          "has_sitemap": {
            "score": 100,
            "weight": 15,
            "evidence": "plausible",
            "details": "Sitemap found"
          },
          "has_robots_txt": {
            "score": 100,
            "weight": 10,
            "evidence": "plausible",
            "details": "robots.txt exists"
          },
          "has_llms_txt": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "llms.txt exists and is valid"
          },
          "has_content_signals": {
            "score": 0,
            "weight": 10,
            "evidence": "speculative",
            "details": "No Content-Signal found (robots.txt or HTTP headers)",
            "mechanisms": {
              "robotsTxt": false,
              "httpHeader": false,
              "policy": false
            }
          }
        }
      },
      "structuredData": {
        "score": 100,
        "weight": 20,
        "grade": "A",
        "checks": {
          "has_schema_org": {
            "score": 100,
            "weight": 35,
            "evidence": "proven",
            "details": "JSON-LD found: Person, WebSite, WebPage, ProfilePage"
          },
          "has_open_graph": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "All OG tags present"
          },
          "has_meta_description": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "Meta description: 146 chars"
          },
          "has_canonical_url": {
            "score": 100,
            "weight": 15,
            "evidence": "plausible",
            "details": "Canonical URL present"
          },
          "has_lang_attribute": {
            "score": 100,
            "weight": 10,
            "evidence": "plausible",
            "details": "lang=\"en\""
          }
        }
      },
      "semanticHtml": {
        "score": 100,
        "weight": 15,
        "grade": "A",
        "checks": {
          "proper_heading_hierarchy": {
            "score": 100,
            "weight": 30,
            "evidence": "plausible",
            "details": "Clean heading hierarchy"
          },
          "uses_article_or_main": {
            "score": 100,
            "weight": 25,
            "evidence": "plausible",
            "details": "Has both <article> and <main>"
          },
          "semantic_elements": {
            "score": 100,
            "weight": 20,
            "evidence": "plausible",
            "details": "19 semantic elements, 4 divs (ratio: 83%)"
          },
          "meaningful_alt_texts": {
            "score": 100,
            "weight": 15,
            "evidence": "plausible",
            "details": "1/1 images with meaningful alt text"
          },
          "low_div_nesting": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "Avg div depth: 1.3, max: 2"
          }
        }
      },
      "contentEfficiency": {
        "score": 78,
        "weight": 10,
        "grade": "B",
        "checks": {
          "token_reduction_ratio": {
            "score": 100,
            "weight": 40,
            "evidence": "speculative",
            "details": "82% token reduction (HTML→Markdown)"
          },
          "content_to_noise_ratio": {
            "score": 25,
            "weight": 30,
            "evidence": "speculative",
            "details": "Content ratio: 8.7% (2441 content chars / 28062 HTML bytes)"
          },
          "reasonable_page_weight": {
            "score": 100,
            "weight": 20,
            "evidence": "speculative",
            "details": "HTML size: 27KB"
          },
          "minimal_inline_styles": {
            "score": 100,
            "weight": 10,
            "evidence": "speculative",
            "details": "1/198 elements with inline styles (0.5%)"
          }
        }
      }
    }
  },
  "recommendations": [
    {
      "id": "add_content_signals",
      "priority": "high",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_content_signals.title",
      "descriptionKey": "rec.add_content_signals.description",
      "howToKey": "rec.add_content_signals.howto",
      "howToStepKeys": null,
      "effort": "quick-win",
      "estimatedImpact": 2.5,
      "maxImpact": 2.5,
      "evidence": "speculative",
      "checkScore": 0,
      "checkDetails": "No Content-Signal found (robots.txt or HTTP headers)"
    },
    {
      "id": "improve_content_ratio",
      "priority": "medium",
      "category": "contentEfficiency",
      "titleKey": "rec.improve_content_ratio.title",
      "descriptionKey": "rec.improve_content_ratio.description",
      "howToKey": "rec.improve_content_ratio.howto",
      "howToStepKeys": null,
      "effort": "moderate",
      "estimatedImpact": 2.3,
      "maxImpact": 3,
      "evidence": "speculative",
      "checkScore": 25,
      "checkDetails": "Content ratio: 8.7% (2441 content chars / 28062 HTML bytes)"
    }
  ],
  "llmsTxtPreview": "# rodrigocastilho.com\n\n> Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO.\n\n## Main\n- [Rodrigo Castilho - Staff Frontend Software Engineer](https://rodrigocastilho.com): Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems…\n- [About](https://rodrigocastilho.com/)\n- [RSS Feed](https://rodrigocastilho.com/feed.xml)\n- [Sitemap](https://rodrigocastilho.com/sitemap.xml)\n\n",
  "llmsTxtExisting": "# Rodrigo Castilho\n\n> Staff Frontend Software Engineer at Wellhub specializing in React, Next.js, JavaScript, TypeScript, AWS, design systems, web performance, and SEO. Personal site exposing public profile, projects, and articles as agent-friendly content.\n\nThe site is a statically exported Next.js application. Project and article data are fetched at build time from the GitHub REST API and the Medium RSS feed. The Markdown homepage is available directly at `/index.md`. Accept-based content negotiation on `/` works only on hosts that honor the repository's rewrite and header configuration; GitHub Pages does not.\n\n## Content\n\n- [Homepage (Markdown)](https://rodrigocastilho.com/index.md): Profile summary, projects, and articles with embedded schema.org JSON-LD.\n- [RSS Feed](https://rodrigocastilho.com/feed.xml): Site feed.\n- [Sitemap](https://rodrigocastilho.com/sitemap.xml): List of indexable URLs.\n\n## API\n\n- [OpenAPI Specification](https://rodrigocastilho.com/docs/api/openapi.json): OpenAPI 3.1 description of the public endpoints.\n- [API Documentation](https://rodrigocastilho.com/docs/api/): Human-readable API docs.\n- [API Documentation (Markdown)](https://rodrigocastilho.com/docs/api.md): Agent-friendly API docs.\n- [API Catalog](https://rodrigocastilho.com/.well-known/api-catalog): RFC 9727 linkset advertising API discovery endpoints.\n\n## Agents\n\n- [Agent Card](https://rodrigocastilho.com/.well-known/agent-card.json): Agent metadata for this site.\n- [Agent Skills Index](https://rodrigocastilho.com/.well-known/agent-skills/index.json): Catalog of agent skills (markdown negotiation, API discovery, WebMCP tools, auth).\n- [MCP Server Card](https://rodrigocastilho.com/.well-known/mcp/server-card.json): Model Context Protocol server descriptor.\n\n## Social\n\n- [GitHub](https://github.com/rodcast)\n- [Twitter](https://twitter.com/rodcast)\n- [LinkedIn](https://www.linkedin.com/in/rodcast)\n- [Medium](https://medium.com/@rodcast)",
  "emergingProtocols": {
    "oauthProtectedResource": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/oauth-protected-resource",
      "resource": "https://rodrigocastilho.com/",
      "authorizationServers": [
        "https://rodrigocastilho.com"
      ],
      "scopesSupported": [
        "profile:read",
        "content:read"
      ]
    },
    "oauthDiscovery": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/oauth-authorization-server",
      "issuer": "https://rodrigocastilho.com",
      "authorizationEndpoint": null,
      "tokenEndpoint": "https://rodrigocastilho.com/oauth/token",
      "grantTypesSupported": [
        "urn:ietf:params:oauth:grant-type:jwt-bearer",
        "urn:workos:agent-auth:grant-type:claim"
      ],
      "scopesSupported": [
        "profile:read",
        "content:read"
      ]
    },
    "mcpServerCard": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/mcp/server-card.json",
      "draft": true,
      "name": null,
      "version": null,
      "description": null,
      "transport": null,
      "tools": null,
      "resources": null,
      "prompts": null
    },
    "a2aAgentCard": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/agent-card.json",
      "name": "Rodrigo Castilho Personal Website Agent",
      "version": "1.0.0",
      "description": "A read-only agent that provides information about Rodrigo Castilho's profile, public GitHub repositories, and Medium articles via WebMCP browser tools.",
      "capabilities": 2,
      "skills": 4,
      "endpoint": null
    },
    "apiCatalog": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/api-catalog",
      "contentType": "application/octet-stream",
      "validMediaType": false,
      "apis": 1
    },
    "agentSkills": {
      "exists": true,
      "url": "https://rodrigocastilho.com/.well-known/agent-skills/index.json",
      "draft": true,
      "schema": "https://agentskills.io/schemas/agent-skills-index.v0.2.0.json",
      "skills": 5,
      "names": [
        "api-discovery",
        "markdown-negotiation",
        "auth-discovery",
        "webmcp-tools",
        "web-bot-auth"
      ]
    },
    "count": 6,
    "total": 6
  },
  "botAccess": {
    "probed": true,
    "bot": "OAI-SearchBot",
    "controlStatus": 200,
    "botStatus": 200,
    "discriminates": false,
    "refusedAsBot": false,
    "edge": "Fastly",
    "verifiable": false,
    "detail": "This origin answers OAI-SearchBot exactly as it answers any other client (200). No edge-level filtering of AI crawlers observed."
  },
  "snippets": [
    {
      "id": "add_content_signals",
      "title": "Add Content-Signal directives",
      "description": "Content-Signal tells AI agents how they may use your content. The canonical location is robots.txt, but you can also expose it as an HTTP header from any stack.",
      "language": "txt",
      "code": "User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no",
      "filename": "/robots.txt",
      "stacks": [
        {
          "id": "robots",
          "label": "robots.txt",
          "language": "txt",
          "filename": "/robots.txt",
          "code": "User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no"
        },
        {
          "id": "nginx",
          "label": "Nginx",
          "language": "nginx",
          "filename": "server block",
          "code": "# Inside your server { } block:\nadd_header Content-Signal \"search=yes, ai-input=yes, ai-train=no\" always;"
        },
        {
          "id": "apache",
          "label": "Apache",
          "language": "apache",
          "filename": ".htaccess",
          "code": "# In .htaccess (or VirtualHost):\nHeader set Content-Signal \"search=yes, ai-input=yes, ai-train=no\""
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// In your theme's functions.php or a small mu-plugin\nadd_action('send_headers', function () {\n    header('Content-Signal: search=yes, ai-input=yes, ai-train=no');\n});\n\n// Optional: also append the directive to the dynamic robots.txt\nadd_filter('robots_txt', function ($output) {\n    return $output . \"\\nContent-Signal: search=yes, ai-input=yes, ai-train=no\\n\";\n}, 10, 1);"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "middleware.ts",
          "code": "// middleware.ts (Next.js 13+ App Router or Pages Router)\nimport { NextResponse } from 'next/server';\nexport function middleware() {\n  const res = NextResponse.next();\n  res.headers.set(\n    'Content-Signal',\n    'search=yes, ai-input=yes, ai-train=no'\n  );\n  return res;\n}\nexport const config = { matcher: '/:path*' };"
        },
        {
          "id": "cloudflare",
          "label": "Cloudflare Workers",
          "language": "javascript",
          "filename": "worker.js",
          "code": "// Cloudflare Worker that proxies your origin and adds the header\nexport default {\n  async fetch(request, env, ctx) {\n    const res = await fetch(request);\n    const newRes = new Response(res.body, res);\n    newRes.headers.set(\n      'Content-Signal',\n      'search=yes, ai-input=yes, ai-train=no'\n    );\n    return newRes;\n  },\n};"
        },
        {
          "id": "express",
          "label": "Express / Fastify",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Express\napp.use((req, res, next) => {\n  res.setHeader('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n  next();\n});\n\n// Fastify\nfastify.addHook('onSend', (request, reply, payload, done) => {\n  reply.header('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n  done();\n});"
        }
      ]
    }
  ]
}

Use our API to get this programmatically (coming soon)

This JSON is for internal use — unlike the Markdown and llms.txt files, it's not meant to be uploaded to your site. Save it as a baseline to track your score over time, share it with your dev team, or integrate it into your CI/CD pipeline.

Want a second opinion?

Cloudflare runs a free scanner too, and it asks a different question. It scores what your site publishes for agents to call — MCP server cards, Agent Skills, API catalogs, DNS records. We score whether an agent can reach, read and understand your content. A site can do well on one and poorly on the other, so expect two different numbers: they are answers to two different questions, and both are worth knowing.

Scan rodrigocastilho.com with Cloudflare

Embed your badge

Add this badge to your site. It updates automatically as your AI-readiness score changes.

AgentReady.md score for rodrigocastilho.com
Script Recommended
<script src="https://agentready.md/badge.js" data-id="407916de-53c1-4656-ab49-8f27cbfb5682" data-domain="rodrigocastilho.com"></script>
Markdown
[![AgentReady.md score for rodrigocastilho.com](https://agentready.md/badge/rodrigocastilho.com.svg)](https://agentready.md/r/rodrigocastilho.com)

Coming soon: Full Domain Analysis

Crawl your entire domain, generate llms.txt, and monitor your AI-readiness score over time. Join the waitlist to be notified.

You're on the list! We'll notify you when it launches.