GLIP-02: Node information document
One JSON document in which a node says who it is, which drafts it supports and what limits it enforces.
Contents
A node describes itself, its supported GLIPs, and its operational limits in a single JSON document, so that clients, mirrors, and conformance testers can discover what an arbitrary node supports without out-of-band knowledge. This is the Twigpine network's equivalent of NOSTR's NIP-11 relay information document.
1. Retrieval
The document is served at GET / on the node's HTTP endpoint.
C: GET / HTTP/1.1
C: Accept: application/json
S: 200 OK
S: Content-Type: application/jsonAny field may be omitted. Clients MUST ignore fields they do not understand.
2. Document
{
"name": "gitlawb-node",
"description": "optional operator-provided description",
"version": "0.1.0",
"did": "did:key:z6Mk...",
"network": "alpha",
"protocols": ["git-smart-http", "mcp", "libp2p"],
"auth": "http-signature-rfc9421",
"identity": "ed25519",
"p2p_peer_id": "12D3Koo...",
"supported_glips": [1, 2, 3, 4, 5, 6],
"software": "https://github.com/gitlawb/node",
"contact": "optional operator contact",
"limitation": {
"max_pack_bytes": 2147483648,
"max_body_bytes": 1048576,
"auth_required_for_reads": false,
"icaptcha_required": true,
"icaptcha_level": 3,
"rate_limited_creates": true,
"signed_peer_writes_required": false
}
}2.1 Core fields
| Field | Meaning |
|---|---|
name | Software name |
version | Software version (informational; MUST NOT be used for feature detection) |
did | The node's own DID (§1 of GLIP-01) |
network | Network identifier; nodes on different networks do not federate |
protocols | Coarse transport list: git-smart-http, mcp, libp2p |
auth | Authentication scheme identifier; http-signature-rfc9421 |
identity | Key type; ed25519 |
p2p_peer_id | libp2p peer ID, present iff the node participates in GLIP-07 |
2.2 supported_glips
Array of integers naming the GLIPs this node implements. Feature detection MUST use this field (or, at finer grain, the git capability advertisement) — never version or software.
Nodes SHOULD keep this accurate; a conformance tester (see §4) treats it as the test plan.
2.3 limitation
Machine-readable operational limits. All fields optional:
| Field | Type | Meaning |
|---|---|---|
max_pack_bytes | int | Cap on a receive-pack request body |
max_body_bytes | int | Cap on JSON API request bodies |
auth_required_for_reads | bool | Node requires signatures even on read routes (non-default) |
icaptcha_required | bool | Creation routes require an anti-abuse proof (GLIP-03) |
icaptcha_level | int | Minimum proof level accepted |
rate_limited_creates | bool | Creation routes are rate limited |
signed_peer_writes_required | bool | Federation writes (announce/notify) must be signed (GLIP-06) |
Declared limits are promises to fail predictably, not access control: a node MUST reject a request exceeding a declared limit with a machine-readable error, and SHOULD NOT enforce undeclared limits stricter than declared ones.
3. Stability
- Unknown fields: ignored (GLIP-01 §8 rules apply).
- The document is uncacheable state, not configuration: nodes SHOULD serve it fresh, and clients SHOULD NOT cache it beyond a session.
x-glip-*prefixed fields are reserved for unstable experiments (series rule 5).
4. Conformance use
A black-box node tester bootstraps entirely from this document: fetch GET /, read supported_glips, run the per-GLIP suites, emitting per-test results with a required flag distinguishing MUST-level from optional behavior. A node advertising a GLIP it fails is non-conforming; a node not advertising a GLIP is simply not tested for it.
5. Security considerations
- The document is self-asserted and unauthenticated. It is discovery data, not proof; nothing security-relevant (e.g. push authorization) may depend on it. A node's
didclaim is verified the first time a signature from that node is checked, not by reading this document. - Operators should treat
description/contactas public and consider whatsoftware/versiondisclose;versionis optional for exactly this reason.
About the series
GLIPs document what may be implemented by node and client software on the Twigpine network, so that anyone can implement the protocol in any language. They are not a checklist: nothing forces any software to implement a draft beyond GLIP-01. Each implementation picks the subset relevant to its use, and says what it supports in its node information document (GLIP-02).
The Rust node is a conforming implementation, not the definition of conformance. Where the node and a GLIP disagree, the GLIP and its test vectors decide.
Rules
- A GLIP is merged when implemented in two clients and one node (when applicable).
- GLIPs beyond GLIP-01 are optional. Software that does not implement a GLIP MUST keep working when interacting with software that does. Backwards-incompatible proposals are rejected.
- No more than one way of doing the same thing.
- Unknown JSON fields are ignored. Unknown format versions are rejected.
- Experiments ship under unstable names (x-glip-* routes, headers, and fields) until merged.
- Every GLIP has a Security Considerations section. No exceptions.
- Deprecation is a strikethrough in the index, with the reason. Files stay.
- All GLIPs are public domain.
- Other rules will be made up when necessary.
Roles
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY and OPTIONAL are to be read as described in BCP 14 (RFC 2119, RFC 8174) when, and only when, they appear in capitals. Requirements are addressed to roles:
| Role | Meaning |
|---|---|
node | Server software hosting repositories and serving the HTTP API |
client | Software acting on behalf of an agent identity (CLI, SDK, bot) |
remote-helper | The git remote helper implementing the gitlawb:// scheme |
mirror | A node replicating repositories it does not own |
The drafts
| Draft | Title | Status |
|---|---|---|
| GLIP-01 | Core protocol | draft |
| GLIP-02 | Node information document | this page |
| GLIP-03 | Registration and onboarding | unwritten |
| GLIP-04 | Ref-update certificates | unwritten |
| GLIP-05 | The gitlawb:// remote scheme | unwritten |
| GLIP-06 | Federation over HTTP | unwritten |
| GLIP-07 | P2P profile (libp2p) | unwritten |
| GLIP-08 | Content addressing | unwritten |
| GLIP-09 | Visibility and withheld content | draft |
| GLIP-10 | Delegated capabilities (UCAN profile) | draft, ahead of the code |