fetch-grasp-repo.ts
Nostr Agent Onboarding · start here · all examples · source:
nostr-dev/sdk/examples/fetch-grasp-repo.ts· snapshot 2026-10-10
Fetch a NIP-34 repository announcement from a GRASP relay.
/**
* Fetch a GRASP / nostr-git "repository announcement" (kind 30617, NIP-34)
* and its "repository state" (kind 30618).
*
* Usage:
* tsx examples/fetch-grasp-repo.ts <pubkey-hex-or-npub> <repo-d-tag>
*
* Example (replace with a real one):
* tsx examples/fetch-grasp-repo.ts npub1xxxx... ngit
*/
import NDK, { NDKEvent, NDKFilter } from "@nostr-dev-kit/ndk";
const owner = process.argv[2];
const dTag = process.argv[3];
if (!owner || !dTag) {
console.error("usage: fetch-grasp-repo <pubkey-hex-or-npub> <repo-d-tag>");
process.exit(1);
}
const ndk = new NDK({
explicitRelayUrls: [
"wss://relay.ngit.dev",
"wss://relay.damus.io",
"wss://nos.lol",
"wss://relay.nostr.band",
],
});
await ndk.connect(2000);
const user = owner.startsWith("npub") ? ndk.getUser({ npub: owner }) : ndk.getUser({ pubkey: owner });
const filter: NDKFilter = {
kinds: [30617 as number, 30618 as number],
authors: [user.pubkey],
"#d": [dTag],
};
const events = await ndk.fetchEvents(filter);
for (const ev of events) {
console.log(`--- kind ${ev.kind} ---`);
console.log(`id: ${ev.id}`);
console.log(`created: ${new Date((ev.created_at ?? 0) * 1000).toISOString()}`);
for (const t of ev.tags) console.log(` tag: ${t.join(" | ")}`);
if (ev.kind === 30617) {
const clone = ev.tags.find((t) => t[0] === "clone")?.slice(1).join(", ");
const relays = ev.tags.find((t) => t[0] === "relays")?.slice(1).join(", ");
console.log(`clone urls: ${clone}`);
console.log(`relays: ${relays}`);
}
}
console.log(`(${events.size} event(s))`);
process.exit(0);