Package Exports
- @powforge/identity
- @powforge/identity/src/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@powforge/identity) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
@powforge/identity
Depth-of-Identity SDK for Nostr. Measures accumulated irreversible work across four dimensions to produce a single identity weight score.
Built on the idea that identity is not a credential -- it is accumulated proof-of-work across time, space, social graphs, and economic commitments.
Install
npm install @powforge/identityQuick Start
const { getIdentityDepth } = require('@powforge/identity');
const report = await getIdentityDepth(pubkey, {
relays: ['wss://relay.powforge.dev'],
});
console.log(report.weight); // total identity depth score
console.log(report.dimensions); // breakdown by dimensionWhat It Measures
Four dimensions of identity depth:
| Dimension | What It Scores | Event Kinds |
|---|---|---|
| Spatial | Cyberspace movement proofs, unique regions explored | kind:3333 |
| Social | Notes published, reactions given, unique peers interacted with | kind:1, kind:7 |
| Access | NIP-13 proof-of-work accumulated across all events | nonce tags |
| Vouch | Inbound vouches from other identities, weighted by voucher depth with sqrt dilution | kind:33335 |
API
getIdentityDepth(pubkey, options?)
Returns a full identity report for a hex pubkey.
Options:
| Option | Default | Description |
|---|---|---|
relays |
['ws://localhost:3088'] |
Array of relay WebSocket URLs to query |
timeout |
5000 |
Query timeout per relay in ms |
dimensions |
['spatial', 'social', 'access', 'vouch'] |
Which dimensions to score |
Returns:
{
"pubkey": "93da4435...",
"totalEvents": 3,
"weight": 24,
"activeDimensions": 2,
"dimensionMultiplier": 1.2,
"dimensions": {
"spatial": { "events": 3, "uniqueRegions": 3, "proofsVerified": 3, "score": 21 },
"social": { "notes": 0, "reactions": 0, "uniquePeers": 0, "score": 0 },
"access": { "totalEvents": 3, "totalPowBits": 0, "maxDifficulty": 0, "score": 3 },
"vouch": { "inboundVouches": 0, "uniqueVouchers": 0, "totalWeight": 0, "score": 0 }
},
"firstActivity": "2026-04-12T17:25:47.000Z",
"lastActivity": "2026-04-13T21:01:16.000Z",
"relaysQueried": 1
}queryRelay(relayUrl, filters, timeout?)
Low-level function to query a single relay for events matching NIP-01 filters.
How Scoring Works
Each dimension uses log2 scaling to prevent grinding attacks. You can't just spam events to inflate your score -- each additional unit of work yields diminishing returns, just like real proof-of-work.
- Spatial:
log2(events+1) * 2 + log2(uniqueRegions+1) * 5 - Social:
log2(notes+1) * 3 + log2(reactions+1) + log2(bidirectionalPeers+1) * 15 + log2(unidirectionalPeers+1) * 5 - Access:
totalPowBits * 2 + log2(powEvents+1)(PoW bits are already exponential, so they stay linear) - Vouch:
log2(totalWeight+1) * 3 + log2(uniqueVouchers+1) * 20(sqrt dilution prevents vouch farming)
A dimension multiplier rewards spreading across dimensions: having depth in 2 dimensions gives 1.2x, 3 gives 1.4x, all 4 gives 1.6x. One-trick ponies get no bonus.
The total weight is the sum of all dimension scores times the multiplier. Higher weight means more accumulated, irreversible work.
Why Not Just Check Follower Count?
Follower counts are trivially faked. This SDK measures things that cost real resources to produce: computation (PoW), time (event history), movement (spatial proofs), and social commitment (vouches backed by depth). Every dimension requires irreversible expenditure to increase.
License
MIT