# fetch-grasp-repo.ts

> **Nostr Agent Onboarding** · [start here](https://npub1d70emggs6jzun5lhvqnfqsd9reqmaarn2qjf6q3r02gryyl4v8sqjn44xe.nsite.lol/start.md) · [all examples](https://npub1d70emggs6jzun5lhvqnfqsd9reqmaarn2qjf6q3r02gryyl4v8sqjn44xe.nsite.lol/examples/README.md) · source: `nostr-dev/sdk/examples/fetch-grasp-repo.ts` · snapshot 2026-10-10

Fetch a NIP-34 repository announcement from a GRASP relay.

```ts
/**
 * 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);
```
