Jayant © 2026Hyderabad, India
Jayant
HomeAboutWorkWritingResumeContact
Discuss a product
Field note / Published18 September 2026

How I Made a Public Portfolio Discoverable to Agents

Discovery for people stayed editorial. Discovery for agents became signed DNS, well-known catalogs, and honest auth metadata—without inventing a commerce protocol the site does not run.

4 min read781 words
  • Agent Discovery
  • DNSSEC
  • Next.js
  • SEO
  • System Design
Cover illustration for How I Made a Public Portfolio Discoverable to Agents
Inside this note
  1. 01The problem was not a missing score
  2. 02People still get pages. Agents get catalogs.
  3. 03DNS-AID is not an HTTP file
  4. 04SEO stayed in the implementation
  5. 05What I refused to fake
  6. 06What I would keep watching

A public site already has two audiences. People read pages. Crawlers and agents look for contracts: which documents exist, which APIs are real, and whether the answers are authentic.

I treated that second audience as a product boundary, not as a badge. The work was to publish a small, honest discovery surface on jayantgoyal.com without pretending the portfolio is a store, an MCP runtime, or a second identity provider.

The problem was not a missing score

Search and agent scanners are useful regression tests. They are a poor product definition.

If a checker wants commerce protocols, the honest response for this site is still no. There is nothing to buy. Inventing x402, UCP, or ACP endpoints would make the catalog larger and the system less true.

The same rule applied to Web Bot Auth. Signing HTTP messages needs a key I am willing to operate. I was not going to mint a private key so a scanner could tick a box.

What I did ship is the part that belongs on a public editorial site: crawlable pages, machine-readable catalogs, DNS records agents can look up, and DNSSEC so those records can be authenticated.

People still get pages. Agents get catalogs.

Portfolio remains the public story. The homepage, Writing, Work, and résumé did not become a developer portal.

Alongside those pages, Portfolio now serves a discovery layer:

SurfaceJob
/.well-known/ai-catalog.jsonCapability catalog for agents
/.well-known/api-catalogLinkset of public APIs and documents
/.well-known/oauth-protected-resourceResource metadata, including agent_auth: anonymous
/.well-known/oauth-authorization-server and OpenID configurationPoint at the site that owns the resource notes
/.well-known/mcp/server-card.jsonCard only — no invented MCP runtime
/.well-known/agent-skills/index.jsonSkills index
/.well-known/agent-card.jsonA2A card
/auth.mdHuman-readable agent auth notes
/agent/identityPublic identity document, no tokens

The important constraint is ownership. Human sign-in still lives on Auth. The Portfolio origin is a public resource. Anonymous agents may read published content. They do not receive a session, and they should not be redirected into a login flow that was built for people.

That is why resource metadata points at the Portfolio origin instead of at Supabase. A scanner that follows authorization_servers needs to land on the document that explains anonymous access, not on a hosted auth product that does not speak this protocol.

Drawing architecture diagram…

DNS-AID is not an HTTP file

HTTP catalogs are easy to ship in Next.js. Authenticated discovery is not.

DNS-AID asks for HTTPS/SVCB records under _index._agents and _catalog._agents, ServiceMode, ALPN h2/h3, port 443, targeting the canonical host. On older dig builds those records show up as TYPE65, not as the HTTPS mnemonic.

Those records lived at Cloudflare as soon as the zone was the nameserver. That was not enough for a checker that wants the chain of trust. DNSKEY in the zone without a DS at the parent is local signing. Authenticated DNS-AID needs the registry to publish DS.

The missing piece was the .com DS, not another well-known path. After the DS landed — key tag 2371, algorithm 13, digest type 2 — WHOIS moved to signedDelegation. The HTTPS records did not change. The parent finally attested to them.

SEO stayed in the implementation

The same pass cleaned on-page issues that a page audit actually measures: a single honest H1, image alts, unique anchors, Person JSON-LD with an image, and no X-Powered-By leak.

That work belongs in metadata, robots Content-Signal, and the renderer. It does not belong on the homepage as “97% SEO.” Scores move when the checker moves. The contracts should still be true.

What I refused to fake

  • Commerce. The site does not sell. The catalog does not advertise checkout protocols.
  • A live MCP or A2A runtime. Cards describe intent. They do not imply a process that is not running.
  • Token issuance on Portfolio. Public reads stay anonymous. Auth remains the interactive owner.

Leaving those gaps visible is part of the design. A smaller true surface is easier to keep correct than a complete-looking one.

What I would keep watching

The public checks I care about are boring:

  • /.well-known/ai-catalog.json still returns 200.
  • _index._agents and _catalog._agents still answer TYPE65.
  • dig DS jayantgoyal.com still returns the parent digest.

If those three hold, people and agents are looking at the same site. The score is a screenshot of that fact, not the product.

Article details
Written by
Jayant
Reading time
4 minutes
Last updated
18 September 2026
Get in touch
From the workbench

Notes from the work

More on how the software was built. Written by Jayant, Software Engineer.

Get in touch
Continue reading

How I Turned Cloudflare Analytics Into a Public Portfolio Feature

How I exposed aggregate Cloudflare traffic and field performance through a server-only Next.js boundary, then shaped it into a privacy-conscious dashboard with global reach, clear chart semantics, and country-level interaction.

Next note