Help us improve
Share bugs, ideas, or general feedback.
From vibefed
Detects NodeInfo protocol implementation in codebases for Fediverse and federated social servers by scanning for /.well-known/nodeinfo endpoints and metadata signals.
npx claudepluginhub reiver/vibefed --plugin vibefedHow this skill is triggered — by the user, by Claude, or both
Slash command
/vibefed:detect-nodeinfoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
NodeInfo is a protocol used by federated social network servers to expose
Builds ActivityPub servers and handles fediverse federation in JavaScript/TypeScript using Fedify. Covers builder pattern, dispatchers, HTTP Signatures, vocab objects, key management, and integrations with Hono, Express, Next.js, and more.
Guides building on AT Protocol (atproto/Bluesky): authoring Lexicons, app views, firehose consumption, DIDs/handles, repositories, records, XRPC endpoints, OAuth.
Evaluates MCP servers from GitHub repos for security vulnerabilities, privacy risks, code quality, community feedback, and reliability with risk scoring and recommendations. Activate on safety queries or assessments.
Share bugs, ideas, or general feedback.
NodeInfo is a protocol used by federated social network servers to expose instance metadata in a standardized format. It is widely used in the Fediverse (Mastodon, Misskey, Pleroma, Diaspora, etc.).
NodeInfo is always two endpoints, not one. This is important for classification:
Part 1 — Discovery endpoint (required):
GET /.well-known/nodeinfolinks array, each entry pointing to a
versioned schema document{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href": "https://example.org/nodeinfo/2.1"
}
]
}
Part 2 — Schema endpoint (required):
/nodeinfo/2.1 or /nodeinfo/2.0 (path is not
standardized, but this convention is near-universal)version, software, protocols, usage,
openRegistrations, metadataVariant — NodeInfo2 (optional, separate spec):
GET /.well-known/x-nodeinfo2Search the codebase for nodeinfo (case-insensitive) across all source
files, excluding: node_modules, vendor, .git, dist, build.
If no matches are found, proceed to Step 2 (fallback search). If matches are found, proceed to Step 3 (classify results).
Some implementations use only generic well-known routing. Search for:
/.well-known/nodeinfo (the discovery path literal)diaspora.software/ns/schema (the rel URL used in the links array —
a very specific signal)x-nodeinfo2 (NodeInfo2 variant path)openRegistrations (a distinctive field name in the schema response)activeHalfyear or activeHalfYear (unique usage stats field)If still nothing — report: NodeInfo not detected.
For each file containing a match, determine which category it falls into:
The file registers a route at /.well-known/nodeinfo that returns a
links array pointing to a versioned schema document.
The file registers a route (commonly /nodeinfo/2.0, /nodeinfo/2.1,
/nodeinfo/2.2) that returns the full instance metadata document with
fields like software, protocols, usage, openRegistrations.
The codebase implements both Part 1 and Part 2 — this is a complete implementation.
The file imports or references a NodeInfo library (e.g. go-nodeinfo,
@semapps/nodeinfo, nodeinfo-rack, ActivityPub frameworks like Fedify
which auto-register NodeInfo) without directly defining the handlers.
The match appears in comments, test fixtures, README files, or configuration pointing to an external NodeInfo server.
The file handles /.well-known/x-nodeinfo2 — a valid but separate
implementation of the NodeInfo2 spec (jaywink/nodeinfo2). Report alongside
standard NodeInfo findings.
| Framework / Language | Pattern to look for |
|---|---|
| Rails | get '/.well-known/nodeinfo' in routes.rb; nodeinfo_controller.rb |
| Django | path('.well-known/nodeinfo' in urls.py |
| Express / Node | app.get('/.well-known/nodeinfo' |
| Spring Boot | @GetMapping("/.well-known/nodeinfo") |
| Go | nodeinfo.NodeInfoPath constant; NodeInfoDiscover handler |
| Mastodon | WellKnown::NodeinfoController |
| Misskey / Calckey | nodeinfo in route definitions |
| Fedify (TS/JS) | NodeInfo auto-registered — look for setNodeInfoDispatcher |
| PHP (ActivityPub) | well-known/nodeinfo near json_encode |
If a schema endpoint is found, note which version(s) are supported:
1.0 — original, rarely seen today1.1 — adds services2.0 — adds usage.localComments; most common2.1 — adds software.repository and software.homepage; current standard2.2 — draft; uncommonThe rel URL in the discovery response encodes the version:
http://nodeinfo.diaspora.software/ns/schema/2.1
Provide a clear summary with:
/.well-known/nodeinfo): Yes / No / Via library/nodeinfo/x.y): Yes / No / Via library/.well-known/x-nodeinfo2): Yes / No / N/Ausage stats appear hardcoded rather
than queried from a database"openRegistrations field in schema response"For reference, a complete implementation provides:
Discovery (/.well-known/nodeinfo):
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href": "https://example.org/nodeinfo/2.1"
}
]
}
Schema (/nodeinfo/2.1):
{
"version": "2.1",
"software": {
"name": "myapp",
"version": "1.0.0",
"repository": "https://github.com/example/myapp",
"homepage": "https://example.org"
},
"protocols": ["activitypub"],
"usage": {
"users": {
"total": 100,
"activeHalfyear": 50,
"activeMonth": 20
},
"localPosts": 1000,
"localComments": 500
},
"openRegistrations": true,
"metadata": {}
}