Developer portal

Tudo o que é legível por máquina

Este site é o lar público de Vini Silveira. Para facilitar a vida de quem constrói agentes, agregadores de conteúdo, leitores RSS ou qualquer ferramenta que precise de dados estruturados, toda a informação está exposta em formatos abertos, sem precisar executar JavaScript. Esta página é o índice.

llms.txt

Markdown manifest for LLM crawlers

agents.txt / agents.json

Endpoint index for AI agents

RSS 2.0

Full feed of blog posts

JSON-LD

Person, WebSite, BlogPosting, AboutPage

Endpoints públicos

Tudo abaixo é GET, público, sem rate limit agressivo, sem autenticação. Se algo aqui quebrar, é bug — abra uma issue no GitHub ou mande email.

MétodoCaminhoDescrição
GET/llms.txt

curl https://vmsilveira.dev/llms.txt

Manifesto do site em Markdown para LLMs (llms.txt spec).

Cache: 1h com SWR de 24h

GET/agents.txt

curl https://vmsilveira.dev/agents.txt

Lista canônica de endpoints para AI agents.

Cache: 1h com SWR de 24h

GET/api/agents.json

curl https://vmsilveira.dev/api/agents.json

Manifesto JSON com endpoints, páginas, sinais e contato.

Cache: 1h com SWR de 24h

GET/sitemap.xml

curl https://vmsilveira.dev/sitemap.xml

Sitemap dinâmico com posts e projetos do Notion.

Cache: Regenerado a cada 1h

GET/rss.xml

curl https://vmsilveira.dev/rss.xml

Feed RSS 2.0 com os posts do blog, incluindo categoria e guid.

Cache: 1h com SWR de 24h

GET/robots.txt

Diretrizes de crawling + Content-Signal header para AI.

Cache: Estático

GET/humans.txt

Créditos humanos e stack do site (convenção humans.txt).

Cache: 1h com SWR de 24h

JSON-LD/#person

schema.org/Person com sameAs, knowsAbout, jobTitle.

Cache: Embutido em cada página

JSON-LD/#website

schema.org/WebSite com SearchAction e publisher.

Cache: Embutido em cada página

Dados estruturados

Todo post do blog, todo projeto e as páginas About/Contact/Privacy emitem JSON-LD próprio. Abaixo, amostras reais do que o crawler recebe.

Person (schema.org/Person)

JSON-LD embutido em cada página

{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://vmsilveira.dev/#person",
  "name": "Vinicius de Moura Silveira",
  "alternateName": ["Vini Silveira", "dev.cozy"],
  "url": "https://vmsilveira.dev",
  "jobTitle": "Tech Lead Frontend",
  "worksFor": { "@type": "Organization", "name": "Unicred do Brasil" },
  "address": { "@type": "PostalAddress", "addressLocality": "São Paulo", "addressRegion": "SP", "addressCountry": "BR" },
  "knowsAbout": ["React", "Next.js", "TypeScript", "Frontend Architecture", "Microfrontends", "Team Leadership"],
  "sameAs": [
    "https://github.com/vmsilveira",
    "https://www.linkedin.com/in/silveira-vinicius",
    "https://x.com/vinny__silveira"
  ]
}

WebSite (schema.org/WebSite)

JSON-LD embutido em cada página

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "https://vmsilveira.dev/#website",
  "name": "vmsilveira.dev",
  "alternateName": "Vini Silveira - Tech Lead Frontend",
  "url": "https://vmsilveira.dev",
  "inLanguage": "pt-BR",
  "publisher": { "@id": "https://vmsilveira.dev/#person" },
  "author":   { "@id": "https://vmsilveira.dev/#person" },
  "potentialAction": {
    "@type": "SearchAction",
    "target": { "@type": "EntryPoint", "urlTemplate": "https://vmsilveira.dev/blog?q={search_term_string}" },
    "query-input": "required name=search_term_string"
  }
}

llms.txt (manifest para LLMs)

text/plain — https://vmsilveira.dev/llms.txt

# Vini Silveira — vmsilveira.dev

> Personal site and blog of Vini Silveira (Vinicius de Moura Silveira),
> Tech Lead Frontend at Unicred do Brasil. 11+ years writing production
> frontend: React, TypeScript, Next.js, microfrontends, design systems...

## Identity & canonical URLs
- [Canonical domain](https://vmsilveira.dev/)
- [Author](https://vmsilveira.dev/about)

agents.json (manifest para agents)

application/json — https://vmsilveira.dev/api/agents.json

{
  "name": "vmsilveira.dev agents manifest",
  "canonical": "https://vmsilveira.dev",
  "endpoints": {
    "llms_txt": "https://vmsilveira.dev/llms.txt",
    "rss": "https://vmsilveira.dev/rss.xml",
    "sitemap": "https://vmsilveira.dev/sitemap.xml",
    "api_index": "https://vmsilveira.dev/api/agents.json"
  },
  "signals": { "ai_train": "no", "ai_search": "yes", "ai_input": "yes" }
}

Quickstart

Os snippets abaixo usam o que há de mais simples. Funcionam em qualquer runtime com fetch — Node 20+, Bun, Deno, navegadores e workers.

Listar todos os endpoints (uma chamada)

bash

curl -s https://vmsilveira.dev/api/agents.json | jq .endpoints

Assinar o feed RSS em um agregador qualquer

bash

# RSS URL:
https://vmsilveira.dev/rss.xml

Ler o manifesto LLM e processar no Node

ts

import { readFile } from "node:fs/promises";

const llmsTxt = await fetch("https://vmsilveira.dev/llms.txt").then((r) => r.text());
const lines = llmsTxt.split("\\n");
const sections = lines
  .filter((l) => l.startsWith("## "))
  .map((l) => l.replace("## ", ""));
console.log("Seções:", sections);

Buscar os 5 posts mais recentes via RSS

ts

import Parser from "rss-parser";

const parser = new Parser();
const feed = await parser.parseURL("https://vmsilveira.dev/rss.xml");
for (const item of feed.items.slice(0, 5)) {
  console.log(`- ${item.title}`);
  console.log(`  ${item.link}`);
  console.log(`  ${item.pubDate}\n`);
}

Usar o CLI oficial (recomendado)

bash

npx @vmsilveira/cli@latest posts --limit 3
npx @vmsilveira/cli@latest projects
npx @vmsilveira/cli@latest manifest

CLI oficial

O pacote `@vmsilveira/cli` é a forma mais simples de puxar dados deste site sem precisar manter um scraper. Zero dependências externas em runtime, código aberto, MIT.

Registro

npm (em breve)

Runtime

Node 20+ / Bun / Deno

Licença

MIT

Comandos disponíveis

v1.0.0

npx @vmsilveira/cli manifest

Imprime o agents.json localmente

npx @vmsilveira/cli posts --limit 5

Lista os 5 posts mais recentes

npx @vmsilveira/cli projects

Lista projetos publicados

npx @vmsilveira/cli about

Mostra os dados estruturados de Person

npx @vmsilveira/cli rss --json

Converte o RSS para JSON

O scaffold do CLI está versionado em /cli na raiz deste repositório. A publicação no npm requer uma decisão de produto (escopo, nome do pacote, modelo de versionamento) e credenciais — enquanto isso não acontece, os snippets acima usam npx apontando para o source direto.